6

我一直在试图弄清楚如何使可见图像在小程序窗口中对角移动。

如果您按向上、向下、向左或向右,图像(gif)会相应移动,但是如果您尝试同时按两个键(例如同时向上和向右),图像只会沿您按下的方向移动秒(即使您同时按下按键仍然存在微观延迟)。

可能有一种我不知道的简单方法可以解决此问题,或者可能有人已经找到了解决方法...我感谢可以提供的任何帮助或建议。

谢谢

英雄类(这个类定义了“英雄”是什么;在这种情况下是一个简单的像素人,以及他能做什么)

import objectdraw.*;
import java.awt.*;

public class Hero extends ActiveObject {

private DrawingCanvas canvas;
private VisibleImage player;

public Hero(Location initLocation, Image playerPic, DrawingCanvas aCanvas) {
canvas = aCanvas;

player = new VisibleImage(playerPic, canvas.getWidth()/3,
         canvas.getWidth()/3, canvas);
start();

}
public void run() 
{

}

public void move(double dx, double dy) 
{
player.move(dx, dy);
}
}

HeroGame 类(该类创建“英雄”并指定位置,以及用于使他移动的键)

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

public class HeroGame extends WindowController implements KeyListener {
private Hero theHero;
private Image playerPic;
private Location initLocation;
public void begin() {
    playerPic = getImage("player.gif");
    canvas.addKeyListener ( this );
    this.addKeyListener ( this );
    requestFocusInWindow();
    theHero = new Hero(initLocation, playerPic, canvas);
    }
public void keyTyped( KeyEvent e ) { }
public void keyReleased( KeyEvent e ) { }
public void keyPressed( KeyEvent e ) {

    if ( e.getKeyCode() == KeyEvent.VK_UP ) {
        theHero.move(0,-5);
    }
    else if ( e.getKeyCode() == KeyEvent.VK_DOWN ) {
        theHero.move(0,5);
    }
    else if ( e.getKeyCode() == KeyEvent.VK_LEFT ) {
        theHero.move(-5,0);
    }
    else if ( e.getKeyCode() == KeyEvent.VK_RIGHT ) {
        theHero.move(5,0);
    }
  }
}

再次感谢您花时间阅读本文并希望有所帮助。

4

5 回答 5

3

我建议你使用 Swing (JApplet) 和 Key Bindings。有关使用KeyListener 的问题以及处理同时按下多个键的解决方案,请参阅使用键盘进行运动。

于 2013-08-07T19:32:42.140 回答
2

改变

if ( e.getKeyCode() == KeyEvent.VK_UP ) {
    theHero.move(0,-5);
}
else if ( e.getKeyCode() == KeyEvent.VK_DOWN ) {
    theHero.move(0,5);
}
else if ( e.getKeyCode() == KeyEvent.VK_LEFT ) {
    theHero.move(-5,0);
}
else if ( e.getKeyCode() == KeyEvent.VK_RIGHT ) {
    theHero.move(5,0);
}

if ( e.getKeyCode() == KeyEvent.VK_UP ) {
    theHero.move(0,-5);
}
if ( e.getKeyCode() == KeyEvent.VK_DOWN ) {
    theHero.move(0,5);
}
if ( e.getKeyCode() == KeyEvent.VK_LEFT ) {
    theHero.move(-5,0);
}
if ( e.getKeyCode() == KeyEvent.VK_RIGHT ) {
    theHero.move(5,0);
}

它应该对两个键都有反应。

于 2013-08-07T19:33:48.530 回答
1

if-else您应该使用一系列语句,而不是您的键if语句。

而不是在这些语句中为 the和移动设置hero' 方向,您应该只更新适当的xyifdelta

对于(一个非常简化的)示例......

if (up) yDelta = -5;
if (down) yDelta = 5;
if (left) xDelta = -5;
if (right) xDelta = 5;

hero.move(xDelta, yDelta);

我也同意camickr

于 2013-08-07T19:44:04.770 回答
0

您需要做的是访问图像的底层 AffineTransform 类,并设置正确的翻译方法。这将允许您通过一键(绑定到该调用)来移动图像(以任何度数,在任何方向)。

阅读此内容: http: //docs.oracle.com/javase/7/docs/api/java/awt/geom/AffineTransform.html

于 2013-08-07T19:42:38.993 回答
0

这是接受键盘输入的游戏中相当常见的情况。问题是您的游戏需要对游戏当前按下的所有键进行操作(这意味着尚未触发 KEY_RELEASE 事件的所有键)。

KeyListener只会通知您按下的最后一个键(如果您按住它,将继续通知您相同的键),因此您需要自己跟踪其余键的状态

要了解如何做到这一点,请搜索键盘轮询这里是一个示例),这是一种流行的技术,您不会立即对玩家的输入采取行动,而是将按键存储在队列中,然后定期轮询该队列(即在您的游戏循环中)来决定按下或不按下哪些键并采取相应的行动。

我希望这有帮助

于 2013-08-07T21:25:49.750 回答