【问题标题】:Alternate two images in java (open and close the pacman's mouth)java中交替两张图片(打开和关闭吃豆人的嘴)
【发布时间】:2022-01-04 14:39:27
【问题描述】:

我会尝试用 Java 复制 Pacman 游戏。我确保通过键盘我可以通过替换图像使播放器正确移动和旋转它。我现在不知道如何让他在走路时无休止地张开和闭上嘴。这是我的代码(目前,我只处理它走过的部分):

吃豆人闭着嘴的形象是“playerClosed”

import java.awt.Graphics;
import java.util.concurrent.TimeUnit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.awt.event.KeyEvent;
import java.awt.Color;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.Timer;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import javax.swing.Timer;

public class decisiva extends JPanel implements ActionListener, KeyListener {
    
    int x=0;
    int y=0;
    int velX=0;
    int velY=0;

    Timer tm = new Timer(1,this);
    
    
    private String playerDirection="right";

    private Image playerUp = new ImageIcon("boh/imageUp.png").getImage();
    private Image playerDown = new ImageIcon("boh/imageDown.png").getImage();
    private Image playerRight = new ImageIcon("boh/imageRight.png").getImage();
    private Image playerLeft = new ImageIcon("boh/imageLeft.png").getImage();
    
    private Image playerClosed = new ImageIcon("boh/closed.png").getImage();
    
    
    public decisiva() {
        tm.start();
        addKeyListener(this);
        setFocusable(true);
    }
    
    
    Timer timer = new Timer(5444400,this);

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        if(playerDirection=="up") {
            g.drawImage(playerUp,x,y,this);
        }
        if(playerDirection=="down") {
            g.drawImage(playerDown,x,y,this);
        }
        if(playerDirection=="left") {
            g.drawImage(playerLeft,x,y,this);
        }
        if(playerDirection=="right") {
            g.drawImage(playerRight,x,y,this);
        }
        
    }
    

    public void actionPerformed(ActionEvent e) {
        x = x+velX;
        y= y+velY;
        repaint();
    }
    
    public void keyPressed(KeyEvent e) {

        if(e.getKeyCode() == KeyEvent.VK_W) {
            velX=0;
            velY=-1;
            playerDirection="up";
            
        }
        
        if(e.getKeyCode() == KeyEvent.VK_D) {
            velX=1;
            velY=0;
            playerDirection="right";
        }
        
        if(e.getKeyCode() == KeyEvent.VK_A) {
            velX=-1;
            velY=0;
            playerDirection="left";
        }
        
        
        if(e.getKeyCode() == KeyEvent.VK_S) {
            velX=0;
            velY=1;
            playerDirection="down";
        }
    }


    public void keyTyped(KeyEvent e) {      
    }

    public void keyReleased(KeyEvent e) {
    }
}

还有主要的:

package player;

import javax.swing.JFrame;

public class main {

    public static void main(String[] args) {
        
        decisiva t = new decisiva();
        
        JFrame jf = new JFrame();
        
        jf.setTitle("tutorial");
        jf.setSize(600,400);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.add(t);

    }

}

My goal is to be able to do this in the simplest way.

但现在使用我的代码,我可以通过仅沿所需方向旋转它来使其正确移动。

【问题讨论】:

  • 这能回答你的问题吗? Animating Sprite Sheets in Java using LibGdx
  • 也许您可以使用 int 作为计数器,在每个游戏时间/帧递增,当它达到特定数字后,您切换动画图像并将计数器重置为零
  • 最简单的解决方案是创建四个 GIF 文件,每个方向一个。

标签: java swing animation 2d pacman


【解决方案1】:

我的第一个问题是想知道为什么只有一张图片中精灵的嘴巴是闭合的,因为这只会让精灵的嘴巴朝一个方向闭合。但是,要回答您的问题,我会创建一个全局 int 变量并将其用作计时器,因此当它到达某个点时,它将来回切换图像从闭嘴的图像到张开的图像。

private int openClose = 0; //the time variable that is global

然后在一个单独的函数中可以声明精灵的运动:

private int leftCloseIndex = 0; private Image[] leftClose = {playerLeft, playerClosed}; // list to alternate images
public void actionPerformed(){
    if (openClose != 20){
        openClose++;
    } else{
        openClose = 0;
        if (leftCloseIndex == 1){
            leftCloseIndex = 0;
        } else{
            leftCloseIndex = 1;
        }
    }
}

注意:该函数必须是 actionPerformed 函数或被它引用才能更新。

【讨论】:

  • “我的第一个问题是..” 问题是针对 cme​​ts 的。鉴于您没有代表。尚未发表评论,请将该规则视为您应该耐心等待的提示。专注于回答那些不需要开头的问题(或答案中的任何地方)。
猜你喜欢
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 2022-08-15
相关资源
最近更新 更多