【问题标题】:How to move a visible image diagonally?如何沿对角线移动可见图像?
【发布时间】:2013-08-09 08:17:20
【问题描述】:

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

如果您按向上、向下、向左或向右,图像(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 类(该类创建“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);
    }
  }
}

再次感谢您抽出宝贵时间阅读本文并希望对您有所帮助。

【问题讨论】:

    标签: java applet gif diagonal active-objects


    【解决方案1】:

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

    【讨论】:

    • 好的,谢谢,我去看看;如果我注意到它是什么,我一定会发布它。
    【解决方案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);
    }
    

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

    【讨论】:

    • 没有看到渲染代码,我不确定这是否可行。如果用户向上和离开,角色移动增量仍为 -5,0
    • 谢谢,但是在我进行这些更改后,结果仍然是一样的,尽管您的建议对我来说是有意义的。
    • theHero.move(0,5); 是否允许多次通话?比如,如果玩家在移动,是否可以再次为theHero 调用move() 方法?
    • @bas 看看OP提供的代码,我想你应该可以推断出答案
    • 这无济于事。即使同时按住两个键,也只会生成一个事件。这就是为什么您需要手动跟踪按下了哪些键。
    【解决方案3】:

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

    您不应在这些if 语句中为xy 的运动设置hero 的方向,而应该只更新适当的delta

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

    if (up) yDelta = -5;
    if (down) yDelta = 5;
    if (left) xDelta = -5;
    if (right) xDelta = 5;
    
    hero.move(xDelta, yDelta);
    

    我也同意camickr

    【讨论】:

      【解决方案4】:

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

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

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

      希望对你有帮助

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 除了轮换,我很确定没有被问到,我看不出 AffineTranform 将如何提供帮助。 Graphics#drawInage 和简单的重叠图像有什么问题?
        • .translate() 来自 AffineTransform 的方法?
        • 仍然不确定这将如何解决 OPs 问题:P
        • 0. 为对角线移动创建 4 种新方法,然后分别为: 1. 从底层图像获取变换。 2.transformer.translate(1, 1);斜向左下方移动。 3.transformer.translate(-1, -1);对角线向右上方移动。 4.transformer.translate(-1, 1);对角线向右上方移动。 5.transformer.translate(1, -1);对角线向右下方移动。 6. 绑定 4 个键,例如Q,E,Z,X 瞧,图像/字符可以一键沿对角线移动?
        • 这可以通过drawImage来实现。我们没有操作的渲染代码,但我们可以看到他们是如何更新模型的。阿里,不要告诉我,告诉 OP ;)
        猜你喜欢
        • 1970-01-01
        • 2023-03-22
        • 2019-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-24
        相关资源
        最近更新 更多