KeyEvent verzögert

Status
Nicht offen für weitere Antworten.

gabriel

Mitglied
halli hallo
hab mal ne frage soweit geht alles aber kann mir vielleich einer sagen warum das KeyEvent
so verzögert ist? wenn ich zwischen links und rechts wechsel dann hab ich da ne kleine verzögerung!
hat jemand ne ahung wie ich das wegbekomme?

Code:
	public Game(){
	
		this.setFocusable(true); 
		this.requestFocusInWindow();
		 
		this.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent evt){
				if(evt.getKeyCode() == KeyEvent.VK_RIGHT && move < getWidth()-BAR){
					move+=RIGHT;
					//System.out.println("right");
				}
				if(evt.getKeyCode() == KeyEvent.VK_LEFT && move > 0){
					move+=LEFT;
					//System.out.println("left");
				}
				if(evt.getKeyCode() == KeyEvent.VK_ESCAPE){
					System.exit(0);
				}
			}
		});
	}

gruß
gabriel
 

Wildcard

Top Contributor
'move' ist vermutlich irgendein int das eine Richtung vorgibt?
angenommen 'LEFT' ist -1 und 'RIGHT' ist 1:
drücke links -> move = -1
drücke rechts -> move = -1+1 = 0
bleibe auf rechts bis zum nächsen KeyEvent -> move = 1 -> Verzögerung!?
Klartext : mach mal das '+=' weg...
 

gabriel

Mitglied
stimmt hast recht ;)
ok aber wenn ich das mache dann bewegt er sich nur einmal nach -20 und einmal nach +20;
oder wie soll ich das jetzt ohne += lösen?

Code:
	private  final static int LEFT = -20; 
	private  final static int RIGHT = 20;
	
	private  int move=0;


	public Game(){
	
		this.setFocusable(true); 
		this.requestFocusInWindow();
		 
		this.addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent evt){
				if(evt.getKeyCode() == KeyEvent.VK_RIGHT && move < getWidth()-BAR){
					move = RIGHT;
					//System.out.println("right");
				}
				if(evt.getKeyCode() == KeyEvent.VK_LEFT && move > 0){
					move = LEFT;
					//System.out.println("left");
				}
				if(evt.getKeyCode() == KeyEvent.VK_ESCAPE){
					System.exit(0);
				}
			}
		});
	}




gruß
gabriel
 

gabriel

Mitglied
hehe;

ich will breakout oder so schreiben;
aber erstmal will ich ein vernüntiges pong!
bevor ich weitermache...
hier mein code!
ich kriegs irgendwie ohne "+=" nicht hin und
ich habs sowas wie nen score aber der scheit auch nicht richtig zu funktionieren irgendwei zählt der willkürlich, er soll aber po treffer auf den balken zählen, aber wie gesagt das ist nebensache;
ich brauch erstmal das der balken sich unter ein bisschen smoother und flüssiger bewegt

gruß
gabriel

Code:
/*
 * Autor: [email]gabriel@percutio.com[/email]
 * GAME
 */

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

import javax.swing.*;

public class Game extends JComponent implements Runnable{

	private  static long SLEEPTIME = 5;
	private  final static int R = 6;
	// velocity vector of ball
	private  final static int DELTA_X = 1; //9;
	private  final static int DELTA_Y = 1; //2;
	 // ball position
	private int x, y;
	
	private  final static int BAR = 40;
	private  final static int LEFT = -20; 
	private  final static int RIGHT = +20;
	
	private  int move=0;
	private  int score=0;
	

	
	
	public void run() {
  
		// place ball at center
		x = getWidth()/2;
		y = getHeight()/2;
		int dx = DELTA_X;
		int dy = DELTA_Y;
		long ts = System.currentTimeMillis();
		
		for (;;) {
		
			ts += SLEEPTIME;
			long sleep = ts - System.currentTimeMillis();
			
			if (sleep > 0) {
				try {
					Thread.sleep(sleep);
				}
				catch (InterruptedException e) {
					return;
				}
			} 
			//	move ball
				x += dx;
				y += dy;
			//	change direction if we hit a wall
			if (x-R<=0)
				dx = DELTA_X;
				
			else if (x+R>=getWidth()-1)
				dx = -DELTA_X;
				
			if (y-R<=0)
				dy = DELTA_Y;
				
			else if (y+R>=getHeight()-1)
				dy = getHeight()-2;

			//	change direction if we hit the bar
			if (y+R>getHeight()-20 && x+R>move && x+R<move+BAR){
				score +=5;
				dy = -DELTA_Y;
				
				
				System.out.println(score);
			}
			else if (y+R>getHeight()){
			
				System.out.println("GO HOME LOOSER");
				break;
			}
			
				
			// paint it
			repaint();
		}
	}
	
	protected void paintComponent(Graphics g) {
	
        //BACKGROUND
        g.setColor(Color.lightGray);
		g.fillRect(0, 0, getWidth(), getHeight());
		
		//BALL
		g.setColor(Color.gray);
		g.fillOval(x-R, y-R, 2*R, 2*R);
		g.setColor(Color.white);
		g.fillOval(x-R, y-R, R, R);
		
		//BAR
		g.setColor(Color.gray);
		g.fillRect(move, getHeight()-20, BAR, 10);
		//g.setColor(Color.gray);
		//g.fillRect(move+2, getHeight()-18, BAR-4, 10);

		//SCORE
		Font scoreFont = new Font( "Helvetica", Font.BOLD, 15 );
		g.setFont( scoreFont );
		g.setColor( Color.gray); 
		g.drawString("SCORE: " +score, 12, 22);		
		//g.setFont( scoreFont );
		//g.setColor( Color.white); 
		//g.drawString("SCORE: " +score, 10, 20);		
	}
	
	public Dimension getPreferredSize() {
		return new Dimension(400, 600);
	}
	
	public Game(){
	
		this.setFocusable(true); 
		this.requestFocusInWindow();
		 
		this.addKeyListener(new KeyAdapter() {
		
			public void keyPressed(KeyEvent evt){
				if(evt.getKeyCode() == KeyEvent.VK_RIGHT && move < getWidth()-BAR){
					move += RIGHT;
			
					//System.out.println("right");
				}
				else if(evt.getKeyCode() == KeyEvent.VK_LEFT && move > 0){
					move += LEFT;
					
					//System.out.println("left");
				}
				if(evt.getKeyCode() == KeyEvent.VK_ESCAPE){
					System.exit(0);
				}
			}
			
		});
	}	
	
	public static void main(String[] args) {
		
		
		
		
		//JLabel aJLabel = new JLabel("SCORE:" +score);
		
		JFrame aJFrame = new JFrame("PING");
		Game go = new Game();
		//aJFrame.getContentPane().add(aJLabel, BorderLayout.NORTH); 
		aJFrame.getContentPane().add(go, BorderLayout.CENTER);
		aJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		aJFrame.pack();
		aJFrame.setVisible(true);
		(new Thread(go)).start();
	}	
}
 

Wildcard

Top Contributor
Dann gehts schon so wie ich gesagt habe.
Benutz einfach '=' und bei KeyReleased setzt du move = 0
 

gabriel

Mitglied
sooo? irgendwie funktioniert das nicht...
wie vorhin er springt nur zwischen 20 und -20 als quasi immer nur einmal eins nach LEFT oder eins nach RIGHT...
aber nicht mehr...

Code:
	public Game(){
	
		this.setFocusable(true); 
		this.requestFocusInWindow();
		 
		this.addKeyListener(new KeyAdapter() {
		
			public void keyPressed(KeyEvent evt){
				if(evt.getKeyCode() == KeyEvent.VK_RIGHT && move < getWidth()-BAR){
					move = RIGHT;
			
					//System.out.println("right");
				}
				else if(evt.getKeyCode() == KeyEvent.VK_LEFT && move > 0){
					move = LEFT;
					
					//System.out.println("left");
				}
				if(evt.getKeyCode() == KeyEvent.VK_ESCAPE){
					System.exit(0);
				}
			}
			
			public void KeyReleased(KeyEvent e){ 
				move = 0;
            } 
			
			 
			
		});
	}
 

Wildcard

Top Contributor
Ich dachte du willst Pong machen? Bei Pong bewegt sich der Schläger aber nich bei jedem Tastendruck um ein paar Punkte, sondern solange eine Taste gedrückt ist mit einer bestimmten Geschwindigkeit.
Ich glaube wir reden aneinander vorbei...
vor ein paar Wochen hatte hier noch jemand ein Pong-Problem, also hab ich ein kleines Beispiel gemacht.
Vieleicht hilfts dir ja:
Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.LayoutManager;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


/**
* TODO short description for Pong.
* 


* Long description for Pong.
*
* @author Wildcard
* @version $Revision: $
*/
public class Pong extends JFrame implements Runnable
{
   
    private Ball ball = new Ball(18,Color.RED);
    private Stick stick = new Stick(50,Color.BLUE);
    private Point speed = new Point(3,3);
    private static final int LEFT = -5;
    private static final int RIGHT = 5;
    private int direction=0;
   
    public Pong()
    {
        JPanel panel = new JPanel((LayoutManager)null);
        add(panel);
       
        panel.addKeyListener(new KeyAdapter()
        {
            public void keyTyped(KeyEvent e)
            {
                if(e.getKeyChar()=='a')
                    direction=LEFT;
                else if(e.getKeyChar()=='d')
                    direction=RIGHT;

            }

            public void keyReleased(KeyEvent e)
            {
                direction=0;
            }
        });


        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500,500);
        stick.setLocation(getWidth()/2-25,getHeight()-80);
        ball.setLocation(50,50);
       
        panel.add(stick);
        panel.add(ball);
       
        new Thread(this).start();
        setVisible(true);
        panel.requestFocus();
       
    }

    /**
     * @see java.lang.Runnable#run()
     */
    public void run()
    {
        // TODO Auto-generated method stub
        Rectangle frame = new Rectangle(0,0,getContentPane().getWidth(),getContentPane().getHeight());
        Rectangle ballRect;
        final Point ballLocation = ball.getLocation();
       
        while(true)
        {
            repaint();
            if (!(stick.getLocation().x<=5) && !(stick.getLocation().x+50>=getContentPane().getWidth()-5))
                stick.setLocation(stick.getLocation().x+direction,stick.getLocation().y);
            else if (stick.getLocation().x<50)
                stick.setLocation(stick.getLocation().x+1,stick.getLocation().y);
            else
                stick.setLocation(stick.getLocation().x-1,stick.getLocation().y);
           
            ballRect = new Rectangle(ball.getBounds());
            if (!frame.contains(ballRect))
            {
                if (ball.getLocation().x<0 || ball.getLocation().x+ball.durchmesser>getWidth())
                    speed.x=-speed.x;
                else if (ball.getLocation().y<0 || ball.getLocation().y+ball.durchmesser>getContentPane().getHeight())
                    speed.y=-speed.y;
            }
           
            if(stick.getBounds().intersects(ball.getBounds()))
            {
                speed.y=-speed.y;
            }
           
            try
            {
                Thread.sleep(8);
            } catch (InterruptedException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           
           
            ballLocation.x=ballLocation.x+speed.x;
            ballLocation.y=ballLocation.y+speed.y;
            ball.setLocation(ballLocation);
           

                     
        }     
    }
   
    public static void main(String[] args)
    {
        Pong pong = new Pong();
    }
}

class Ball extends JComponent
{
    int durchmesser;
    private Color color;
   
   
    public Ball(int durchmesser, Color color)
    {
        this.durchmesser=durchmesser;
        this.color=color;
        setSize(durchmesser,durchmesser);
    }
   
   
    protected void paintComponent(Graphics g)
    {
       
        g.setColor(color);
        g.fillOval(0,0,durchmesser,durchmesser);
    }
   
}

class Stick extends JComponent
{
    int length;
    private Color color;
   
   
    public Stick(int length, Color color)
    {
        this.length=length;
        this.color=color;
        setSize(length,10);
    }
   
   
    protected void paintComponent(Graphics g)
    {
        g.setColor(color);
        g.fillRoundRect(0,0,length,10,5,5);
    }
}
 

gabriel

Mitglied
muss ja nicht pro tastendruck sein;
wie ists denn normal;
brauch ich keyTyped???
oder wie würde es denn ungefähr aussehen?

thx


aber so bewegt sich garnichts:

Code:
	public Game(){
	
		this.setFocusable(true); 
		this.requestFocusInWindow();
		 
		this.addKeyListener(new KeyAdapter() {
		
			public void keyTyped(KeyEvent evt){
				if(evt.getKeyCode() == KeyEvent.VK_RIGHT && move < getWidth()-BAR){
					move = RIGHT;
			
					//System.out.println("right");
				}
				else if(evt.getKeyCode() == KeyEvent.VK_LEFT && move > 0){
					move = LEFT;
					
					//System.out.println("left");
				}
				if(evt.getKeyCode() == KeyEvent.VK_ESCAPE){
					System.exit(0);
				}
			}
			
			public void KeyReleased(KeyEvent e){ 
				move = 0;
            } 
			
			 
			
		});
	}

gruß
gab
 

Wildcard

Top Contributor
Benutz KeyPressed und KeyReleased. Damit bestimmst du die Bewegungsrichtung.
Die Bewegungsrichtung wird dann bei jedem Threaddurchlauf auf die x-Position aufaddiert.
Steht alles in dem Beispiel oben...
 

gabriel

Mitglied
ok danke aber irgendwie fällt es mir sehr schwer das jetzt auf mein beispiel zu übertragen...
naja...
aber dankesehr

gruß
gabriel

edit

ok ich habs hginbekommen mit ner sehr komischen version ;)
aber kann man es nich so einriuchten das wenn man den knof loslässt das sich der balken dann nichtzmehr bewegt?

/edit


also ich habs jetztsoi gemacht funtz auch ganz cool, aber leider funktioniert das KeyReleased nicht!
keine ahnung warum;

aber wenn ich sowas wie:

if(evt.getKeyCode() == KeyEvent.VK_UP){
move = 0
}

funktionuerts also er setzt dann move auf 0 beim

public void KeyReleased(KeyEvent evt){
move = 0;
}

funktionuerts nichts...


Code:
	public Game(){
	
		this.setFocusable(true); 
		this.requestFocusInWindow();
		 
		this.addKeyListener(new KeyAdapter() {
		
			public void KeyReleased(KeyEvent evt){
				move = 0;			
            } 
		
			public void keyPressed(KeyEvent evt){
			
				if(evt.getKeyCode() == KeyEvent.VK_RIGHT ){
					move = RIGHT;
			
					//System.out.println("right");
				}
				else if(evt.getKeyCode() == KeyEvent.VK_LEFT){
					move = LEFT;
					
					//System.out.println("left");
				}	
				
				if(evt.getKeyCode() == KeyEvent.VK_ESCAPE){
					System.exit(0);
				}
			}
			
		});
	}
 

Wildcard

Top Contributor
gabriel hat gesagt.:
...

aber wenn ich sowas wie:

if(evt.getKeyCode() == KeyEvent.VK_UP){
move = 0
}

funktionuerts also er setzt dann move auf 0 beim

public void KeyReleased(KeyEvent evt){
move = 0;
}

funktionuerts nichts...
weils keyReleased und nicht KeyReleased heißt... :roll: [/quote]
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J JLabel bzw. Image Icon mit KeyEvent bewgen Java Basics - Anfänger-Themen 9
T KeyEvent Problem Hilfe!! Java Basics - Anfänger-Themen 5
Xentox501 keyevent.VK_LEFT wird beim drücken jeder belibigen Taste aktiv. Java Basics - Anfänger-Themen 3
T KeyEvent - Gedankenfehler? Java Basics - Anfänger-Themen 3
P Klassen Bei KeyEvent in KeyListener den Tastendruck abbrechen Java Basics - Anfänger-Themen 5
S Eigene KeyEvent-Mask erstellen Java Basics - Anfänger-Themen 4
B Input/Output jTextField - KeyEvent - Zeichen soll nicht erscheinen Java Basics - Anfänger-Themen 6
F KeyEvent Frage Java Basics - Anfänger-Themen 2
MrGe keyevent gleichheitszeichen Java Basics - Anfänger-Themen 2
S KeyEvent Maker funktioniert nicht. Java Basics - Anfänger-Themen 4
S String KeyEvent parsen Java Basics - Anfänger-Themen 2
I KeyEvent macht nichts.^^ Java Basics - Anfänger-Themen 3
D KeyEvent Taste blockieren. Java Basics - Anfänger-Themen 2
StickToFreak Graphicsg, KeyEvent ec <-- geht das? Java Basics - Anfänger-Themen 11
? Problem mit KeyEvent.VK_DOWN Java Basics - Anfänger-Themen 4
A KeyEvent wird nicht erkannt Java Basics - Anfänger-Themen 2
A keyevent > keyPressed > vk_enter Java Basics - Anfänger-Themen 12
P KeyEvent.VK_Enter Java Basics - Anfänger-Themen 3
G KeyEvent in JFrame Java Basics - Anfänger-Themen 2
S Keyevent in Panel Java Basics - Anfänger-Themen 5
C public void keyPressed(KeyEvent e) Java Basics - Anfänger-Themen 2
G KeyListener und KeyEvent Java Basics - Anfänger-Themen 6
S KeyEvent Tastenkombination? Java Basics - Anfänger-Themen 1
D Button KeyEvent zuweisen. Java Basics - Anfänger-Themen 15
G KeyEvent auswerten Java Basics - Anfänger-Themen 2
Z KeyEvent in JButton? Java Basics - Anfänger-Themen 12
Helgon Seite verzögert lesen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben