在简单的Java BigBang World中移动对象

时间:2017-11-01 19:02:36

标签: java keyevent

我正在尝试创建一个大爆炸世界,其中包含一个圆圈,其初始状态应该让它沿对角线方向移动一个像素到右下角。每次用户按下四个箭头键时,圆圈应向该方向移动一个像素并继续移动。例如,如果我一直按下右箭头键,则圆圈应向右移动,并在每次按下时保持移动速度越来越快。我遇到的问题是我无法让圆圈移动!我认为为每个方法更改圆圈的x和y坐标应相应地移动它。我究竟做错了什么?如我所述,我可以做些什么让圆圈移动?这是我需要修复的Game.java文件:

import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Game implements World { 

  public Game() { }
  int x, y = 200;
  int width, height = 100;
  void Circle(int x, int y, int width, int height){
    this.x = x;
    this.y = y; 
    this.width = width;
    this.height = height;
  }
  public void draw(Graphics g) { 
    int x = 200;
    int y = 200;
    int width = 100;
    int height = 100;

    g.setColor(Color.red); 
    g.fillOval(x, 
               y, 
               width, 
               height);  
  }  
  public void teh() {
    this.x++;
    this.y++; 
  }
  public void meh(MouseEvent e) {
    int x = e.getX(), y = e.getY(); 
    System.out.println("Mouse event detected.");
  }
  public void keh(KeyEvent e) {
    int x = e.getKeyLocation(), y = e.getKeyLocation(); 
    int key = e.getKeyCode();
    if (key == KeyEvent.VK_UP){
      this.y--;  
      System.out.println("Up.");
    }
    else if (key == KeyEvent.VK_DOWN){
      this.y++;  
      System.out.println("Down.");
    }
    else if (key == KeyEvent.VK_RIGHT){
      this.x++;   
      System.out.println("Right.");
    }
    else if (key == KeyEvent.VK_LEFT){
      this.x--; 
      System.out.println("Left.");
    }
    else{}

//    switch( keyCode ) { 
//        case KeyEvent.VK_UP:
//            // handle up 
//            break;
//        case KeyEvent.VK_DOWN:
//            // handle down 
//            break;
//        case KeyEvent.VK_LEFT:
//            // handle left
//            break;
//        case KeyEvent.VK_RIGHT :
//            // handle right
//            break;
//     } 
  } 
  public boolean hasEnded() { 
    return false; 
  }
  public void sayBye() { 
    System.out.println("BYE!");
  }

  public static void main(String[] args) {
    BigBang b = new BigBang(new Game()); 
    b.start( 50, // delay 
            400  // size 
           ); 
  }

}

这些是使用的补充文件,但应保持不变。我将它们包括在内供您参考:

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

public class BigBang extends JComponent implements ActionListener, MouseListener, MouseMotionListener, KeyListener {
  Timer timer; 
  World world; 
  public BigBang(World world) {
    this.world = world; 
    this.addMouseListener(this); 
    this.addMouseMotionListener(this); 
    this.addKeyListener(this); 
    this.setFocusable(true); 
    this.requestFocus();
  }
  public void start(int delay, int size) {
    JFrame a = new JFrame(); 
    a.add( this ); 
    a.setVisible(true); 
    a.setSize(size, size); 
    this.timer = new Timer(delay, this);  
    this.timer.start(); 
  }
  public void mouseEntered(MouseEvent e) { }
  public void mouseExited(MouseEvent e) { }
  public void mousePressed(MouseEvent e) { 
    this.world.meh(e); 
    this.repaint(); 
  }
  public void mouseDragged(MouseEvent e) { 
    this.world.meh(e); 
    this.repaint(); 
  }
  public void mouseMoved(MouseEvent e) { } 
  public void mouseReleased(MouseEvent u) { 
    this.world.meh(u); 
    this.repaint(); 
  }
  public void mouseClicked(MouseEvent e) { }
  public void keyPressed(KeyEvent e) {
    this.world.keh(e);
    this.repaint();
  }
  public void keyReleased(KeyEvent e) { }  
  public void keyTyped(KeyEvent e) { } 
  // int count;
  public void actionPerformed(ActionEvent e) {
    // this.count += 1; 
    // System.out.println("Ouch" + this.count);     
    if (this.world.hasEnded()) { 
      this.timer.stop(); 
      this.world.sayBye(); 
    } else { 
      this.world.teh();
    }
    this.repaint();
  }
  public void paintComponent(Graphics g) {
    this.world.draw(g); 
  }
}

界面World.java:

import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseEvent; 

interface World {
  void draw(Graphics g);  
  void teh(); 
  void meh(MouseEvent e); 
  void keh(KeyEvent e); 
  boolean hasEnded(); 
  void sayBye(); 
}

我的错误在哪里?为什么在按下箭头键时无法移动圆圈?每次按下箭头键时,如何继续添加对象的速度?任何修改或建议都会有所帮助。

1 个答案:

答案 0 :(得分:0)

问题在于你的绘制方法:

public void draw(Graphics g)
{
    int x = 200;
    int y = 200;
    int width = 100;
    int height = 100;

    g.setColor(Color.red);
    g.fillOval(x, y, width, height);
}

您不断制作新的本地变量xywidthheight,并使用这些变量

相反,您应该使用您的类已设计的变量:

public void draw(Graphics g)
{
    g.setColor(Color.red);
    g.fillOval(x, y, width, height);
}