Jump N Run - Kolission

Status
Nicht offen für weitere Antworten.
Hallo Zusammen :)

Ich bin noch ein ziemlicher Java Noob, muss aber dennoch zusammen mit 2 anderen ein Jump n Run in der Schule programmieren. Und bei der arbeitsaufteilung ist die Kolission auf mich gefallen. Allerdings hab ich damit 0 Erfahrung und finde iwie auch nichts brauchbares im Internet.

Zu unserem Spiel bisher: Wir zeichnen zuerst den Hintergrund, dann unsere Figur, und dann die Objekte wie Kisten etc, die für die Kolission berücksichtigt werden sollen.


Ich hoffe ihr versteht mein Problem und könnt mir iwie helfen, aber bitte auch so das ich etwas verstehe :)
habe auch schon in quaxxlis tutorial geschaut, aber da blick ich auch nicht so recht durch.

Danke schonma im vorraus.


Greeez
 

Oli

Top Contributor
nun, ich nehme an, dass das ganze dann per Pfeiltasten zu steuern ist. Für jeden Tastendruck die Koordinaten der Figur mit denen der Kollisionsobjekte vergleichen. Wenn gleich, dann Kollision.
 

Landei

Top Contributor
Es gibt (mindestens) zwei unterschiedliche Wege:
- Pixelgenaue Kollisionserkennung - wahrscheinlich zu kompliziert in deinem Fall
- Kollisionserkennung mit "Bounds"

"Bounds" meint, dass eure Spiel-Objekte durch einfachere Formen angenährt werden, und diese für die Berechnung der Kollision herangezogen werden. Im einfachsten Fall könnten das Rechtecke sein, aber auch Kreise oder Ellipsen. Versuch dich also erst mal an einem Stück Code, was berechnet, ob sich zwei Rechtecke überschneiden bzw. berühren, vielleicht reicht das ja schon aus.
 

Quaxli

Top Contributor
unleashed1988 hat gesagt.:
habe auch schon in quaxxlis tutorial geschaut, aber da blick ich auch nicht so recht durch.
Greeez

Der Name ist Quaxli und was gibt's da nicht zu blicken??? :wink:

Spaß beiseite: Fang mit einer einfachen Kollission an und verfeinere die dann. Mal ein Vorschlag, ohne den Aufbau Eures Spiel zu kennen:

- Vorteilhaft wäre es, wenn Eure Objekte von Rectangle oder Rectangle2D erben. Wenn nicht, wäre es ggf. sinnvoll, wenn die Objekte ein Rectangle2D.Double als Instanzvariable implementieren über das dann Position, sowie Breite und Höhe als Informationen verfügbar sind.

- Die einfachste Kollission ist dann das Überschneiden der Rechtecke. Dafür gibt es in der Basisklasse diverse Methoden, die alle mit "intersect" anfangen oder "intersect" im Namen haben. Damit hast Du dann schon mal eine sehr einfache Kollission, die aber auch dann zuschlägt, wenn sich 2 transparente Bereiche überlagern.

- Wenn Du die o.g. Kollisions-Methode verfeinerst, kannst Du o.g. Methode verwenden, um zu überprüfen, ob ein 2. Blick notwendig ist. Denn nur, wenn sich die Rechtecke überschneiden, ist es notwendig genauer zu prüfen. Dazu mußt Du Dir eine Vorgehensweise überlegen, mit der Du herausfindest, ob sich im Überschneidungsbereich zwei nicht-transparente Pixel aus beiden Objekten an gleicher Stelle befinden. Eine Möglichkeit, die für mich recht gut funktioniert habe ich im Tutorial beschrieben. Entweder liest Du Dir das nochmal in Ruhe durch oder denkst Dir selbst was aus. Da gibt's sicherlich noch mehr Herangehensweisen ;)
 
ok ich habe mir dein Tutorial nochmal angeschaut und denke ich würde es doch verstehen, aber da ich noch nie etwas mit Sprites gemacht habe, verwirrt mich das ganz besonders, denn ich verstehe dein Aufbau davon im Tutorial nicht so ganz.
Wäre nett wenn ihr mir da vllt noch ein wenig Nachhilfe geben könntet :)

Sry bin echt noch totaler Anfänger :(

benutze im übrigen Netbeans, falls das euch bei den Antworten helfen sollte.
 
So hi nochma, hab jetzt lang rumprobiert aber bekomm nix vernünftiges auf die Reihe :(

wäre vllt einer so nett mir ne total einfache un billige version von ner kolission 2er rechtecke oder sonst was zu machen? dann könnt ich mich daran für das game orientieren...wäre echt nett...


greez
 

Landei

Top Contributor
Code:
Rectangle r1 = new Rectangle(100,100,100,100);
Rectangle r2 = new Rectangle(150,150,100,100);
Rectangle r3 = new Rectangle(300,300,100,100);
System.out.println(r1.intersects(r2)); //Kollision
System.out.println(r1.intersects(r3)); //keine Kollision
 
ok schonmal ganz gut, danke, aber kann ich dann mit paint component diese Rectangles einfach zeichnen oder wie mache ich das? ich würde gern eine grafische kolission selber machen zum besseren verständnis.

greez
 

Landei

Top Contributor
Mehrere Möglichkeiten:
- du kannst die Rectangles einfach nur zum Rechnen benutzen
- du kannst deine Sprites von Rectangle ableiten
- du kannst dir angucken wie Rectangle.intersects funktioniert und selber nachbauen
 
so ich bins nochmal, bekomms iwie nich hin.


also wir haben jetzt 2 objekte, einmal msf (die eigene Spielfigur) und n gegenstand neKiste (das objekt mit dem ich die Kolission testen will) beides klassen erben von sprite und sprite erbt von rectangle...

wenn ich jetzt

Code:
                        if (msf.getFrame().intersects(neKiste.getFrame()) ) 
                        {
                            System.out.println("jeah");
                        }

in meinem keylistener aufrufe funktioniert das nicht ( es wird jedesmal wenn ich nach rechts drücke der systemout aufgerufen ) :( komm hier echt nich weiter. Das mit intersects ist doch richtig oder? wo liegt mein Fehler?
 

Quaxli

Top Contributor
Wenn beide Objekte von Rectangle erben, brauchst Du das getFrame() nicht. Dann heißt die Prüfung

msf.intersects(neKiste)

Im KeyListener ist dieser Code übrigens (außer vielleicht für Tests) nicht glücklich plaziert.

<edit>
Dabei ist natürlich unterstellt, das x/y von Rectangle gepflegt sind bzw. der Sprite-Position entsprechen und
width und height ebenfalls mit Werten versehen sind, die der Größe des jeweiligen Bildes entsprechen.

</edit>
 
naja dann passiert das gleiche, der sout wird die ganze zeit aufgerufen..

jao das mim listener ist mir klar, wills ja nur testen :)

wie meinst du das mit den x/y koordinaten? das versteh ich nicht ganz... wir benutzen halt sachen wie

spielFigurBild.getWidth und spielFigurBild.getHeight ist das so richtig ?! ich blicks leider gar nich wie du es meinst :(
 

Quaxli

Top Contributor
Ein Beispiel....

Aber gleich vorweg: Das ist ein einfaches, primitives Beispiel.
So macht man eigentlich keine Animation für Spiele!!!!
So macht man eigentlich keine Animation für Spiele!!!!
So macht man eigentlich keine Animation für Spiele!!!!
So macht man eigentlich keine Animation für Spiele!!!!
So macht man eigentlich keine Animation für Spiele!!!!
So macht man eigentlich keine Animation für Spiele!!!!


Deine Klasse für Kisten, Spieler, etc. erben von Rectangle:

Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;


public class Figure extends Rectangle {
	
	private static final long	serialVersionUID	= 1L;

	Color color;
	
	public Figure(int x, int y, int w, int h, Color c){
		super(x,y,w,h);
		color = c;
	}
	
	public void drawFigure(Graphics g){
		g.setColor(color);
		g.fillRect(x, y, width, height);
	}
}

Und hier das "Spiel":

Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GamePanel extends JPanel implements KeyListener {

	private static final long	serialVersionUID	= 1L;

	JFrame										frame;
	Figure										f1;
	Figure										f2;

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

	public GamePanel() {
		f1 = new Figure(10, 100, 50, 50, Color.RED);
		f2 = new Figure(100, 100, 30, 30, Color.BLUE);

		frame = new JFrame("Beispiel");
		frame.setSize(300, 300);
		frame.setLocation(100, 100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.addKeyListener(this);
		frame.setVisible(true);
	}

	public void paintComponent(Graphics g) {
		f1.drawFigure(g);
		f2.drawFigure(g);
	}

	public void keyPressed(KeyEvent e) {
		System.out.println("hier");
    if(e.getKeyCode()==KeyEvent.VK_RIGHT){
    	f1.x +=10;
    	frame.repaint();
    	if(f1.intersects(f2)){
    		System.out.println("Kollision!!!!!!!!!");
    	}
    }
	}

	public void keyReleased(KeyEvent e) {

	}

	public void keyTyped(KeyEvent e) {

	}

}

Wenn Du jetzt oft genug, die rechte Cursor-Taste drückst, kriegst Du irgendwann in der Konsole die Ausgabe!!!
 
ja hm das sieht einleuchtend aus, und ich versteh allerdings nicht warum das dann bei uns nicht funktioniert.

ich lads mal hier hoch, da fehlt jetzt zwar grad das mit intersects und wurde mit Koordbedingungen erstezt aber naja kannst es dir ja vllt mal anschauen. brauchst aber glaub ich netbeans dazu

naja hier hast es:

rapidshare.de/files/41010205/CT-Spiel__2_.rar.html

sorry das ich dich so stresse, aber ich bin echt nich so helle was java angeht :(
 

Quaxli

Top Contributor
Du streßt mich nicht, weil ich's nicht angucke. Sorry, aber dazu fehlt mir momentan die Zeit.
Du hast ein Beispiel, daß Dir zeigt wie man's umsetzt. Damit solltest Du Deine Klassen und die Kollisionsabfrage anpassen können.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben