我一直试图弄清楚如何在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);
}
}
}
再次感谢您花时间阅读本文,希望能给予帮助。
答案 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
语句中的y
和if
移动设置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)这是一种流行的技术,您不会立即对播放器的输入采取行动,而是存储密钥按下队列,然后定期轮询该队列(即在你的游戏循环中),以决定按下或不按下哪些键,并采取相应的行动。
我希望这会有所帮助