Java 如何为键盘输入制作不同的动画
我正在用爪哇制作一个自上而下的射击游戏,我有一个固定的玩家,他可以左右转动,可以向移动到中间(玩家所在的位置)的敌人开枪。当我的球员转身时,我为每一边做了不同的面,但我不知道如何在使用箭头键时切换面。这是我的主面板:Java 如何为键盘输入制作不同的动画,java,animation,keyboard,project,panel,Java,Animation,Keyboard,Project,Panel,我正在用爪哇制作一个自上而下的射击游戏,我有一个固定的玩家,他可以左右转动,可以向移动到中间(玩家所在的位置)的敌人开枪。当我的球员转身时,我为每一边做了不同的面,但我不知道如何在使用箭头键时切换面。这是我的主面板: import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.image.*; public class FinalPanel extends JPanel { priva
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
public class FinalPanel extends JPanel
{
private static final int FRAME = 1600;
private static final Color BACKGROUND = new Color(255, 255, 255);
private Player player;
private ImageIcon faces;
private ImageIcon playerFace = new ImageIcon("PlayerUpImage.png");
private BufferedImage myImage;
private Graphics myBuffer;
private Timer timer;
public FinalPanel()
{
myImage = new BufferedImage(FRAME, FRAME, BufferedImage.TYPE_INT_RGB);
myBuffer = myImage.getGraphics();
addKeyListener(new Key());
setFocusable(true);
}
private class Listener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
ImageIcon player = new ImageIcon("PlayerUpImage.png");
myBuffer.drawImage(player.getImage(), 800, 800, null);
repaint();
}
}
public void paintComponent(Graphics g)
{
super.paintComponenet(g);
g.drawImage(myImage, 0, 0, getWidth(), getHeight(), null);
}
private class Key extends KeyAdapter//The arrow keys make the player change directions and it replaces his face with a different animation to show the change in direction
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode() == KeyEvent.VK_W)
{
playerFace = new ImageIcon("PlayerUpImage.png");
}
if(e.getKeyCode() == KeyEvent.VK_S)
{
playerFace = new ImageIcon("PlayerDownImage.png");
}
if(e.getKeyCode() == KeyEvent.VK_A)
{
playerFace = new ImageIcon("PlayerLeftImage.png");
}
if(e.getKeyCode() == KeyEvent.VK_D)
{
playerFace = new ImageIcon("PlayerRightImage.png");
}
repaint();
}
}
}
球员级别:
import java.awt.*;
import javax.swing.*;
public class Player
{
//Private fields for player class
private int myX;
private int myY;
private int myXWidth;
private int myYWidth;
public Player()
{
myX = 775;
myY = 775;
myXWidth = 50;
myYWidth = 50;
}
public Player(int x, int y, int xWidth, int yWidth)
{
myX = x;
myY = y;
myXWidth = xWidth;
myYWidth = yWidth;
}
//I borrowed this health code from: https://stackoverflow.com/questions/9834609/how-to-make-a-player-class-that-holds-lives-inheritance//
int liveCount = 10;
public boolean damage() {
--liveCount;
return isDead();
}
public boolean isDead() {
return liveCount < 1;
}
public void boostLives(int moreLives) {
liveCount += moreLives;
}
//Accessor Methods//
public int getX()
{
return myX;
}
public int getY()
{
return myY;
}
public int getXWidth()
{
return myXWidth;
}
public int getYWidth()
{
return myYWidth;
}
//Modifier Methods//
public void setX(int x)
{
myX = x;
}
public void setY(int y)
{
myY = y;
}
public void setXWidth(int xWidth)
{
myXWidth = xWidth;
}
public void setYWidth(int yWidth)
{
myYWidth = yWidth;
}
}
import java.awt.*;
导入javax.swing.*;
公开课选手
{
//玩家类的私有字段
私有int myX;
私家密室;
私有int myXWidth;
密威茨私人酒店;
公共玩家()
{
myX=775;
myY=775;
myXWidth=50;
myYWidth=50;
}
公共播放器(整数x,整数y,整数xWidth,整数yWidth)
{
myX=x;
myY=y;
myXWidth=xWidth;
myYWidth=yWidth;
}
//我从以下地方借用了此健康代码:https://stackoverflow.com/questions/9834609/how-to-make-a-player-class-that-holds-lives-inheritance//
int-liveCount=10;
公共布尔损坏(){
--活计数;
返回isDead();
}
公共布尔ISDED(){
返回liveCount<1;
}
公共虚空boostLives(int morelifes){
liveCount+=更多生命;
}
//存取器方法//
公共int getX()
{
返回myX;
}
公共int getY()
{
返回myY;
}
公共int getXWidth()
{
返回myXWidth;
}
public int getYWidth()
{
返回myYWidth;
}
//修正方法//
公共无效集合x(整数x)
{
myX=x;
}
公共空间设置(整数y)
{
myY=y;
}
公共void setXWidth(int xWidth)
{
myXWidth=xWidth;
}
公共无效设置宽度(整数宽度)
{
myYWidth=yWidth;
}
}
我有一些建议可能会有所帮助:
不要使用可变面,而是使用名为playerFace的图像图标,默认方向为向上
private ImageIcon playerFace = new ImageIcon(“PlayerUpImage.png”);
您的绘制方法可以如下所示
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(playerFace.getImage(), 800, 800, null);
}
在按下键的方法中,您所要做的就是更改播放器图像并调用方法repaint,以便面板再次调用paintComponent方法:
public void keyPressed(KeyEvent e) {
//pressed d for example
if(e.getKeyCode() == KeyEvent.VK_D)
playerFace = new ImageIcon(“PlayerImageRight.png”);
... //if else’s for other keys
repaint();
}
最好是将playerFace作为Player类的一个属性,并使用getter方法来获取playerFace方向(从而使playerFace成为Player的变量)。但这是为了让你开始
您还需要设置一个框架,而不是使用当前的变量框架
public FinalPanel() {
JFrame frame = new JFrame();
frame.setSize(1600, 1600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
frame.setVisible(true);
addKeyListener(new Key());
setFocusable(true);
}
嘿,谢谢你的回答。我做了一些改变。你能看一下吗?你好@GoodMovies,首先,当你按键时,播放器没有改变方向,我说的对吗?其次,你设置了一个计时器,每10毫秒重置一次你的玩家图像,我认为这就是一直重置你的角色。此外,您正试图使用可变面更改播放器的方向,但似乎在您的按键方法之外没有使用面变量。我建议您创建一个新的简单Java文件,并尝试我的建议,这样您就不会重写现有代码。看看是否有帮助。尽量不要使用计时器,你是对的,我的播放器没有移动。我已经删除了计时器,并根据您的建议更改了代码。我现在的问题是,我的屏幕上没有任何内容。我在这里编辑了我的代码,以便您可以看到更新。谢谢这可能会做到,注意在我的paintComponent方法中,第一行是super.paintComponent(g),这很重要,任何带有图形的swing应用程序都有这一点。试着包括这个,告诉我它是否有效我只是把它放进去,但它似乎仍然不起作用。