我对java有点陌生。我想写一个简单的游戏,它有一个玩家和敌人,当你按一些键如“空格”时,玩家大多数会朝正确的方向射击,但我不知道如何在游戏中渲染子弹。事实上,它不会在游戏中出现,也不会移动。
射击系统
package com.company;
import javax.swing.*;
import java.awt.*;
public class Bullet {
GamePanel panel;//Game panel
Rectangle hitBox;//Bullet
public int x,y,width,height;
boolean Shoot;
public Bullet(int x , int y ,GamePanel panel)
{
this.panel = panel;
this.x=x;
this.y=y;
height=15;
width=15;
hitBox = new Rectangle(x,y,width,height);
}
public void set()
{
if(Shoot) // where I have problem which Bullet doesn't move or doesn't appear
move();
}
public void move()
{
x=x+10;
}
public void draw(Graphics2D gtd)
{
gtd.setColor(Color.RED);
gtd.fillRect(x,y,width,height);
}
}
设置游戏对象的游戏面板
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
public class GamePanel extends JPanel implements ActionListener {
Player player;
Timer gameTimer;
Bullet bullet;
public GamePanel(){
player = new Player(400,300,this);
bullet = new Bullet(player.x, player.y, this);
gameTimer = new Timer();
gameTimer.schedule(new TimerTask() {
@Override
public void run() {
player.set();
bullet.move();
repaint();
}
},100,15);
}
public void paint(Graphics g){
super.paint(g);
Graphics2D gtd = (Graphics2D) g;
player.draw(gtd);
bullet.draw(gtd);
}
void keyPressed(KeyEvent e)
{
if(e.getKeyChar()=='w')
player.keyUp=true;
if(e.getKeyChar()=='a')
player.keyLeft=true;
if(e.getKeyChar()=='s')
player.keyDown=true;
if(e.getKeyChar()=='d')
player.keyRight=true;
if(e.getKeyChar()=='t')
bullet.Shoot=true;
}
void keyReleased(KeyEvent e)
{
if(e.getKeyChar()=='w')
player.keyUp=false;
if(e.getKeyChar()=='a')
player.keyLeft=false;
if(e.getKeyChar()=='s')
player.keyDown=false;
if(e.getKeyChar()=='d')
player.keyRight=false;
if(e.getKeyChar()=='t')
bullet.Shoot=false;
}
@Override
public void actionPerformed(ActionEvent e) {
}
}
1条答案
按热度按时间6qftjkof1#
我想问题是你在打电话
bullet.move();
在你的生活中不断地计时GamePanel
班级。除此之外,我不完全确定您是如何获取键盘输入的。你的GamePanel
类包含一个KeyListener
通常会利用,但该类不实现KeyListener
,但是ActionListener
,代码中没有使用它。所以你应该做的是:
验证您的
keyPressed
及keyReleased
当按下键盘按钮时,函数实际上正在被调用,如果没有,您应该实现KeyListener
而不是ActionListener
在GamePanel
班确保
bullet.move();
只在应该的时候被调用,因为它当前在计时器的每次迭代中都被调用