Java game

Status
Niet open voor verdere reacties.

blannie

Nieuwe gebruiker
Lid geworden
30 jan 2010
Berichten
2
Ik ben begonnen met het maken van een pong spelletje voor 1 persoon. Ik ben al een aardig eind gekomen maar liep tegen een muur aan.

De bal moet door het gehele applet bouncen maar wanneer de bal aan de rechter komt komt is de bal uit en begint het opnieuw. uiteraard moet deze bal kunnen worden tegengehouden door een klein balkje en weer terugbouncen het veld in. dit balkje moet te bedienen zijn met de up en down toetsen.

echter heb ik een probleempje om mijn keylistener te laten luisteren en daarmee mijn balkje te laten bewegen en de bal ervan af te laten stuiteren.

Code:
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

@SuppressWarnings("serial")
public class opdracht extends Applet {
	private Veld veld;
	private Bal bal;
	private Button startKnop, pauzeKnop, gadoorKnop, stopKnop;
	private Plank plank;
	//public int x = 300;
	//public int y = 100;
  
		public void init() {
			veld = new Veld( this, 50, 320, 200, 50 );
			plank = new Plank (this,300,130,0 );

			startKnop = new Button( "Start" );
			pauzeKnop = new Button( "Pauze" );
			gadoorKnop = new Button( "Ga door" );
			stopKnop = new Button( "Stop" );
			KnopHandler handler = new KnopHandler();
			startKnop.addActionListener( handler );
			stopKnop.addActionListener( handler );
			gadoorKnop.addActionListener( handler );
			pauzeKnop.addActionListener( handler );

			add( startKnop );
			add( pauzeKnop );
			add( gadoorKnop );
			add( stopKnop );
			
			addKeyListener (new toetsenHandler());
			System.out.println("keyboardhandler");
			requestFocus();
  }
  
 class toetsenHandler extends KeyAdapter implements KeyListener{
	 //private int x;
	 //private int y;
	 public void keyPressed(KeyEvent e){
				int keyCode = e.getKeyCode();
					switch(keyCode){
						
						case KeyEvent.VK_DOWN:
							plank.y += 10;
							System.out.println("down");
							break;
								
						case KeyEvent.VK_UP:
							plank.y -= 10;
							System.out.println("up");
							break;
						
						}
					repaint();
						} 
					}		
		
		public void paint( Graphics g ) {
		    veld.teken();
		    plank.teken();
		    //g.fillRect(x,y,10,60);
		  }
		
		public void start() {
			if( bal == null ) {
				bal = new Bal( this, plank, 10, getBackground(), veld );
				bal.start();
    }
  }
    
		public void stop() {
			if( bal != null ) {
				bal.nuStoppen();
				bal = null;
    }
  }

 class KnopHandler implements ActionListener {
	 	public void actionPerformed( ActionEvent e ) {
	 			if( e.getSource() == startKnop ) {
	 				start();
      }
	 			if( e.getSource() == pauzeKnop ) {
	 				if( bal != null ) {
	 					bal.pauzeer();
        }
      }
	 			if( e.getSource() == gadoorKnop ) {
	 				if( bal != null ) {
	 					bal.pauzeVoorbij();
        }
      }
	 			if ( e.getSource() == stopKnop ) {
	 				stop();
      }
    }
  }
}


class Veld {
  private Graphics g;
  public int links, boven, rechts, onder;
  
  		Veld( Applet applet, int links, int rechts, int onder, int boven ) {
  			g = applet.getGraphics();
  			this.links = links;
  			this.rechts = rechts;
  			this.onder = onder;
  			this.boven = boven;
  }
  
  		void teken() {
  			int breedte = rechts - links, hoogte = onder - boven;
  			g.setColor( Color.black );
  			g.drawRect( links, boven, breedte, hoogte );
  			g.setColor( Color.white );
  			g.fillRect( links + 1, boven + 1, breedte - 1, hoogte - 1 );
  }
}

class Bal extends Thread {
  private Graphics g;
  private int grootte;
  private int x, y;
  private int dx = 3, dy = 2;
  private Color wisKleur;
  private Veld veld;
  private boolean isPauze, doorgaan;
  
  		public Bal( Applet applet, Plank mijnPlank, int grootte, Color wisKleur, Veld veld ) {
  			g = applet.getGraphics();
  			this.grootte = grootte;
  			this.wisKleur = wisKleur;
  			this.veld = veld;
  			doorgaan = true;
    
  }
  
  		public void teken() {
  			g.setColor( Color.red );
  			g.fillOval( x, y, grootte, grootte );
  }
  
  		public void wis() {
  			g.setColor( wisKleur );
  			g.fillOval( x, y, grootte, grootte );
  }
 
  		public void verplaats() {
  			if( x + dx <= veld.links) dx = -dx;
    
  			if( y + dy <= veld.boven ||
  				y + dy + grootte >= veld.onder ) dy = -dy;
    
  			if(x +dy + grootte >= veld.rechts) run();
  			
  			//if(x +dy + grootte >= mijnPlank) dx = -dx;
     
  			x += dx;  y += dy;
  }
 
  		public void nuStoppen() {
  			doorgaan = false;
  }

  		public void pauzeer() {
  			isPauze = true;
  }

  		public synchronized void pauzeVoorbij() {
  			isPauze = false;
  			notify();
  }

 		private synchronized void controleerPauze() 
 			throws InterruptedException {
 			while( isPauze ) {
 			wait();
    }
  }    
  
  		public void run() {
  			x = veld.links + 1;
  			y = veld.boven + 1;
  			while( doorgaan ) {
  				teken();
  				slaap( 50 );
  				wis();
  				verplaats();
    }
  }
  
  		public void slaap( int millisec ) {
  			try {
  				sleep( millisec );
  				controleerPauze();
    }
  			catch( InterruptedException e ) {
    }
  }
  	
}

class Plank extends Thread {
	private Graphics g;
	private int x;
    public int y;
    private int BREEDTE =10;
    private int HOOGTE =50;
    private int maxY;
	
    
    	public Plank (Applet applet,int x, int y, int hoogte) {
    		g = applet.getGraphics();
    		this.x = x;
    		this.y = y;
    		this.maxY = hoogte;
    	
		}
		void teken(){
			    g.setColor(Color.black);
    			g.fillRect(x,y,BREEDTE,HOOGTE);
    	}
}

Ik hoop dat jullie mij kunnen helpen.

Alvast bedankt.
 
Laatst bewerkt:
thread is de oplossing
Het lijkt een school oefening dus implements runneble eerst bekijken wat het is
dus als u meerdere instanties kan maken van het spel wat is de bedoeling elk spel stand allown werkt zoniet bekijk eens socket rmi of ejb3 neem aan als je stevig naar buiten wil komen zult u ejb3 moeten gebruiken zodat je eenvoudige client-server afhandeling kan doen
 
thread is de oplossing
Het lijkt een school oefening dus implements runneble eerst bekijken wat het is
dus als u meerdere instanties kan maken van het spel wat is de bedoeling elk spel stand allown werkt zoniet bekijk eens socket rmi of ejb3 neem aan als je stevig naar buiten wil komen zult u ejb3
moeten gebruiken zodat je eenvoudige client-server afhandeling kan doen
????

Als ik zelf zoiets zal schrijven zal ik heel anders doen. Nu zijn je bal en batje een eigen thread.
Communicatie tussen threads is altijd lastig omdat je de variablen synchronized of volatile moeten zijn..
(Als een thread een variable schrijft en de andere thread op hetzelfde moment de variable probeert te lezen kan je hele rare fouten krijgen.)

Ik zou voor een Timer kiezen.. (en wel uit de javax.swing package..)

Code:
Timer timer = new Timer(100,new ActionListener() { //100 is interval in milliseconden
     public void actionPerformed(ActionEvent evt) {
          //hier de code om je bat + bal te bewegen...
      }
}
timer.start();

Als je deze code gebruikt worden je bat en bal een stuk eenvoudiger.
Alles runt 1 thread nml the swing thread of (EDT) dus mag je scherm updates uitvoeren..

Nog iets anders.. deze code zie je heel vaak maar is echt fout...

Code:
try {
  	sleep( millisec );
  	controleerPauze();
}
  	catch( InterruptedException e ) {
}

Sleep gooit een interruptedException als deze vroegtijdig wordt ontwaakt.
Dit heeft een reden, gewoon catch doen is niet de oplossing.
Je moet op z'n minst de interrupt status herzetten met Thread.currentThread().interrupt();
 
Bedankt voor alle suggesties. Ik heb zelf het batje werkend gekregen.

Ik had dan eigenlijk 1 vraag over wat ik niet helemaal voor elkaar krijg.
Hoe krijg ik het zo dat de bal tegen het batje terug het veld in bounced.

ik probeer het nu via deze regel te doen: if(x +dy + grootte >= plank) dx = -dx
in de public void verplaats, echter krijg ik dat dus niet helemaal werkend.

bij voorbaat dank

Code:
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

@SuppressWarnings("serial")
public class opdracht extends Applet {
	private Veld veld;
	private Bal bal;
	private Button startKnop, pauzeKnop, gadoorKnop, stopKnop;
	private Plank plank;
	//public int x = 300;
	public int y = 100;
  
		public void init() {
			veld = new Veld( this, 50, 320, 200, 50 );
			plank = new Plank (this,300,130,0 );

			startKnop = new Button( "Start" );
			pauzeKnop = new Button( "Pauze" );
			gadoorKnop = new Button( "Ga door" );
			stopKnop = new Button( "Stop" );
			//KnopHandler handler = new KnopHandler();
			//startKnop.addActionListener( handler );
			//stopKnop.addActionListener( handler );
			//gadoorKnop.addActionListener( handler );
			//pauzeKnop.addActionListener( handler );
			
			addKeyListener (new toetsenHandler());
			System.out.println("keyboardhandler");
			
			
			//add( startKnop );
			//add( pauzeKnop );
			//add( gadoorKnop );
			//add( stopKnop );
			requestFocus();

  }
  
 class toetsenHandler extends KeyAdapter implements KeyListener{
	 //private int x;
	 public int y = 100;
	 //private Plank plank;
	 
	 public void keyPressed(KeyEvent e){
		 		System.out.println("inhandler");
				int keyCode = e.getKeyCode();
					switch(keyCode){
						
						case KeyEvent.VK_DOWN:
							System.out.println("down1");
							plank.y += 10;
							System.out.println("down");
							break;
								
						case KeyEvent.VK_UP:
							plank.y -= 10;
							System.out.println("up");
							break;
						
						}
					repaint();
						} 
					}		
		
		public void paint( Graphics g ) {
		    veld.teken();
		    plank.teken();
		    //g.fillRect(x,y,10,60);
		  }
		
		public void start() {
			if( bal == null ) {
				bal = new Bal( this, plank, 10, getBackground(), veld );
				bal.start();
			}
  }
    
		public void stop() {
			if( bal != null ) {
				bal.nuStoppen();
				bal = null;
    }
  }

 class KnopHandler implements ActionListener {
	 	public void actionPerformed( ActionEvent e ) {
	 			if( e.getSource() == startKnop ) {
	 				start();
      }
	 			if( e.getSource() == pauzeKnop ) {
	 				if( bal != null ) {
	 					bal.pauzeer();
        }
      }
	 			if( e.getSource() == gadoorKnop ) {
	 				if( bal != null ) {
	 					bal.pauzeVoorbij();
        }
      }
	 			if ( e.getSource() == stopKnop ) {
	 				stop();
      }
    }
  }
}


class Veld {
  private Graphics g;
  public int links, boven, rechts, onder;
  
  		Veld( Applet applet, int links, int rechts, int onder, int boven ) {
  			g = applet.getGraphics();
  			this.links = links;
  			this.rechts = rechts;
  			this.onder = onder;
  			this.boven = boven;
  }
  
  		void teken() {
  			int breedte = rechts - links, hoogte = onder - boven;
  			g.setColor( Color.black );
  			g.drawRect( links, boven, breedte, hoogte );
  			g.setColor( Color.white );
  			g.fillRect( links + 1, boven + 1, breedte - 1, hoogte - 1 );
  }
}

class Bal extends Thread {
  private Graphics g;
  private int grootte;
  private int x, y;
  private int dx = 3, dy = 2;
  private Color wisKleur;
  private Veld veld;
  private Plank plank;
  private boolean isPauze, doorgaan;
  
  		public Bal( Applet applet, Plank plank, int grootte, Color wisKleur, Veld veld ) {
  			g = applet.getGraphics();
  			this.grootte = grootte;
  			this.wisKleur = wisKleur;
  			this.veld = veld;
  			doorgaan = true;
  			this.plank = plank;
    
  }
  
  		public void teken() {
  			g.setColor( Color.red );
  			g.fillOval( x, y, grootte, grootte );
  }
  
  		public void wis() {
  			g.setColor( wisKleur );
  			g.fillOval( x, y, grootte, grootte );
  }
 
  		public void verplaats() {
  			if( x + dx <= veld.links) dx = -dx;
    
  			if( y + dy <= veld.boven ||
  				y + dy + grootte >= veld.onder ) dy = -dy;
    
  			if(x +dy + grootte >= veld.rechts-6) doorgaan = false;
  			
  			//if(x +dy + grootte >= plank) dx = -dx 
     
  			x += dx;  y += dy;
  }
 
  		public void nuStoppen() {
  			doorgaan = false;
  }

  		public void pauzeer() {
  			isPauze = true;
  }

  		public synchronized void pauzeVoorbij() {
  			isPauze = false;
  			notify();
  }

 		private synchronized void controleerPauze() 
 			throws InterruptedException {
 			while( isPauze ) {
 			wait();
    }
  }    
  
  		public void run() {
  			x = veld.links + 1;
  			y = veld.boven + 1;
  			while( doorgaan ) {
  				teken();
  				slaap( 50 );
  				wis();
  				verplaats();
    }
  }
  
  		public void slaap( int millisec ) {
  			try {
  				sleep( millisec );
  				controleerPauze();
    }
  			catch( InterruptedException e ) {
    }
  }
  	
}

class Plank extends Thread {
	private Graphics g;
	private int x;
    public int y;
    private int BREEDTE =10;
    private int HOOGTE =50;
    private int maxY;
	
    
    	public Plank (Applet applet,int x, int y, int hoogte) {
    		g = applet.getGraphics();
    		this.x = x;
    		this.y = y;
    		this.maxY = hoogte;
    	
		}
		void teken(){
			    g.setColor(Color.black);
    			g.fillRect(x,y,BREEDTE,HOOGTE);
    	}
}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan