2013-08-22 3 views
0

Я начал изучать Java как хобби немного назад, потому что я хотел сделать небольшую игру. Я изучил основы Java, и я решил, что я попытаюсь решить игру-dev. Мой JFrame и все в порядке, и я технически не имею ошибок, но мой маленький парень прямоугольника не будет перемещаться по экрану. Вот мой код:Sprite Movement в Java

package main; 

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 

public class Race extends JFrame { 

public int speed=5; 
public int up=1; 
public int left=2; 
public int down=3; 
public int right=4; 
public int direction=0; 

Rectangle p1 = new Rectangle (500,400,20,40); 

public Race() 
{ 
    super("Race"); 
    setSize(1000,800); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Container cont=getContentPane(); 
    cont.setBackground(Color.orange); 
    setResizable(false); 
} 

public void paint(Graphics g) 
{ 
    super.paint(g); 
    g.setColor(Color.red); 
    g.fillRect(p1.x, p1.y, p1.width, p1.height); 
} 


public class Move extends Thread implements KeyListener 
{ 
    public void run() 
    { 
     addKeyListener(this); 

     while(true) 
     { 
      try 
      { 
       repaint(); 

       if(direction==up) 
       { 
        p1.y-=(int)speed; 
       } 
       if(direction==down) 
       { 
        p1.y+=(int)speed; 
       } 
       if(direction==right) 
       { 
        p1.x+=(int)speed; 
       } 
       if(direction==left) 
       { 
        p1.x-=(int)speed; 
       } 
        Thread.sleep(75); 
      } 
       catch (Exception e) 
       { 
        break; 
       } 
      } 
     } 

    @Override 
    public void keyPressed(KeyEvent event) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyReleased(KeyEvent event) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void keyTyped(KeyEvent event) { 
     // TODO Auto-generated method stub 
     if(event.getKeyChar()=='w') 
     { 
      direction = up; 
     } 
     if(event.getKeyChar()=='d') 
     { 
      direction = left; 
     } 
     if(event.getKeyChar()=='s') 
     { 
     direction = down; 
     } 
     if(event.getKeyChar()=='a') 
     { 
      direction = left; 
     } 
    } 

    } 





public static void main(String[] args) 
{ 
    new Race(); 
} 

} 

Спасибо!

+0

1) put 'setVisible (true);' в конце конструктора, 2) 'repaing()' marely предлагает, чтобы он не гарантировал перекраску, 3) где вы используете/запускаете поток 'Move'? – Pshemo

+0

Прежде всего, это действительно хорошая идея начать привыкать комментировать ваш код. Каждая пара строк по мере необходимости должна иметь некоторое разъяснение того, что вы делаете/хотите делать. Легче понять другим. Является ли ваша программа вызовом Paint снова после настройки координат x и y на основе ввода? Если это не так, это может быть проблемой. – ObjectNameDisplay

ответ

1

Есть несколько проблем:

  1. Вы не создаете экземпляр Move, чтобы ничего не слушают ключи.
  2. Я не думаю, что вам даже нужен класс Move, который работает в фоновом потоке. Возьмите логику KeyListener и поместите ее в свой класс Race, затем включите keyListener, позвонив addKeyListener(this);, чтобы он начал слушать нажатия клавиш.

    Race extends JFrame implements KeyListener{ 
    
        Race(){ 
         ... 
         addKeyListener(this); 
        } 
    
    @Override 
    public void keyTyped(KeyEvent event) { 
    
    if(event.getKeyChar()=='w') 
        { 
         direction = up; 
        } 
        if(event.getKeyChar()=='d') 
        { 
         direction = left; 
        } 
        if(event.getKeyChar()=='s') 
        { 
        direction = down; 
        } 
        if(event.getKeyChar()=='a') 
        { 
         direction = left; 
        } 
        repaint(); 
    } 
    

Также см это так вопрос: Unresponsive KeyListener for JFrame для получения дополнительной помощи.

+0

Я знаю, что мой KeyListener работает, потому что я сделал его печать на консоль. Я думаю, что проблема в классе Move, но я не вижу, что это такое, поэтому больше предложений поможет! – user2642853