Pacman,mapa, tworzenie ścian.

0

Szanowni użytkownicy ;)
Jestem początkującym programistą Java(o ile mogę się tak nazwać), mam za zadanie stworzyć grę na kształt Pacmana. Stworzyłem sobie JFrame(500x500), w którym wyświetla się namalowana i zaimportowana mapa(25x25), a także jest możliwość poruszania się pakiem strzałkami klawiatury Chciałbym teraz stworzyć drogę po której poruszałby się Pacman. Inaczej mówiąc chciałbym stworzyć ściany, które wytyczyłyby jego możliwość poruszania się, ale kompletnie nie mam pomysłu jak, myślałem żeby zahaczyć jakoś o pixele, ale jakoś nie idzie. Czy miałby ktoś jakiś pomysł ? Pozdrawiam :)

0

A w jaki sposób wyświetlasz to malowanie zainportowanej mapy?

0

``

Wklejam klasę, która odpowiedzialna jest za tworzenie okna z mapą, nie jest to dzieło sztuki ale jakoś działa :)

/**
 * 
 */
private static final long serialVersionUID = 1L;

int x = 20;
int y = 40;
public BufferedImage bfImg;
public boolean up, down, left, right;
private Image dbImage;
private Graphics dbg;
private BufferedImage img;

public Button1() {

	this.setIconImage(new ImageIcon(this.getClass().getResource("/pliki/pc.png")).getImage());
	this.setSize(500, 500);
	this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	this.setResizable(false);
	this.setTitle("                                                        Pakmen Wannbe - v0.1");
	this.setVisible(true);
	Toolkit tk = Toolkit.getDefaultToolkit();
	Dimension dim = tk.getScreenSize();
	int xPos = (dim.width / 2) - (this.getWidth() / 2);
	int yPos = (dim.height / 2) - (this.getHeight() / 2);
	this.setLocation(xPos, yPos);
	this.setColor();
	this.addKeyListener(this);

	// wczytujemy mape
	try {
		img = ImageIO.read(getClass().getResourceAsStream("/res/mapa.png"));
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

}

public void setColor() {

	getContentPane().setBackground(new Color(128, 128, 128));

}

// double buffer
public void paint(Graphics g) {
	dbImage = createImage(getWidth(), getHeight());
	dbg = dbImage.getGraphics();
	paintComponent(dbg);
	g.drawImage(dbImage, 0, 0, this);
}

// tworze painComponent, ktory ma za zadanie stworzenie pomaranczowego
// obiektu ktory bedzie poruszany strzalkami klawiatury, wywolana zostala
// funckaj repaint() ktora aktualizuje pozycje mojego obiektu
// w celu zlikwidowania problemu "migotania" zastosowalem double buffer,
// ktory zznajduje sie powyzej.
public void paintComponent(Graphics g) {

	super.paint(g);

	// g.drawImage(img, 0, 0, img.getWidth() * 20, img.getHeight() * 20,
	// null);

	g.fillRect(x, y, 50, 50);

	// rysujemy rect-a
	g.drawRect(x, y, 20, 20);

	// ustalamy kolor
	g.setColor(Color.orange);

	// wypelniamy kolorem
	g.fillRect(x, y, 20, 20);

	repaint();

}

@Override
public void keyPressed(KeyEvent e) {

	if (e.getKeyCode() == KeyEvent.VK_UP) {

		y = y - 10;
	}

	if (e.getKeyCode() == KeyEvent.VK_DOWN) {
		y = y + 10;
	}

	if (e.getKeyCode() == KeyEvent.VK_LEFT) {
		x = x - 10;
	}

	if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
		x = x + 10;
	}
}

@Override
public void keyReleased(KeyEvent e) {

}

@Override
public void keyTyped(KeyEvent e) {

}

public static void main(String[] args) {

}

}

1

Musisz stworzyć funkcję która będzie sprawdzała w głównej pętli gry kolizję. Możesz sprawdzać pozycje pacmana z pozycją obiektów na mapie. Np.: ściana górna ma pozycję y_sciany = 0 i sprawdzasz jeżeli y_pacmana < 10 to wtedy dodajesz y = y+10; żeby nie przeleciał przez ścianę tylko się na niej zatrzymywał.

0

Kilka hintów ogólnych.
W Pacmanie nie trzeba sie bawić w żadne kolizje.
Bo: w Pacmanie ruch zawsze jest ograniczony do ruchów w 4 kierunkach NSWE i można ruszać się jeśli w danym kierunku nie ma ściany.

Plansze możesz sobie zamodelować jako macierz booleanów - jest ściana / nie ma ściany. (Strzelam, że masz coś takiego).

***************************
*...........**............*
*.*********.**.**********.*
*...*******....**********.*

I tak dalej.
Na początku możesz sobie malować tą plansze - tam gdzie jest droga (.) jednym kolorem, a ściany (*) drugim.
Ładnie nie będzie, ale będzie.

Swojego pacmana umieszczasz w jakimś punkcie (x,y) i teraz w zależności od tego czy ruch w danych kierunku jest dozwolony -to pozwalasz na niego albo nie.

Czyli olewasz zahaczenie o pixele - a tylko interesują cie współrzędne logiczne pacmana (np. (x,y) = (11,12)).

Tak zrobiony pacman będzie się głupio poruszał skokami o całe pola.

Ale następny krok jest już prosty dodajesz "podkrok". Np. ruch między dwoma polami do 100 małych króków.
I teraz jak Pacman rusza z 11,12 do 12,12 to dodatkowo raz np. na 100 milisekund aktualizujesz zmieną substep od (0.0) do (1.0,0.0). I dopiero jak dojdzie to zmieniasz logiczne współrzędne.
To dość dobrze pasuje, bo w oryginale było tak, że PacMan zaczynał poruszać się na sąsiednie pole - to nie mógł przerwac w połowie i zacząć się wracać przed całkowitym osiągnięciem drugiego pola.

Alternatywnie możesz też współrzędne Pacmana od razu reprezentować w większej rozdzielczości
czyli zamiast (11,12) masz (1100, 1200), na użytek gdzie to jest na mapie dzielisz sobie przez sto i wyciągasz z mapy czy w danym kierunku jest ściana, czy wolne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1