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

cu6pst1q  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(380)

我对java有点陌生。我想写一个简单的游戏,它有一个玩家和敌人,当你按一些键如“空格”时,玩家大多数会朝正确的方向射击,但我不知道如何在游戏中渲染子弹。事实上,它不会在游戏中出现,也不会移动。
射击系统

  1. package com.company;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. public class Bullet {
  5. GamePanel panel;//Game panel
  6. Rectangle hitBox;//Bullet
  7. public int x,y,width,height;
  8. boolean Shoot;
  9. public Bullet(int x , int y ,GamePanel panel)
  10. {
  11. this.panel = panel;
  12. this.x=x;
  13. this.y=y;
  14. height=15;
  15. width=15;
  16. hitBox = new Rectangle(x,y,width,height);
  17. }
  18. public void set()
  19. {
  20. if(Shoot) // where I have problem which Bullet doesn't move or doesn't appear
  21. move();
  22. }
  23. public void move()
  24. {
  25. x=x+10;
  26. }
  27. public void draw(Graphics2D gtd)
  28. {
  29. gtd.setColor(Color.RED);
  30. gtd.fillRect(x,y,width,height);
  31. }
  32. }

设置游戏对象的游戏面板

  1. package com.company;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.KeyEvent;
  7. import java.util.ArrayList;
  8. import java.util.Timer;
  9. import java.util.TimerTask;
  10. public class GamePanel extends JPanel implements ActionListener {
  11. Player player;
  12. Timer gameTimer;
  13. Bullet bullet;
  14. public GamePanel(){
  15. player = new Player(400,300,this);
  16. bullet = new Bullet(player.x, player.y, this);
  17. gameTimer = new Timer();
  18. gameTimer.schedule(new TimerTask() {
  19. @Override
  20. public void run() {
  21. player.set();
  22. bullet.move();
  23. repaint();
  24. }
  25. },100,15);
  26. }
  27. public void paint(Graphics g){
  28. super.paint(g);
  29. Graphics2D gtd = (Graphics2D) g;
  30. player.draw(gtd);
  31. bullet.draw(gtd);
  32. }
  33. void keyPressed(KeyEvent e)
  34. {
  35. if(e.getKeyChar()=='w')
  36. player.keyUp=true;
  37. if(e.getKeyChar()=='a')
  38. player.keyLeft=true;
  39. if(e.getKeyChar()=='s')
  40. player.keyDown=true;
  41. if(e.getKeyChar()=='d')
  42. player.keyRight=true;
  43. if(e.getKeyChar()=='t')
  44. bullet.Shoot=true;
  45. }
  46. void keyReleased(KeyEvent e)
  47. {
  48. if(e.getKeyChar()=='w')
  49. player.keyUp=false;
  50. if(e.getKeyChar()=='a')
  51. player.keyLeft=false;
  52. if(e.getKeyChar()=='s')
  53. player.keyDown=false;
  54. if(e.getKeyChar()=='d')
  55. player.keyRight=false;
  56. if(e.getKeyChar()=='t')
  57. bullet.Shoot=false;
  58. }
  59. @Override
  60. public void actionPerformed(ActionEvent e) {
  61. }
  62. }
6qftjkof

6qftjkof1#

我想问题是你在打电话 bullet.move(); 在你的生活中不断地计时 GamePanel 班级。除此之外,我不完全确定您是如何获取键盘输入的。你的 GamePanel 类包含一个 KeyListener 通常会利用,但该类不实现 KeyListener ,但是 ActionListener ,代码中没有使用它。
所以你应该做的是:
验证您的 keyPressedkeyReleased 当按下键盘按钮时,函数实际上正在被调用,如果没有,您应该实现 KeyListener 而不是 ActionListenerGamePanel
确保 bullet.move(); 只在应该的时候被调用,因为它当前在计时器的每次迭代中都被调用

相关问题