Space Invaders

  • Onderwerp starter Onderwerp starter Ro3
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Ro3

Gebruiker
Lid geworden
19 mei 2008
Berichten
6
De method in spel om de coordinaten van raket en alien te vergelijken werkt niet.
Iemand?

Spel
Code:
import java.applet.*;
import java.awt.*;
import javax.swing.Timer;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.Object;
import java.util.ArrayList;
import java.util.Random;


//een simpel schietspel van 15 seconden waarbij het ruimteschip dmv raketten bewegende aliens 
//moet zien te raken en dmv bewegen zijn positie kan bepalen
public class Spel extends Applet 
{	
	//Timers
	Timer nieuwePositieTimer;
	Timer nieuweAlienTimer;
	Timer stopSpelTimer;
	//een nieuwe arraylist bewegendedelen
	ArrayList<BewegendeDelen> bewegendedelenarray = new ArrayList<BewegendeDelen>();
	Ruimteschip ruimteschip = new Ruimteschip();
    Raket raket = null;
	
	
	public void init()
	{
		setBackground(Color.white);
		
		//nieuwepositielistener
		ActionListener nieuwePositieListener = new nieuwePositieListener();
		//interval van 1/4 seconde
		final int nieuwepositieDELAY = 250;
		//nieuwe positie timer
		Timer nieuwePositieTimer = new Timer(nieuwepositieDELAY, nieuwePositieListener);
        this.nieuwePositieTimer = nieuwePositieTimer;
		//start de nieuwe positietimer
		nieuwePositieTimer.start();
		
		//nieuwe alien listener
		ActionListener nieuweAlienListener = new nieuweAlienListener();
		//interval van 4 seconden
		final int nieuwealienDELAY = 4000;
		//nieuwe alientimer
		Timer nieuweAlienTimer = new Timer(nieuwealienDELAY, nieuweAlienListener);
        this.nieuweAlienTimer = nieuweAlienTimer;
        
		//start de nieuwe alientimer
		nieuweAlienTimer.start();
		
		//stop het spel listener
		ActionListener stopSpelListener = new stopSpelListener(15); 
		//1 seconde interval
		final int stopspelDELAY = 1000;
		//nieuwe timer stop het spel
		stopSpelTimer = new Timer(stopspelDELAY, stopSpelListener);
		//start de timer
		stopSpelTimer.start();
		
		//bewegendedelenarray.add(alien);
		bewegendedelenarray.add(ruimteschip);
		//bewegendedelenarray.add(raket);
		
	}	
	
	//tekenen
	public void paint(Graphics g)
	{	//print uit bewegendedelenarray obj van het type BewegendeDelen
		for(BewegendeDelen obj : bewegendedelenarray)
		{	//teken de bewegende delen (ruimteschip, aliens en raketten)
			System.out.println(obj);
			obj.paint(g);
			//als teller op nul staat game over!
			if (count <= 0)
			g.drawString("Game over!", 250, 250);
			//laat de score zien als de teller op nul staat
			if (count <= 0) 
			g.drawString("Je score is: " + score + "!", 250, 300); 
		}	
	}
	
	
	
	//pijltjes toetsen indrukken om te bewegen en spatie om te schieten
	public boolean keyDown(Event e, int key) 
		{	//naar links
			if(key == Event.LEFT)
			{	if (ruimteschip.getX() > 10)
				{
					ruimteschip.beweegLinks();
					System.out.println("links");
					repaint();
				}
			}
			else
			//naar rechts
			if(key == Event.RIGHT) 
			{	if (ruimteschip.getX() < 450)
				{
					ruimteschip.beweegRechts();
					repaint();
				}
			}
			
			else
			//schieten
			if (key == 32) 
			{			
				raket = new Raket(ruimteschip.getX(), ruimteschip.getY());
                bewegendedelenarray.add(raket);
				raket.beweeg();
				repaint();
					
			}
		return true;
		}
	
	
	//kijken of de raket een alien raakt
	public boolean isGeraakt()
	{
		for(BewegendeDelen obj : bewegendedelenarray)
		//controleren of er een raket is
		while(raket != null)
		{	//als objecten zelfde coordinaten hebben, verwijder object, opnieuw tekenen en score ophogen
			if (obj.getX() >= obj.getX()  && obj.getX() <= (obj.getX()+obj.getWeergave().length()) && obj.getX()==obj.getY())
			{	//roep verwijderen aan
				obj.verwijder();
				
				raket = null;	
				repaint();
				score++;
			}
	
		}
		
		return !gemist;
	}	
	
	//iedere 1/4 seconden krijgen de aliens een nieuwe positie 
	class nieuwePositieListener implements ActionListener
	{
		public void actionPerformed(ActionEvent event)
		{   System.out.println("nieuwe pos");
		   Random generator = new Random();
		    
  			for(BewegendeDelen obj : bewegendedelenarray)
			{	
				obj.beweeg();
			}          
             repaint(); 
		}
		
	} 
	
	//om de vier seconden een nieuwe alien op het scherm
	class nieuweAlienListener implements ActionListener
	{
		public void actionPerformed(ActionEvent event)
		{	//voeg een nieuw alien object aan de array toe en repaint
		    System.out.println("nieuwe alien");
			bewegendedelenarray.add(new Alien());
			//repaint();
		}
		

	} 
	
	//na 15 seconden stopt het spel: Game Over!
	class stopSpelListener implements ActionListener
	{
		public stopSpelListener(int initialCount)
		{
			count = initialCount;
		}
		
		public void actionPerformed(ActionEvent event)
        {   count--;   
		  
		  //als de teller op 0 staat is het spel voorbij
			if (count == 0) 
			{
				nieuwePositieTimer.stop();
             	nieuweAlienTimer.stop();
             	stopSpelTimer.stop();
			} 
			else 
			{
			 System.out.println("time left: " + count);
			}				
		}
		
		//private int count;
	} 
	
	
	
	
	//instantievariabelen
	private int count;
	private int score;
	private boolean gemist;
}

Superklasse
Code:
import java.awt.*;
import java.awt.Graphics2D;

//superclass met gezamenlijke eigenschappen van de bewegende delen ruimteschip, alien en raket
public class BewegendeDelen
{
	public void paint(Graphics g) 
    { 	//weergave drawstring met x en y positie
    	Graphics2D g2D = (Graphics2D)g;
        g.drawString(weergave, x, y); 
	}
	
	//zet de x positie
	public void setX(int xPos)
	{
		x = xPos;
	}
	
	//en y positie
	public void setY(int yPos)
	{
		y = yPos;
	}
	

	public void setWeergave(String deWeergave)
	{
		weergave = deWeergave;
	}
	
	public String getWeergave()
	{
		return weergave;
	}
	
	public int getX()
	{
		return x;
	}
	
	public int getY()
	{
		return y;
	}
	

	
	
	//beweegmethod rechts
	public void beweegRechts()
	{	//verschuif rechts
		x = x + 25;
	}
    
    //beweegmethod links
	public void beweegLinks()
	{	//verschuif links
		x = x - 25;
	}
	
	public void beweeg() 
	{
	}
	
	
	public void verwijder()
	{
	}
	
	public String toString() 
	{
	   return weergave + ": (" + x + ", " + y +")";
	}
	
	//geef de breedte terug
	public int getWidth()
	{
		return width;
	}
	
	
	
	
	
	   
	//instantievariabelen
	public int x;
	public int y;
	public String weergave;
	public int width;

}

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

//subklasse van "bewegendedelen" die eigenschappen ervan erft, en met beweegmethods
public class Ruimteschip extends BewegendeDelen
{ 	
	public Ruimteschip()
	{   
		weergave = "<<=>>";
        x = 250;
    	y = 500;
	}	
}

Code:
import java.awt.*;
import java.awt.image.*;
import java.applet.Applet;

//de alien class
public class Alien extends BewegendeDelen
{
	public Alien()
	{   
		weergave = "^^^";
		y = 25;
	}
	
	public void beweeg() 
	{
		x= x+10;
	}
	

}

Code:
import java.awt.*;
import java.awt.image.*;
import java.applet.Applet;

public class Raket extends BewegendeDelen
{
	public Raket(int x, int y)
    { 
    	weergave = "|";
    	setX(x+17);
    	setY(y);
    
    } 

	//schietmethod, verticaal omhoog bewegen
	public void beweeg()
	{
		y = y - 40;
	}	
		
	//een lege string als weergave
	public void verwijder()
	{
		weergave = "";
	}
}
 
Je roept isGeraakt nooit aan..

Als je met threads werkt moet je ook opletten dan je variable "synchronized" zijn.
Anders kan een thread de x-waarde zetten terwijl de andere thread op hetzelfde moment x waarde probeert te lezen.. Dit kan rare effecten geven...

Gebruik ook Swing ipv AWT dus geen Applet meer maar JApplet!.
 
awt is beter als je met tekenwerk aan de slag gaat, ik raad aan om daar bij te blijven
 
Ik zal wel overstappen op swing, zeker met tekenen.

Als je spelletje af is zal je zien dat het beeld knippert.. nu kan je zelf off screen gaan tekenen en scherm tonen als het klaar is... Maar door gebruik van JComponent en JApplet krijg je dit "gratis".. (tevens zijn er vele componenten alleen in swing beschikbaar)

En swing is sinds java 1.4 vaak nog sneller ook..
 
Hoi jongens, bedankt voor de tips! Ik hou het bij awt. En het spelletje is praktisch af alleen lukt het me niet om de method 'controleerHit' in orde te maken. Heeft iemand hier tips voor?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan