【问题标题】:Getting animation to work correctly with Java KeyEvent使动画与 Java KeyEvent 一起正常工作
【发布时间】:2012-05-17 01:06:44
【问题描述】:

我坚持让我的精灵角色通过按d 来执行 2 个动画帧(link_frame_2 后跟 link_frame_1)。它只执行一个动画帧(link_frame_2_face_right.png)。

代码如下:

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

import acm.graphics.GImage;
import acm.graphics.GPoint;
import acm.program.GraphicsProgram;


public class LinkGame extends GraphicsProgram {

    public void run(){
        setSize(APPLICATION_WIDTH, APPLICATION_HEIGHT);
        addLink();
        addKeyListeners();
        addMouseListeners();
    }
    private void addLink(){
        linkCharacter = new GImage("link sprites/link_frame_1_face_right.png");
            add(linkCharacter,link_Location_XCoord,link_Location_YCoord);
    }
    public void keyPressed(KeyEvent e){ 
        char linkMoveRightKey = e.getKeyChar();
        if(linkMoveRightKey == 'd'){
            // y should not change so goku moves in a straight line
                link_Location_YCoord = 0;
                linkCharacter.move(link_Location_XCoord,link_Location_YCoord);
                    set_Link_Anim_Frame_2_face_left();
            }
    }
    public void set_Link_Anim_Frame_2_face_left(){
        linkCharacter.setImage("link sprites/link_frame_2_face_right.png");         
    }
    public void set_Link_Anim_Frame_1_face_left(){  
        linkCharacter.setImage("link sprites/link_frame_1_face_right.png");
    }
    private GImage linkCharacter;
    private  int link_Location_XCoord = 50;
    private  int link_Location_YCoord = 50 ;
    private final int APPLICATION_WIDTH = 600;
    private final int APPLICATION_HEIGHT = 600;
}

【问题讨论】:

  • 你的游戏是一直在运行,还是只有在你按键时才会移动/改变?

标签: java animation frame keyevent


【解决方案1】:

目前,当您移动时,要显示的帧不会更新。如果您使用一组图像并循环播放,那么您将能够在动画中包含任意数字。我已在下面的代码中提供了更新,因此您可以尝试一下。我添加了一个速度,而不是使用您的运动的初始位置,因此您可以独立更改这两个值。此外,缓慢移动可以让您更轻松地看到帧的变化。

import java.awt.event.KeyEvent;

import acm.graphics.GImage;
import acm.program.GraphicsProgram;

public class LinkGame extends GraphicsProgram {

    public void run(){
        setSize(APPLICATION_WIDTH, APPLICATION_HEIGHT);
        addLink();
        addKeyListeners();
        addMouseListeners();
    }

    private void addLink(){
        linkCharacter = new GImage("link sprites/link_frame_1_face_right.png");
            add(linkCharacter,link_Location_XCoord,link_Location_YCoord);
    }

    public void keyPressed(KeyEvent e){ 
        char linkMoveRightKey = e.getKeyChar();
        if(linkMoveRightKey == 'd'){
                linkCharacter.move(xSpeed,ySpeed);
                linkCharacter.setImage(images[frame]);
                frame++;
                if(frame>=images.length){
                    frame = 0;
                }
            }
    }
    private GImage linkCharacter;
    private  int link_Location_XCoord = 50;
    private  int link_Location_YCoord = 50 ;
    private final int APPLICATION_WIDTH = 600;
    private final int APPLICATION_HEIGHT = 600;
    private String[] images = {"link sprites/link_frame_1_face_right.png","link sprites/link_frame_2_face_right.png"}; //Add in as many images as you want for your animation
    private int frame = 0;
    private int xSpeed = 1; //the number of pixels to move in x
    private int ySpeed = 0; //0 so you only move horizontally
}

【讨论】:

  • 我确实希望在按 d 时一个接一个地播放多个帧。由于某种原因,它只设置了 frame_2 的图像,但没有设置 frame_1。我尝试在 keyPressed 方法中在 frame_2 上使用 set_image,然后在 frame_1 上使用 set_image,但随后它只会设置 frame_1 的图像。
  • 您的意思是要在按住 d 的同时继续播放动画吗?您的图像是在屏幕上移动还是只移动一次?
  • 我提交的代码执行以下操作:在按下 d 键时允许精灵移动,并且还会更改动画的一帧(frame_2),但在 frame_2 之后永远不会变回 frame_1。我想要它做的是在播放 frame_2 后更改 frame_1。
  • 如果您多次按“d”,我的任何一个示例都有效吗?
  • 它不起作用,而是我收到标有红色文本的错误。您的示例是一个字符串 [],我使用的设置图像方法会查找一个目录,该目录中填充了表示为字符串的图像。我可能需要研究线程来实现多帧动画。
猜你喜欢
  • 1970-01-01
  • 2011-10-29
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
相关资源
最近更新 更多