Kollisionsabfrage haut nicht hin

Robokopp

Bekanntes Mitglied
Sry dass ich deswegen jetzt nochmal einen Thread eröffne, aber ich finde den Fehler einfach nicht...
ich sehe da keinen Unterschied zwischen meiner Version und der des Quaxi Tutorials, abgesehen davon dass sich bei ihm die Raketenobjekte noch untereinander treffen können.
also ich hab eine GameLoop, in der die Logik für alle Elemente durchgeführt und gleichzeitig auf Kollision geprüft wird:

Java:
private void doLogic() {
		
		if(player.getY()<400){
			firstaction=true;
		}
		if(firstaction){
			
		for(ListIterator<Sprite> it = actors.listIterator();it.hasNext();){
			Sprite r = it.next();
			r.doLogic();
			player.collidedWith(r);
}

Da die Blöcke untereinander garnicht kollidieren können, habe ich dafür die Kollisionsprüfung weggelassen(mit geht es trotzdem nicht)

Die Klasse player beinhaltet die intersects() Methode:

Java:
	@Override
	public boolean collidedWith(Sprite s){
		
		if(this.intersects(s)){
			
			System.out.println("Intersects");
			return true;
		}
		return false;
		
	}


Der Spielebildschirm stellt eine Art Tower dar, wo Blöcke von oben nach unten fallen und die Spielfigur soll darauf springen können.

Nur irgendwie ist intersects nie true...

Ich hatte anfangs eine eigene Kollisionsprüfung implementiert, die doch sehr waage war und nicht wirklich gut funktioniert hat.
 

Fu3L

Top Contributor
Ich denke dieser kleine Codeteil reicht dafür nicht...
Positionierung von Spieler und Blöcken könnte wichtig sein. Außerdem das Erstellen der Blöcke inklusive Konstruktor.
 

Robokopp

Bekanntes Mitglied
echt?
ich dachte für intersects reichen einfach 2 Objekte. Na gut

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Block extends Sprite implements Drawable{
	GamePanel panel;
	JFrame frame;
	BufferedImage block1;
	BufferedImage image;
	Player player;
	private double fallgeschwindigkeit=2;
	private int panelwidth;
	private boolean rightmovement;
	private boolean leftmovement;
	private int rightbound;
	private int leftbound;
	private int modulo;
	private int zufall;
	private double yRaw;
	private int width;
	private int height;
	private int x;
	
public void setPanelwidth(int panelwidth) {
		this.panelwidth = panelwidth;
	}
	
	public Block(int id,int x, int y, int width, int height,Color color,BufferedImage image) {
		super(id,x, y, width, height,color,image);
		// TODO Auto-generated constructor stub
		this.image=image;
		this.width=width;
		this.x=x;
		this.y=y;
		this.height=height;
	
		modulo=id % 10;
		if(modulo == 0){
			zufall =(int)(Math.random()*2);
			if(zufall==0){
				System.out.println("Block"+id+" is moving left");
			}
			else if(zufall==1){
				System.out.println("Block"+id+" is moving right");
			}
			
		}
	}

	private static final long	serialVersionUID	= 1L;

	@Override
	public void drawObjects(Graphics g){
		g.drawImage(image, x, (int)y,width,height, null);
	}	
	@Override
	public double getY() {
		return y;
	}
	
	@Override
	public void doLogic2(double player){
		
		int i=0;
		if(player>40){
//			System.out.println(">40");
			while(i<20){
				i++;
			yRaw=y+0.1;
			y=(int)yRaw;
			}
		
		}
		if(player<=40){
//			System.out.println("<40");
			while(i<20){
				i++;
			yRaw=y+0.1;
			y=(int)yRaw;
			}
			
		}
	}

	@Override
	public void doLogic(){
		

			if(y>0){
				
				if(!leftmovement&&!rightmovement){
				if(zufall==0&&modulo==0){
					leftmovement=true;
					rightmovement=false;
				}
				if(zufall==1){
					leftmovement=false;
					rightmovement=true;
				}}
				
				if(leftmovement){
					x--;
					if(x<45){
						rightmovement=true;
						leftmovement=false;
					}
				}
				if(rightmovement){
					x++;
					if(x>(panelwidth-panelwidth/4)-width){
						rightmovement=false;
						leftmovement=true;
					}
				}
			}
					
			y=(int)(y+fallgeschwindigkeit);
			
	}
	@Override
	public double getWidth(){
		return width;
	}
	@Override
	public boolean collidedWith(Sprite s){
		
		
		if(this.intersects(s)){
			System.out.println("Intersects");
			return true;
		}
		return false;
		
	}
	@Override
	public int getID(){
		return id;
	}


}

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ListIterator;
import java.util.Vector;

import javax.imageio.ImageIO;
import javax.swing.JFrame;


public class Player extends Sprite{
	GamePanel panel;
	JFrame frame;
	BufferedImage mewnormal;
	BufferedImage mewleft;
	BufferedImage mewright;
	BufferedImage mew;
	int time;
	private int jumpingtime=0;
	Vector<Sprite> actors= new Vector<Sprite>();
	Block block;
	private int y;
	private int x;
	private int width;
	private int height;
	private boolean jump=true;

	private Sprite r;
	private boolean isMoving;
	public Player(int id, int x, int y, int width, int height, Color color) {
		super(id, x, y, width, height, color, null);
		this.x=x;
		this.y=y;
		this.width=width;
		this.height=height;
		
		try {
			mewnormal = ImageIO.read(new File("Sources/mew.png"));
			mewleft = ImageIO.read(new File("Sources/mewleft.png"));
			mewright = ImageIO.read(new File("Sources/mewright.png"));
			mew=mewnormal;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public boolean isJump() {
		return jump;
	}

	@Override
	public double getY() {
		return y;
	}


	public double getX() {
		return x;
	}


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

	public void setX(int x) {
		this.x = x;
	}
	public void setNormalPic(){
		mew=mewnormal;
	}
	@Override
	public void drawObjects(Graphics g){
		g.drawImage(mew, x, y,width,height, null);
	}
	public void timeReset(){
		time=0;
		jumpingtime=0;
	}
	

	@Override
	public void doLogic(){
	
		if(y<747-height){
			time=time+1;
			double yRaw=y+0.0007*time*time*9.81;
			y=(int)yRaw;
			
			
			
		}
		
	}

	@Override
	public boolean collidedWith(Sprite s){
		
//		System.out.println("Collidewith");
		if(this.intersects(s)){
			
			System.out.println("Intersects");
			return true;
		}
		return false;
		
	}
	@Override
	public void moveUp(){
		mew=mewnormal;
	}
	@Override
	public void moveDown(){
		mew=mewnormal;
	}
	@Override
	public void moveLeft(){
		mew=mewleft;
	}
	@Override
	public void moveRight(){
		mew=mewright;
	}




}

Und hier noch zwei relevante Methoden aus der MainKlasse:

Java:
	private void checkKeys() {

		if(down){
			player.setY((int) (player.getY()+yvelocity));
		}
		if(left){
			player.setX((int) (player.getX()-xvelocity));
		}
		if(right){
			player.setX((int) (player.getX()+xvelocity));
		}
		if(jump){
			
			jumping();
		
	}}
	private void jumping(){
		
		jumpingtime=0;
		while(jumpingtime<jumpfactor){
//			player.setBlockcontact(false);
			jumpingtime++;
			double yRaw = player.getY()-jumpingspeed*0.000001*9.81*jumpingtime*jumpingtime;
			player.setY((int)yRaw);
		}
			if(player.getY()<120){
//				this.backgroundclass.doLogic2(player.getY());
				for(ListIterator<Sprite> it = actors.listIterator();it.hasNext();){
					Sprite r = it.next();
					r.doLogic2(player.getY());
					

				}
			}
			if(jumpingtime==jumpfactor){
				jump=false;
			
			}
	}
 

Robokopp

Bekanntes Mitglied
Hmm bin zwar Grad nicht zu hause aber ich glaube nicht.... Aber selbst wenn, macht das was aus?

Gesendet von meinem GT-I9100 mit Tapatalk
 

Marco13

Top Contributor
Wenn die Sprite-Klasse schon z.B. von Rectangle2D erbt, dann wird für die "intersects"-Methode auch getX() verwendet. Wenn man die überschreibt, so dass "das falsche X" zurückgegeben wird, arbeitet auch die Methode nicht mehr richtig. Ist aber erstmal nur geraten.
 

Marco13

Top Contributor
In der Sprite-Klasse sind keine getX/getY, dafür aber in deiner Player-Klasse - und DIE könnte (!) das Problem sein.

Java:
class Rectangle2D.Double
{
    private double x; //-------------------- Das hier ist das "ECHTE" x!
    ...
    public double getX() { 
        return x;  //--------------------  getX liefert das "ECHTE" x!
    }
    ...

    public boolean intersects(Rectangle2D other)
    {
        if (getX() < other.getX()) ... //------------------------- Verwendet getX !!!
    }
}


class Sprite extends Rectangle2D.Double  // erbtgetX und getY und intersects
{
...
}


class Player extends Sprite
{
    private int x;  //-------------------- Das hier ist das "FALSCHE" x!

    public double getX() //-------------------- Überschreibt das getX() aus Rectangle2D!
    {
        return x;  //-------------------- Liefert das FALSCHE x zurück!
    }

}

Wenn man jetzt auf Player "intersects" aufruft, wird dort unter anderem getX aufgerufen, aber das gibt das falsche X zurück. Wozu hast du im Player überhaupt nochmal x,y,width und height gespeichert? Die hat es doch schon, wenn es von Sprite (also von Rectangle2D.Double) erbt!?
 

Robokopp

Bekanntes Mitglied
Frag mich was leichteres :D aber danke, werde ich morgen gleich mal ausprobieren

Gesendet von meinem GT-I9100 mit Tapatalk

Okay, hab jetzt die Gettermethoden zu
Java:
public double getYPos() {
		return y;
	}


	public double getXPos() {
		return x;
	}

geändert und alle Methodenzugriffe ebenfalls geändert auf player.getXPos/YPos und es funktioniert dennoch nicht...

EDIT:
ich hab nun mal mit
Java:
System.out.println("Playerx "+this.getX()+" Playery "+this.getY()+" Sprite x "+s.getX()+ " Spritey "+s.getY());

in der CollidedWith() Methode die Koordinaten geprüft, wobei in allen Fällen 0 angezeigt wird, was ja nicht sein dürfte
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hmja, hab' mir den Code nochmal angesehen. Das ist mal wieder so ein Fall, wo versucht wurde, ein ganz tolles Spiel zu schreiben indem ganz viel Quellcode hingeschrieben wurde, ... das geht halt immer erstaunlich lange gut, und wenn man merkt, dass irgendwas nicht stimmt, ist SO viel Code da, dass man es kaum noch in eine vernünftige Strukur bringt. Aber abgesehen von dieser Strukturfreiheit (die GamePanel ist ein Monster mit etliche überflüssigen Fields - räum' das auf!) ist eines der Hauptprobleme, dass du überall x/y/width/height neu bzw. anders definierst.

Sprite extends Rectangle2D.Double!!!!

Das heißt, jedes Sprite hat die Methoden getX(), getY(), getWidth() und getHeight() aus der Klasse Rectangle2D.Double. Und diese Methoden sollte man nicht überschreiben. (Ob die Sprite-Klasse wirklich von Rectangle2D.Double erben sollte, sei mal dahingestellt, aber das hatte Quaxli AFAIR gemacht, weil es einige Dinge - speziell das intersects usw. - vereinfachen KANN - FALLS man nicht sowas macht wie du jetzt...)


Nimm aus der Sprite-Klasse mal die
int x;
int y;
int width;
int height;
raus, und aus der Block-Klasse die
int x;
int width;
int height;
und aus der Player-Klasse die
int x;
int y;
int width;
int height;

In der BackGround-Klasse lungern auch noch so ein paar Koordinaten rum, mit denen ich gerade nichts anzufangen weiß. Vermutlich sollte der Background gar kein Sprite sein, aber ... die Gesamtstruktur habe ich nicht wirklich nachvollziehen können.

In die Sprite-Klasse kann ein
Java:
	public void setY(double y) {
		this.y = y;
	}

	public void setX(double x) {
		this.x = x;
	}
rein, aber allen anderen setX/getX/setY/getY-Methoden aus allen anderen Klassen (Player, Block, etc.) sollten WEG.

Er wird sich dann an einigen Stellen beschweren, weil er int's braucht, aber doubles bekommt, bzw. nicht auf x/y zugreifen kann. Diese Stellen, wie z.B. in Player
g.drawImage(mew, x, y,width,height, null);
kannst du nach diesem Muster ändern:
g.drawImage(mew, (int)getX(), (int)getY(),(int)getWidth(), (int)getHeight(), null);

Für alles weitere müßte man den Code nochmal genauer durchlesen und aufräumen...

Jedenfalls düfte die intersects-Methode dann zumindest grundsätzlich funktionieren....
 

Robokopp

Bekanntes Mitglied
Jap läuft alles optimal. Habs aber gestern nicht mehr geschafft dafür zu sorgen, dass nur gesprungen werden kann wenn er auf einem block sitzt. Zur zeit sind noch luftsprünge möglich :D

Gesendet von meinem GT-I9100 mit Tapatalk
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A DoodleJump programmieren: Kollisionsabfrage Spiele- und Multimedia-Programmierung 6
T Problem bei Kollisionsabfrage Spiele- und Multimedia-Programmierung 4
S Polygon Kollisionsabfrage Spiele- und Multimedia-Programmierung 2
RalleYTN Erweiterte Kollisionsabfrage Spiele- und Multimedia-Programmierung 7
S Kollisionsabfrage zwischen Rechteck und Polygon Spiele- und Multimedia-Programmierung 1
J Java Kollisionsabfrage Spiele- und Multimedia-Programmierung 21
kaoZ Kollisionsabfrage implementieren Spiele- und Multimedia-Programmierung 63
T Problem mit Kollisionsabfrage der NPC Spiele- und Multimedia-Programmierung 1
F Kollisionsabfrage bei schnellen Objekten Spiele- und Multimedia-Programmierung 2
J Problem bei pixelgenauer Kollisionsabfrage Spiele- und Multimedia-Programmierung 10
M Kollisionsabfrage Spiele- und Multimedia-Programmierung 7
N Quake - Kollisionsabfrage Spiele- und Multimedia-Programmierung 21
N Problem mit Kollisionsabfrage beim Fallen Jump & Run Spiele- und Multimedia-Programmierung 5
Gossi Quaxlis 2D Tutorial....Probleme nach hinzufügen der Kollisionsabfrage Spiele- und Multimedia-Programmierung 16
U Jump n' Run 2D Geometrie und Kollisionsabfrage? Spiele- und Multimedia-Programmierung 11
baddestpoet Problem mit Kollisionsabfrage Spiele- und Multimedia-Programmierung 18
D Kollisionsabfrage von 2 Autos Spiele- und Multimedia-Programmierung 2
G Kollisionsabfrage (Mario klon) Spiele- und Multimedia-Programmierung 6
gieser Buggy Kollisionsabfrage Spiele- und Multimedia-Programmierung 4
masta // thomas Kollisionsabfrage - inspiriert durch "pixelgenaue Kolli Spiele- und Multimedia-Programmierung 13
gieser pixelgenaue Kollisionsabfrage der Kreise Spiele- und Multimedia-Programmierung 9
T Kollisionsabfrage von einem Stein mit einem Ball Spiele- und Multimedia-Programmierung 5
N Kollisionsabfrage Spiele- und Multimedia-Programmierung 6
D Jump and Run Game -- Kollisionsabfrage Spiele- und Multimedia-Programmierung 30
J Kollisionsabfrage Ball <-> Paddle Spiele- und Multimedia-Programmierung 2
B Bild wird nicht geladen Spiele- und Multimedia-Programmierung 4
Fabel TicTacToe MiniMax Algorithmus geht nicht Spiele- und Multimedia-Programmierung 4
ThoraxLaneus Minecraft MCP-Client mit Optifine fertig machen in IntelliJ klappt nicht ganz Spiele- und Multimedia-Programmierung 6
K Mein Jump and Run charakter bewegt sich nicht mehr rückwärts... Spiele- und Multimedia-Programmierung 0
P Pokemon Spiel Funktioniert nicht ? Spiele- und Multimedia-Programmierung 3
D MIDIdevice open funktioniert nicht Spiele- und Multimedia-Programmierung 1
Mika_MDF Minecraft Eclipse startet Minecraft nicht? Spiele- und Multimedia-Programmierung 23
H Musik Datei lädt nicht? Spiele- und Multimedia-Programmierung 8
A Kollision funktioniert nicht richtig bei zu schneller Geschwindigkeit des Spielers Spiele- und Multimedia-Programmierung 0
JeremyStarTM Minecraft Minecraft Spigot Server akzeptiert JAR-Version nicht Spiele- und Multimedia-Programmierung 8
K Das Leerzeichen der Tastatur wird nicht gleichgesetzt mit dem Leerzeichen aus der Text Datei Spiele- und Multimedia-Programmierung 5
P Teamspeak interface mit JFrame funktioniert nicht Spiele- und Multimedia-Programmierung 3
coolian slick lwjgl text darstellen mit UnicodeFont funktoniert nicht? Spiele- und Multimedia-Programmierung 11
Z Minecraft Multiplayer geht nicht Spiele- und Multimedia-Programmierung 2
L Minecraft 1.7.10 Server startet nicht Spiele- und Multimedia-Programmierung 1
R Memory - Nicht alle Button lassen sich aktivieren? Spiele- und Multimedia-Programmierung 1
D Kollision funktioniert unten aber nicht oben Spiele- und Multimedia-Programmierung 4
C Java findet FluidSynth nicht Spiele- und Multimedia-Programmierung 2
N der Player bewegt sich nicht Spiele- und Multimedia-Programmierung 14
D Java Bild bewegen funktioniert nicht Spiele- und Multimedia-Programmierung 8
Damtonix Gameloop funktioniert nicht! Spiele- und Multimedia-Programmierung 6
N Warum tut der Gegner nicht das was er soll? Spiele- und Multimedia-Programmierung 13
N Warum ist das Fenster nicht schwarz? Spiele- und Multimedia-Programmierung 26
B Programmieren wie der Befehl /ban in Minecraft geblockt wird aber nicht /ban mit einem Argument Spiele- und Multimedia-Programmierung 1
A Dateifehler - Öffnet nicht Spiele- und Multimedia-Programmierung 7
temi libGDX Box2d ApplyTorque() funktioniert nicht Spiele- und Multimedia-Programmierung 1
R Laufbewegung geht nicht.. Spiele- und Multimedia-Programmierung 1
J OpenGL Bild wird nicht richtig angezeigt Spiele- und Multimedia-Programmierung 2
S GetBufferStrategy-Methode wird nicht angezeigt Spiele- und Multimedia-Programmierung 6
M KeyListener funktioniert nicht während Timer läuft Spiele- und Multimedia-Programmierung 26
F vlcj läuft nicht exportiert, aber in Eclipse Spiele- und Multimedia-Programmierung 2
A MouseListener ändert nicht das Lable Icon. Spiele- und Multimedia-Programmierung 2
G LWJGL Rendert nicht Spiele- und Multimedia-Programmierung 3
A Spielball bewegt sich nicht richtig, prallt falsch ab Spiele- und Multimedia-Programmierung 7
S KeyEvent funktioniert nicht, wenn Buttons dem Frame hinzugefügt werden Spiele- und Multimedia-Programmierung 7
Blender3D VLCJ Video lässt sich nicht mehr abspielen nach mysql Installation Spiele- und Multimedia-Programmierung 1
J Programm kann Audio Datei nicht finden Spiele- und Multimedia-Programmierung 7
Viktim Snake - Schlange wächst nicht Spiele- und Multimedia-Programmierung 3
J Mensch Ärgere Dich nicht - Künstliche Intelligenz Spiele- und Multimedia-Programmierung 2
C Export als .jar funktioniert nicht richtig (JAVA 3D) Spiele- und Multimedia-Programmierung 5
L Mensch ärgere dich nicht Spiele- und Multimedia-Programmierung 9
Polarfuchs Status von Midi Datei(wird gerade abgespielt oder nicht) Spiele- und Multimedia-Programmierung 0
A Bild(sequenz) wird nicht geladen Spiele- und Multimedia-Programmierung 1
4 AudioSystem.write() wirft IllegalArgumentException, obwohl dies eig. nicht passieren dürfte Spiele- und Multimedia-Programmierung 2
V Methoden werden zwar ausgeführt führen aber nicht zum Ergebnis Spiele- und Multimedia-Programmierung 5
M [JOGL] eclipse export Runnable Jar - startet nicht Spiele- und Multimedia-Programmierung 3
B LWJGL / OPENGL Kriege Depth-Test nicht hin :( Spiele- und Multimedia-Programmierung 0
S Slick2D KeyInput reagiert nicht. Spiele- und Multimedia-Programmierung 3
S Quaxli's Heli Spiel läuft nicht nach Plan Spiele- und Multimedia-Programmierung 2
W [libGDX] findet SplashScreen.png nicht Spiele- und Multimedia-Programmierung 4
T LWJGL VBO's funktionieren nicht, geben aber auch keinen Fehler Spiele- und Multimedia-Programmierung 0
Androbin Kollision zwischen Raster und Nicht-Raster Spiele- und Multimedia-Programmierung 2
O Fehler bei Programmierung lässt Figur nicht bewegen Spiele- und Multimedia-Programmierung 5
Androbin Mein Spiel will sich nicht zeichnen lassen !!! Spiele- und Multimedia-Programmierung 7
B Mein Programm reagiert nicht auf den Tasstendruck Spiele- und Multimedia-Programmierung 1
F HashMap liefert nicht gewünschten Wert (gar nix) Spiele- und Multimedia-Programmierung 5
J mensch ärger dich nicht Spiele- und Multimedia-Programmierung 1
M Spiele Tutorial.. Findet Bilddateien nicht Spiele- und Multimedia-Programmierung 6
G Ausführbare Jar findet Bilddateien nicht... Spiele- und Multimedia-Programmierung 4
P Rotation von Sprite klappt nicht Spiele- und Multimedia-Programmierung 4
A Minecraft Java Ubuntu Minecraft Server startet nicht - ERROR (SIGSEGV) Spiele- und Multimedia-Programmierung 7
F LWJGL: Licht und GL_LINES funktioniert nicht Spiele- und Multimedia-Programmierung 6
A [LWJGL] BMP Textur wird nicht richtig dargestellt Spiele- und Multimedia-Programmierung 8
N JPanel Inhalt aktualisiert nach Thread.sleep nicht Spiele- und Multimedia-Programmierung 2
S LWJGL Rechteck wird nicht gezeichnet Spiele- und Multimedia-Programmierung 6
J KeyMapping funktioniert nicht Spiele- und Multimedia-Programmierung 5
R Minecraft Minecraft läuft nicht paralel mit minecraft server ? Spiele- und Multimedia-Programmierung 3
S eine nullpointerexception, wo sie nicht sein sollte Spiele- und Multimedia-Programmierung 12
J Java3D - Textur laden geht nicht Spiele- und Multimedia-Programmierung 9
S Mensch-Ärger-Dich-Nicht Methoden Spiele- und Multimedia-Programmierung 2
S VLCJ libjawt.so nicht gefunden Spiele- und Multimedia-Programmierung 3
J Sound einbinden funktioniert nicht Spiele- und Multimedia-Programmierung 13
A JME3 will Blender/j3o Objekte nicht einladen Spiele- und Multimedia-Programmierung 3
D Slick Lib - Bilder einlesen funktioniert nicht Spiele- und Multimedia-Programmierung 2
Q BufferedImage vs. Heap Space ‒ Warum wird der Speicher nicht freigegeben? Spiele- und Multimedia-Programmierung 6

Ähnliche Java Themen

Neue Themen


Oben