Snake JGameGrid Fatal Error bei bewegen der Snake

Objektorientierte Programmiersprache auf Basis einer virtuellen Maschine (https://www.oracle.com/java/)
Antworten
sashpta
Beiträge: 104
Registriert: Fr Dez 12, 2014 2:55 pm

Snake JGameGrid Fatal Error bei bewegen der Snake

Beitrag von sashpta » So Jun 21, 2015 10:47 am

Hey,
so bin jetzt ein kleines Stückchen weiter mit dem Spiel :D
jedoch habe ich jetzt ein neues Problem und zwar habe ich jetzt den Code hier

Code: Alles auswählen

import ch.aplu.jgamegrid.*;
import java.awt.Color;
import java.util.ArrayList;
import java.awt.event.KeyEvent;

public class Snake_0 extends GameGrid
{
	public Snake_0()
	{
		
		super(20 , 20 ,20, Color.darkGray, false);
		Snake snake = new Snake();
		
	
		addActor(snake, new Location(10, 10));
		snake.setDirection(Location.NORTH);

		addActor(new Mouse(), getRandomEmptyLocation());

		addKeyListener(snake);

		show();
		doRun();
		}


	public static void main(String[] args)
	{
		new Snake_0();
	}
}

// ______________ Snake ______________
class Snake extends Actor implements GGKeyListener
	{
		private ArrayList<TailSegment> tail = new ArrayList<TailSegment>();

		public Snake()
		{
			super(true, "sprites/snakeHead.gif");
		}

		public boolean keyPressed(KeyEvent evt)
		{
			switch (evt.getKeyCode())
			{
				case KeyEvent.VK_UP:
				setDirection(270);
				break;
				case KeyEvent.VK_RIGHT:
				setDirection(0);
				break;
				case KeyEvent.VK_LEFT:
				setDirection(180);
				break;
				case KeyEvent.VK_DOWN:
				setDirection(90);
				break;
			}
			move();
			tryToEat();

			return true;
		}

		public boolean keyReleased(KeyEvent evt)
		{
			return true;
		}

		public void initTail()
		{
			for (int i = 0; i < 3; i++)
    		{
      			TailSegment segment = new TailSegment();
      			gameGrid.addActor(segment, new Location(getX(), getY() + i + 1));
      			tail.add(segment);
    		}
		}

		public void act()
		{
			if (nbCycles == 0)
				initTail();

			int lastIndex = tail.size() - 1;
			for (int i = lastIndex; i > 0; i--)
				tail.get(i).setLocation(tail.get(i-1).getLocation());
			tail.get(0).setLocation(getLocation());
			move();
			

		}

		public void tryToEat() 
		{
			Actor mouse = gameGrid.getOneActorAt(getLocation(), Mouse.class);
			if (mouse != null)
				mouse.hide(); // seitdem ich die drei Schritte hier eingefügt hab kommt der Fehler :(
				mouse.setLocation(gameGrid.getRandomEmptyLocation());
				mouse.show();


		}

	
			
	}
		
class Mouse extends Actor
{
	public Mouse()
	{
		super("sprites/sMouse.gif");
	}
}


// ____________ Snake Schwanz ________

class TailSegment extends Actor
{
	public TailSegment()
	{
		super("sprites/snakeTail.gif");
	}
}
Wenn ich das Spiel nun starte und dann mit der Tastatur die Schlange bewegen möchte kommt immer die Meldung "JGameGrid Fatal Error" (siehe Anhang)
Das Problem tritt aber erst auf seitdem ich bei "public void tryToEat()" & im "public Snake_0()" was geändert habe

als noch alles ging war das "tryToEat()" noch so:

Code: Alles auswählen

 public void tryToEat()
          {
             Actor actor = gameGrid.getOneActorAt(getLocation(), Mouse.class);
             if (actor != null)
                actor.hide();
          }
und das "public Snake_0()" noch so:

Code: Alles auswählen

public Snake_0()
       {
          
          super(20 , 20 ,20, Color.darkGray, false);
          Snake snake = new Snake();
       
          addActor(snake, new Location(10, 10));
          snake.setDirection(Location.NORTH);

          for (int i = 0; i < 10; i++)   // die for Schleife ist jetzt weg 
             addActor(new Mouse(), getRandomEmptyLocation());

          addKeyListener(snake);

          show();
          doRun();
          }
Hab ihr ne Idee wie ich den Fehler beheben kann?
also ich wollte eigentlich, dass immer nur eine Maus da ist, wenn man diese gegessen hat, spawnt die woanders wieder, das die ganze Zeit bis irgendwann GameOver ist (so weit bin ich aber noch nicht^^)

falls ihr das was hilft hier noch mal der DropBox Link wo der Code und die Sprites drin sind https://www.dropbox.com/sh/1nxl69a63yi3 ... JEPga?dl=0
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von sashpta am So Jun 21, 2015 10:52 am, insgesamt 1-mal geändert.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Snake JGameGrid Fatal Error bei bewegen der Snake

Beitrag von cloidnerux » So Jun 21, 2015 10:51 am

Du solltest mal Klammern setzten.
Das ist dein Code, der Fehler macht.

Code: Alles auswählen

 public void tryToEat() 
      {
         Actor mouse = gameGrid.getOneActorAt(getLocation(), Mouse.class);
         if (mouse != null)
            mouse.hide(); // seitdem ich die drei Schritte hier eingefügt hab kommt der Fehler :(
         mouse.setLocation(gameGrid.getRandomEmptyLocation());
         mouse.show();
      }
Redundanz macht wiederholen unnötig.
quod erat expectandum

sashpta
Beiträge: 104
Registriert: Fr Dez 12, 2014 2:55 pm

Re: Snake JGameGrid Fatal Error bei bewegen der Snake

Beitrag von sashpta » So Jun 21, 2015 10:54 am

wo fehlen da denn Klammern?

sashpta
Beiträge: 104
Registriert: Fr Dez 12, 2014 2:55 pm

Re: Snake JGameGrid Fatal Error bei bewegen der Snake

Beitrag von sashpta » So Jun 21, 2015 1:35 pm

Oke hat sich gelöst, hab noch mal ein bisschen rum Probiert und siehe da es klappt wenn man "mouse.show();" und "mouse.hide();" weglässt :D

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Snake JGameGrid Fatal Error bei bewegen der Snake

Beitrag von cloidnerux » So Jun 21, 2015 4:17 pm

wo fehlen da denn Klammern?
https://www.proggen.org/doku.php?id=c:var:scopes
Ist zwar C, aber Syntaktisch das selbe.

Du hast folgenden Code:

Code: Alles auswählen

if (mouse != null)
    mouse.hide(); // seitdem ich die drei Schritte hier eingefügt hab kommt der Fehler :(
Der gleichbedeutend ist mit:

Code: Alles auswählen

if (mouse != null)
{
    mouse.hide(); // seitdem ich die drei Schritte hier eingefügt hab kommt der Fehler :(
}
Der sinn ist ja ganz klar, dass du im falle eines Fehler oder anderen Gründen, wenn mouse eben auf kein Objekt zeigt, den code nicht ausführen, da sonst ein Fataler Fehler ensteht.
Du nutzt hier noch die Tatsache aus, dass Java für nur ein Statement, das ausgeführt wird bei einem if, keine Klammern erfordert.

Jetzt hast du aber folgendes programmiert:

Code: Alles auswählen

if (mouse != null)
    mouse.hide(); // seitdem ich die drei Schritte hier eingefügt hab kommt der Fehler :(
mouse.setLocation(gameGrid.getRandomEmptyLocation());
mouse.show();
was gleichbedeutend ist mit

Code: Alles auswählen

if (mouse != null)
{
    mouse.hide(); // seitdem ich die drei Schritte hier eingefügt hab kommt der Fehler :(
}
mouse.setLocation(gameGrid.getRandomEmptyLocation());
mouse.show();
Damit wird mouse.setLocation und mouse.show immer aufgerufen, ob mouse nun ein gültiges Objekt ist oder nicht. das sorgt für den Fehler.
Um das zu beheben musst du klammern setzten:

Code: Alles auswählen

if (mouse != null)
{
    mouse.hide(); // seitdem ich die drei Schritte hier eingefügt hab kommt der Fehler :(
    mouse.setLocation(gameGrid.getRandomEmptyLocation());
    mouse.show();
}
Redundanz macht wiederholen unnötig.
quod erat expectandum

sashpta
Beiträge: 104
Registriert: Fr Dez 12, 2014 2:55 pm

Re: Snake JGameGrid Fatal Error bei bewegen der Snake

Beitrag von sashpta » So Jun 21, 2015 6:30 pm

Achso oke ja jetzt macht das Sinn, vielen Dank :)

Antworten