gpt4 book ai didi

java - 如何在创建另一个项目符号对象时连续移动这些 'bullets'?

转载 作者:行者123 更新时间:2023-12-04 14:54:22 26 4
gpt4 key购买 nike

刚开始学习Java,最近学习了Timer类。我正在尝试将我目前学到的知识应用到制作这个项目中,其中一个宇宙飞船发射子弹。我的所有控件都可以正常工作,但是当我创建另一个项目符号对象时,我遇到了以前的项目符号 中途停止的问题。我从昨天开始就一直在搜索,但我似乎找不到合适的关键字。我想我明白为什么它会停止,但我怎样才能让子弹继续移动?

我在我的 JFrame 中添加了这个 GamePanel 类。

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

public class GamePanel extends JPanel implements KeyListener, ActionListener {

int panelWidth = 500;
int panelHeight = 500;

JLabel spaceship;
int shipWidth = 50;
int shipHeight = 50;
int shipX = 0;
int shipY = panelHeight - shipHeight; // BOTTOM of GamePanel
int shipXVelocity = 5;

JLabel bullet;
int bulletWidth = 10;
int bulletHeight = 25;
int bulletX;
int bulletY;
int bulleyYVelocity = 7;

boolean left,right = false;

Timer timer;

GamePanel() {

timer = new Timer(10,this);
timer.start();

this.setPreferredSize(new Dimension(panelWidth,panelHeight));
this.setLayout(null);
this.setBackground(Color.black);
this.setFocusable(true);
this.addKeyListener(this);

spaceship = new JLabel();
spaceship.setBounds(shipX, shipY, shipWidth, shipHeight);
spaceship.setBackground(Color.green);
spaceship.setOpaque(true);

this.add(spaceship);

}

void shoot() {

bulletX = shipX + (shipWidth / 2) - (bulletWidth / 2); // CENTER-TOP of spaceship
bulletY = shipY;

bullet = new JLabel();
bullet.setBounds(bulletX, bulletY, bulletWidth, bulletHeight);
bullet.setBackground(Color.white);
bullet.setOpaque(true);

this.add(bullet);

}

@Override
public void keyTyped(KeyEvent e) {

switch(e.getKeyChar()) {
case 'a' : left = true;
break;
case 'd' : right = true;
break;
}

}

@Override
public void keyPressed(KeyEvent e) {

switch(e.getKeyCode()) {
case 10 : shoot();
break;
}

}

@Override
public void keyReleased(KeyEvent e) {

switch(e.getKeyChar()) {
case 'a' : left = false;
break;
case 'd' : right = false;
break;
}

}

@Override
public void actionPerformed(ActionEvent e) {

if(left == true && shipX > 0) shipX -= shipXVelocity;
if(right == true && shipX < panelWidth - shipWidth) shipX += shipXVelocity;
spaceship.setLocation(shipX, shipY);

if(bullet != null) { // Move if a bullet exist
bulletY -= bulleyYVelocity;
bullet.setLocation(bulletX, bulletY);
}

if(bulletY < 0) this.remove(bullet);;

}

}

输出:

bullets stopping when I shoot another bullet

最佳答案

有两种可能的解决方案:

  1. 多线程:对于你发射的每一颗子弹,打开一个专门为这颗子弹工作的新计时器,直到子弹应该停止,比如当他击中某物时。
  2. 为所有项目符号创建一个列表:创建一个子弹列表,每次发射新子弹时将其添加到列表中而不覆盖以前的子弹。然后,在您的 actionPerformed 方法中运行并循环遍历整个列表,更新那里的每个项目符号并从列表中删除应该消失的项目符号。

我认为第二种解决方案更适合你的游戏,没有太多计算是他的物体移动。

关于java - 如何在创建另一个项目符号对象时连续移动这些 'bullets'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68387905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com