# Bekanntes Heli Spiel -> Aber Probleme damit



## TKing (8. Sep 2009)

Hallo,

habe zwar nicht so viel Erfahrung, aber was mir neu ist, ist das mit dem mov:akteur oder so. kA wie das funktioniert und warum man das genau macht.

Ich kann nämlich kein Bild anzeigen lassen:
folgender Grund:
@Override
public void paintComponent(Graphics g)//Frames anzeigen(*)
{
super.paintComponents(g);

g.setColor(Color.red);
g.drawString("FPS: "+Long.toString(fps),0,10);

if(akteur!=null)
{

for(Drawable draw:akteur)
{
draw.drawObject(g);
}
}
}

Der akteur kalppt nicht. Immer rot unterschlängelt und die Meldung heißt:
Type missmatch:connot convert form element type Sprite to Drawable

Aber warum nicht?

Bis jetzt kann hab ich noch nicht viel davon gemacht und will das Heli spiel ummodellieren in ein eigenes Game. Also bis jetzt hab ich nur das Fenster anzeigen lassen und die Grafik eingebunden. Mehr noch nicht.
FPS (ca. 170fps)werden im Fenster angezeigt(wenn der oben angegebene Part auskommentiert ist) jedoch das Bild nicht.

Noch eine Frage zum Bild:
Wenn man nur ein BIld hat mit 30*30 px geht das dann so in der

BufferedImage[] bomber = this.loadImage("pic/bomber.gif",1);?

Also ich weiß wirklich nicht weiter

Hoffe jemand kann mir hier helfen^^


----------



## ARadauer (8. Sep 2009)

> Type missmatch:connot convert form element type Sprite to Drawable


erbt/implementiert dein Sprite  Drawable?


----------



## TKing (8. Sep 2009)

aber wie soll ich das jetzt machen?

Irgendwie ist vererbung ja standart nur ich hab zur Zeit nen Black out oder nen Brett vorm Kopf...

sprich die Sprite Klasse wird glaub gar nciht benutzt....

also meinst du jetzt extends Sprite?

oder import?

Angesporchen wird es doch eh nur durch den vector oder liege ich da flasch?

Problem ist auch, dass meine Sprite ja implements Drawable sein muss... aber das geht nciht...wird class Sprite unterschlängelt...irgendwas passt einfach nicht
implements Drawable geht nur wenn icfh Sprite abstract mache, aber dann meckert wieder GamePanel


----------



## andre111 (8. Sep 2009)

Naja, das Sprite wird unterringelt wenn es nicht abstrakt ist, weil es dann die Methoden von Drawable (vermutlich draw(...)) implementieren muss.


----------



## TKing (8. Sep 2009)

Die Sprite will, dass ich diese methode erzeugen soll(sprich die aus der Drawable):
 	public void drawObject(Graphics g) {
		// TODO Auto-generated method stub

	}
Bringt auch kein Bild zum vorschein...

vllt noch etwas...warum werden meine FPS nicht erkennbar angezeigt? Sieht so aus als wenn die so shcnell wechseln würden, dass diese nicht mehr zu erkennen sind.
In der COnsole als ausgabe ganz normal im 60-70er Bereich


----------



## TKing (8. Sep 2009)

Jede Methode tut was...alle durchgetestet und es sieht auch alles ganz relevant und logisch aus..aber irgendwas dürfte trotzdem falsch sein


----------



## ARadauer (8. Sep 2009)

von welchem Heli Spiel redest du? Dem aus Quaxlis Tutorial?
Wenn ja musst du dir das halt nochmal ansehen. Du hast irgendwo einen Fehler ;-)


----------



## TKing (8. Sep 2009)

ja das mein ich(Quaxli)...das Problem ist aber irgendwie so, dass ich es nciht finde...und nochmal anfangen...hab ich eigentlich keine lust...aber es muss doch irgendwelche hinweise geben, wenn das Bild nicht angezeigt wird... Heli oder selbst ein 30*30 gif...


----------



## Gastredner (9. Sep 2009)

TKing hat gesagt.:


> Die Sprite will, dass ich diese methode erzeugen soll(sprich die aus der Drawable):
> public void drawObject(Graphics g) {
> // TODO Auto-generated method stub
> 
> ...


Wie sieht denn die Implementierung der Methode aus, vielleicht hast du da einen Fehler gemacht.


----------



## ARadauer (9. Sep 2009)

> ich eigentlich keine lust


also sollen wir deinen fehler suchen?


----------



## dayaftereh (9. Sep 2009)

Vieleicht Postest du mal den Code? Dann können wir die weiter Helfen, ich weiß das im Tutorial von Quaxlis ein paar Code Sprünge sind, die eine Anfänger nicht gleich sieht oder versteht.(ich gebe den Azubis gerne dieses Tutorial!)


----------



## TKing (9. Sep 2009)

gibt es hier bestimmte Vorschriften wie man den Code ins Forum schreibt?


----------



## andre111 (9. Sep 2009)

Ja, in den [noparse]
	
	
	
	





```
code
```
[/noparse]-tags.


----------



## TKing (9. Sep 2009)

GamePanel(sind überall Kommentare für mcih slebst zwischen)


```
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.*;



public class GamePanel extends JPanel implements Runnable
//Runnable = Um das Spiel in einem eigenen Thread laufen zu lassen
{
	private static final long serialVersionUID = 1L;
	boolean spiel_lauf = true; //für einen Schleifenabbruch der Spieleschleife(run())
	
	//Zeitmessung(flüssigen Spielelauf)
	long zeiterrechnung = 0;
	long letztezeit = 0;
	long fps = 0;
	
	Sprite man;
	Vector<Sprite> akteur;
	
	
	public static void main(String[] args) 
	{
		new GamePanel(800,600);//Größe von 800*600 festgelegt
	
	}
	
	public GamePanel(int width, int height)
	{
		//Fenster Eigenschaften:
		
		this.setPreferredSize(new Dimension(width,height));
		JFrame fenster = new JFrame("BomberMan");
		fenster.setLocation(100,100);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster.add(this);
		fenster.pack();//Hiermit wird das Fenster an die gewünschte Größe angepasst
		
		fenster.setVisible(true);
		UniqueLoad();
		fenster.setVisible(true);
	}
	
	public void UniqueLoad()//Einmaliges Laden(Bilder und Grafiken vorladen(Performance schub))
	{
		letztezeit = System.nanoTime();
//		System.out.println(letztezeit);
		akteur = new Vector<Sprite>();
		BufferedImage[] bomber = this.loadImage("pic/bomber.gif",1);
		System.out.println(akteur);
		man = new Sprite(bomber,20,20,100,this);//S.21
		akteur.add(man);
		System.out.println(akteur);
		
		Thread t = new Thread(this);//Spiel in ein Thread gepackt
		t.start();
	}
	public void run()//alle notwendigen Prüfungen werden in einer Schleife vorgenommen
	{
		while(spiel_lauf)
		{
			System.out.println("Spiellauf");
			schleifenBerechnung();
			checkEingabe();
			doLogic();
			
			moveObjectsOn();
			
			repaint();
			try
			{
				Thread.sleep(10);
			}
			catch(InterruptedException e)
			{
				JOptionPane.showMessageDialog(null, e);
			}
		}
	}
	private void schleifenBerechnung()
	{
		
		zeiterrechnung = System.nanoTime()-letztezeit;//Errechung des Schleifendurchlaufs(while(spiel_lauf))
//		System.out.println("zeiterrechnung"+zeiterrechnung);
		letztezeit = System.nanoTime();//aktuelle Systemzeit
//		System.out.println("letztezeit: "+letztezeit);
		fps = ((long) 1e9)/zeiterrechnung;//Frameratenberrechnung(*)
		
//			System.out.println("FPS: "+fps);
		
		
		

	}

	@Override
	public void paintComponent(Graphics g)//Frames anzeigen(*)
	{
		super.paintComponents(g);
		
		g.setColor(Color.red);
		g.drawString("FPS: "+Long.toString(fps),0,10);
//	System.out.println("paint Component");
		if(akteur!=null)
		{
//			System.out.println("paint Componentif");
			for(Drawable draw:akteur)
			{
				draw.drawObject(g);
//				System.out.println("paint Componentifdraw");
			}
		}
	}
	// Laden der Bilder in ein Array-> Für die Animation sowie die Berechnungen
	private BufferedImage[] loadImage(String path, int image)
	{
		BufferedImage[] anim = new BufferedImage[image];
		BufferedImage source = null;
		
		URL imageurl = getClass().getClassLoader().getResource(path);//Ermittlung der URL(Speicherort)
		try
		{
			source = ImageIO.read(imageurl);
		}
		catch(IOException ioe){}
	
		for(int x = 0;x<image;x++)
		{
			anim[x] = source.getSubimage(x*source.getWidth()/image, 0, source.getWidth()/image, source.getHeight());
		}
		
		return anim;
	}
	private void doLogic()
	{
		for(Moveable mov:akteur)
		{
			mov.doLogic(zeiterrechnung);
//			System.out.println("doLogic"+zeiterrechnung);
		}
	}
	private void moveObjectsOn()
	{
//		System.out.println("MoveObjectsOn");
		for(Moveable mov:akteur)
		{
			mov.move(zeiterrechnung);
//			System.out.println("MoveObjectsOnInderSchleife");
		}
	}
	private void checkEingabe()
	{
		
	}
	
	

}
```

Sprite:

```
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;
//import java.awt.geom.Rectangle2D.Double;
import java.awt.image.BufferedImage;


public class Sprite extends Rectangle2D.Double implements Moveable,Drawable
{

	private static final long serialVersionUID = 1L;
	long delay;//für Millisekunden
	long animation = 0;
	
	protected double dx;//Horizontale Veränderung +getters und setters
	protected double dy;//vertikale Veränderung +getters und setters
	
	GamePanel referenz;//Referenz auf das GamePanel
	
	BufferedImage[] image;//Bilderarray
	 int currentimage = 0;//Bildzähler (0 - n Bilder)
	 


	public Sprite(BufferedImage[] i,double x,double y,long delay, GamePanel gp)//void?!?!?
	 {
		 image = i;
		 this.x = x;
		 this.y = y;
		 this.delay = delay;
		 this.width = image[0].getWidth();//Benutzung gleich Großer Bilder
		 this.height = image[0].getHeight();//Benutzung gleich Großer Bilder
		 referenz = gp;
		 
	 }
	 
	
    public void drawObjects(Graphics g)//Bildzeichnung vom GamePanel übergebene Grafik
    {
    	g.drawImage(image[currentimage],(int)x,(int)y,null);//Problem gehabt wegen (int)
    ;
    }
	public void doLogic(long zeiterrechnung) 
	{
		animation += (zeiterrechnung/1000000);//dividiert durch 1 Mil. wegen Nanosekunden
		System.out.println(animation+"animation");
		if(animation > delay)
		{
			animation = 0;
			animationsBerechnung();//Hiermit ermitteln wir das nächste Bild
		}
	}

	public void move(long zeiterrechnung) //Wenn zeiterrechnung != null dann bewegen
	{
		if(dx!=0)
		{
			x += dx*(zeiterrechnung/1e9);
		}
		if(dy!=0)
		{
			y += dy*(zeiterrechnung/1e9);
		}
		
	}
	private void animationsBerechnung()
	{
		currentimage++;
		if(currentimage >= image.length)//Fehlervermeidung der aktuellen Animation/Bild[Array]
		{
			currentimage = 0;
		}
			
	}

	public void setVerticalSpeed(double d)
	{
		dy = d;
	}
	public void setHorizontalSpeed(double d)
	{
		dx = d;
	}
	public double getVerticalSpeed()
	{
		return dy;
	}
	public double getHorizontalSpeed()
	{
		return dx;
	}


	public void drawObject(Graphics g) {
		
		
	}

}
```

Drawable

```
import java.awt.Graphics;

public interface Drawable 
{
	public void drawObject(Graphics g);
	
}
```

und Moveable:


```
public interface Moveable 
{
	public void doLogic(long zeiterrechnung);
	public void move(long zeiterrechnung);
}
```

Vielleicht findet jemand miene dummen Fehler...würdm ich aber freuen... einfach aufgeben ist nicht richtig


----------



## Gastredner (10. Sep 2009)

Dein Code aus [c]drawObjects(...)[/c] gehört in die Methode [c]drawObject(...)[/c]. 
Gab es überhaupt jemals eine [c]drawObjects(...)[/c] im Tutorial? Erinnere mich irgendwie nicht daran...


----------



## TKing (10. Sep 2009)

nur wenn ich die rausnehme kann ich nicht implements Drawable machen...also das war nur ne notlösung, die dazu dient, dass das progi einfach startet
wenn diese nciht existiert, dann ist halt die klasse Sprite und Implements Drawable unterschlängelt...warum auch immer...


----------



## Gastredner (10. Sep 2009)

Ah, war auch Unsinn: Ich hab mir das Tutorial grad nochmal angesehen - dein Fehler ist ein einfacher Schreibfehler!
Die Methode des Interfaces Drawable heißt drawObjects, nicht drawObject. Ändere die Deklaration im Interface und korrigiere die Aufrufe der fehlerhaft benannten Methode.


----------



## TKing (11. Sep 2009)

:lol: ... Danke:-* hast mir echt weitergeholfen... war ja gott sei dank echt nur ein dumer Fehler echt super Hilfe


----------



## TKing (11. Sep 2009)

Mein Problem ist jetzt ja eigentlich behoben nur was mich stört ist die fps anzeige die Wirklich komisch dargestellt wird. Sprich es sieht so aus als wenn die zahlen so shcnell wechseln, dass es nichtmal so shcnell angezeigt werden kann... auch ein Fehler oder Schicksal?


----------



## Zenic (11. Sep 2009)

Selber Fehler.

```
public void paintComponent(Graphics g)//Frames anzeigen(*)
    {
        super.paintComponents(g); //<-- das s ist zuviel
        ...
    }
```
Das s weg, dann sollte es Richtig angezeigt werden.


----------



## TKing (13. Sep 2009)

danke shconmal für die ganze Hilfe hier echt mal nen Hammer Forum^^ auch wenns für euch nur eine Kleinigkeit ist. Eine Frage gibt es noch...wie kriege ich immer die genaue Position meines wandernden objektes(zb. Heli) im spiel raus?


----------



## andre111 (13. Sep 2009)

Damit:

```
Sprite actor = new Sprite(...);
double xPosition = actor.getX();
double yPosition = actor.getY();
```


----------



## radiac (13. Sep 2009)

noch ein Quaxli Tutorial User .

Ich kenn das Tutorial jetzt mittlerweile innen und auswendig. Wenn du Fragen hast, kannst du mich auch fragen .


----------



## andre111 (13. Sep 2009)

Naja, ich schreib grad eine kleine Gameengine für 2D Spiele (mit dem ungefähren Ansatz von Quaxli ).


----------



## TKing (14. Sep 2009)

Ich wollte das Tutorial ein wenig umändern und daraus BomberMan programmieren. geschafft habe ich bis jetzt, dass mein mänchen läuft(änlich wie der heli), jedoch wenn ich eine bombe setzte/lege weiß ich nicht wie die nach einer gewissen Zeit wieder verschwinden soll...
sprich explodieren soll...und man keine andere bombe über eine bereits gelegte legen kann:

```
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.*;

import view.GamePanelView;

import mdInterface.Drawable;
import mdInterface.Moveable;



public class GamePanel extends JPanel implements Runnable,KeyListener
//Runnable = Um das Spiel in einem eigenen Thread laufen zu lassen
{
	private static final long serialVersionUID = 1L;
	boolean spiel_lauf = true; //für einen Schleifenabbruch der Spieleschleife(run())
	boolean gestartet = false;
	boolean once = false;
	
	//Zeitmessung(flüssigen Spielelauf)
	long zeiterrechnung = 0;
	long letztezeit = 0;
	long fps = 0;
	
	//die Steuerung:
	boolean up = false;
	boolean down = false;
	boolean right = false;
	boolean left = false;
	boolean bombe = false;
	int geschwindigkeit = 200;//für die Geschwindigkeit unseres bewegten Objects
	
	BomberMan man;//wegen abstract in Sprite
	Bombe bom;
	Vector<Sprite> akteur;
	
	public static void main(String[] args) 
	{
		new GamePanel(800,600);//Größe von 800*600 festgelegt
	}
	public GamePanel(int width, int height)
	{
		//Fenster Eigenschaften:
		
		this.setPreferredSize(new Dimension(width,height));
		this.setBackground(Color.gray);
		JFrame fenster = new JFrame("BomberMan");
		fenster.setLocation(100,100);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster.addKeyListener(this);
		this.add(new JLabel("1.Zum starten: Enter drücken"+"----->"+
							"2.Zum Thread beenden: ESC drücken"+"----->"+
							"3.Zum Spiel beenden: nochmal ESC drücken"));
		fenster.add(this);
		fenster.pack();//Hiermit wird das Fenster an die gewünschte Größe angepasst
		
		fenster.setVisible(true);
		UniqueLoad();
		fenster.setVisible(true);
	}
	
	//Bilderstrings
	String heli = "heli.gif";
	String bomberman = "bomber.gif";
	String bombeone = "bombe.gif";
	
	
	public void UniqueLoad()//Einmaliges Laden(Bilder und Grafiken vorladen(Performance schub))
	{
		letztezeit = System.nanoTime();
		akteur = new Vector<Sprite>();
		
		BufferedImage[] bomber = this.loadImage("pic/"+bomberman,1);
		man = new BomberMan(bomber,400,300,50,this);
		akteur.add(man);
		
		if(!once ==true)//verhindert,dass nach jedem Neustart ein neuer Thread aufgemacht wird
		{
			once=true;
			Thread t = new Thread(this);//Spiel in ein Thread gepackt
			t.start();//und gestartet
		}
	
	}
	public void run()//alle notwendigen Prüfungen werden in einer Schleife vorgenommen
	{
		while(spiel_lauf)
		{
			schleifenBerechnung();
			
			if(isGestartet())
			{
				checkEingabe();
				doLogic();
				moveObjectsOn();
			}
			repaint();
			try
			{
				Thread.sleep(1);
			}
			catch(InterruptedException e)
			{
				JOptionPane.showMessageDialog(null, e);
			}
		}
	}
	private void schleifenBerechnung()
	{
		
		zeiterrechnung = System.nanoTime()-letztezeit;//Errechung des Schleifendurchlaufs(while(spiel_lauf))
		letztezeit = System.nanoTime();//aktuelle Systemzeit
		fps = ((long) 1e9)/zeiterrechnung;//Frameratenberrechnung(*)
	}

	@Override
	public void paintComponent(Graphics g)//Frames anzeigen(*)
	{
		super.paintComponent(g);
		
		g.setColor(Color.red);
		g.drawString("FPS: "+Long.toString(fps),0,10);
		
		//nach Spielbeginn wird erst gezeichnet:
		if(!isGestartet())
		{
			return;
		}
		if(akteur!=null)
		{
			for(Drawable draw:akteur)
			{
				draw.drawObjects(g);
			}
		}
	}
	// Laden der Bilder in ein Array-> Für die Animation sowie die Berechnungen
	private BufferedImage[] loadImage(String path, int image)
	{
		BufferedImage[] anim = new BufferedImage[image];
		BufferedImage source = null;
		
		URL imageurl = getClass().getClassLoader().getResource(path);//Ermittlung der URL(Speicherort)
		try
		{
			source = ImageIO.read(imageurl);
		}
		catch(IOException ioe){}
	
		for(int x = 0;x<image;x++)
		{
			anim[x] = source.getSubimage(x*source.getWidth()/image, 0, source.getWidth()/image, source.getHeight());
		}
		
		return anim;
	}
	private void doLogic()
	{
		for(Moveable mov:akteur)
		{
			mov.doLogic(zeiterrechnung);
		}
	}
	private void moveObjectsOn()
	{
		for(Moveable mov:akteur)
		{
			mov.move(zeiterrechnung);
		}
	}
	private void checkEingabe()
	{
		if(up)
		{
			man.setVerticalSpeed(-geschwindigkeit);
		}
		if(down)
		{
			man.setVerticalSpeed(geschwindigkeit);
		}
		if(right)
		{
			man.setHorizontalSpeed(geschwindigkeit);
		}
		if(left)
		{
			man.setHorizontalSpeed(-geschwindigkeit);
		}
		//falls losgelassen wird dann soll er stoppen
		if(!left && !right)
		{
			man.setHorizontalSpeed(0);
		}
		if(!up && !down)
		{
			man.setVerticalSpeed(0);
		}
		//Man kann keine Bewegungen gleichzeitig drücken:
		if(down && left || down && right || up && left || up && right || right && left || up && down)
		{
			man.setVerticalSpeed(0);
			man.setHorizontalSpeed(0);
		}
	}
	
	//Automatisch ertsellt durch den KeyListener
	//Die Vorgehensweise stellt sicher, dass alles immer klappt(nihct in der Keylistener Klasse gemacht)
	
	public void keyPressed(KeyEvent ke) 
	{
		if(ke.getKeyCode()==KeyEvent.VK_UP)
		{
			up = true;
			
		}
		if(ke.getKeyCode()==KeyEvent.VK_DOWN)
		{
			down = true;
		}
		if(ke.getKeyCode()==KeyEvent.VK_LEFT)
		{
			left = true;
		}
		if(ke.getKeyCode()==KeyEvent.VK_RIGHT)
		{
			right = true;
		}
		if(ke.getKeyCode()==KeyEvent.VK_0)
		{
			bombe = true;
			
			createBombe();
			
		}
	}
	public void keyReleased(KeyEvent ke) 
	{
		if(ke.getKeyCode()==KeyEvent.VK_UP)
		{
			up = false;
		}
		if(ke.getKeyCode()==KeyEvent.VK_DOWN)
		{
			down = false;
		}
		if(ke.getKeyCode()==KeyEvent.VK_LEFT)
		{
			left = false;
		}
		if(ke.getKeyCode()==KeyEvent.VK_RIGHT)
		{
			right = false;
		}
		if(ke.getKeyCode()==KeyEvent.VK_0)
		{
			bombe = false;
		}
		if(ke.getKeyCode()==KeyEvent.VK_ENTER)
		{
			if(!isGestartet())
			{
				UniqueLoad();
				setGestartet(true);
			}
		}
		if(ke.getKeyCode()==KeyEvent.VK_ESCAPE)
		{
			if(isGestartet())
			{
				setGestartet(false);
//				System.exit(0);
			}
			else
			{
				setGestartet(false);
				System.exit(0);
				
			}
		}
	}
	
	public void keyTyped(KeyEvent ke) 
	{
	
	}
	public boolean isGestartet() 
	{
		return gestartet;
	}
	public void setGestartet(boolean gestartet) 
	{
		this.gestartet = gestartet;
	}
	boolean bomesetzten = false;
	
	public void createBombe()
	{
		BufferedImage[] bombearray = this.loadImage("pic/bombe.gif",4);		
		
		double xx = man.getX();
		double yy = man.getY()+30;
		
		Bombe bom= new Bombe(bombearray,xx,yy,50,this);
		akteur.add(bom);	
	}
}
```

in der createBombe() wird eine bombe erstellt und an der position des Mänchen gesetzt... wie kann ich die nächste bombe so erstellen, dass wenn in dem Bereich schon eine gelegt ist keine weitere gelegt werden kann?


----------



## Quaxli (14. Sep 2009)

Laß Dir was einfallen und probiere, ob es funktioniert. So lernt man programmieren.
Das ist jetzt nicht böse gemeint: Die Grundlagen für Dein Problem stehen im Tutorial, der Rest ist kreatives Denken. Wenn Du Dir alles vorkauen läßt, kommst Du nur sehr langsam auf einen grünen Zweig.

Aber um die Frage zu beantworten:

Es gibt verschiedene Möglichkeiten:
- Du speicherst alle Bomben in einer eigenen Collection und prüfst, ob eine die gleichen bzw. annähernd gleichen Koordinaten hat.
- Du loopst über alle Objekte in der Collection, in der die Sprites sind und wenn eines davon eine Bombe ist, prüfst Du die Koordinaten
- Du könntest auch im Hintergrund ein Raster vorhalten, in das die Bomben gelegt werden können und prüfst gegen das. 
- etc. etc.


----------



## TKing (14. Sep 2009)

danke schonmal... ja so ein raster ist echt ne gute idee...
gibt es irgendwelche bestimmten methoden oder kannste mir noch ein Tipp geben wie ich da anfangen soll?


----------



## Quaxli (14. Sep 2009)

Da hast Du Dir gleich den anspruchsvollsten Vorschlag ausgeguckt,  den die Lösung beinhaltet auch, daß sich die Bewegung des Spielers am Raster orientiert.
Und nein, da gibt es nix Fertiges. Ich mache so etwas meistens mit einem 2-dimensionalen Array aus Rechtecken, das ich in eine eigene Klasse packe und mir die benötigten Methoden dazu schreibe.


----------



## TKing (15. Sep 2009)

so hab das mit dem raster erstmal hinbekommen, dass der nur auf bestimmten punkten gehen kann.. danke nochmal 

bräuchte aber nochmal ganz kurz eure hilfe. habe jetzt das problem, dass ich nich mehr weiter weiß bei den bomben.. wollte, dass die 3 sekunden angezeigt werden und dann explodieren - dazu müssen die ja gelöscht werden.. aber wie genau geht das, dass der genau 3 sekunden wartet und dann das objekt gelöscht wird? was genau muss ich da abfragen? mit thread.sleep gehts schonma nich weil der dann natürlich nicht mehr weiterlaufen kann..

Das nächste problem, bei dem ihr mir vllt helfen könnt, ist, dass ich nicht weiß, wie ich bei bomberman abfragen kann, dass der nicht über gewisse felder laufen kann.. hab das alles mithilfe eines arrays gelöst - also das spielfeld ist ein array und wenn ich z.b. die taste links gedrückt halte, fragt der ständig ab, ob links neben der figur schon ein objekt (ein stein oder bombe) existiert.. das geht auch alles super bis dahin, aber wenn zwischen dem spieler und dem gegenstand genau 1 platz frei ist, kann der über das objekt laufen und ich weiß echt nich warum  habe mir zwischendurch immer die positionen des arrays ausgeben lassen und habe dann festgestellt, dass, wenn ich z.b. bei der position 7 starte und nach links rübergehe, erst die 5 ausgegeben wird und dann 4 usw.

kann euch ja mal den code posten

danke schonmal im voraus


```
public boolean checkObenmoeglich() 
	{
		boolean moeglich = true;

		int x = (int) ((man.getX() + man.getX() + 50) / 100);
		int y = (int) ((man.getY() + man.getY() + 50) / 100);

		if (steinarray[x][y - 1] != null)
			moeglich = false;

		return moeglich;
	}
	


	public boolean checkRechtsmoeglich() 
	{
		boolean moeglich = true;

		int x = (int) ((man.getX() + man.getX() + 50) / 100);
		int y = (int) ((man.getY() + man.getY() + 50) / 100);

		if (steinarray[x + 1][y] != null)
			moeglich = false;

		return moeglich;
	}

	public boolean checkUntenmoeglich() 
	{
		boolean moeglich = true;

		int x = (int) ((man.getX() + man.getX() + 50) / 100);
		int y = (int) ((man.getY() + man.getY() + 50) / 100);

		if (steinarray[x][y + 1] != null)
			moeglich = false;

		return moeglich;
	}


	public boolean checkLinksmoeglich() 
	{
		boolean moeglich = true;

		int x = (int) ((man.getX() + man.getX() + 50) / 100);
		int y = (int) ((man.getY() + man.getY() + 50) / 100);

		if (steinarray[x - 1][y] != null)
			moeglich = false;

		System.out.println(x);

		return moeglich;
	}

	
	
	//Automatisch ertsellt durch den KeyListener
	//Die Vorgehensweise stellt sicher, dass alles immer klappt(nihct in der Keylistener Klasse gemacht)
	
	public void keyPressed(KeyEvent ke) 
	{
		if(ke.getKeyCode()==KeyEvent.VK_UP)
		{
			up=true;
			if(!checkObenmoeglich())
				up=false;
		}
		if(ke.getKeyCode()==KeyEvent.VK_DOWN)
		{
			down = true;
			if(!checkUntenmoeglich())
				down=false;
		}
		if(ke.getKeyCode()==KeyEvent.VK_LEFT)
		{			
			if(!checkLinksmoeglich())
				left=false;
			else
				left=true;	
		}
		if(ke.getKeyCode()==KeyEvent.VK_RIGHT)
		{
			right = true;
//			System.out.println("xwert"+(int)(man.getX()+man.getX()+50)/100);
//			System.out.println("ywert"+(int)(man.getY()+man.getY()+50)/100);
//			
//			System.out.println(spielfeldArray[(int)(man.getX()+man.getX()+50)/100][(int)(man.getY()+man.getY()+50)/100]);
			
			if(!checkRechtsmoeglich())
				right=false;
		}
```


----------



## Quaxli (16. Sep 2009)

Für die Bomben fallen mir 2 Möglichkeiten ein:

1. Du bastelst Dir eine Funktionalität "innerhalb der Bombe" welche die Zeit überprüft
2. Du steuerst das ganze über die Animation und verwendest entsprechend viele Bilder.

Der 1. Vorschlag ist vermutlich der praktikablere.


----------



## TKing (17. Sep 2009)

ich bin hier echt am verzweifeln....ich weiß nicht wie ich die explosionsgrafik einblenden soll, wenn die bombe explodieren soll...Timer funktioniert nicht, Thread weiß ich nicht wie man dort nur eine Methode starten soll...
es ...
Klasse Bombe:

```
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;


public class Bombe extends Sprite 
{
	private static final long serialVersionUID = 1L;
	
	Rectangle2D.Double target;
	boolean locked = false;
	boolean imageSchonDreiGewesen=false;
	BufferedImage[] i;
	int xbombe = referenz.xbombe;
	int ybombe = referenz.ybombe;
	
	
	public Bombe(BufferedImage[] i, double x, double y, long delay, GamePanel gp) 
	{
		super(i, x, y, delay, gp);
	}
	

	@Override
	public void doLogic(long zeiterrechnung) 
	{
		super.doLogic(zeiterrechnung);
		referenz.bombeSchonDa=true;
//		referenz.steinarray[0][0]=null;
//		referenz.akteur.removeElement(referenz.steinarray[0][0]);
		if(currentimage==3)
		{
			imageSchonDreiGewesen=true;			
		}
		if(imageSchonDreiGewesen==true&&currentimage==0)
		{
//			referenz.createExplosion();
			referenz.bombeSchonDa=false;
			remove=true;	
			
			referenz.bombenarray[(int)referenz.xbombe][(int)referenz.ybombe] = null;
```

Methode create Bombe:


```
public void createBombe()
	{
		BufferedImage[] bombebilderarray = this.loadImage("pic/bombe.gif",4);
		BufferedImage[] explosionbilderarray = this.loadImage("pic/explosionmitte.gif",1);	
		
		double x = man.getX();
		double y = man.getY();
				              
		xbombe = (int) ((man.getX() + man.getX() + 50) / 100);
		ybombe = (int) ((man.getY() + man.getY() + 50) / 100);
		
		bombenarray[xbombe][ybombe] = new Bombe(bombebilderarray,x,y,1000,this);
		bombenarray[xbombe+2][ybombe] = new Bombe(explosionbilderarray,x+100,y,1000,this);
//		slib.playSound("Name:Booom");
		akteur.add(bombenarray[xbombe][ybombe]);
		akteur.add(bombenarray[xbombe+2][ybombe]);
//		timer.schedule  ( new Task(), 4000);
	
//		steinarray[i][k] = new Stein(stein,i*50,k*50,100,this);
//		akteur.add(steinarray[i][k]);

		
	}
```

und hierbei weiß ich nicht wie ich die explosionsgrafiken nach dem verschwinden der bombe laden soll...
Wenn ich eine neue Methode dafür ertselle, dann kommt immer ein Fehler... mit demTimer funktionierts auch irgendwie nicht, sprich mit Timertask kann ich die ganzen Bilderarrays nicht einbinden.???:L


----------

