Avatar billede jannek_ek Nybegynder
19. september 2005 - 19:19 Der 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?
Avatar billede mikkelbm Nybegynder
19. september 2005 - 19:24 #1
Har du leget med tråde?

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.
Avatar billede mikkelbm Nybegynder
19. september 2005 - 19:39 #2
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:


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MoveGui extends JFrame
{
    private MyRec rec;
    private final int speed = 2;
   
    public MoveGui ()
    {
        setSize (400, 400);   
        this.addKeyListener(new MyKeyListener ());
        rec = new MyRec (50, 50, 15, 15);
    }
   
    public void paint (Graphics g)
    {
        g.clearRect(0, 0, this.getWidth(), this.getHeight());
        g.drawRect(rec.x, rec.y, rec.width, rec.height);
    }
   
    private class MyRec
    {
        int x, y, width, height;
       
        public MyRec (int x, int y, int width, int height)
        {
            this.x = x;
            this.y = y;
            this.width = width;
            this.height = height;
        }
    }
   
    private class MyKeyListener extends KeyAdapter
    {
        public void keyPressed (KeyEvent e)
        {
            switch (e.getKeyCode())
            {
                case KeyEvent.VK_UP: rec.y -= speed; break;
                case KeyEvent.VK_DOWN: rec.y += speed; break;
                case KeyEvent.VK_RIGHT: rec.x += speed; break;
                case KeyEvent.VK_LEFT: rec.x -= speed; break;
            }
            repaint ();
        }
    }
   
    public static void main (String[] args)
    {
        new MoveGui().setVisible(true);
    }
}
Avatar billede jannek_ek Nybegynder
19. september 2005 - 21:07 #3
hmm jeg er ikke helt sikker på hvad der får dit eksempel til at virke fremfor mit... så jeg prøver at lave en tråd
Avatar billede mikkelbm Nybegynder
19. september 2005 - 21:10 #4
Jeg kan som sagt ikke sige, om det er nødvendigt med en tråd eller ej ud fra den smule du har vist. Men prøv.
Avatar billede mikkelbm Nybegynder
20. september 2005 - 23:01 #5
Kommet videre ?
Avatar billede jannek_ek Nybegynder
21. september 2005 - 16:39 #6
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;
 
  public timer(vindue f)
  {
    this.f = f;
  }
 
  public void run()
  {
    try
    {
      Thread.sleep(50);
    } catch (Exception e)
    {}
    f.repaint();
  }
}
Avatar billede mikkelbm Nybegynder
21. september 2005 - 16:43 #7
Jeg kigger lige på det, når jeg kommer hjem senere.
Avatar billede jannek_ek Nybegynder
21. september 2005 - 16:44 #8
jes lyder herligt :D
Avatar billede mikkelbm Nybegynder
21. september 2005 - 17:13 #9
Kan du ikke lige prøve kort at beskrive, hvad det er du vil ha' programmet til at gøre?
Avatar billede mikkelbm Nybegynder
21. september 2005 - 17:18 #10
Altså:

- Vil du kun ha' noget til at bevæge sig, når der trykkes på knapperne
- Eller skal det hele tiden bevæge sig, og knapperne skal blot indikere retning

Osv...
Avatar billede mikkelbm Nybegynder
21. september 2005 - 17:20 #11
Jeg kan heller ikke compile din kode uden klassen: kasse
Avatar billede jannek_ek Nybegynder
21. september 2005 - 17:20 #12
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
Avatar billede jannek_ek Nybegynder
21. september 2005 - 17:21 #13
nej hov:

import java.awt.*;

public class kasse
{
  protected Rectangle kassen;
  protected int hastighed;
  protected String navn;
  protected Point startP;

  public kasse(Point punkt, int hastighed, String navn)
  {
    kassen = new Rectangle(punkt.x, punkt.y, 20, 20);
    this.hastighed = hastighed;
    this.navn = navn;
    startP = punkt;
  }

  public void bevæg()
  {
    if (kassen.x < (400 + startP.x))
    kassen.x += hastighed;
    else if (kassen.y < (300 + startP.y))
    kassen.y += hastighed;
    else
    kassen.x += hastighed;   
  }

  public void flyt(Point punkt)
  {
    kassen.x += punkt.x;
    kassen.y += punkt.y;
  }

  public void sæt(Point punkt)
  {
    kassen.x = punkt.x;
    kassen.y = punkt.y;
  }

  public void render(Graphics g)
  {
    g.fillRect(kassen.x, kassen.y, kassen.width, kassen.height);
  }
}
Avatar billede mikkelbm Nybegynder
21. september 2005 - 17:41 #14
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;
        }   
    }
   
    public void flyt(Point punkt)
    {
        point = punkt;
    }
   
    public void render(Graphics g)
    {
        g.fillRect(point.x, point.y, size, size);
    }
}
Avatar billede jannek_ek Nybegynder
23. september 2005 - 18:28 #15
jes så virker det fint, mange tak :P
Avatar billede mikkelbm Nybegynder
23. september 2005 - 20:06 #16
Jeg tillader mig at smide et svar :)
Avatar billede jannek_ek Nybegynder
27. september 2005 - 16:45 #17
Så vil jeg da tillade mig at sige tak igen :P
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester