太空入侵者外星阵列问题-Java
我正在为一个大学作业开发一个太空入侵者应用程序,我遇到了一个问题,当外星人撞到墙上时,他们会一个接一个地改变方向,而不是当任何外星人碰到边界时,所有的物体都会改变方向。我觉得这是我的for循环中的一个问题,我的move方法包含reverseDirection()方法分别作用于每个元素,但我不知道如何解决这个问题,任何帮助都将不胜感激。这是我给你的密码太空入侵者外星阵列问题-Java,java,arrays,physics,game-development,Java,Arrays,Physics,Game Development,我正在为一个大学作业开发一个太空入侵者应用程序,我遇到了一个问题,当外星人撞到墙上时,他们会一个接一个地改变方向,而不是当任何外星人碰到边界时,所有的物体都会改变方向。我觉得这是我的for循环中的一个问题,我的move方法包含reverseDirection()方法分别作用于每个元素,但我不知道如何解决这个问题,任何帮助都将不胜感激。这是我给你的密码 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphic
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.*;
public class InvadersApplication extends JFrame implements Runnable {//, KeyListener {
private static final Dimension WindowSize = new Dimension(800, 600);
private static final int NUMALIENS = 16;
private Alien AliensArray[] = new Alien[NUMALIENS];
private Image alienImage;
private Image playerImage;
private String workingDirectory = "C:\\Users\\brads\\IdeaProjects\\Assignment3\\src\\workingDirectory\\";
private Player playerShip;
private BufferStrategy strategy;
public InvadersApplication() {
System.out.println(System.getProperty("user.dir"));
setDefaultCloseOperation(EXIT_ON_CLOSE);
Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
int x = screenSize.width / 2 - WindowSize.width / 2;
int y = screenSize.height / 2 - WindowSize.height / 2;
setBounds(x, y, WindowSize.width, WindowSize.height);
this.setTitle("Alien Invaders App");
ImageIcon playerIcon = new ImageIcon(workingDirectory + "player_ship.png");
playerImage = playerIcon.getImage();
ImageIcon alienIcon = new ImageIcon(workingDirectory + "alien_ship_1.png");
alienImage = alienIcon.getImage();
playerShip = new Player(playerImage);
// addKeyListener(this);
setVisible(true);
createBufferStrategy(2);
strategy = getBufferStrategy();
for (int i = 0; i < NUMALIENS; i++) {
AliensArray[i] = new Alien(alienImage);
AliensArray[i].setPosition(70 * (i%4), 70 * (i/4));
AliensArray[i].setXspeed(1);
}
Thread thread1 = new Thread(this);
thread1.start();
repaint();
}
@Override
public void run(){
while(true){
try{
for(int i = 0; i < NUMALIENS; i++) {
AliensArray[i].move();
}
repaint();
Thread.sleep(5);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/* public void keyPressed(KeyEvent e) {
int KeyCode = e.getKeyCode();
if (KeyCode == KeyEvent.VK_LEFT) {
playerShip.movePlayer(-8);
} else if (KeyCode == KeyEvent.VK_RIGHT) {
playerShip.movePlayer(8);
}
}
*/
public void keyReleased(KeyEvent e){
}
public void keyTyped(KeyEvent e){}
public void paint(Graphics g){
g = strategy.getDrawGraphics();
g.setColor(Color.BLACK);
g.fillRect(0,0,800,600);
for(int i=0; i < NUMALIENS; i++){
AliensArray[i].paint(g);
}
// playerShip.paint(g);
//playerShip.paintPlayer(g);
strategy.show();
this.repaint();
}
public static void main(String[] args){
InvadersApplication x = new InvadersApplication();
}
}
sprite2D的外来亚类
import java.awt.*;
import java.util.Random;
import javax.swing.*;
public class Alien extends Sprite2D {
private int xi;
private int xj;
public Alien(Image myImage) {
super(myImage);
this.myImage = myImage;
this.x = x;
this.y = y;
this.xi = xi;
this.xj = xj;
}
// @Override
// public void setPosition(int xx, int yy){
// xx = x;
// yy = y;
//
// }
public void move() {
y+=xj;
x+= xi;
if(x >= 750) {
reverseDirection();
x = x + xi;
}
else if (x < 0)
{
reverseDirection();
x = x + xi;
}
}
public void setXspeed(int xi) {
this.xi = xi;
}
public void setYspeed(int xj) {
this.xj = xj;
}
public void reverseDirection() {
xi = -xi;
System.out.println("reverse");
}
// @Override
// public void paint(Graphics g) {
//
//
// g.drawImage(myImage, xx, yy, null);
// }
}
import java.awt.*;
导入java.util.Random;
导入javax.swing.*;
公共类Sprite2D{
私有国际席;
私人int xj;
公共外星人(图片myImage){
超级(myImage);
this.myImage=myImage;
这个.x=x;
这个。y=y;
这是X==席;
这个.xj=xj;
}
//@覆盖
//公共无效设置位置(整数xx,整数yy){
//xx=x;
//yy=y;
//
// }
公开作废动议(){
y+=xj;
x+=席;
如果(x>=750){
逆向();
x= x+席;
}
else如果(x<0)
{
逆向();
x= x+席;
}
}
公共void setXspeed(int xi){
这是X==席;
}
公共无效设置速度(int xj){
这个.xj=xj;
}
公共void reverseDirection(){
席=席;
系统输出打印项次(“反向”);
}
//@覆盖
//公共空间涂料(图g){
//
//
//g.drawImage(myImage,xx,yy,null);
// }
}
您正在检查它们是否达到了单独反转它们的条件,而不是检查数组中是否有任何Alien
符合条件,然后同时对整个数组调用reverseDirection()
。您需要与整个阵列进行通信,告知至少一个外星人的方向已更改。有几种不同的方法可以做到这一点。非常感谢您的回复。我觉得自己真的很愚蠢,因为我意识到了这样一个问题,即他们是单独行动的,而不是作为一个整体,但我就是想不出一种方法,让他们在满足条件的情况下都行动起来。我正在考虑在for循环中使用for循环,这样如果aliensArray[I]满足条件,那么for(int I=0;Iimport java.awt.*;
import java.util.Random;
import javax.swing.*;
public class Alien extends Sprite2D {
private int xi;
private int xj;
public Alien(Image myImage) {
super(myImage);
this.myImage = myImage;
this.x = x;
this.y = y;
this.xi = xi;
this.xj = xj;
}
// @Override
// public void setPosition(int xx, int yy){
// xx = x;
// yy = y;
//
// }
public void move() {
y+=xj;
x+= xi;
if(x >= 750) {
reverseDirection();
x = x + xi;
}
else if (x < 0)
{
reverseDirection();
x = x + xi;
}
}
public void setXspeed(int xi) {
this.xi = xi;
}
public void setYspeed(int xj) {
this.xj = xj;
}
public void reverseDirection() {
xi = -xi;
System.out.println("reverse");
}
// @Override
// public void paint(Graphics g) {
//
//
// g.drawImage(myImage, xx, yy, null);
// }
}