1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

JavaApplet Minigame - Fehlersuche fehlgeschlagen

Discussion in 'Programmieren' started by horstinette, Jan 11, 2009.

Thread Status:
Not open for further replies.
  1. Hallo zusammen,


    ich hab mithilfe eines Tutorials und ein wenig individueller Gestaltung des Codes versucht, ein kleines Spielchen zu erstellen.
    Ich habe den Code aus dem Tut nicht einfach kopiert, sondern versucht, ihn auf eigene Weise aufzuschreiben, sodass ich da auch ein wenig Routine im Schreiben bekomme...

    Das Spielchen sieht im Prinzip so aus:

    2 Bälle (rot, blau) bewegen sich mit zufällig generierter Geschwindigkeit und Richtung über einen 380*380 "Schirm".
    Die Maus stellt das Fadenkreuz dar, womit die Bälle "abgeschossen" (angeklickt -> mouseDown Event) werden sollen.
    Wenn getroffen werden Punkte gutgeschrieben, die anhand der Entfernung zum Ballmittelpunkt berechnet werden.
    Wenn ein Ball außerhalb des Spielfelds "rollt", so werden "Leben" abgezogen.
    Außerdem gibt es sowohl für einen Schuss, einen Treffer ein Rausrollen der Bälle aus dem Feld Sounds.
    Ziel des Spiels demnach: Keine Leben verlieren und viele Punkte durch Abschüsse kassieren.

    Die Codes sehen derzeit so aus:

    Main

    Code:
    import java.awt.*;
    import java.util.*;
    import java.applet.*;
    import java.net.*;
    
    public class Main extends Applet implements Runnable
    {
    	//Variablenerstellung
    	private int speed;				//Spiel(thread)geschwindigkeit
    	
    	boolean gameStop = true;		//Indikator: Spiel läuft (false) oder angehalten (true)
    	
    	private Spieler spieler;		//Verweis auf Spielerobjekt
    	private Ball roterBall;			//Verweis roter Ball
    	private Ball blauerBall;		//   "   blauer Ball
    	
    	Thread th;						//Spielthread	
    	
    	AudioClip Schuss;				//Schusssound - verfehlt
    	AudioClip Treffer;				//Ball getroffen
    	AudioClip Out;					//Ball aus Spielfeld raus/Leben abgezogen
    	 
    	
    	Font f = new Font("Tahoma", Font.BOLD, 20);		//Schrift
    	
    	Cursor c;						//Cursorvariable
    	
    	private Image dbImage;
    	private Graphics dbg;			//Doppelpuffervariable
    	
    	
    	public void init()
    	{
    		c = new Cursor(Cursor.CROSSHAIR_CURSOR);		//Cursor zum Fadenkreuz wandeln
    		this.setCursor(c);
    		
    		Color supercolor = new Color(0, 0, 255);		//neue Hintergrundfarbe
    		
    		setBackground(Color.black);						//Setzen der BG-Farbe
    		
    		setFont(f);										//	"	der Schrift
    		
    		if (getParameter("speed") != null)
    			speed = Integer.parseInt(getParameter("speed"));
    		else 
    			speed = 5;
    		
    		
    		 //Preload der Sounds - Ladezeitreduzierung		 
    		 Treffer = getAudioClip(getCodeBase(), "Treffer.au");
    		 Treffer.play();
    		 Treffer.stop();
    		 
    		 Schuss = getAudioClip(getCodeBase(), "Schuss.au");
    		 Schuss.play();
    		 Schuss.stop();
    		 
    		 Out = getAudioClip(getCodeBase(), "Out.au");
    		 Out.play();
    		 Out.stop();
    		 
    		
    		spieler = new Spieler();
    		roterBall = new Ball(10, 190, 250, 1, -1, 4, Color.red, Out, spieler);
    		blauerBall = new Ball(10, 190, 150, 1, 1, 3, Color.blue, Out, spieler);
    		//Erstellung der Objekte
    	}
    	
    	public void start()
    	{
    		th = new Thread(this); 			//Erstellung des Spielthreads
    		th.start();						//Starten des Threads
    	}
    	
    	public void stop()
    	{
    
    	}
    	
    	public void run()
    	{
    		Thread.currentThread().setPriority(Thread.MIN_PRIORITY);		//min. Prior zum Zeichnen
    		
    		while (true)
    		{
    			if(spieler.getLives() >= 0 && !gameStop)					//solange Leben vorhanden und Spiel läuft...
    			{
    				roterBall.move();										//Bälle bewegen
    				blauerBall.move();
    			}
    			
    			repaint();
    			
    			try
    			{
    				Thread.sleep(speed);									//Thread sleepen für "speed"
    			}				
    			
    			catch(InterruptedException ex)
    			{
    				//nichts
    			}
    			
    			Thread.currentThread().setPriority(Thread.MAX_PRIORITY);	//Reset der Prior
    		}
    	}
    	
    	public void paint(Graphics g)
    	{
    		if (spieler.getLives() >= 0)									//Wenn Leben vorhanden...
    		{
    			g.setColor(Color.YELLOW);									//Schriftfarbe
    			
    			g.drawString("Punkte: "+spieler.getScore(), 10, 40);		//Leben und Punkteanzeige
    			g.drawString("Leben: "+spieler.getLives(), 300, 40);		//" " "
    			
    			roterBall.zeichnen(g);										//Bälle zeichnen
    			blauerBall.zeichnen(g);
    			
    			if (gameStop)												//Wenn Spiel nicht laufend...
    			{
    				g.setColor(Color.yellow);
    				g.drawString("Doppelklick auf das Spiel um es zu starten!", 40, 200);
    			}															//Meldung: Doppelklick zum Start
    		}		
    		else if(spieler.getLives() < 0)									//Wenn Leben weg...
    		{
    			g.setColor(Color.yellow);
    			
    			g.drawString("Verkackt du Noob!!", 130, 100);				//Eigene GameOver Meldung
    			g.drawString("^^", 150, 120);								//^^
    						
    			//Punkteausgabe
    			g.drawString("Erreicht: "+spieler.getScore()+" Punkte", 90, 160);	
    						
    			//Rängedefinition anhand der Punkte			
    			if(spieler.getScore() < 300) g.drawString("Noob!", 100, 190);
    			else if(spieler.getScore() < 600 && spieler.getScore() >= 300) g.drawString("Geht aber noch besser...", 100, 190);
    			else if(spieler.getScore() < 900 && spieler.getScore() >= 600) g.drawString("Übung macht den Meister, oder wie war das?", 100, 190);
    			else if(spieler.getScore() < 1200 && spieler.getScore() >= 900) g.drawString("Na, wird doch ;-)", 100, 190);
    			else if(spieler.getScore() >=1200) g.drawString("Tschüsch Lan!!", 100, 190);
    			
    			//Restart
    			g.drawString("Doppeklick, um nochmal zu spielen!", 20, 220);	
    			
    			gameStop = true;	//...da Spiel zuende
    		}
    	}
    	
    	public void update(Graphics g)
    	{
    		//Erstellung Doppelbuffer
    		if(dbImage == null)
    		{
    			dbImage = createImage(this.getSize().width, this.getSize().height);
    			dbg = dbImage.getGraphics();
    		}
    		
    		//Bild im BG löschen
    		dbg.setColor(getBackground());
    		dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
    		
    		//BG-Bild in FG
    		dbg.setColor(getForeground());
    		paint(dbg);
    		
    		//geladetes Bild zeichnen
    		g.drawImage(dbImage, 0, 0, this);
    			
    	}
    	
    	public boolean mouseDown(Event e, int x, int y)
    	{
    		if (!gameStop)							//Wenn das Spiel läuft...
    		{
    			if(roterBall.userHit(x, y))			//Test: Hit@rBall	
    			{
    				Treffer.play();				//Treffersound
    				roterBall.ballHit();			//Methode ballHit für rBall aufrufen
    			}									//->Zurücksetzen
    			if(blauerBall.userHit(x, y))		//same
    			{									//same
    				Treffer.play();					//same
    				blauerBall.ballHit();			//same
    			}
    		
    			else
    			{
    				Schuss.play();					//wenn keiner getroffen -> Schusssound
    			}
    		}
    		else if (gameStop && e.clickCount == 2)	//wenn Stop + Doppelklick
    		{
    			gameStop = false;					//Game startet
    			init();								//init() ausführen
    		}
    		return true;
    	}
    }
    
    Spieler

    Code:
    public class Spieler 
    {
    	
    	//Punkte und Lebensvariablen
    	private int score;
    	private int lives;
    	
    	//Kontruktor für Spieler
    	public Spieler()
    	{
    		lives = 10;
    		score = 0;
    	}
    	
    	//Punkteausgabe
    	public int getScore()
    	{
    		return score;
    	}
    	
    	//Lebensausgabe
    	public int getLives()
    	{
    		return lives;
    	}
    	
    	//Punkteaddition
    	public void addScore(int plus)
    	{
    		score += plus;
    	}
    	
    	//Lebensabzug
    	public void looseLife()
    	{
    		lives--;
    	}
    
    }
    und Ball

    Code:
    import java.applet.*;
    import java.awt.*;
    import java.util.*;
    import java.net.*;
    
    public class Ball 
    {
    	
    	//XYPos- + Speed- + Radiusvariablen
    	private int pos_x;
    	private int pos_y;
    	private int x_speed;
    	private int y_speed;
    	private int radius;
    	
    	//Startpunkt der Bälle
    	private int start_x;
    	private int start_y;
    	
    	//max. Geschw. der Bälle
    	private int maxspeed;
    	
    	//Variablen für Feldgrenzen (Größe: 380*380)
    	private final int x_links = 10;
    	private final int x_rechts = 370;
    	private final int y_unten = 45;
    	private final int y_oben = 370;
    	
    	//Farbe
    	Color color;
    	
    	//Out Audio	
    	AudioClip Out;
    	 
    	
    	//Verweis auf das Spielerobjekt
    	Spieler spieler;
    	
    	//Zufallszahlerstellendes Objekt
    	Random rnd = new Random();
    	
    	//Kontruktor
    	public Ball(int radius, int x, int y, int vx, int vy, int ms, Color color, AudioClip Out, Spieler spieler)
    	{
    		
    		//Variablendefinition
    		this.radius = radius;
    		
    		pos_x = x;
    		pos_y = y;
    		
    		start_x = x;
    		start_y = y;
    		
    		x_speed = vx;
    		y_speed = vy;
    		
    		maxspeed = ms;
    		
    		this.color = color;
    		//this.Out = Out;
    		this.spieler = spieler;
    		
    	}
    		
    	//Bewegungsmethode
    	public void move()
    	{
    		pos_x += x_speed;
    		pos_y += y_speed;
    		ballOut();
    	}
    	
    	//Bei Treffer aufgerufen, X/Y wird übergeben und auf Start zurückgesetzt
    	public void ballHit()
    	{
    		//Positionsreset
    		pos_x = start_x;
    		pos_y = start_y;
    		
    		//Flugrichtungsbestimmung (x-speed) - durch Zufall
    		x_speed = (rnd.nextInt()) % maxspeed;
    	}
    	
    	//Vektorielle Bestimmung des Balles & Maus und Bestimmung if (shot == true/false)
    	public boolean userHit(int maus_x, int maus_y)
    	{
    		//Vektorenbestimmung
    		double x = maus_x - pos_x;
    		double y = maus_y - pos_y;
    		
    		//Distanzberechnung
    		double entfernung = Math.sqrt((x*x) + (y*y));
    		
    		//Wenn Entfernung < 15 return: Treffer == true // Punkte ++	
    		if (entfernung < 15)
    		{
    			spieler.addScore (10*Math.abs(x_speed) + 10);
    			return true;
    		}
    		else return false;
    	}
    	
    	//Test, ob Ball außerhalb des Feldes ist
    	private boolean ballOut()
    	{
    		
    		//links raus
    		if(pos_x < x_links)
    		{
    			//Zurücksetzen
    			pos_x = start_x;
    			pos_y = start_y;
    			
    			//Audio			
    			Out.play();
    			
    		
    			//Flugrichtung neu berechnen - Zufall
    			x_speed = (rnd.nextInt()) % maxspeed;
    			
    			//Leben -1
    			spieler.looseLife();
    			
    			return true;		//Ball raus!
    		}
    		
    		//rechts raus
    		else if(pos_x > x_rechts)
    		{
    			//Zurücksetzen
    			pos_x = start_x;
    			pos_y = start_y;
    			
    			//Audio			
    			Out.play();
    			
    		
    			//Flugrichtung neu berechnen - Zufall
    			x_speed = (rnd.nextInt()) % maxspeed;
    			
    			//Leben -1
    			spieler.looseLife();
    			
    			return true;		//Ball raus!
    		}
    		
    		//oben raus
    		else if(pos_y < y_oben)
    		{
    			//Zurücksetzen
    			pos_x = start_x;
    			pos_y = start_y;
    			
    			//Audio
    			Out.play();
    			
    		
    			//Flugrichtung neu berechnen - Zufall
    			x_speed = (rnd.nextInt()) % maxspeed;
    			
    			//Leben -1
    			spieler.looseLife();
    			
    			return true;		//Ball raus!
    		}
    		
    		//unten raus
    		else if(pos_y > y_unten)
    		{
    			//Zurücksetzen
    			pos_x = start_x;
    			pos_y = start_y;
    			
    			//Audio
    			Out.play();
    			
    		
    			//Flugrichtung neu berechnen - Zufall
    			x_speed = (rnd.nextInt()) % maxspeed;
    			
    			//Leben -1
    			spieler.looseLife();
    			
    			return true;		//Ball raus!
    		}
    		else return false;
    	} 
    	
    	public void zeichnen(Graphics g)
    	{
    		g.setColor(color);
    		g.fillOval(pos_x - radius, pos_y - radius, 2 * radius, 2 * radius);
    	}
    
    }

    Bei der Ausführung (mit Eclipse SDK) zeigt es mir zwar den Startbildschirm an, allerdings wenn man dann Doppelklickt, um das Spiel zu starten kommt entweder eine Fehlermeldung
    Code:
    Exception in thread "Thread-8" java.lang.NullPointerException
    	at Ball.ballOut(Ball.java:153)
    	at Ball.move(Ball.java:71)
    	at Main.run(Main.java:88)
    	at java.lang.Thread.run(Unknown Source)
    oder das Spiel ist direkt beendet.
    Die Geschwindigkeit des Spiels/Threads habe ich schon versuchsweise runter- bzw hochgeschraubt, allerdings gab das auch keine Änderung...

    Ball.ballOut 153 entspricht
    Code:
    pos_y = start_y;
    Ball.move 71 entspricht
    Code:
    ballOut();
    und Main.run 88
    Code:
    roterBall.move();
    Der Ursprung des Problems dürfte also in Ball.ballOut() liegen:
    Code:
    private boolean ballOut()
    	{
    		
    		//links raus
    		if(pos_x < x_links)
    		{
    			//Zurücksetzen
    			pos_x = start_x;
    			pos_y = start_y;
    			
    			//Audio			
    			Out.play();
    			
    		
    			//Flugrichtung neu berechnen - Zufall
    			x_speed = (rnd.nextInt()) % maxspeed;
    			
    			//Leben -1
    			spieler.looseLife();
    			
    			return true;		//Ball raus!
    		}
    		
    		//rechts raus
    		else if(pos_x > x_rechts)
    		{
    			//Zurücksetzen
    			pos_x = start_x;
    			pos_y = start_y;
    			
    			//Audio			
    			Out.play();
    			
    		
    			//Flugrichtung neu berechnen - Zufall
    			x_speed = (rnd.nextInt()) % maxspeed;
    			
    			//Leben -1
    			spieler.looseLife();
    			
    			return true;		//Ball raus!
    		}
    		
    		//oben raus
    		else if(pos_y < y_oben)
    		{
    			//Zurücksetzen
    			pos_x = start_x;
    			pos_y = start_y;
    			
    			//Audio
    			Out.play();
    			
    		
    			//Flugrichtung neu berechnen - Zufall
    			x_speed = (rnd.nextInt()) % maxspeed;
    			
    			//Leben -1
    			spieler.looseLife();
    			
    			return true;		//Ball raus!
    		}
    		
    		//unten raus
    		else if(pos_y > y_unten)
    		{
    			//Zurücksetzen
    			pos_x = start_x;
    			pos_y = start_y;
    			
    			//Audio
    			Out.play();
    			
    		
    			//Flugrichtung neu berechnen - Zufall
    			x_speed = (rnd.nextInt()) % maxspeed;
    			
    			//Leben -1
    			spieler.looseLife();
    			
    			return true;		//Ball raus!
    		}
    		else return false;
    	} 


    Google zeigte mir auch nichts passendes zur NullPointerException an, daher frage ich mal hier und hoffe auf Kompetenz :bitte:

    Grüße

    Daniel
     
    Last edited: Jan 11, 2009
Thread Status:
Not open for further replies.

Share This Page