繁体   English   中英

Java游戏:在一个简单的游戏中射击子弹

[英]Java game: shooting bullets in a simple game

我是 java.im 的新手,试图编写一个简单的游戏,它有一个玩家和敌人,当你按下“空格”之类的一些键时,玩家最多会朝正确的方向发射子弹,但我不知道如何在游戏中渲染子弹。 实际上它不会出现,也不会在游戏中移动。

射击系统

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) {

    }
}

我认为问题在于您正在调用bullet.move(); 在您的GamePanel类的 Timer 中连续。 除此之外,我不完全确定您如何获取键盘输入。 您的GamePanel类包含KeyListener通常会使用的方法,但该类没有实现KeyListener ,而是实现了ActionListener ,它没有在您的代码中使用。

所以你应该做的是:

  • 验证您的keyPressedkeyReleased函数是否在按下键盘按钮时被实际调用,如果没有,您应该在GamePanel类中实现KeyListener而不是ActionListener
  • 确保bullet.move(); 只在应该调用的时候被调用,因为它当前在你的计时器的每次迭代中被调用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM