2011-11-27 46 views
1

嘿即时试图让Java中的简单的ASCII游戏,但我不能让图形上的按键Java的图形更新

即时试图让它这样的家伙是控制使用箭头键更新

继承人的代码

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.JFrame; 
import javax.swing.Timer; 


public class shooter extends JFrame{ 
    int x = 100, y = 100, dx, dy; 
    Timer time; 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    public void move(){ 
     x = x + dx; 
     y = y + dx; 
    } 
    public int getX(){ 
     return x; 
    } 
    public int getY(){ 
     return y; 
    } 

    public shooter() { 
     setTitle("title of gip"); 
     setSize(600, 400); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setResizable(false); 

     //keep at bottom 
     setVisible(true); 
     //dont code here >:(
    } 

    ///////////GRAPHICS //////////////////// 
    public void paint(Graphics g){ 
     g.clearRect(0, 0, getWidth(), getHeight()); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
     g.setColor(Color.white); 
     g.drawString("☺", getX(), getY()); 
    } 
    public void paintComponent(Graphics g){ 

    } 
    //////////////end of graphics////////////// 

    public void keyPressed(KeyEvent e){ 
     int pressed = e.getKeyCode(); 
     if (pressed == KeyEvent.VK_LEFT){ 
      dx = -1; 
     } 
     if (pressed == KeyEvent.VK_RIGHT){ 
      dx = 1; 
     } 
    } 
    public void keyReleased(KeyEvent e){ 
     int rel = e.getKeyCode(); 
     if (rel == KeyEvent.VK_LEFT){ 
      dx = 0; 
     } 
     if (rel == KeyEvent.VK_RIGHT){ 
      dx = 0; 
     } 
    } 
    public void actionPerformed(ActionEvent e) { 
     move(); 
     repaint(); 
    } 
    public static void main(String[] args){ 
     new shooter(); 


    } 

} 

请帮助 感谢

回答

3

@ dann.dev已经找到很好的问题。你没有把你的关键笔画和事件连接到主框架。 另外,我只想评论你绘制场景的方式。您应该绘制一个JPanel而不是JFrame,如果您愿意将按钮和菜单添加到主框架,这将使您的生活更轻松。

覆写并绘制在paintComponent而不是paint

class DrawingPanel{ 
    // .... 
    @Override 
    public void paintComponent(Graphics g){ 
     g.clearRect(0, 0, getWidth(), getHeight()); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
     g.setColor(Color.white); 
     g.drawString("☺", getX(), getY()); 
    } 
    // .... 
} 

完成后,将此面板设置为框架的内容窗格。

frame.setContentPane(new DrawingPanel()); 
+0

盖塔同意。 用户,您设置程序的方式看起来不错,但我认为您可能会遇到一些麻烦,抱歉,我现在没有时间查看它,请尝试阅读“Killer Java游戏编程”有一些很好的信息和一个很好的框架,以固定的fps –

+0

+!来绘制屏幕,​​用于绘制JPanel并覆盖paintComponent()。 – camickr

3

您还没有为您的框架添加任何动作侦听器。当这些事件发生时,会调用关键按钮和动作执行方法,但只能从具有动作侦听器或附加关键侦听器的对象中调用。

结账http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html

总之,虽然您需要满足以下,public class TryItOut extends JFrame implements ActionListener,KeyListener{和在构造函数addActionListener(this);addKeyListener(this);

做到这一点,然后从那里试试。

+0

+1,很好的捕获。我没有看到这个问题:p – GETah

3

1)用于收听来自键盘的按键事件会更好地实现KeyBinding S,例如here

2)类名。将public class Shooter extends JFrame {

为Swing 3)涂料的方法将是public void paintComponent(Graphics g){

4 )主要方法是

public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Shooter(); 
      } 
     }); 
    } 

编辑:

5)@camickr正确注意到我 - >CustomPainting应该在一个JComponent或JPanel的完成,或者您可以使用方法油漆的GlassPane or RootPane

+0

+1,对于使用键绑定的建议,但是在Jframe上重写paintComponent()将不起作用,因为该方法没有在JFrame上实现。自定义绘画应该在JComponent或JPanel上完成。 – camickr