KeyDown om ruimteschip te bewegen

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

Ro3

Gebruiker
Lid geworden
19 mei 2008
Berichten
6
Hoi! Ik ben een simpel space invaders spelletje aan het maken. Nu heb ik een aantal objecten die moeten gaan bewegen (aliens, ruimteschip, raketten) dit zijn allemaal verschillende klasses. Omdat ze bepaalde eigenschappen hetzelfde hebben, heb ik een superklass "bewegendedelen" gemaakt.
Nu wil ik vanuit mijn main dmv een "keydown event" mijn ruimteschip gaan bewegen.
Hier is de code van die method:
Code:
	//pijltjes toetsen indrukken om te bewegen en spatie om te schieten
	public boolean keyDown(Event e, int key) 
		{
			if(key == Event.LEFT) naarLinks = true; //ruimteschip.beweegLinks();
			if(key == Event.RIGHT) naarRechts = true; //ruimteschip.beweegRechts();
			if (key == 32) 
				{
					//ruimteschip.schietRaket();
					//if raket.getPosition == alien.getPosition (score + 1)
					
				}
		return true;
		}

De "beweeglinks" en "beweegrechts" methoden komen uit mijn Ruimteschip.class
Hoe zorg ik er nu voor dat in de keydown method deze beweegmethods aangeroepen worden? Alvast bedankt voor jullie hulp!
 
Laatst bewerkt:
Hier heb je een voorbeeld van een keylistener op een applet:

Code:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

/**
 *
 * @author killermenace
 */
public class keyListenerClass extends java.applet.Applet implements KeyListener {
    
    private javax.swing.JLabel _label = new javax.swing.JLabel("testlabel");
    
    @Override
    public void init(){
        this.setFocusable(true);
        this.addKeyListener(this);
        _label.setBounds(50, 50, 200, 50);
        this.add(_label);
    }

    public void keyTyped(KeyEvent e) {
        //dummy
    }
//elke keer dat er een toets in wordt gedrukt, dan wordt dat weergegeven in het label
//behalve als het een keydown is, dan wordt er keyDown in de label gezet.
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_DOWN){
            _label.setText("keyDown");
            //hier kan je dan ook je eigen code in zetten.
        } else{
            _label.setText("" + e.getKeyChar());
        }
    }

    public void keyReleased(KeyEvent e) {
        //dummy
    }
}

Ik hoop dat je hier wat verder mee kan :)
 
Laatst bewerkt:
Bedankt. Ik heb de code nu op deze manier aangepast, maar ik heb een aantal foutmeldingen. Betekent dat mijn code fundamenteel niet OK is? of zie ik een aantal triviale fouten over het hoofd?
Code:
//pijltjes toetsen indrukken om te bewegen en spatie om te schieten
	public boolean keyDown(Event e, int key) 
		{	//naar links
			if(key == Event.LEFT)
			{
				 ruimteschip.beweegLinks();
			}
			else
			//naar rechts
			if(key == Event.RIGHT) 
			{
				ruimteschip.beweegRechts();
			}
			else
			//schieten
			if (key == 32) 
				{
					//ruimteschip.schietRaket();
					//if raket.getPosition == alien.getPosition (score + 1)
					
				}
		return false;
		}
 
Wat voor foutmeldingen geeft hij?
Geef je hele code eens en niet alleen deze functie, dan kunnen we kijken waar de foutmeldingen precies vandaan komen.
 
De main class ziet er als volgt uit:

Code:
import java.applet.*;
import java.awt.*;
import javax.swing.JFrame; 
import javax.swing.JPanel;
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;


//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 
{
	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);
		//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);
		//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
		Timer stopSpelTimer = new Timer(stopspelDELAY, stopSpelListener);
		//start de timer
		stopSpelTimer.start();
	}	
	
	//maak een nieuw spel
	Spel schietspel = new Spel();
	//maak een nieuw ruimteschip
	Ruimteschip ruimteschip = new Ruimteschip();
	
	//een arraylist die wordt gevuld met de bewegendedelen 
	ArrayList<BewegendeDelen> bewegendedelenarray = new ArrayList<BewegendeDelen>();
	
	//tekenen
	public void paint(Graphics G)
	{
		for(BewegendeDelen obj : bewegendedelenarray)
			//teken de bewegende delen (ruimteschip, aliens)
			
	}
	
	
	//pijltjes toetsen indrukken om te bewegen en spatie om te schieten
	public boolean keyDown(Event e, int key) 
		{	//naar links
			if(key == Event.LEFT)
			{
				 ruimteschip.beweegLinks();
			}
			else
			//naar rechts
			if(key == Event.RIGHT) 
			{
				ruimteschip.beweegRechts();
			}
			else
			//schieten
			if (key == 32) 
				{
					//ruimteschip.schietRaket();
					//if raket.getPosition == alien.getPosition (score + 1)
					
				}
		return false;
		}
	
	//iedere 1/4 seconden krijgen de aliens een nieuwe positie 
	class nieuwePositieListener implements ActionListener
	{
		public void actionPerformed(ActionEvent event)
		{
			//bereken een nieuwe (random?) positie
		}
		
		
		
	} 
	
	//om de vier seconden een nieuwe alien op het scherm
	class nieuweAlienListener implements ActionListener
	{
		public void actionPerformed(ActionEvent event)
		{
			//zolang het spel duurt (15 s) geef om de 4 seconden een nieuwe alien weer
			//while
		}
		
	
	} 
	
	//na 15 seconden stopt het spel: Game Over!
	class stopSpelListener implements ActionListener
	{
		public stopSpelListener(int initialCount)
		{
			count = initialCount;
		}
		
		public void actionPerformed(ActionEvent event)
		{	//als de teller op 0 staat is het spel voorbij
			if (count == 0)
				System.out.println("Game Over!");
			count--;
		}
		
		private int count;
	} 
	
	
	//instantievariabelen
	//public int score;
}	
}
Verder heb ik een superklasse "bewegendedelen.class" die gedeelde eigenschappen van de subklasses "ruimteschip.class" en "alien.class" bezit.

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) 
    { 	//weergeven
    	Graphics2D g2D = (Graphics2D)g;
        String s = "";
        g.drawString(s, x, y); 
	}
	
	//instantievariabelen
	public String s;
	public int x;
	public int y;
}

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 void paint(Graphics g) 
    { 	
        String s = "ruimteschip";
        
    } 
		
	//beweegmethod
	public void beweegRechts()
	{	//verschuif 1 coordinaat rechts
		x++;
	}
    
    //beweegmethod
	public void beweegLinks()
	{	//verschuif 1 coordinaat links
		x--;
	}
	
	//instantievariabelen
	public String s;
}

Vergeef me bepaalde imports. In de loop van het maken van dit programma heb ik verschillende dingen geprobeerd, zodoende zijn er een aantal imports overbodig geworden vermoed ik. Ontzettend bedankt voor je hulp!
 
Bij mij waren er maar 2 compileer fouten:

Code:
	public void paint(Graphics G)
	{
		for(BewegendeDelen obj : bewegendedelenarray)
			//teken de bewegende delen (ruimteschip, aliens)
		    [COLOR="Red"] ;	[/COLOR] // sommige compilers klagen hiervan en            eisen minstens 1 commando na een if test
	}
	
	....

	//instantievariabelen
	//public int score;
}	
[COLOR="Red"]}	[/COLOR]	// deze mag weg hoor! ( einde main klasse )

En btw je moet in je main klasse wel een
PHP:
public static void main( String[] args ) { }
implementeren anders werkt de boel niet:)
 
Je hoeft een main niet
Code:
public static void main( String[] args ) { }
te geven, als het een applet is :)
 
Update

Van de superclass "BewegendeDelen" (met subclasses "Ruimteschip" en "Alien") maak ik een arryalist die ik wil vullen met ruimteschip en alien objecten.
Ik probeer dat op deze manier. Doe ik dit zo goed, en waarom krijg ik dan die foutmeldingen?

Code:
//een arraylist die wordt gevuld met de bewegendedelen 
	ArrayList<BewegendeDelen> bewegendedelenarray = new       ArrayList<BewegendeDelen>();
	
	//voeg de ruimteschip en alien objecten toe aan de arraylist
	bewegendedelenarray.add(new Ruimteschip());
	bewegendedelenarray.add(new Alien());

Vervolgens wil ik deze bewegendedelen via een for loop in mijn paint method tekenen, hoe krijg ik dat voor elkaar?

Code:
//tekenen
	public void paint(Graphics G)
	{
		for(BewegendeDelen obj : bewegendedelenarray)
		{	//teken de bewegende delen (ruimteschip, aliens)
			
		}	
	}

Alvast bedankt voor je interesse en hulp!
 
Je zou in de classes een eigen paint kunnen zetten die een positie e.d. heeft.
Dan kan je de arraylist doorlopen en dan op elk onderdeel van de arraylist de ,paint(g) aanroepen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan