如何对角移动可见图像?

时间:2013-08-07 19:28:27

标签: java applet gif diagonal active-objects

我一直试图弄清楚如何在applet窗口中对角线移动可见图像。

如果向上,向下,向左或向右按​​下图像(gif)会相应移动,但是如果您尝试同时按下两个键(例如同时向上和向右),则图像仅在你按下方向的第二个方向(即使你同时按下按键仍有微小的延迟)。

可能有一种简单的方法可以解决这个问题,我只是不知道,或者某个人已经弄清楚了......我感谢任何帮助或建议。

感谢您

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

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类(此类创建“Hero”并指定位置,以及用于移动的键)

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);
    }
  }
}

再次感谢您花时间阅读本文,希望能给予帮助。

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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);
}

它应该对两个键做出反应。

答案 2 :(得分:1)

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

您应该只更新相应的hero,而不是为这些x语句中的yif移动设置delta的方向。 }

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

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

hero.move(xDelta, yDelta);

我也同意camickr

答案 3 :(得分:0)

您需要做的是访问图像的基础AffineTransform类,并设置正确的翻译方法。这样,您只需按一下键(即绑定到该调用),就可以无论如何移动图像(任何方向的#度)。

继续阅读: http://docs.oracle.com/javase/7/docs/api/java/awt/geom/AffineTransform.html

答案 4 :(得分:0)

这是接受键盘输入的游戏中的一种常见情况。问题是,就游戏而言,你的游戏需要对当前按下的所有键采取行动(意味着还没有触发KEY_RELEASE事件的所有键)。

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

要了解如何操作,请搜索键盘轮询here an example)这是一种流行的技术,您不会立即对播放器的输入采取行动,而是存储密钥按下队列,然后定期轮询该队列(即在你的游戏循环中),以决定按下或不按下哪些键,并采取相应的行动。

我希望这会有所帮助