Pijltjestoetsen, hapering

Status
Niet open voor verdere reacties.

stienoo

Gebruiker
Lid geworden
31 dec 2007
Berichten
315
Ik ben een doolhof aan het maken, met uiteraard pijltjestoetsen maar ik heb gemerkt (ook al bij andere programma's dat als je een toets indruk hij vooruitgaat, dan stopt en dan terug vooruit gaat. Ik gebruik "implements KeyListener".

En dan nog een klein vraagje, hoe kan je een rechtermuisknop gebruik (met "implements MouseListener")?
 
Voor rechtermuis button kan je gebruik maken van isRightMouseButton(..) uit de SwingUtilities klas:

Code:
/**
     * Returns true if the mouse event specifies the right mouse button.
     *
     * @param anEvent  a MouseEvent object
     * @return true if the right mouse button was active
     */
    public static boolean isRightMouseButton(MouseEvent anEvent) {
        return ((anEvent.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK);
    }

Het gebruik van een keylistener werkt niet echt handig voor spelletjes. Als je een toets ingedrukt houdt gaat het OS (en niet java) zorgen dat er een keyevents worden gegeneerd. (dus afhankelijk van repeat snelheid van toestenbord instelling).

Maar als je een vloeiende beweging wil. Gebruik je een keylistener die onthoudt welke toets een gebruiker heeft ingedukt en gebruik je een timer die om de zoveel milliseconden je voorwerp beweegt (gebruikmakend van de opgeslagen toests informatie uit je keylistener.
 
Dat met die rechter muisknop werkt al! (bedankt)
Met die KeyListener, ik gebruik al een timer (het duurt zo'n 32 miliseconden voor hij klaar is) dat is dus nog te snel en ik kan het echt niet vertragen...
Maar met wat kan je nog (pijltjes)toetsen gebruiken?
 
Dat kan ik:

Doolhof
Code:
import javax.swing.*;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Doolhof extends JFrame{
    public static void main( String args[] ) {
        JFrame frame = new Doolhof();
        frame.setSize(1000, 900);
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Doolhof");
        frame.setContentPane(new DoolhofPaneel());
        frame.setVisible(true);
    }
}

class DoolhofPaneel extends JPanel implements KeyListener {
	public Persoon persoon;
	public int vakgroote = 32;
	public int veld[][] = new int[25][25];
	public ImageIcon muur;
	public boolean links, rechts, up, down, gewonnen;
	public int linksg, rechtsg, upg, downg;
	private javax.swing.Timer timer;
	DoolhofPaneel(){
		 this.setFocusable(true);
	     this.addKeyListener(this);
	     timer = new javax.swing.Timer(1, new TimerHandler());
	     timer.start();
		muur = new ImageIcon("muur.gif");
		veld[0][0]=1; veld[0][1]=1; veld[0][2]=1; veld[0][3]=1; veld[0][4]=1; veld[0][5]=1; veld[0][6]=1; veld[0][7]=1; veld[0][8]=1; veld[0][9]=1; veld[0][10]=1; veld[0][11]=1; veld[0][12]=1; veld[0][13]=1; veld[0][14]=1; veld[0][15]=1; veld[0][16]=1; veld[0][17]=1; veld[0][18]=1; veld[0][19]=1; veld[0][20]=1; veld[0][21]=1; veld[0][22]=1; veld[0][23]=1; veld[0][24]=1; veld[1][0]=1; veld[1][2]=1; veld[1][9]=1; veld[1][10]=1; veld[1][13]=1; veld[1][14]=1; veld[1][16]=1; veld[1][17]=1; veld[1][19]=1; veld[1][20]=1; veld[1][22]=1; veld[1][23]=1; veld[1][24]=1; veld[2][0]=1; veld[2][2]=1; veld[2][4]=1; veld[2][5]=1; veld[2][6]=1; veld[2][8]=1; veld[2][9]=1; veld[2][12]=1; veld[2][19]=1; veld[2][24]=1; veld[3][0]=1; veld[3][2]=1; veld[3][4]=1; veld[3][9]=1; veld[3][11]=1; veld[3][12]=1; veld[3][13]=1; veld[3][15]=1; veld[3][17]=1; veld[3][19]=1; veld[3][24]=1; veld[4][0]=1; veld[4][4]=1; veld[4][6]=1; veld[4][7]=1; veld[4][8]=1; veld[4][9]=1; veld[4][15]=1; veld[4][17]=1; veld[4][19]=1; veld[4][20]=1; veld[4][21]=1; veld[4][22]=1; veld[4][24]=1; veld[5][0]=1; veld[5][2]=1; veld[5][3]=1; veld[5][4]=1; veld[5][11]=1; veld[5][12]=1; veld[5][13]=1; veld[5][14]=1; veld[5][15]=1; veld[5][17]=1; veld[5][22]=1; veld[5][24]=1; veld[6][0]=1; veld[6][6]=1; veld[6][7]=1; veld[6][8]=1; veld[6][9]=1; veld[6][10]=1; veld[6][11]=1; veld[6][18]=1; veld[6][22]=1; veld[6][24]=1; veld[7][0]=1; veld[7][1]=1; veld[7][3]=1; veld[7][11]=1; veld[7][12]=1; veld[7][13]=1; veld[7][14]=1; veld[7][15]=1; veld[7][16]=1; veld[7][18]=1; veld[7][20]=1; veld[7][21]=1; veld[7][22]=1; veld[7][24]=1; veld[8][0]=1; veld[8][3]=1; veld[8][5]=1; veld[8][6]=1; veld[8][7]=1; veld[8][8]=1; veld[8][16]=1; veld[8][18]=1; veld[8][20]=1; veld[8][24]=1; veld[9][0]=1; veld[9][2]=1; veld[9][3]=1; veld[9][8]=1; veld[9][10]=1; veld[9][11]=1; veld[9][12]=1; veld[9][14]=1; veld[9][16]=1; veld[9][18]=1; veld[9][20]=1; veld[9][21]=1; veld[9][22]=1; veld[9][24]=1; veld[10][0]=1; veld[10][2]=1; veld[10][3]=1; veld[10][4]=1; veld[10][5]=1; veld[10][6]=1; veld[10][8]=1; veld[10][9]=1; veld[10][14]=1; veld[10][16]=1; veld[10][18]=1; veld[10][24]=1; veld[11][0]=1; veld[11][6]=1; veld[11][8]=1; veld[11][10]=1; veld[11][11]=1; veld[11][14]=1; veld[11][18]=1; veld[11][19]=1; veld[11][20]=1; veld[11][21]=1; veld[11][22]=1; veld[11][24]=1; veld[12][0]=1; veld[12][1]=1; veld[12][2]=1; veld[12][3]=1; veld[12][4]=1; veld[12][6]=1; veld[12][8]=1; veld[12][12]=1; veld[12][14]=1; veld[12][15]=1; veld[12][18]=1; veld[12][24]=1; veld[13][0]=1; veld[13][6]=1; veld[13][8]=1; veld[13][9]=1; veld[13][10]=1; veld[13][12]=1; veld[13][15]=1; veld[13][18]=1; veld[13][21]=1; veld[13][22]=1; veld[13][23]=1; veld[13][24]=1; veld[14][0]=1; veld[14][2]=1; veld[14][3]=1; veld[14][4]=1; veld[14][6]=1; veld[14][8]=1; veld[14][10]=1; veld[14][12]=1; veld[14][13]=1; veld[14][15]=1; veld[14][18]=1; veld[14][19]=1; veld[14][22]=1; veld[14][24]=1; veld[15][0]=1; veld[15][2]=1; veld[15][4]=1; veld[15][6]=1; veld[15][8]=1; veld[15][10]=1; veld[15][12]=1; veld[15][15]=1; veld[15][16]=1; veld[15][19]=1; veld[15][24]=1; veld[16][0]=1; veld[16][2]=1; veld[16][4]=1; veld[16][8]=1; veld[16][10]=1; veld[16][14]=1; veld[16][16]=1; veld[16][19]=1; veld[16][20]=1; veld[16][21]=1; veld[16][22]=1; veld[16][23]=1; veld[16][24]=1; veld[17][0]=1; veld[17][2]=1; veld[17][4]=1; veld[17][10]=1; veld[17][11]=1; veld[17][12]=1; veld[17][14]=1; veld[17][23]=1; veld[17][24]=1; veld[18][0]=1; veld[18][2]=1; veld[18][4]=1; veld[18][6]=1; veld[18][7]=1; veld[18][8]=1; veld[18][12]=1; veld[18][14]=1; veld[18][15]=1; veld[18][16]=1; veld[18][19]=1; veld[18][21]=1; veld[18][24]=1; veld[19][0]=1; veld[19][2]=1; veld[19][8]=1; veld[19][10]=1; veld[19][11]=1; veld[19][12]=1; veld[19][16]=1; veld[19][19]=1; veld[19][21]=1; veld[19][22]=1; veld[19][24]=1; veld[20][0]=1; veld[20][2]=1; veld[20][4]=1; veld[20][5]=1; veld[20][6]=1; veld[20][7]=1; veld[20][8]=1; veld[20][10]=1; veld[20][14]=1; veld[20][15]=1; veld[20][16]=1; veld[20][19]=1; veld[20][21]=1; veld[20][24]=1; veld[21][0]=1; veld[21][2]=1; veld[21][4]=1; veld[21][16]=1; veld[21][19]=1; veld[21][21]=1; veld[21][23]=1; veld[21][24]=1; veld[22][0]=1; veld[22][2]=1; veld[22][3]=1; veld[22][4]=1; veld[22][5]=1; veld[22][6]=1; veld[22][7]=1; veld[22][8]=1; veld[22][9]=1; veld[22][11]=1; veld[22][12]=1; veld[22][13]=1; veld[22][14]=1; veld[22][16]=1; veld[22][17]=1; veld[22][18]=1; veld[22][19]=1; veld[22][21]=1; veld[22][24]=1; veld[23][0]=1; veld[23][14]=1; veld[23][22]=1; veld[23][24]=1; veld[24][0]=1; veld[24][1]=1; veld[24][2]=1; veld[24][3]=1; veld[24][4]=1; veld[24][5]=1; veld[24][6]=1; veld[24][7]=1; veld[24][8]=1; veld[24][9]=1; veld[24][10]=1; veld[24][11]=1; veld[24][12]=1; veld[24][13]=1; veld[24][14]=1; veld[24][15]=1; veld[24][16]=1; veld[24][17]=1; veld[24][18]=1; veld[24][19]=1; veld[24][20]=1; veld[24][21]=1; veld[24][22]=1; veld[24][23]=1; veld[24][24]=1; 
		veld[23][23]=2;
		persoon = new Persoon(1*vakgroote,1*vakgroote,vakgroote);
	}
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		for(int i=0; i < veld.length ; i++){
			   for (int j=0; j < veld.length ; j++){
				   g.setColor(Color.orange);
				   if(veld[i][j]==0){
					   g.fillRect(50+vakgroote*i, 50+vakgroote*j ,vakgroote ,vakgroote);
				   }
				   if(veld[i][j]==1){
					   muur.paintIcon( this, g, 50+vakgroote*i, 50+vakgroote*j);
				   }
				   if(veld[i][j]==2){
					   g.setColor(Color.blue);
					   g.fillRect(50+vakgroote*i, 50+vakgroote*j, vakgroote, vakgroote);
					   if(i*vakgroote==persoon.getx() && j*vakgroote==persoon.gety()){
						   gewonnen=true;
					   }
				   }
			   }
		}
		persoon.teken(g);
		if(gewonnen){
			g.drawString("U hebt gewonnen.", 400, 30);
		}
	}
	
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode() == KeyEvent.VK_LEFT){
			if(!links && !rechts && !up && !down){
			links=true;
			}
		}
		if(e.getKeyCode() == KeyEvent.VK_RIGHT){
			if(!links && !rechts && !up && !down){
				rechts=true;
				}
		}
		if(e.getKeyCode() == KeyEvent.VK_DOWN){
			if(!links && !rechts && !up && !down){
				down=true;
				}
		}
		if(e.getKeyCode() == KeyEvent.VK_UP){
			if(!links && !rechts && !up && !down){
				up=true;
				}
		}
	}
	public void keyReleased(KeyEvent e) {}
	public void keyTyped(KeyEvent e) {}

	class TimerHandler implements ActionListener{
        public void actionPerformed(ActionEvent e){
        	if(!gewonnen){
        	if(links){
        		if(persoon.xmincontrole(veld)){
        			links=false;
        		}
        		else{
        		if(linksg<33){
        			persoon.xmin();
        			if(linksg==32){
        				links=false;
        				linksg=0;
        			}
        		linksg++;
    			repaint();
        		}
        		}
        	}
        	if(rechts){
        		if(persoon.xpluscontrole(veld)){
        			rechts=false;
        		}
        		else{
        		if(rechtsg<33){
        			persoon.xplus();
        			rechtsg++;
            		if(rechtsg==32){
        				rechts=false;
        				rechtsg=0;
        			}
            	    repaint();
        		}
        		}
        	}
        	if(down){
        		if(persoon.ypluscontrole(veld)){
        			down=false;
        		}
        		else{
        		if(downg<33){
        			persoon.yplus();
        			downg++;
        			if(downg==32){
        				down=false;
        				downg=0;
        			}
        			repaint();
        		}
        		}
        	}
        	if(up){
        		if(persoon.ymincontrole(veld)){
        			up=false;
        		}
        		else{
        		if(upg<33){
        			persoon.ymin();
        			upg++;
        			if(upg==32){
        				up=false;
        				upg=0;
        			}
    			repaint();
        		}
        		}
        	}
        }
        }
	}
}

Persoon
Code:
import java.awt.Color;
import java.awt.Graphics;

class Persoon {
	private int x,y,vakgroote;
	
	public Persoon(int x, int y, int vakgroote){
		this.x = x;
		this.y = y;
		this.vakgroote = vakgroote;
	}
	public void teken(Graphics g){
		g.setColor(Color.red);
		g.fillOval(50+x, 50+y, vakgroote, vakgroote);
	}
	public int getx(){
		return this.x;
	}
	public int gety(){
		return this.y;
	}
	public void xmin(){
		x--;
	}
	public void xplus(){
		x++;
	}
	public void yplus(){
		y++;
	}
	public void ymin(){
		y--;
	}
	public boolean xmincontrole(int[][] veld){
		boolean rezul = false;
		int cx=this.x-32;
		int cy=this.y;
		for(int i=0; i < veld.length ; i++){
			   for (int j=0; j < veld[i].length ; j++){
				   if(veld[i][j]==1){
					   if(vakgroote*i==cx && vakgroote*j==cy){
						   rezul = true;
					   }
				   }
			   }
		}
    return rezul;
	}
	public boolean xpluscontrole(int[][] veld){
		boolean rezul = false;
		int cx=this.x+32;
		int cy=this.y;
		for(int i=0; i < veld.length ; i++){
			   for (int j=0; j < veld[i].length ; j++){
				   if(veld[i][j]==1){
					   if(vakgroote*i==cx && vakgroote*j==cy){
						   rezul = true;
					   }
				   }
			   }
		}
    return rezul;
	}
	public boolean ypluscontrole(int[][] veld){
		boolean rezul = false;
		int cx=this.x;
		int cy=this.y+32;
		for(int i=0; i < veld.length ; i++){
			   for (int j=0; j < veld[i].length ; j++){
				   if(veld[i][j]==1){
					   if(vakgroote*i==cx && vakgroote*j==cy){
						   rezul = true;
					   }
				   }
			   }
		}
    return rezul;
	}
	public boolean ymincontrole(int[][] veld){
		boolean rezul = false;
		int cx=this.x;
		int cy=this.y-32;
		for(int i=0; i < veld.length ; i++){
			   for (int j=0; j < veld[i].length ; j++){
				   if(veld[i][j]==1){
					   if(vakgroote*i==cx && vakgroote*j==cy){
						   rezul = true;
					   }
				   }
			   }
		}
    return rezul;
	}
}
 
Ik heb je code nog niet uitgeprobeerd, maar ik denk dat je het resetten van links, rechts enz. niet in de timer moet zetten maar in de key released.

De timer runt(waarschijnlijk) veel vaker dan je key events krijgt. Dus moet je programma toch weer wachten op een key event.

gr,
 
Bedankt, het werkt!
Maar wat wel vreemd is is dat je soms ineens door een of meerdere muren kan en vlak daarna niet meer en heel soms krijgt de bal een versnelling?

Nieuwe code van Doolhof:

Code:
import javax.swing.*;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Doolhof extends JFrame{
    public static void main( String args[] ) {
        JFrame frame = new Doolhof();
        frame.setSize(1000, 900);
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Doolhof");
        frame.setContentPane(new DoolhofPaneel());
        frame.setVisible(true);
    }
}

class DoolhofPaneel extends JPanel implements KeyListener {
	public Persoon persoon;
	public int vakgroote = 32;
	public int veld[][] = new int[25][25];
	public ImageIcon muur;
	public boolean links, rechts, up, down, ingedrukt, gewonnen;
	public int linksg, rechtsg, upg, downg;
	private javax.swing.Timer timer;
	DoolhofPaneel(){
		 this.setFocusable(true);
	     this.addKeyListener(this);
	     timer = new javax.swing.Timer(1, new TimerHandler());
	     timer.start();
		muur = new ImageIcon("muur.gif");
		veld[0][0]=1; veld[0][1]=1; veld[0][2]=1; veld[0][3]=1; veld[0][4]=1; veld[0][5]=1; veld[0][6]=1; veld[0][7]=1; veld[0][8]=1; veld[0][9]=1; veld[0][10]=1; veld[0][11]=1; veld[0][12]=1; veld[0][13]=1; veld[0][14]=1; veld[0][15]=1; veld[0][16]=1; veld[0][17]=1; veld[0][18]=1; veld[0][19]=1; veld[0][20]=1; veld[0][21]=1; veld[0][22]=1; veld[0][23]=1; veld[0][24]=1; veld[1][0]=1; veld[1][2]=1; veld[1][9]=1; veld[1][10]=1; veld[1][13]=1; veld[1][14]=1; veld[1][16]=1; veld[1][17]=1; veld[1][19]=1; veld[1][20]=1; veld[1][22]=1; veld[1][23]=1; veld[1][24]=1; veld[2][0]=1; veld[2][2]=1; veld[2][4]=1; veld[2][5]=1; veld[2][6]=1; veld[2][8]=1; veld[2][9]=1; veld[2][12]=1; veld[2][19]=1; veld[2][24]=1; veld[3][0]=1; veld[3][2]=1; veld[3][4]=1; veld[3][9]=1; veld[3][11]=1; veld[3][12]=1; veld[3][13]=1; veld[3][15]=1; veld[3][17]=1; veld[3][19]=1; veld[3][24]=1; veld[4][0]=1; veld[4][4]=1; veld[4][6]=1; veld[4][7]=1; veld[4][8]=1; veld[4][9]=1; veld[4][15]=1; veld[4][17]=1; veld[4][19]=1; veld[4][20]=1; veld[4][21]=1; veld[4][22]=1; veld[4][24]=1; veld[5][0]=1; veld[5][2]=1; veld[5][3]=1; veld[5][4]=1; veld[5][11]=1; veld[5][12]=1; veld[5][13]=1; veld[5][14]=1; veld[5][15]=1; veld[5][17]=1; veld[5][22]=1; veld[5][24]=1; veld[6][0]=1; veld[6][6]=1; veld[6][7]=1; veld[6][8]=1; veld[6][9]=1; veld[6][10]=1; veld[6][11]=1; veld[6][18]=1; veld[6][22]=1; veld[6][24]=1; veld[7][0]=1; veld[7][1]=1; veld[7][3]=1; veld[7][11]=1; veld[7][12]=1; veld[7][13]=1; veld[7][14]=1; veld[7][15]=1; veld[7][16]=1; veld[7][18]=1; veld[7][20]=1; veld[7][21]=1; veld[7][22]=1; veld[7][24]=1; veld[8][0]=1; veld[8][3]=1; veld[8][5]=1; veld[8][6]=1; veld[8][7]=1; veld[8][8]=1; veld[8][16]=1; veld[8][18]=1; veld[8][20]=1; veld[8][24]=1; veld[9][0]=1; veld[9][2]=1; veld[9][3]=1; veld[9][8]=1; veld[9][10]=1; veld[9][11]=1; veld[9][12]=1; veld[9][14]=1; veld[9][16]=1; veld[9][18]=1; veld[9][20]=1; veld[9][21]=1; veld[9][22]=1; veld[9][24]=1; veld[10][0]=1; veld[10][2]=1; veld[10][3]=1; veld[10][4]=1; veld[10][5]=1; veld[10][6]=1; veld[10][8]=1; veld[10][9]=1; veld[10][14]=1; veld[10][16]=1; veld[10][18]=1; veld[10][24]=1; veld[11][0]=1; veld[11][6]=1; veld[11][8]=1; veld[11][10]=1; veld[11][11]=1; veld[11][14]=1; veld[11][18]=1; veld[11][19]=1; veld[11][20]=1; veld[11][21]=1; veld[11][22]=1; veld[11][24]=1; veld[12][0]=1; veld[12][1]=1; veld[12][2]=1; veld[12][3]=1; veld[12][4]=1; veld[12][6]=1; veld[12][8]=1; veld[12][12]=1; veld[12][14]=1; veld[12][15]=1; veld[12][18]=1; veld[12][24]=1; veld[13][0]=1; veld[13][6]=1; veld[13][8]=1; veld[13][9]=1; veld[13][10]=1; veld[13][12]=1; veld[13][15]=1; veld[13][18]=1; veld[13][21]=1; veld[13][22]=1; veld[13][23]=1; veld[13][24]=1; veld[14][0]=1; veld[14][2]=1; veld[14][3]=1; veld[14][4]=1; veld[14][6]=1; veld[14][8]=1; veld[14][10]=1; veld[14][12]=1; veld[14][13]=1; veld[14][15]=1; veld[14][18]=1; veld[14][19]=1; veld[14][22]=1; veld[14][24]=1; veld[15][0]=1; veld[15][2]=1; veld[15][4]=1; veld[15][6]=1; veld[15][8]=1; veld[15][10]=1; veld[15][12]=1; veld[15][15]=1; veld[15][16]=1; veld[15][19]=1; veld[15][24]=1; veld[16][0]=1; veld[16][2]=1; veld[16][4]=1; veld[16][8]=1; veld[16][10]=1; veld[16][14]=1; veld[16][16]=1; veld[16][19]=1; veld[16][20]=1; veld[16][21]=1; veld[16][22]=1; veld[16][23]=1; veld[16][24]=1; veld[17][0]=1; veld[17][2]=1; veld[17][4]=1; veld[17][10]=1; veld[17][11]=1; veld[17][12]=1; veld[17][14]=1; veld[17][23]=1; veld[17][24]=1; veld[18][0]=1; veld[18][2]=1; veld[18][4]=1; veld[18][6]=1; veld[18][7]=1; veld[18][8]=1; veld[18][12]=1; veld[18][14]=1; veld[18][15]=1; veld[18][16]=1; veld[18][19]=1; veld[18][21]=1; veld[18][24]=1; veld[19][0]=1; veld[19][2]=1; veld[19][8]=1; veld[19][10]=1; veld[19][11]=1; veld[19][12]=1; veld[19][16]=1; veld[19][19]=1; veld[19][21]=1; veld[19][22]=1; veld[19][24]=1; veld[20][0]=1; veld[20][2]=1; veld[20][4]=1; veld[20][5]=1; veld[20][6]=1; veld[20][7]=1; veld[20][8]=1; veld[20][10]=1; veld[20][14]=1; veld[20][15]=1; veld[20][16]=1; veld[20][19]=1; veld[20][21]=1; veld[20][24]=1; veld[21][0]=1; veld[21][2]=1; veld[21][4]=1; veld[21][16]=1; veld[21][19]=1; veld[21][21]=1; veld[21][23]=1; veld[21][24]=1; veld[22][0]=1; veld[22][2]=1; veld[22][3]=1; veld[22][4]=1; veld[22][5]=1; veld[22][6]=1; veld[22][7]=1; veld[22][8]=1; veld[22][9]=1; veld[22][11]=1; veld[22][12]=1; veld[22][13]=1; veld[22][14]=1; veld[22][16]=1; veld[22][17]=1; veld[22][18]=1; veld[22][19]=1; veld[22][21]=1; veld[22][24]=1; veld[23][0]=1; veld[23][14]=1; veld[23][22]=1; veld[23][24]=1; veld[24][0]=1; veld[24][1]=1; veld[24][2]=1; veld[24][3]=1; veld[24][4]=1; veld[24][5]=1; veld[24][6]=1; veld[24][7]=1; veld[24][8]=1; veld[24][9]=1; veld[24][10]=1; veld[24][11]=1; veld[24][12]=1; veld[24][13]=1; veld[24][14]=1; veld[24][15]=1; veld[24][16]=1; veld[24][17]=1; veld[24][18]=1; veld[24][19]=1; veld[24][20]=1; veld[24][21]=1; veld[24][22]=1; veld[24][23]=1; veld[24][24]=1; 
		veld[23][23]=2;
		persoon = new Persoon(1*vakgroote,1*vakgroote,vakgroote);
	}
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		for(int i=0; i < veld.length ; i++){
			   for (int j=0; j < veld.length ; j++){
				   g.setColor(Color.orange);
				   if(veld[i][j]==0){
					   g.fillRect(50+vakgroote*i, 50+vakgroote*j ,vakgroote ,vakgroote);
				   }
				   if(veld[i][j]==1){
					   muur.paintIcon( this, g, 50+vakgroote*i, 50+vakgroote*j);
				   }
				   if(veld[i][j]==2){
					   g.setColor(Color.blue);
					   g.fillRect(50+vakgroote*i, 50+vakgroote*j, vakgroote, vakgroote);
					   if(i*vakgroote==persoon.getx() && j*vakgroote==persoon.gety()){
						   gewonnen=true;
					   }
				   }
			   }
		}
		persoon.teken(g);
		if(gewonnen){
			g.drawString("U hebt gewonnen.", 400, 30);
		}
	}
	
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode() == KeyEvent.VK_LEFT){
			if(!links && !rechts && !up && !down){
			links=true;
			}
		}
		if(e.getKeyCode() == KeyEvent.VK_RIGHT){
			if(!links && !rechts && !up && !down){
				rechts=true;
				}
		}
		if(e.getKeyCode() == KeyEvent.VK_DOWN){
			if(!links && !rechts && !up && !down){
				down=true;
				}
		}
		if(e.getKeyCode() == KeyEvent.VK_UP){
			if(!links && !rechts && !up && !down){
				up=true;
				}
		}
		ingedrukt=true;
	}
	public void keyReleased(KeyEvent e) {
		ingedrukt=false;
	}
	public void keyTyped(KeyEvent e) {}

	class TimerHandler implements ActionListener{
        public void actionPerformed(ActionEvent e){
        	if(!gewonnen){
        	if(links){
        		if(persoon.xmincontrole(veld)){
        			links=false;
        		}
        		else{
        		if(linksg<33){
        			persoon.xmin();
        			if(linksg==32){
        				if(!ingedrukt){
        					links=false;
        				}
        				linksg=0;
        			}
        		linksg++;
    			repaint();
        		}
        		}
        	}
        	if(rechts){
        		if(persoon.xpluscontrole(veld)){
        			rechts=false;
        		}
        		else{
        		if(rechtsg<33){
        			persoon.xplus();
        			rechtsg++;
            		if(rechtsg==32){
            			if(!ingedrukt){
        					rechts=false;
        				}
        				rechtsg = 0;
        			}
            	    repaint();
        		}
        		}
        	}
        	if(down){
        		if(persoon.ypluscontrole(veld)){
        			down=false;
        		}
        		else{
        		if(downg<33){
        			persoon.yplus();
        			downg++;
        			if(downg==32){
        				if(!ingedrukt){
        					down=false;
        				}
        				downg=0;
        			}
        			repaint();
        		}
        		}
        	}
        	if(up){
        		if(persoon.ymincontrole(veld)){
        			up=false;
        		}
        		else{
        		if(upg<33){
        			persoon.ymin();
        			upg++;
        			if(upg==32){
        				if(!ingedrukt){
        					up=false;
        				}
        				upg=0;
        			}
    			repaint();
        		}
        		}
        	}
        }
        }
	}
}
 
Je gebruikt verschillende threads, die dezelfde variabelen gebruiken. Terwijl de ene thread de variabele wijzigt, probeert de andere deze te lezen. Hierdoor kan je rare effecten krijgen. Je functie die de bewegingen controleert alleen de echte grenzen. Een combinatie van beide geeft dat je soms door een muur heen kan. Een eenvoudige oplossing is om je variabele volatile te maken. (dit zal het wel langzamer maken, omdat je variabele niet in het register wordt gehouden, maar steeds wordt opgehaald uit het geheugen...

Je xmincontrole enz. kan ook efficienter. Je kan adhv je coordinaten wel terug rekenen in welke veld je zit. Hoefje niet elke keer alle velden af.

gr.
 
Wat is volatile?
En van dat eficienter controleren zal ik straks efjes kijken...
 
Ik heb dit gedaan:

Code:
public volatile int linksg, rechtsg, upg, downg;

Maar hij gaat nog soms door muren + zit er soms (terug) een kleine hapering in...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan