SpaceInvader Kollisionprobleme.

Status
Nicht offen für weitere Antworten.

Corax

Mitglied
Hallo Leute, ich versuche grad SpaceInvader zu programmienen. Hab dazu ein Raumschiff, der ganz unten am Bildschirm platziert ist. Dieser muss herunterfallende Gegner abschießen.

Damit die Gegner auch an verschiedenen X-Koordinaten auftauchen, habe ich Math.random() benutzt. Zwar funktioniert dies, aber irgendwie habe ich das Gefühl, dass die Gegner nur von der linken Hälfte des Bildschirms fallen...

Zudem kann mein Raumschiff manchmal die Gegner nicht treffen, wenn ich z.B. x=x+10 setze (raumschiff bewegt sich nach rechts). Nur wenn ich x=x+1 setze, kriegt das Raumschiff auch die Koordinaten von den Gegnern, die ja per Zufall generiert werden. Ich möchte aber nicht dass das Raumschiff sich mit 1PS nach rechts/links bewegt sondern mit 10 oder 20z.B.

Ich hatte das so gemacht, dass ich die generierte Zahl geprüft habe, ob sie durch 2 teilbar ist oder sagen wir mal durch 10. Wenn nicht, sollte z.B. 5 abgezogen werden, wenn Rest = 5..

also Bsp:
Zufallszahl=156
156%10=6
156-6=150

Wenn ich mich jetzt mit 10PS bewege, müsste ich doch die X-Koordinaten von den herunterfallenden Gegner erwischen können..nur irgendwie ist das nicht der Fall bei mir..

wäre dankbar wenn ich mir helfen könntet..
bin noch nicht lange dabei, also seid mir nicht böse, wenn mein Code etwas unübersichtlich geworden ist..

Hier das Hauptfenster..



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


public class Hauptfenster extends JFrame implements KeyListener
{
	
	public JLabel Raumschiff,Laser,Gegner,exp;  		//LABELS
	public JButton button;								//BUTTON
	int x=0,y=550,yg=-100, yexp, lasersave, expPoint=1; //KOORDINATEN
	int zeit= 25,gzeit=50000; 							//ZEIT IN MILLISEKUNDEN
	boolean feuer=false,gegnerda=false, explosion=false, zufall=false;
	java.util.Random random = new java.util.Random();
	int zufallszahl = random.nextInt(650);
	{
		if(zufallszahl%2==1)
		{
			zufallszahl=zufallszahl-1;
		}		
		
	}
	
	
	//HAUPTFENSTER
	public Hauptfenster()
	{		
		super("Fenstername");
		addKeyListener(this);
		setExtendedState(MAXIMIZED_BOTH);
		this.setTitle("JLabel");	
		this.getContentPane().setLayout(null);
		Laser = new JLabel("",JLabel.CENTER);
		Raumschiff = new JLabel("",JLabel.CENTER);
		Gegner = new JLabel("",JLabel.CENTER);
		exp = new JLabel("",JLabel.CENTER);
		
		ImageIcon laser = new ImageIcon("Laser.gif");
		ImageIcon icon = new ImageIcon("Raumschiff.gif");
		ImageIcon gegner = new ImageIcon("gegner.gif");
		ImageIcon explosion = new ImageIcon("gegnerexp.gif");
		
		exp.setIcon(explosion);
		Raumschiff.setIcon(icon);
		Laser.setIcon(laser);
		Gegner.setIcon(gegner);
		
		Raumschiff.setBounds(x, 550, 160, 230);  
		
		Laser.setVisible(false);
		Gegner.setBounds(zufallszahl,-100, 160, 230);  
		Gegner.setVisible(false);
		
        this.getContentPane().add(Raumschiff);   
        this.getContentPane().add(Laser);
        this.getContentPane().add(Gegner);
        this.getContentPane().add(exp);
        
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	

	 //BEWEGUNG
	public void keyPressed(KeyEvent event)
	{      
		switch(event.getKeyCode())
		{
		case KeyEvent.VK_LEFT : {							 
								 x=x-2;		//LINKS,								 	 
								 Raumschiff.setBounds(x, 550, 160, 230); 
								 break;
								}
		case KeyEvent.VK_RIGHT : { 						
								 x=x+2;		//RECHTS,								 
			 					 Raumschiff.setBounds(x, 550, 160, 230); 
			 					 break;
								 }
		case KeyEvent.VK_SPACE : { 								
									new Timer(zeit, taskPerformer).start();
									Laser.setVisible(true);										
									if (feuer==false)
									{
										lasersave=x;
									}
									feuer=true;
									break;					
								}
		case KeyEvent.VK_UP :   { 
									new Timer(500, Gegnerf).start();
									gegnerda=true;
									break;		
								}
		}
	}
		

	//SCHUSS
	ActionListener taskPerformer = new ActionListener() 
	{
	   public void actionPerformed(ActionEvent evt) 
	   {
	    	{
		      if (feuer==true)
			  {
		    	y=y-1;
			    Laser.setBounds(lasersave,y, 160, 230); 
			    if (yg==y&&x==zufallszahl)
			    {   
			    	Gegner.setVisible(false);
			    	Gegner.setBounds(zufallszahl,-100, 160, 230);  
			    	TrefferSound treffer = new TrefferSound();
			    	Laser.setVisible(false);
		    		Laser.setBounds(x,550,160,230);
		    			    		
			    	feuer=false;
			    	y=550;

			    	new Timer(0, gegnerExplosion).start();			  			    	
		    		explosion=true;		
		    		gegnerda=true;
		    		zufall=true;
			    }
			 
			 }
		      	if (y<-180)
		      	{ 
			   		 feuer=false;
			   		 SchussSound schuss = new SchussSound();
			   		 y=550;
		      	}
		      	else {};		      	
		      	if(yg>=800)
		      	{
		      		yg=-150;
		      	}					      	
	      }
	   }
	};

	
	//GEGNER FÄLLT RUNTER!!!
	ActionListener Gegnerf = new ActionListener() 
	{
		public void actionPerformed(ActionEvent evt) 
		{			
			Random rand = new Random();	
			if(zufall==true)
			{
				zufallszahl=zufallszahl-Math.abs(rand.nextInt()%600+1);
				if(zufallszahl%10==1)
				{
					zufallszahl=zufallszahl-1;
				}
				if(zufallszahl<=10)
				{
					zufallszahl=zufallszahl+200;
				}				
				zufall=false;
				gegnerda=true;
				
				
				if(zufallszahl<=0)
				{
					zufallszahl=zufallszahl+Math.abs(rand.nextInt()%600+1);
					if(zufallszahl%2==1)
					{
						zufallszahl=zufallszahl-1;
					}
					if(zufallszahl>=600)
					{
						zufallszahl=zufallszahl-200;
					}				
					zufall=false;
					gegnerda=true;
					
				}
				if(zufallszahl>=600)
				{
					zufallszahl=zufallszahl-Math.abs(rand.nextInt()%600+1);
					if(zufallszahl%2==1)
					{
						zufallszahl=zufallszahl-1;
					}
					if(zufallszahl<=10)
					{	
						zufallszahl=zufallszahl+200;
					}										
					zufall=false;
					gegnerda=true;					
				}
			}
			
			if (gegnerda==true&&zufall==false)
			{	
				
				Gegner.setBounds(zufallszahl,-150, 160, 230);
				Gegner.setVisible(true);
	
				exp.setVisible(false);
				
				yg=yg+10;
				Gegner.setBounds(zufallszahl,yg, 160, 230); 
				
				if (yg>=800)
				{ 
					gegnerda=false;
					TrefferSound sound = new TrefferSound();
					zufall=true;
					gegnerda=true;
					return;
					
						    	 	
				}	
				else 
				{ 
					Gegner.setBounds(zufallszahl,yg, 160, 230);
					gegnerda=true;
				}	
				
			}
		}	  
	};
	
	
	//GEGNER EXPLODIERT
	ActionListener gegnerExplosion = new ActionListener() 
	{
		public void actionPerformed(ActionEvent evt) 
		{
						if(explosion==true)
						{
							exp.setBounds(zufallszahl,yg, 160, 230);
							exp.setVisible(true);							
							VerlorenSound verloren = new VerlorenSound();
							yg=-200;
						}
						
						explosion=false;
						
						
		}
	
	
	
};
	
	public void keyReleased(KeyEvent arg0) {}
	public void keyTyped(KeyEvent arg0) {}
}
 

Quaxli

Top Contributor
Spielelemente vom Typ JLabel. Das mag ich nicht wirklich kommentieren. Kleiner Tipp: Wirf es weg und mach es neu. Ganz ehrlich. Mit dem Konstrukt wirst Du nicht glücklich.

<Eigenlob an>
Es gibt da ein ganz tolles Tutorial zur Spieleprogrammierung. Das Tutorial ist u. a. so toll, weil es von mir ist ;) ;) ;)
</Eigenlob an>

Guck Dir mal das hier an. Das Tutorial zeigt Dir die ungefähren Grundzüge, wie man so etwas aufzieht, von den Basics wie ein animiertes Objekt erstellen bis später zur pixelgenauen Kollision, wenn Du das brauchst. Es paßt vielleicht nicht 100% auf jedes Spielprinzip sollte Dir aber auf jeden Fall die Grundzüge verdeutlichen.
 

0x7F800000

Top Contributor
Quaxli hat gesagt.:
Kleiner Tipp: Wirf es weg und mach es neu. Ganz ehrlich. Mit dem Konstrukt wirst Du nicht glücklich.
schließe mich da an. Du hast irgendwie alle möglichen Klassen total zweckentfremdet :shock: , imho hat 90% von dem was da drin steht in so einem Programm nichts zu suchen, dafür hast du die ganzen unumgänglichen Sachen weggelassen, und quälst dich selbst in jeder unbedeutenden methode mit irgendwelchen manuellen pixelangaben, statt dich auf das wesentliche zu konzentrieren...
 

Corax

Mitglied
gut, hab das irgendwie hinbekommen, nur habe ich jetzt ein problem.

zufallszahl=rand.nextInt()%1100+220; müsste doch als zufallszahl eine zahl zwischen 220 und 1100 aus dem system rausfischen..

Aber irgendwie funktioniert das nicht so ganz, weil ich die gegner manchmal nicht sehe, d.h sie sind raus aussem Bildschirm..
bei mir endet der Bildschirm bei x=1100 und y=550

hoffe ihr könnt mir helfen...
mfg
 

0x7F800000

Top Contributor
Nun gut, die Ursache für dieses Problem ist wesentlich trivialer
1100+220=1320 > 1100 ;)

Code:
rand.nextInt()%1100 //liefert werte von 0 bis 1099
 

Leroy42

Top Contributor
oder als Methode:

Code:
int zuffi(int von, int bis) {
  return new Random().nextInt(bis-von+1) + von+1;
}

Edit: besser:
Code:
private final Random rand = new Random();
int zuffi(int von, int bis) {
  return rand.nextInt(bis-von+1) + von+1;
}

und noch besser:
Code:
private static final Random rand = new Random();
int zuffi(int von, int bis) {
  return rand.nextInt(bis-von+1) + von+1;
}

:cool:
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben