Vogelspiel

Status
Nicht offen für weitere Antworten.

Hatsch

Mitglied
Hi ich hätt da ma ne frage. Ich will ein java applet erstellen wo ein vogel früchte einsammeln soll. alles soweit in ordnung aber aus irgend einem grund erscheint die frucht nicht zufällig und das mit der kollision krieg ich irgendwie nicht hin. Könnte mir jemand zufällig helfen? Das ist der Quelltext bis jetzt:




Code:
import java.awt.*;          //Java Packete
import java.applet.*;
import java.awt.event.*;
import java.util.Random;

public class vogelfrucht extends java.applet.Applet implements Runnable 
{ private int xa,ya;                //Position des Vogels
  private int xb,yb;                //Position der Frucht   
  private int richtung;             //Bewegung des Vogels
  private int gesamtbreite;         //Breite des Applets
  private int gesamthöhe;           //Höhe des Applets
  private boolean verloren;         
  private int spielstand;           // Spielstand
  private Image vogel;              // Zu zeichnender Vogel
  private Image frucht;             // Zu zeichnende Frucht
  

Thread th; 
   int counter = 0;         //Zeit

   
public void init() 
{
spielstand = 0;
verloren=false;
vogel   = getImage(getCodeBase(), "vogelflug.gif");
frucht  = getImage(getCodeBase(), "frucht.gif");
setBackground(Color.black);

gesamtbreite=this.size().width;
gesamthöhe=this.size().height; 
    zufallszahl(); 
    richtung=0;   //Vogel bewegt sich am Anfgang nicht
    xa=50;        //Position des Vogels
    ya=200;
    th = new Thread(this); 
    th.start();}

    // Zufallszahl für Frucht-position
    
public void zufallszahl() {
    Random r = new Random();
    int xb = r.nextInt(400);
    int yb = r.nextInt(250);
}
  


    //Grafiken und Schriftzüge
public void paint(Graphics g) {
  if (verloren==true){  //Bei Spielende (Nach einer Minute)
    g.setFont(new Font("Arial",Font.ITALIC|Font.BOLD, 24));
    g.setColor(Color.white);
    g.drawString("Spiel vorbei... "+ spielstand +" Früchte gesammelt!",50,200);}    
  else{
      g.drawImage(vogel , xa, ya, this);        //Vogel wird gemalt
      g.drawImage(frucht, xb, yb, this);        //Frucht wird gemalt
      g.setColor(Color.white);                  //Counter
      g.drawString(counter + " Zeit(bis 3750(1 Minute))", 10,490);  // Zeit bis Spielende
      g.drawString("Spielstand: " + spielstand, 200, 490);          //Spielstand

}

} 

    //Kollision


    //Bewegungen + timer
public void run() 
{ 
while(true) 
{ 
try 
{ 
if (richtung==1){       //oben
ya--;}
if (richtung==2){       //unten
ya++;}
if (richtung==3){       //links
xa--;}
if (richtung==4){       //rechts
xa++;}
if (ya==gesamthöhe-75){     //wenn zu weit unten, dann gehts wieder nach oben
richtung=1;} 
if (ya==0){                 //wenn zu weit oben, dann gehts wieder nach unten  
richtung=2;}                
if (xa==gesamtbreite-50){   //wenn zu weit rechts, dann gehts wieder nach links
richtung=3;}                
if (xa==0){                 //wenn zu weit unten, dann gehts wieder nach rechts
richtung=4;}                
Thread.sleep(10); 
counter++;
if (counter==3750){verloren=true;} // Nach einer minute

 
repaint(); 
} 
catch(Exception ex){} 
}
}
        //bewegungen
    public boolean keyDown(Event e,int key) {
       //Fokus muss im Applet sein
        switch(key){
           
            case Event.UP: richtung=1;      //Pfeiltaste nach oben
            break;
            case Event.DOWN: richtung=2;    //Pfeiltaste nach unten
            break;
            case Event.LEFT: richtung=3;    //Pfeiltaste nach links
            break;
            case Event.RIGHT: richtung=4;   //Pfeiltaste nach rechts
            break;}

       
        
        repaint();
        return true;
    }

}

Edit: jo sry, also ich hab ja das gif "frucht" das sich nach xb und yb richtet und mit der methode zufallszahl an eine zufällige stelle im applet erscheinen soll. Leider erscheint es aber immer an der linken oberen ecke.
Mein 2. problem ist das ich das nicht ganz hinbekomme wenn frucht und vogel sich treffen die frucht verschwindet, und an eine neue zufällige stelle kommt.
 
T

tuxedo

Gast
Was Code-Tags sind weißt du hoffentlich, oder? Wenn ja, warum benutzt du sie nicht? --> Beitrag editieren und Code-Tags einfügen ....

Eine genauere Beschreibung wo und warum das nicht so klappt wie du es vor hast würde auch helfen.

- Alex
 

Marco13

Top Contributor
Code:
public void zufallszahl() {
    Random r = new Random();
    int xb = r.nextInt(400);
    int yb = r.nextInt(250);
}
Dort werden schonmal LOKAL (d.h. nur in der Methode) Variablen xb, yb definiert - die haben mit denen, die weiter oben stehen, nichts zu tun. Das müßte
Code:
public void zufallszahl() {
    Random r = new Random();
    xb = r.nextInt(400);
    yb = r.nextInt(250);
}
lauten.

Ob sich die beiden Bilrder überschneiden, kannst du rausfinden, indem zu für beide Bilder ein "Rectangle" erstellst, und dann rectangleVogel.intersects(rectanlgeFrucht) überprüfst....
 

Hatsch

Mitglied
sry ich bin ein bisschen nervtötend aber könnte mir jemand n beispiel aufbau ein rectangle zeigen. ich bin noch relativ grün hinter den ohren und weiß weder wie man sowas macht noch find ich im internet sonst irgendwelche beispiele an denen ich mich orientieren könnte. :(

Danke im Vorraus für eure mühen
 

Dagobert

Bekanntes Mitglied
Da ich mich damit zur zeit auch beschäftige hab ich dir das zusammengebastelt:
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;
import javax.swing.JLabel;


public class RectangelDemo extends JLabel {
	
	Rectangle2D.Double r1;		// 2 Rechtecke
	Rectangle2D.Double r2;
	
	boolean ueberschneidung;	// Gibt an ob eine Überschneidung vorliegt
	
	public static void main(String arg[]){
		new RectangelDemo(800, 600);
	}
	
	public RectangelDemo(int w, int h){
		JFrame frame = new JFrame();			//Fenster
		frame.setSize(new Dimension(w, h));
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		setPreferredSize(new Dimension(w,h));
		frame.add(this);
		
		r1 = new Rectangle2D.Double(0, 150, 50, 50);		// Postionen und Größe der Rechtecke
		r2 = new Rectangle2D.Double(500, 150, 50, 50);		// (x, y, w, h)
		ueberschneidung = false;
		while(r2.getX()>getX()){							// Solange laufen lassen, bis das zweite Rechteck am linken Fensterrand angekommen ist
			if(r1.intersects(r2)){							// Auf Überschneidung prüfen
				System.out.println("Überschneidung");
				ueberschneidung = true;
			}else{
				ueberschneidung = false;
			}
			r1.x++;								// Die beiden Rechtecke aufeinander zulufen lassen
			r2.x--;
			repaint();							// Das ganze neuzeichnen
			try {
				Thread.sleep(25);				// Pause (für bessere darstellung)
			} catch (InterruptedException e) {
				// do nothing
				e.printStackTrace();
			}
		}
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setColor(Color.black);		
		if(ueberschneidung){		// Bei Überschneidug Farbe ändern
			g.setColor(Color.red);
		}
		//Zeichen der beiden Rechtecke
		g.drawRect((int)r1.getX(), (int)r1.getY(), (int)r1.getWidth(), (int)r1.getHeight());
		g.drawRect((int)r2.getX(), (int)r2.getY(), (int)r2.getWidth(), (int)r2.getHeight());
	}
}

Natürlich must du bei dir die Größe der Rechtecke auf deine Grafiken anpassen.

mfg. Dagobert
 

Hatsch

Mitglied
also letztenendes ist das hier mein quelltext

Code:
import java.awt.*;          //Java Packete
import java.applet.*;
import java.awt.event.*;
import java.util.Random;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;


public class vogelfrucht extends java.applet.Applet implements Runnable 
{ private int xa,ya;                //Position des Vogels
  private int xb,yb;                //Position der Frucht   
  private int richtung;             //Bewegung des Vogels
  private int gesamtbreite;         //Breite des Applets
  private int gesamthöhe;           //Höhe des Applets
  private boolean verloren;         
  private int spielstand;           // Spielstand
  private Image vogel;              // Zu zeichnender Vogel
  private Image frucht;             // Zu zeichnende Frucht
  Rectangle2D.Double rectangleVogel;            // 2 Rechtecke
  Rectangle2D.Double rectangleFrucht;

Thread th; 
   int counter = 0;         //Zeit

   
public void init() 
{
spielstand = 0;
verloren=false;
vogel   = getImage(getCodeBase(), "vogelflug.gif");
frucht  = getImage(getCodeBase(), "frucht.gif");
setBackground(Color.black);

gesamtbreite=this.size().width;
gesamthöhe=this.size().height; 
    richtung=0;   //Vogel bewegt sich am Anfgang nicht
    xa=50;        //Position des Vogels
    ya=200;
    xb=0;
    yb=0;
    zufallszahl();
    th = new Thread(this); 
    th.start();
rectangleVogel = new Rectangle2D.Double(xa, ya, 80, 60);      // Postionen und Größe der Rechtecke
rectangleFrucht = new Rectangle2D.Double(xb, yb, 35, 35);
}




     // Zufallszahl für Frucht-position  
public void zufallszahl() {
    Random r = new Random();
    xb = r.nextInt(400);
    yb = r.nextInt(250);
    repaint();
}
  


    //Grafiken und Schriftzüge
public void paint(Graphics g) {
  if (verloren==true){  //Bei Spielende (Nach einer Minute)
    g.setFont(new Font("Arial",Font.ITALIC|Font.BOLD, 24));
    g.setColor(Color.white);
    g.drawString("Spiel vorbei... "+ spielstand +" Früchte gesammelt!",50,200);}    
  else{
      //Vogel wird gemalt
      g.drawImage(vogel , xa, ya, this);        
      //Frucht wird gemalt
      g.drawImage(frucht, xb, yb, this);    
      g.setColor(Color.white);                  //Counter
      g.drawString(counter + " Zeit(bis 3750(1 Minute))", 10,490);  // Zeit bis Spielende
      g.drawString("Spielstand: " + spielstand, 200, 490);          //Spielstand
      
}

} 

    //Kollision
public void check(){
    if (rectangleVogel.intersects(rectangleFrucht)){    //Wenn der Vogel die Frucht eingesammelt hat
    zufallszahl();                                      //Frucht wird neu positioniert
    spielstand++;                                       //Man erhält einen Punkt
    
}                                    
}


    //Bewegungen + timer
public void run() 
{ 
while(true) 
{ 
try 
{ 
if (richtung==1){       //oben
ya--;}
if (richtung==2){       //unten
ya++;}
if (richtung==3){       //links
xa--;}
if (richtung==4){       //rechts
xa++;}
if (ya==gesamthöhe-75){     //wenn zu weit unten, dann gehts wieder nach oben
richtung=1;} 
if (ya==0){                 //wenn zu weit oben, dann gehts wieder nach unten  
richtung=2;}                
if (xa==gesamtbreite-50){   //wenn zu weit rechts, dann gehts wieder nach links
richtung=3;}                
if (xa==0){                 //wenn zu weit unten, dann gehts wieder nach rechts
richtung=4;}                
Thread.sleep(1); 
counter++;
if (counter==3750){verloren=true;} // Nach einer minute

 
repaint(); 
} 
catch(Exception ex){} 
}
}
        //bewegungen
    public boolean keyDown(Event e,int key) {
       //Fokus muss im Applet sein
        switch(key){
           
            case Event.UP: richtung=1;      //Pfeiltaste nach oben
            break;
            case Event.DOWN: richtung=2;    //Pfeiltaste nach unten
            break;
            case Event.LEFT: richtung=3;    //Pfeiltaste nach links
            break;
            case Event.RIGHT: richtung=4;   //Pfeiltaste nach rechts
            break;}

       
        repaint();
        return true;
    }

}

aber leider verschwindet nachwievor die frucht nicht wenn der vogel auf sie trifft. nach längerem überlegen fand ich raus das irgendwo der aufruf check() fehlt aber ich weiß nicht wo. hab scho n bissel rumprobiert aber ...
 

Marco13

Top Contributor
Naja, die muss wohl irgendwo in deiner "while(true)"-Schleife aufgerufen werden. DORT musst du auch die Rectangles, die du oben erstellt hast, an die neue Position anpassen, indem du jeweils rectangle.setLocation(x,y) mit den Koordinaten des Vogels bzw. der Frucht aufrufst.
 

Dagobert

Bekanntes Mitglied
Du must auch jedes mal wenn du dein Image versetzte dein Rectangle demensprechend mitsetzen.
Das hast du noch nicht gemacht soweit ich gesehen habe oder?

mfg. Dagobert

EDIT: Mist zu langsam ;)
 

Marco13

Top Contributor
Ach, hab's gerade mal getestet - du verwendest ja Rectangle2D.Double (Rectangle hätte es auch getan, ist jetzt aber egal). Dann muss es
rectangleVogel.setRect(xa, ya, 80, 60);
rectangleFrucht.setRect(xb, yb, 35, 35);
sein.

BTW: Funktioniert das mit dem sleep(1) und dem Counter bei dir ???:L EINE Millisekunde ist eigentlich zu wenig, als dass er wirklich eine Pause machen würde (sooo genau ist das ganze leider nicht). Bei mir huscht das gesamte Spiel jedenfalls in ein paar Sekunden durch (wild flackernd). Evtl. solltest du lieber sleep(10) nehmen, und dafür die Bewegung mit xb+=5; (statt xb++) usw. ein bißchen schneller machen...
 

Hatsch

Mitglied
jo danke für eure hilfe :)

das mit dem sleep hatte ich nur auf 1 gestellt damit ich den vogel schneller zur frucht bewegen konnte ums zu testen ^^
 

Hatsch

Mitglied
ich verzweifel echt an dem teil -.-
ich hab die check methode in der whileschleife untergebracht aber nu reagiert der immer noch nicht. dann hab ich die if-bedinung aus dem check in der whileschleife untergebracht aber dann führt er check immer durch wenn ich eine pfeiltaste drücke ...

public void check und public void run

das sind die eigentlich relevanten im moment und die wirklich letzte hürde damit das spiel so funktioniert wie ichs mir vorgestellt hab :(
 

Dagobert

Bekanntes Mitglied
Was genau geht noch nicht?
Ich denke es ist deine Kollisionserkennung, oder?
Du must bei jeder bewegung deiner figur auch das Rectangle mitbewegen. So erstellst du am Anfrang eins und sobald sich deine Figur bewegt, bewegt sich zwar dein Bild aber das Viereck bleibt noch stehen.
Zeichne mal beide vierecke in der Paintmethode und dann wirds du bestimmt verstehen was ich meine ;)

mfg. Dagobert
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben