Hilfe bei Frogger!

Sternchen8520

Grünschnabel
Hallo,

ich hab grad ein Pfojekt, indem ich einen Frogger-Clon schreiben muss.
Soweit klappt alles, nur komm ich nicht auf den entscheidenden grünen Zweig, wie ich die Autos in verschiedenem Abstand wieder hole (oder überhaupt erstmal wiederhole).
Habt ihr vielleicht eine Idee, wie ich das wo anstellen kann?

Hier mein bisheriger Code:
Class Frogger:
Code:
package Frogger;

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.net.URL;


public class Frogger extends Applet implements Runnable
{
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		
		Thread th;
		static Image Car1, Car2, Car3, Car4, Frosch, Background, gameover, win;
		String Cars;
		
		private Image dbImage;		//Doppelpuffer
		private Graphics dbGraphics;
		
		private Frog Frog;
		private Car Car;
		
		static AudioClip traffic;
		static AudioClip crash;
		static AudioClip quack;
		static AudioClip winsound;
		
		
		
		
		public void init()
		{
			
			setSize(801, 641);
			
			//Bilddaten laden
			setBackground(Color.black);
			Background = getImage(getCodeBase(), "Frogger/pictures/lane.gif");
			Frosch = getImage(getCodeBase(), "Frogger/pictures/frog.gif");
			Car1 = getImage(getCodeBase(), "Frogger/pictures/car10.gif");
			Car2 = getImage(getCodeBase(), "Frogger/pictures/car11.gif");
			Car3 = getImage(getCodeBase(), "Frogger/pictures/car12.gif");
			Car4 = getImage(getCodeBase(), "Frogger/pictures/car13.gif");
			gameover = getImage(getCodeBase(), "Frogger/pictures/gameover.gif");
			win = getImage(getCodeBase(), "Frogger/pictures/win.gif");
			
			
			//Sounddaten laden
			crash = getAudioClip(getCodeBase(), "Frogger/sounds/crash3.wav");
			traffic = getAudioClip(getCodeBase(), "Frogger/sounds/traffic.wav");
			quack = getAudioClip(getCodeBase(), "Frogger/sounds/frog.wav");
			winsound = getAudioClip(getCodeBase(), "Frogger/sounds/applause.wav");
			
			//Verbindungen zu anderen Klassen
			Frog = new Frog();
			Car = new Car();
			addKeyListener((KeyListener) Frog);
			
	
		}
		
		public void start()
		{
			th = new Thread(this);
			th.start();
		}
		
		
		public void run() 
		{
			
			Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
			
			traffic.loop();
			
			
			while(true)
			{	
				Car.Car1_move();
				Car.Car2_move();
				Car.Car3_move();
				Car.Car4_move();
				
				
				try
				{
					repaint();
					Thread.sleep(10);
				}
				catch(InterruptedException ex)
				{
					//do nothing
				}
			Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
			
			}
			
		}
		
		
		
		public void stop()
		{
			th.stop();
		}
		
		
		
		public void paint(Graphics g)
		{
			g.drawImage(dbImage, 0, 0, this);
		}
		
		public void update(Graphics g)
		{
			if (dbImage == null) 
			{
				dbImage = createImage(this.size().width, this.size().height);
				dbGraphics = dbImage.getGraphics();
			}
		

			if(Frog.goal() != true)
				{
				dbGraphics.drawImage(Background, 0, 40, this);
				dbGraphics.drawImage(Frosch, Frog.pos_x, Frog.pos_y, this);
				dbGraphics.drawImage(Car1, Car.x_pos_oben_1, Car.y_pos_oben_1, this);
				dbGraphics.drawImage(Car2, Car.x_pos_oben_2, Car.y_pos_oben_2, this);
				dbGraphics.drawImage(Car3, Car.x_pos_unten_1, Car.y_pos_unten_1, this);
				dbGraphics.drawImage(Car4, Car.x_pos_unten_2, Car.y_pos_unten_2, this);
				}
			else
				{
				dbGraphics.drawImage(win, 40, 40, this);
				}
			
			
			
			paint(g);
		}
		

}

Class Frog:
Code:
package Frogger;

import java.applet.AudioClip;
import java.awt.*;
import java.awt.event.*;

public class Frog implements KeyListener
{
	
	public int pos_x = 359;		//aktuelle koordinaten des Frosches
	public int pos_y = 573;
	
	public int speed_x;		//geschwindigkeit des Frosches
	public int speed_y;
	
	private final int goal = 45;	//Start und Ziel festlegen
	private final int start = 359;
	
	private final int up_out = 88;	//Spielfeldbegrenzungen
	private final int down_out = 593;
	private final int left_out = 0;
	private final int right_out = 718;
	
	Car Car;
	
	
	public void keyPressed(KeyEvent e)
	{
		int key = e.getKeyCode();
		
		if(key == KeyEvent.VK_UP)
		{
			Frogger.quack.play();
			if((pos_y -= 48) <= up_out)
			{
				pos_y = 40;
			}
			else
			pos_y -= 48;
		}
		
		if(key == KeyEvent.VK_DOWN)
		{
			Frogger.quack.play();
			if((pos_y += 48) >= down_out)
			{
				pos_y = 593;
			}
			else
			pos_y += 48;
		}
		
		if(key == KeyEvent.VK_RIGHT)
		{
			Frogger.quack.play();
			if((pos_x += 83) >= right_out)
			{
				pos_x = 718;
			}
			else
			pos_x += 83;
		}
		
		if(key == KeyEvent.VK_LEFT)
		{
			Frogger.quack.play();
			if((pos_x -= 83) <= left_out)
			{
				pos_x = 0;
			}
			else
			pos_x -= 83;
		}
	
		
	}

	public void keyReleased(KeyEvent e)
	{
		//do nothing
	}

	public void keyTyped(KeyEvent e)
	{
		//do nothing
	}

	
	
	
	
	public boolean goal()
	{
		if (pos_y <= 40)
		{
			Frogger.traffic.stop();
			Frogger.winsound.play();
			return true;
		}
		
		return false;
	}
	
}

Class Car:
Code:
package Frogger;

import java.awt.Graphics;
import java.awt.Image;
import java.net.URL;

public class Car 
{
	public int x_pos_oben_1 = -170;	
	public int x_pos_oben_2 = -170;
	public int x_pos_unten_1 = 801;	
	public int x_pos_unten_2 = 801;
	public int y_pos_oben_1 = 120;
	public int y_pos_oben_2 = 220;
	public int y_pos_unten_1 = 360;	
	public int y_pos_unten_2 = 480;
	public int v_oben_1 = 4;
	public int v_oben_2 = 2;
	public int v_unten_1 = 3;
	public int v_unten_2 = 2;
	Image []car1;
	Image []car2;
	Image []car3;
	Image []car4;
	Image car1_move, car2_move, car3_move, car4_move;
	Image Auto;
	
	
	
	public void Car1_move()
	{
		x_pos_oben_1 += v_oben_1;
	}
	
	public void Car2_move()
	{
		x_pos_oben_2 += v_oben_2;
	}
	
	public void Car3_move()
	{
		x_pos_unten_1 -= v_unten_1;
	}
	
	public void Car4_move()
	{
		x_pos_unten_2 -= v_unten_2;
	}

}
 
Hi,

du hast doch die Positionskoordinaten von den Autos. Zudem hast du noch deine Breite vom Applet. Wenn deine Autos nun nach rechts fahren, dann musst du nur abfragen, ob die X-Position des Autos größer ist, als die Breite des Applets. Fahren die Autos nach links, fragst du ab, ob die X-Position+(Länge des Autos) kleiner ist als 0. (Dafür setzt du noch eine Variable 'width' in deiner Klasse 'Car'.)
Trifft einer der Fälle zu, dann setzt du die X-Position des Autos auf die X-Anfangsposition zurück und änderst u.U. die Y-Position.

ps.: Bitte verwende die Java-Code-Tags --> [ code ]...[ /code ]

Gruß

Fabio
 
Zuletzt bearbeitet:
ja, aber es soll ja nicht nur ein neues auto reinkommen, wenn eins rausgefahren is... das wär ein bisschen zu einfach... es sollten auch mal zwei hintereinander kommen usw. wie beim "echten" Frogger halt... Fühl mich grad ein bisschen dämlich ^^
 
Das kannst du doch per Zufallswert sage, ob 1, 2 oder 3 Autos gleichzeitig reinfahren sollen. Oder weißt du nicht wie du das umsetzen sollst?
 
Vielleicht solltest du dir ersteinmal die grundlegenden Prinzipien von OOP näher ansehen. Da das dein größtes Problem momentan ist.

Hier zwei Links:
http://openbook.galileocomputing.de/oop/
http://www.galileocomputing.de/artikel/gp/artikelID-215

Als Biespiel habe ich dir auch deine Klasse 'Car' in OOP-Struktur gecoded:
Java:
import java.awt.Image;

public class Car
{
	private static final int SPEED = 3;
	private final Image img;
	private final int width = 50;
	private final int height = 30;
	private int x;
	private int y;
	
	public Car(Image img) {
		this.img = img;
	}

	public void move() {
		x += SPEED; // wenn du nach links fahren willst --> nach rechts: x -= speed;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getX() {
		return x;
	}

	public void setY(int y) {
		this.y = y;
	}

	public int getY() {
		return y;
	}

	public int getWidth() {
		return width;
	}

	public int getHeight() {
		return height;
	}

	public Image getImg() {
		return img;
	}
}

Wenn du dann so halbwegs verstanden hast wie OOP funktioniert und dich dann nochmal an dein Projekt setzt, dann wird es dir um einiges leichter fallen. ;)

Gruß

Fabio
 
also, die Autos fahren jetzt so wie sie fahren sollen. Ich bräuchte vielleicht noch einen kleinen Tipp, was den Crash mit dem Frosch angeht... Wenn ich nur die beiden X-positionen (von den Autos und dem Frosch) mit if abrage passiert nichts, da werd ich wahrscheinlich noch die Höhe der beiden Objekte miteinbinden müssen, nur wie mach ich das?
 
Du musst das folgendermaßen machen. Dein Auto und Frosch brauchen folgende Eigenschaften/Attribute:
Java:
private final int width = 50; // Breite muss angepasst werden
private final int height = 30; // Höhe muss angepasst werden
private int x;
private int y;

Diese Werte übergibst du an ein Rectangle-Objekt.
Java:
Rectangle r = new Rectangle(x, y, width, height);

So und die Klasse Rectangle stellt uns nun die Methode intersects zur Verfügung, mit der wir abfragen können, ob sich zwei Rectangle-Objekte überschneiden.
Java:
if(r.intersects(otherRectangle)) {
   // COLLISION!
}

Mehr Infos zu den Methoden und zur Klasse Rectangle findest du hier.

Gruß

Fabio
 

Neue Beiträge

Zurück