Schüsse zeichnen, Fehler?

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Folgender Code soll Schüsse generieren und anzeigen.
Alles wird fehlerfrei kompiliert aber ich sehe nichts und finde auch nach x-maligem Durchsehen keinen Fehler.. -.-

Wer kann helfen?



Code:
import java.applet.*;
import java.awt.*;
import java.util.*;
import java.net.*;


public class Ball
{

	// Initialisierung der Variablen
	private int x_pos;		// x - Position des Balles
	private int y_pos;		// y - Position des Balles
	private int speed;
	private int radius;		// Radius des Balles
	Color shotcol = new Color (250, 250, 250);
	
	public Ball()
	{
	// initialisieren ohne Parameter
	}
	
	public Ball(int x, int y, int sp, int r) // Konstruktor
	{
	x_pos = x;
	y_pos = y;
	speed = sp;
	radius = r;
	}
	
	public void move()
	{
	this.x_pos = this.x_pos + this.speed;
	}
	
	public boolean isOut()
	{
	 if(this.x_pos >= 500)
	 {
	 return true;
	 }
	 else
	 {
	 return false;
	 }
	}

	public boolean collision(Ball ball)
	{

		if(this.x_pos == ball.x_pos)
		{ 
		stop();
		return true;
		}
		else
		{
		return false;
		}
	}

	public void DrawBall (Graphics g)
	{
		g.setColor  (shotcol);
		g.fillOval (this.x_pos - this.radius, this.y_pos - this.radius, 2 * this.radius, 2 * this.radius);
	}

}

Code:
public class Player {

	private int x_pos;
	private int y_pos;
	
	public Player()
	{
	x_pos = 1;
	y_pos = 80;
	}
	
	public int gety()
	{
	return y_pos;
	}
	
	public Ball generateShot()
	{
	int inta = (int)((Math.random()*3)+1);
	int sped = (int)((Math.random()*5)+5);

	Ball shoot = new Ball(x_pos, y_pos, inta, sped);
	return shoot;
	}
	
	public void move(int yd)
	{
	this.y_pos += yd;
	}

}

Code:
import java.awt.*;
import java.util.*;
import java.applet.*;
import java.net.*;
import java.awt.event.*;


public class game extends Applet implements Runnable
{
	
	// Deklaration der Objektreferenzen
	private Ball[] shoot;	// Refferenz auf den Schuss
	private Player player;

	// Thread
	private Thread th;

    // Variablen für die Doppelpufferung
	private Image dbImage;
	private Graphics dbg;

	// Init - Methode
	public void init ()
	{
		// Neue Hintergrundfarbe
        Color superblue = new Color (50, 100, 150);
		setBackground (superblue);
		
		// Initialisierung der Spielobjekte
		player = new Player();
		shoot = new Ball[5];
	}


	// Start - Methode, hier beginnt das Applet zu laufen
	public void start ()
	{
		// Schaffen eines neuen Threads, in dem das Spiel läuft
		th = new Thread (this);
		th.start ();
	}
	

	// Stop - Methode, hier wird das Applet gestopt
	public void stop ()
	{
		th.stop();
	}

	public boolean keyDown (Event e, int key)
   { 

      // Spacetaste gedrückt
      if (key == 32)
      {
	  
			for(int i=0; i<shoot.length; i++)
			{
				// nur dann im Array speichern, wenn ein Platz frei ist
				if(shoot[i] == null)
				{
				int inta = (int)((Math.random()*3)+1);
				int sped = (int)((Math.random()*5)+5);
				//shoot[i] = new Ball(1,player.gety(),sped,inta);
				shoot[i] = player.generateShot();
				break;
				}
			}
			
      }
	  
	  return true;
   }
   
   
   	// Implementierung der Runmethode
	public void run ()
	{
		// Erniedrigen der ThreadPriority um zeichnen zu erleichtern
		Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

		while (true)
		{
			for(int i=0; i<shoot.length; i++)
			{

				if(shoot[i] != null)		// Wenn Schuss nicht außerhalb von Fenster --> move
				{
				shoot[i].move();
			    }
				
				if(shoot[i].isOut())
				{
				shoot[i] = null;
				}
			  
			}
			repaint();

			try
			{
				// Stoppen des Threads für 10 Millisekunden
				Thread.sleep (10);
			}
			catch (InterruptedException ex)
			{
				// do nothing
			}

			// Zurücksetzen der ThreadPriority auf Maximalwert
			Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
		}
	}

	// Paint - Methode
	public void paint (Graphics g)
	{

		for(int i=0;i<shoot.length;i++)
			{
				if(shoot[i] != null)
				{
				shoot[i].DrawBall(g);
				}
			}
	}

	// Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des Bildschirmflackerns
	public void update (Graphics g)
	{
		// Initialisierung des DoubleBuffers
		if (dbImage == null)
		{
			dbImage = createImage (this.getSize().width, this.getSize().height);
			dbg = dbImage.getGraphics ();
		}

		// Bildschirm im Hintergrund löschen
		dbg.setColor (getBackground ());
		dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

		// Auf gelöschten Hintergrund Vordergrund zeichnen
		dbg.setColor (getForeground());
		paint (dbg);

		// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
		g.drawImage (dbImage, 0, 0, this);
	}
	
}
 

Quaxli

Top Contributor
Hast Du ins Applet geklickt, damit es den Focus hat? ;)

Außerdem ist Dein Programm bei mir immer mit einer NullPointerException aufgeschlagen, bis ich folgenden Zeilen eingefügt hatte:

Code:
	// Implementierung der Runmethode
	public void run() {
		// Erniedrigen der ThreadPriority um zeichnen zu erleichtern
		Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

		while (true) {
			for (int i = 0; i < shoot.length; i++) {

                                //-> Beginn Modifikation
                                //--> shoot[i] ist am Anfang NULL!!!
				if(shoot[i]==null){
					continue;
				}
                               //<-- Ende Modifikation
				
				if (shoot[i] != null) // Wenn Schuss nicht außerhalb von Fenster --> move
				{
					shoot[i].move();
				}

                  .....

Du hast das zwar als Bedingung um den shoot.move() auch schon, aber bei der Abrage weiter unten

Code:
				if (shoot[i].isOut()) {
					shoot[i] = null;
				}

hebelt es das Ganze dann wieder aus. Daher lieber gleich am Anfang eine generelle Abfrage, dann mußt Du später nicht mehr dran denken.

Ansonten noch ein paar Anmerkungen:

Klassennamen schreibt man groß (game -> Game)

Die stop-Methode von Thread is deprecated und sollte nicht verwendet werden. Die Lösung dafür ist auch ganz einfach, da Du schon fast alles dafür hast. Du definierst einen boolean als Instanz-Variable und packst den in die while-Schleife Deiner run-Methode (statt while(true) halt while(active) o. ä.).
Wenn Du jetzt diese boolean auf false setzt, läuft die run-Methode aus und der Thread ist beendet.

Die Ballbewegung über einen fixen Wert zu steuern ist nicht optimal. Wenn das Applet auf einem Rechner ausgeführt wird, der schneller oder langsamer ist als Deiner, läuft der Ball entsprechend schneller oder langsamer, weil der andere Rechner die while-Schleife (bzw. den GameLoop) mit einer anderen Geschwindigkeit ausführt und somit den speed-Wert unterschiedlich oft aufaddiert. Hier ist es sinnvoller, die Zeit, die für den letzten Schleifendurchlauf benötigt wurde zu messen (System.nanoTime()) und den Ball in Abhängigkeit dieser Zeit zu bewegen, dadurch läuft die Bewegung auf allen Rechnern gleich schnell.

Gibt noch ein paar Kleinigkeiten mehr, aber die findest Du mit etwas mehr Erfahrung selbst raus ;)
 
G

Gast

Gast
super!! Vielen Dank, es klappt nun soweit :)

Kannst du mir vielleicht noch erklären, wieso die Bedingung

if(shoot==null){
continue;
}

notwendig ist? Was bewirkt das continue und wieso funktioniert es nicht ohne?
 

Quaxli

Top Contributor
continue heißt "Brich diesen Schleifendurchlauf ab und beginne den nächsten ohne bis zum Ende zu laufen" ;)

Da Du beim Methodenaufruf shoot.isOut() nicht prüfst, ob shoot auf ein existierendes Objekt referenziert, wirft Dein Programm eine NullPointerException. Solagen Du das Array nur definiert hast (shoot = new Ball[5]) existieren ja noch keine 6 Objekte vom Typ Ball, sondern nur Platzhalter.

Du könntest Dir das sparen, wenn Du statt Arrays eine Collection verwenden würdest, z. B. eine ArrayList oder einen Vector und auf diese mit einer for-each-Schleife losgehst.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Schüsse zeichnen Spiele- und Multimedia-Programmierung 13
N Schüsse in Richtung der Maus Spiele- und Multimedia-Programmierung 5
J Spave Invanders - Wie zeichne ich die Laser-Schüsse? Spiele- und Multimedia-Programmierung 23
E relevanter bereich einer isometrischen karte zeichnen (AffineTransform) Spiele- und Multimedia-Programmierung 0
SaftigMelo Kreissegment zeichnen Spiele- und Multimedia-Programmierung 2
E Buttons neu zeichnen im GridLayout Spiele- und Multimedia-Programmierung 2
A Zeichnen außerhalb der paint-Methode Spiele- und Multimedia-Programmierung 6
E Isometrische Tiles mit unterschiedlicher Größe an korrekter Position zeichnen Spiele- und Multimedia-Programmierung 1
Androbin Mein Spiel will sich nicht zeichnen lassen !!! Spiele- und Multimedia-Programmierung 7
J Int Wert auf JFrame zeichnen Spiele- und Multimedia-Programmierung 3
H [ANIMATION] Hintergrundbild nur einmal zeichnen Spiele- und Multimedia-Programmierung 3
R [lwjgl] Cursor -> versetzt Zeichnen / Bild ist umgedreht Spiele- und Multimedia-Programmierung 2
M Methoden eine Map zu zeichnen Spiele- und Multimedia-Programmierung 5
aze Nicht rechteckiges Bild zeichnen Spiele- und Multimedia-Programmierung 5
F nur Ausschnitt eines Image zeichnen Spiele- und Multimedia-Programmierung 9
T 3D Graphen Zeichnen Spiele- und Multimedia-Programmierung 19
F Kurven zeichnen Spiele- und Multimedia-Programmierung 2
E Keine Werte zum Zeichnen werden Übergeben Spiele- und Multimedia-Programmierung 3
A Halbkreise zeichnen lassen? Spiele- und Multimedia-Programmierung 2
F Lineal mit Zahlen zeichnen Spiele- und Multimedia-Programmierung 7
N Linie mit Rand zeichnen Spiele- und Multimedia-Programmierung 10
A Mehrere geometrische Objekte in JPanel zeichnen Spiele- und Multimedia-Programmierung 4
A Optimiertes Zeichnen - wie? Spiele- und Multimedia-Programmierung 8
data89 Koordinaten in Koordinatensystem zeichnen Spiele- und Multimedia-Programmierung 11
M Binärbaum ohne Überlappung zeichnen Spiele- und Multimedia-Programmierung 3
H Decke zeichnen mit Hilfe eines Polygons Spiele- und Multimedia-Programmierung 2
B 1)JButtons zeichnen 2)Kolisionsabfrage von zwei Objekten Spiele- und Multimedia-Programmierung 9
G Linie im Applet zeichnen Spiele- und Multimedia-Programmierung 5
S Dreieck zeichnen Spiele- und Multimedia-Programmierung 9
G Überlagern von Strings beim zeichnen verhindern Spiele- und Multimedia-Programmierung 3
C Objekt bei Buttonklick zeichnen Spiele- und Multimedia-Programmierung 16
G Geschwungene Klammer zeichnen Spiele- und Multimedia-Programmierung 5
F Neu zeichnen verhindern Spiele- und Multimedia-Programmierung 25
J Zeichnen in BufferedImage und dieses in Datei speichern Spiele- und Multimedia-Programmierung 2
O Funktion zeichnen Spiele- und Multimedia-Programmierung 11
A Lissajous Figuren zeichnen Spiele- und Multimedia-Programmierung 1
G Maus springt --> Free-Hand-Zeichnen Spiele- und Multimedia-Programmierung 2
M Eigene Strings zeichnen Spiele- und Multimedia-Programmierung 4
T Blitz berechnen und zeichnen Spiele- und Multimedia-Programmierung 13
M auswahlkreis zeichnen (schräg) Spiele- und Multimedia-Programmierung 4
N Logik: Grenz-/Frontlinie zeichnen Spiele- und Multimedia-Programmierung 4
M Grafikprogramm, zeichnen mit Maus Spiele- und Multimedia-Programmierung 7
G Problem beim Zeichnen von LineArrays Spiele- und Multimedia-Programmierung 9
P linie in bild zeichnen Spiele- und Multimedia-Programmierung 2
G Auf 3D Box zeichnen Spiele- und Multimedia-Programmierung 4
K mit Canvas übereinander zeichnen Spiele- und Multimedia-Programmierung 4
G 3D Raum zeichnen Spiele- und Multimedia-Programmierung 7
H Kreis zeichnen mittels Schleife & drawLine Spiele- und Multimedia-Programmierung 4
B Probleme beim zeichnen Spiele- und Multimedia-Programmierung 15
N Bild zu zeichnen (drawImage) klappt nur manchmal?? Spiele- und Multimedia-Programmierung 8
T Effizient zeichnen Spiele- und Multimedia-Programmierung 12
H mit Java2D Markierung über JTable zeichnen und diese bewegen Spiele- und Multimedia-Programmierung 2
C Graphische Benutzerschnittstelle, Problem beim Zeichnen Spiele- und Multimedia-Programmierung 4
J schnellste alternative um in java zu "zeichnen" Spiele- und Multimedia-Programmierung 17
conan2 Objekte in richtiger Z-Reihenfolge zeichnen Spiele- und Multimedia-Programmierung 2
G Punkte in Java3D zeichnen Spiele- und Multimedia-Programmierung 2
S Pixel zeichnen Spiele- und Multimedia-Programmierung 3
S Bild in Speicherbild zeichnen = Nichts? Spiele- und Multimedia-Programmierung 3
G Farbig zeichnen ohne java.awt.Color? Spiele- und Multimedia-Programmierung 5
S Wie kann ich das Zeichnen der Grafik feiner machen? Spiele- und Multimedia-Programmierung 9
M Wie kann man Kreisringe zeichnen ? Spiele- und Multimedia-Programmierung 12
C Graphics 2D Zeichnen Spiele- und Multimedia-Programmierung 4
R Kreuz lässt sich nicht zeichnen Spiele- und Multimedia-Programmierung 11
F einzelne Polygone(Graphics) schneller als and. Fig. zeichnen Spiele- und Multimedia-Programmierung 3
K Kugeln und Zylinder zeichnen Spiele- und Multimedia-Programmierung 4
L ein Rechteck zeichnen Spiele- und Multimedia-Programmierung 6
Z Zeiterfassungsprogramm Fehler Spiele- und Multimedia-Programmierung 7
L Fehler bei "Nochmal Spielen" (Java) Spiele- und Multimedia-Programmierung 1
M Fehler bei MinecraftPlugin Spiele- und Multimedia-Programmierung 3
D Minecraft [Minecraft] Java Start Fehler (Core-Dump) Spiele- und Multimedia-Programmierung 1
coolian glsl shader syntax fehler bei if? Spiele- und Multimedia-Programmierung 8
KeexZDeveoper Fehler von OpenGL Spiele- und Multimedia-Programmierung 1
Kim_Dotcom libGDX - opengl Fehler Spiele- und Multimedia-Programmierung 5
D Fehler bei GUI-Aktualisierung Spiele- und Multimedia-Programmierung 9
R Fehler beim Laden eines 2D-Bildes Spiele- und Multimedia-Programmierung 3
2 jMonkey fehler Spiele- und Multimedia-Programmierung 0
T LWJGL VBO's funktionieren nicht, geben aber auch keinen Fehler Spiele- und Multimedia-Programmierung 0
A Minecraft Plugin Teleport Fehler Spiele- und Multimedia-Programmierung 1
O Fehler bei Programmierung lässt Figur nicht bewegen Spiele- und Multimedia-Programmierung 5
R LWJGL: OpenGL Fehler - weitere Informationen auslesen möglich? Spiele- und Multimedia-Programmierung 2
G Sound-Sampling: Sinuston; kein Fehler, aber auch kein Ton :-( Spiele- und Multimedia-Programmierung 3
I Minecraft Java programmierungs fehler "MineCraft" Spiele- und Multimedia-Programmierung 6
V Komischer Fehler in LWJGL Spiele- und Multimedia-Programmierung 18
CookieSoft LWJGL Ubuntu 12.04 Fehler Spiele- und Multimedia-Programmierung 7
CookieSoft Slick Texture laden Fehler Spiele- und Multimedia-Programmierung 6
A Netbeans / Gamegrid Fehler/Maze Spiele- und Multimedia-Programmierung 2
1 Fehler bei Krümel&Monster Spiele- und Multimedia-Programmierung 16
0 Finde den Fehler nicht Spiele- und Multimedia-Programmierung 2
C Java Fehler (If?) Spiele- und Multimedia-Programmierung 14
F fehler Spiele- und Multimedia-Programmierung 2
L Abfrage-Fehler? - Hilfe bei Tetris Spiele- und Multimedia-Programmierung 9
N bei abspielen der wav datei fehler Spiele- und Multimedia-Programmierung 6
D Java 2d translation() fehler Spiele- und Multimedia-Programmierung 4
D Fehler beim Stein Scher papier Spiel Spiele- und Multimedia-Programmierung 3
R BufferStragety Fehler: Component must have a valid peer Spiele- und Multimedia-Programmierung 5
S drawImage Fehler ! Spiele- und Multimedia-Programmierung 3
V Minesweeperprogrammierung Fehler J0098 Spiele- und Multimedia-Programmierung 8
I Fehler bei Änderung der Bildschirmauflösung Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben