19. september 2005 - 19:19Der er
16 kommentarer og 1 løsning
keylistener kaldes for hurtigt
jeg har lavet en key listener:
import java.awt.*; import java.awt.event.*;
public class tast implements KeyListener { public vindue prog;
public void keyTyped(KeyEvent e) {} public void keyPressed(KeyEvent e) { try { Thread.sleep(50); } catch (Exception ex) {} prog.repaint(); if (e.getKeyCode() == KeyEvent.VK_UP) { prog.k.bevæg(1); } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { prog.k.bevæg(2); } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { prog.k.bevæg(3); } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { prog.k.bevæg(4); } } public void keyReleased(KeyEvent e) {} }
den virker som sådan fint, men den glemmer bare repaint... det vil sige den kan fint flytte med kassen, men den tegner først når man holder op med at holde knappen nede. kan man ikke sige den skal vente 50 milli sekunder nden den kaldes igen?
For det du skal ha' fat i er nok, at det skal køres i en tråd. Det der sker med det du har nu er, at alle dine keyevents bliver queued og udført inden gui'en igen får lov til at repainte.
Ved nærmere eftertanke, så er det ikke sikkert du skal ha' fat i tråde alligevel. Det kommer lidt an på hvad det er du vil. Det er svært at sige ud fra de oplysninger + kode du har givet.
Jeg har lige lavet et lille hurtigt eksempel, hvor man kan flytte en firkant rundt i en frame:
ja nu er det lavet i en tråd... men det ændre ikke på hvor godt spillet virker...
du får lige hele koden:
import java.awt.*; import java.awt.event.*;
public class program { public static void main(String[] arg) { vindue skærm = new vindue(); skærm.setSize(640, 480); skærm.setTitle("The Game!"); skærm.setVisible(true); } }
import java.awt.*; import java.awt.event.*;
public class vindue extends Frame { public spiller person = new spiller(this); public Thread pers = new Thread(person); public Thread tid; public boolean igang = false; public kasse k;
public void paint(Graphics g) { if (!igang) { pers.start(); igang = true; } tid = new Thread(new timer(this)); tid.start(); Insets in = getInsets(); g.translate(in.left, in.top); person.k.render(g); } }
import java.awt.*; import java.awt.event.*;
public class spiller implements Runnable { public kasse k = new kasse(new Point(100, 100), 1, "kasse 1"); public vindue f;
public spiller(vindue f) { this.f = f; }
public void run() { f.addKeyListener(new tast()); }
public class tast extends KeyAdapter { public void keyPressed(KeyEvent e) { try { Thread.sleep(50); } catch (Exception ex) {} if (e.getKeyCode() == KeyEvent.VK_UP) { k.bevæg(1); } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { k.bevæg(2); } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { k.bevæg(3); } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { k.bevæg(4); } } } }
import java.awt.*;
public class timer implements Runnable { public vindue f;
det skal kun bevæge sig når man trykker på knapperne... sådan set det samme som det lille eksempel du lavede, men jeg vil bare gerne ha det her til at virke. :P
Du har en del overflødig kode - efter min mening. Her kommer mit forslag med udgangspunkt i din egen kode:
import java.awt.*; import java.awt.event.*;
public class program { public static void main(String[] arg) { vindue skærm = new vindue(); skærm.setSize(640, 480); skærm.setTitle("The Game!"); skærm.setVisible(true); } }
import java.awt.*; import java.awt.event.*;
public class vindue extends Frame { public kasse k;
public vindue () { k = new kasse (new Point(10, 10), 5, "Mikkel"); this.addKeyListener(new KeyAdapter() { public void keyPressed (KeyEvent e) { handleMovement (e); } }); }
public void paint(Graphics g) { Insets in = getInsets(); g.translate(in.left, in.top); k.render(g); }
private void handleMovement (KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_UP: k.bevæg(kasse.UP); break; case KeyEvent.VK_DOWN: k.bevæg(kasse.DOWN); break; case KeyEvent.VK_RIGHT: k.bevæg(kasse.RIGHT); break; case KeyEvent.VK_LEFT: k.bevæg(kasse.LEFT); break; } repaint (); } }
import java.awt.*;
public class kasse { public static final int LEFT = 0, RIGHT = 1, UP = 2, DOWN = 3;
private int size = 20; protected int hastighed; protected String navn; protected Point point;
public kasse(Point punkt, int hastighed, String navn) { this.hastighed = hastighed; this.navn = navn; point = punkt; }
public void bevæg(int direction) { switch (direction) { case LEFT: point.x -= hastighed;break; case RIGHT: point.x += hastighed;break; case UP: point.y -= hastighed;break; case DOWN: point.y += hastighed;break; } }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.