Missa inte Amazon Prime Deal Days!
Permalänk
Medlem

Knapptryckningar i java hackar.

gör ett snakeliknande spel där man kan åka runt 360 grader fritt. Har dock ett problem med knapptryckningar. Om man trycker ned en tangent för att svänga så hackar den ett steg och sedan går det en liten stund innan den börjar svänga mjukt och fint. Ungefär som när man håller ned en knapp i word. Om man trycker ned "A" och håller ner den så blir det först bara ett "A" sedan efter en stund sätter den ut flera an. Ungefär såhär:
A........ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA. Jag vill ha ett jämt flöde redan från start. Hur ska man göra detta? Här är min kod:

public class snakey02 extends Applet implements Runnable{

Thread t;
int keycode;
String keyPos;
double x = 500;
double y = 500;
double dir = 0;
int n = 0;
double speed = 0;

class onKey extends KeyAdapter{
public void keyPressed (KeyEvent e) {
keycode = e.getKeyCode();
switch (e.getKeyCode()) {
case 37:
dir-=0.1;
break;
case 39:
dir+=0.1;
break;
default:
}
repaint();
}
public void keyReleased (KeyEvent e) {
keycode = e.getKeyCode();
switch (e.getKeyCode()) {
case 37:
dir-=0.1;
break;
case 39:
dir+=0.1;
break;
default:
}
repaint();
}
}

...

public void paint(Graphics g){

g.setColor(Color.red);
g.drawLine((int)x,(int)y,(int)x,(int)y);
}

Permalänk
Medlem

Spara statusen på tengenterna i en array och så tittar du bara i arrayen när det är dags att uppdatera världen. Att köra med eventbaserad input ger väldigt dåliga resultat.

Permalänk
Medlem

Det brukar vara operativsystemet som bestämmer att det först ska komma ett A och sedan många om man håller inne, inte Java.

Visa signatur

4 datorer: 9 cpuer (plats för 4 till), 10scsi+1satadisk, 7.75gb ram, bara Linux
http://isitfika.net http://code.kryo.se

Permalänk
Medlem

Förstår inte varför du gör samma sak både när knappen trycks ner och när den släpps upp, är det inte det som är problemet. Varför använder du inte en vanlig keylistener när du ändå kör en applet?

Visa signatur

96.0 ram minne systemresurser 9% ledigt filsystem 32 bitar virtuellt minne 32 bitar diskkompicerning inte installerad pccard (pcmia) det finns inga pcmica fack installerade systemet är konfugureat för optimal prestanda hårddisk c:/ 1837 mb ledigt hårddisk d:/ 688 mb ledigt

Permalänk
Medlem

Hehe, jag förstår knappt vad dom andra säger, men simplast måste det ju vara att göra booleans för typ "goright=true" när keyPressed, och "goright=false" vid keyReleased. Och sedan i spelloopen så får du istället köra "If (goright) { dir-=0.1 }".

Citat:

Spara statusen på tengenterna i en array och så tittar du bara i arrayen när det är dags att uppdatera världen. Att köra med eventbaserad input ger väldigt dåliga resultat.

Förkara för en som inte kan. Är det inte eventsbaserat att uppdatera världen när tangentstatusarrayen ändras?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av gekk
Förkara för en som inte kan. Är det inte eventsbaserat att uppdatera världen när tangentstatusarrayen ändras?

Kör man med en eventbaserad metod så körs eventhanterarna varje gång ett event sker. Om man däremot bara sparar att ett event har inträffat, så får man ett mer flödesdrivet program.
Man läser ju bara av innehållet i arrayen en gång per frame, och därmed får man bättre resultat än om man bara uppdaterar världen direkt när ett event sker.

Permalänk
Medlem

hehe har fått många svar. gjorde så att jag sparade i arrayer som ni sa. true när man trycker ned och false så fort man släpper. Fungerar aldeles utmärkt.