Pong

Status
Nicht offen für weitere Antworten.

StarSeven

Bekanntes Mitglied
Also ich habe ein Problem, ich möchte ein ganz simples Pong-Spiel programmieren und habe damit dann auch angefangen, zuerst hatte ich dem Frame ein Panel hinzugefügt, diesem ein JLabel welcher den Balken darstellen soll welchen man auch schon bald mit den Pfeiltasten in alle Richtungen bewegen kann.
Dann kam das erste Problem, ich fügte dem Panel noch ein Label hinzu welches den Ball darstellen sollte, dieser sollte sich auch bewegen mit
Code:
JLabel.setLocation(x, y);
Aber das tat er nicht, ich habe mir sogar die Koordinaten ausgeben lassen und es sind immer andere, also müsste er sich doch bewegen oder?
Naja, dann dachte ich mir damit wirst du später noch fertig und ich wollte ein Hintergrundbild hinzufügen nach etlichen versuchen gelang es mir auch aber leider sieht man nun die JLabels nichtmehr da das Hintergrundbild diese anscheinend verdeckt.
Ich komme einfach nicht weiter, könnt ihr mir bitte helfen.
Hier sind meine Klassen:
Klasse "Game"
Code:
public class Game {
	public static void main(String args[]) {
		//Thread's werden erstellt, Priorität wird festgelegt 
		//und die Frames werden gestartet
		Thread Ball = new Thread(new BallThread());
		Ball.setPriority(3);
		Thread Balk = new Thread(new BalkThread());
		Balk.setPriority(7);
		Ball.start();
		Balk.start();
	}
}
Klasse "TheView"
Code:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class TheView extends JPanel {
	Image bgblue;	//Hintergrundbild
	ImageIcon ii_balk = new ImageIcon(TheView.class.getResource("balk.gif"));
	//Balkenbild
	JFrame mainFrame = new JFrame("Mein erstes Pong-Spiel");
	JLabel jl_balk = new JLabel(ii_balk);//Jlabel in welchen das Balkenbild kommt
	JLabel jl_ball = new JLabel("O");	//Soll Ball darstellen
	public void view() {
		//Grösse und Position wird vom mainFrame festgelegt
		mainFrame.setLocation(0, 0);
		mainFrame.setSize(800, 600);
		
		//JPanel (this) wird zum mainFrame hinzugefügt
		mainFrame.getContentPane().add(this);
		//Layout gleich null gesetzt
		this.setLayout(null);
		//Hintergrundbild wird hinzugefügt
		bgblue = getToolkit().getImage("bgblue.gif");
		MediaTracker mt = new MediaTracker(this);
		mt.addImage(bgblue, 0);
		try {
			//Warten, bis das Image vollständig geladen ist,
			mt.waitForAll();
		} catch (InterruptedException e) {
			//nothing
		}
		repaint();
		
		//Balken und ball-Label werden zum JPanel (this) hinzugefügt
		this.add(jl_balk);
		this.add(jl_ball);
		
		//Größe und Position der JLabels wird festgelegt
		jl_balk.setSize(10, 80);
		jl_ball.setSize(10, 10);
		jl_balk.setLocation(390, 0);
		jl_ball.setLocation(700, 500);
		//mainFrame wird sichtbar gemacht
		mainFrame.setVisible(true);
	}
	
	
	//Methode in welcher das Bild hinzugefügt wird
	public void paint(Graphics g) {
		//Wenn bild da dann male es drauf
		if (bgblue != null) {
			g.drawImage(bgblue, 0, 0, this);
		}
	}
}
Klasse "BalkThread"
Code:
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

class BalkThread implements Runnable {

	TheView myView = new TheView();
	int x = 390, y = 0;
	public void run() {
		//KeyListener werden zum mainFrame hinzugefügt
		myView.mainFrame.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent evt) {
				if (evt.getKeyCode() == KeyEvent.VK_UP) {
					up();
				}
				if (evt.getKeyCode() == KeyEvent.VK_DOWN) {
					down();
				}
				if (evt.getKeyCode() == KeyEvent.VK_RIGHT) {
					right();
				}
				if (evt.getKeyCode() == KeyEvent.VK_LEFT) {
					left();
				}
				if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) {
					System.exit(0);
				}
			}
		});
		myView.view();
	}
	//Wenn die Pfeiltasten gedrückt werden 
	//bewegt sich der Balken 10 Pixel in die Richtung
	public void up() {
		if (y != 0) {
			y = y - 10;
			myView.jl_balk.setLocation(x, y);
		}
	}

	public void down() {
		if (y + 110 != 600) {
			y = y + 10;
			myView.jl_balk.setLocation(x, y);
		}
	}

	public void left() {
		if (x != 0) {
			x = x - 10;
			myView.jl_balk.setLocation(x, y);
		}
	}

	public void right() {
		if (x + 20 != 800) {
			x = x + 10;
			myView.jl_balk.setLocation(x, y);
		}
	}

}
Klasse "BallThread"
Code:
public class BallThread implements Runnable {

	TheView myView = new TheView();
	public void run() {
		int x = 700, y = 500, xChange = 2, yChange = 2;

		for (int i = 1; i != 0;) {
			//Wenn der Ball gegen die Wand kommt wende
			if (x == 0) {
				System.out.println("xChange = xChange * (-1)");
				xChange = -xChange;
			}
			if (x == 800) {
				System.out.println("xChange = xChange * (-1)");
				xChange = -xChange;
			}
			if (y == 0) {
				System.out.println("yChange = yChange * (-1)");
				yChange = -yChange;
			}
			if (y == 600) {
				System.out.println("yChange = yChange * (-1)");
				yChange = -yChange;
			}
			//Neue x und y Positionen werden errechnet und der Ball positioniert
			x = x + xChange;
			y = y + yChange;

			myView.jl_ball.setLocation(x, y);
		}
	}
}
 

Illuvatar

Top Contributor
revalidate() gibts nur in JComponent.

bei einem Frame muss man
Code:
invalidate();
validate();
machen.
 
B

Beni

Gast
Und im "paint" einfach noch die Children zeichnen lassen.
War glaub "paintComponents".
 

StarSeven

Bekanntes Mitglied
Also so richtig hinbekommen habe ich es noch nicht, habe das (in)validate in die view()-Methode gepackt, das ist doch richtig oder?
Aber es bleibt das selbe Ergebnis, kann auch sein das ich da was falsch gemacht habe, habe noch nie was von den Befehlen (in)validate gehört.
Und was ist mit Children zeichnen lassen gemeint? Das ist das erste mal das ich eine paint()-Methode benutze, kenne mich damit nicht wirklich aus.
Und wisst ihr warum der Ball sich mit .setLocation nicht bewegt?
Ich weiß ich bin ein schwieriger Fall aber bin auch für jede Hilfe sehr dankbar.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben