简体   繁体   English

编写太空入侵者代码,无法获得子弹来摧毁外星人

[英]Writing space invaders code, can't get bullets to destroy aliens

I apologize in advance for this question potentially taking some effort to solve. 对于这个问题,我事先表示歉意,可能需要付出一些努力才能解决。 This is a group project I've been working on for a while so the scripts are a bit complicated, and me and the two others I'm working with are all total beginners to java. 这是一个我已经工作了一段时间的小组项目,因此脚本有点复杂,我和我正在使用的另外两个脚本都是Java的初学者。 Unfortunately my problem is that I don't know what the problem is, so my question is a bit vague. 不幸的是,我的问题是我不知道问题是什么,所以我的问题有点含糊。 I'll do my best to show you the relevant bits of code and any help indicating what might be the problem would be greatly appreciated :) 我会尽力向您展示代码的相关部分,任何表示问题的帮助将不胜感激:)

This class, SpriteAlien, creates an alien and has the methods which define the alien's movement. SpriteAlien此类创建外星人,并具有定义外星人运动的方法。

import javax.swing.JPanel;

public class SpriteAlien extends JPanel{

    public int hPosAlien; // alien's horizontal coordinate
    public int vPosAlien; // alien's vertical coordinate

    public int hPosBullet, vPosBullet;


    public int life; // aliens life, some may have more than one

    int dx = 1; // number of pixels the alien moves horizontally every timer cycle
    int dy = 10; // number of pixels the alien moves down when it hits the boundary
    boolean direction = true; // false - left, true - right
    boolean shoot, defeated = false;

    // constructor
    public SpriteAlien (int horizontalPos, int verticalPos){
        hPosAlien = horizontalPos;
        vPosAlien = verticalPos;
    }


    public void moveAlien()
    {   
        //This creates the alien's movement

        // if the alien has not reached the right wall and is moving right
        if ((hPosAlien <= 740) && (direction == true)) { 
            moveRight();
        }

        // if the alien has reached the right wall and is moving right
        else if ((hPosAlien >= 740) && (direction == true)) { 
            moveDown();
            moveLeft();
            direction = false;
        }

        // if the alien has not reached the right wall and is moving left
        else if ((hPosAlien <= 740) && (hPosAlien >= 0) && (direction == false)) {
            moveLeft();
        }

        // if the alien has reached the left wall and is moving left
        else if ((hPosAlien < 0) && (direction == false)) {
            moveDown();
            moveRight();
            direction = true;
        }           
    }

    // methods used for alien movement
    void moveLeft() {
        hPosAlien -= dx;
    }

    void moveRight() {
        hPosAlien += dx;
    }

    void moveDown() {
        vPosAlien += dy;
    }
}

This class, SpriteArray, creates an array of aliens that move together like a formation 此类SpriteArray创建了一系列外星人,它们像队形一样一起移动

// create an array of aliens to make our alien army public class SpriteArray extends Random{ //创建一个外星人数组,使我们的外星人军队公共类SpriteArray扩展Random {

SpriteAlien[] alienArmy = new SpriteAlien[10]; // an array of alien objects
    int index; // index of the array 
    int x, y; // coordinates of the alien

    // constructor
    SpriteArray(){
        // nested loop to position aliens like 2 dimensional arrays on the screen
        for(int i = 0; i < 2; i++){
            for(int j = 0; j < 5; j++)
            {
                index = i*5 + j; // (0*1 + 0) (0*1 + 1) etc

                x = j*120 + 100; // each column is 120 pixels apart
                y = i*80 + 100; // each row is 80 pixels apart 

                alienArmy[index] = new SpriteAlien(x, y);

            }
        }
    }

This is the main class involved, Sprite, and the one most likely to have the error because this is where I've written the code that fires bullets and is supposed to make the aliens get destroyed. 这是所涉及的主要类Sprite,也是最有可能发生错误的类,因为这是我编写了发射子弹并应该使外星人被摧毁的代码的地方。 I'm aware that this piece of code is annoyingly long, so to make it easier I've put 'LOOK HERE LOOK HERE' as a comment just before the most relevant bit :P 我知道这段代码很烦人,所以为了使其更容易,我在最相关的位置:P之前加了“ LOOK HERE LOOK HERE”作为注释。

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import java.util.TimerTask;

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class Sprite extends JPanel implements ActionListener{

    // GAME ANIMATION
    public int hPosShooter; // shooter's horizontal coordinate
    public int vPosShooter; // shooter's vertical coordinate
    public int hPosBullet; // bullet's horizontal coordinate
    public int vPosBullet = 490; // bullet's vertical coordinate
    public int movementSpeed; // shooter's speed(describe shooter movement)
    public Timer loopTime = new Timer(9, this); // used to loop through movements and repaint
    public Timer generateBullet;
    public boolean started = false; // whether or not the game has started
    public boolean fired = false; // whether or not a shot should exist
    public int numberEnemies = 1; // with more enemies this will need to be edited
    public boolean[] destroyed = new boolean[10]; //Array of boolean variables that tell whether or not the alien with the matching index has been destroyed

    public int shootingIndex;

    // display text information
    PlayerInfo pInfo = new PlayerInfo();
    JLabel scoreLabel = new JLabel("score: " + Integer.toString(pInfo.getPlayerScore()));
    JLabel lifeLabel = new JLabel("lives: " + Integer.toString(pInfo.getPlayerLives()));

    // LOAD IMAGES
    String imageNameShooter; //The shooter
    String imageNameAlien; //The alien
    String imageNameBarrier; //The barrier

    protected BufferedImage imageShooter;
    protected BufferedImage imageAlien;
    protected BufferedImage imageBarrier;


    SpriteArray enemies = new SpriteArray();



//  SpriteBarrier barrier1 = new SpriteBarrier(400, 400);
    SpriteBarrierArray barrier1 = new SpriteBarrierArray(160, 360);
    SpriteBarrierArray barrier2 = new SpriteBarrierArray(360, 360);
    SpriteBarrierArray barrier3 = new SpriteBarrierArray(560, 360);

//  int shootingIndex = enemies.AlienShoot();


    public Sprite (String imageNameShooter, String imageNameAlien, String imageNameBarrier){
        try {
            imageShooter = ImageIO.read(new File(imageNameShooter));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            imageAlien = ImageIO.read(new File(imageNameAlien));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            imageBarrier = ImageIO.read(new File(imageNameBarrier));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        scoreLabel.setHorizontalTextPosition(JLabel.RIGHT);
        lifeLabel.setHorizontalTextPosition(JLabel.LEFT);
        add(scoreLabel);
        add(lifeLabel);
    }

    public static void SpriteImage(JFrame frame, JPanel panel) throws IOException
    {          
        frame.add(panel);
    }

    // PAINT SPRITE
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(imageShooter, hPosShooter, vPosShooter, null); //Draws the shooter in the correct position

        //Draws bullet
        if (fired)
        {
            g.fillRect (hPosBullet, vPosBullet, 8, 12);
        }

        //Draws the aliens
        for(int i = 0; i < 10 ; i++ ){
            g.drawImage(imageAlien, enemies.alienArmy[i].hPosAlien, enemies.alienArmy[i].vPosAlien, null);
            if(destroyed[i] == false)
            {
                g.fillRect (enemies.alienArmy[i].hPosBullet, enemies.alienArmy[i].vPosBullet, 8, 12);
            }
        }

        //Draw the Barriers
        for(int i = 0; i < 12 ; i++ ){
            g.drawImage(imageBarrier, barrier1.barrier[i].hPosBarrier, barrier1.barrier[i].vPosBarrier, null);
            g.drawImage(imageBarrier, barrier2.barrier[i].hPosBarrier, barrier2.barrier[i].vPosBarrier, null);
            g.drawImage(imageBarrier, barrier3.barrier[i].hPosBarrier, barrier3.barrier[i].vPosBarrier, null);
        }

        loopTime.start(); // refreshes the image to make animation work
    }


    //Makes the enemies drop missiles
    void enemyAttack() {

        generateBullet = new Timer(1000, new ActionListener() {
            public void actionPerformed(ActionEvent e){
                shootingIndex = enemies.AlienShoot();
            }
        });
        generateBullet.start();
    }

    //SHOOTER MOVEMENT MECHANICS
    public void actionPerformed(ActionEvent e)
    {   
        //Conditional only allows movement once game has started
        if (started)
        {
            //This only allows movement to the right if the right border hasn't been reached
            if (hPosShooter < 733 && movementSpeed > 0)
            {
                hPosShooter = hPosShooter + movementSpeed;
            }
            //This only allows movement to the left if the left border hasn't been reached
            if (hPosShooter > 0 && movementSpeed < 0)
            {
                hPosShooter = hPosShooter + movementSpeed;
            }

        }

        //FIRE!! LOOK HERE LOOK HERE LOOK HERE!!!!!
        if (fired)
        {
            vPosBullet = vPosBullet - 6; //Bullet moves upwards
            //If alien is hit... it (SHOULD) be destroyed!
            for(int i = 0; i < 10 ; i++ ){
                if (!(destroyed[i]))
                {
                    if (vPosBullet == (enemies.alienArmy[i].vPosAlien + 20) && hPosBullet > enemies.alienArmy[i].hPosAlien && hPosBullet < (enemies.alienArmy[i].hPosAlien + 50))
                    {
                        destroyed[i] = true;
                        repaint();
                        fired = false;
                        vPosBullet = 490;
                    }
                }
            }
            for(int i=0; i<12; i++)
            {
                if (vPosBullet == barrier3.barrier[i].vPosBarrier && hPosBullet > barrier3.barrier[i].hPosBarrier && hPosBullet < (barrier3.barrier[i].hPosBarrier + 20))
                {
                    fired = false;
                    vPosBullet = 490;
                }
                if (vPosBullet == barrier2.barrier[i].vPosBarrier && hPosBullet > barrier2.barrier[i].hPosBarrier && hPosBullet < (barrier2.barrier[i].hPosBarrier + 20))
                {
                    fired = false;
                    vPosBullet = 490;
                }
                if (vPosBullet == barrier1.barrier[i].vPosBarrier && hPosBullet > barrier1.barrier[i].hPosBarrier && hPosBullet < (barrier1.barrier[i].hPosBarrier + 20))
                {
                    fired = false;
                    vPosBullet = 490;
                }
            }
        }
        //OKAY THE IMPORTANT BIT'S OVER NOW!!!

        //When bullet reaches top of screen 'fired' = false
        if (vPosBullet < 0)
        {
            fired = false;
            vPosBullet = 490;
        }

        //This bit of makes the aliens shoot missiles at the user's 'shooter'
        for(int j = 0; j < 10 ; j++ ){
            enemies.alienArmy[j].moveAlien();
            if(enemies.alienArmy[j].shoot == true)
            {
                if(enemies.alienArmy[j].vPosBullet > 600)
                {
                    enemies.alienArmy[j].shoot = false;
                }
                else
                {
                    enemies.alienArmy[j].vPosBullet += 2;
                }

            }
        }


        //The position is then reset
        repaint();
    }
}

Thank you so much for any help you can provide! 非常感谢您提供的任何帮助!

I am not sure but 我不确定

if (vPosBullet == (enemies.alienArmy[i].vPosAlien + 20) && hPosBullet > enemies.alienArmy[i].hPosAlien && hPosBullet < (enemies.alienArmy[i].hPosAlien + 50))

There in first test 在第一次测试中

vPosBullet == (enemies.alienArmy[i].vPosAlien + 20)

I am not sure this coords will be exact this, there should be lower than and greater than maybe. 我不确定这个坐标是否准确,应该小于或大于。

because of this: 因为这:

vPosBullet = vPosBullet - 6; //Bullet moves upwards

Maybe not soulution but you code is so long ;P 也许不是解决方案,但是您的代码太长了; P

EDIT: 编辑:

As @user3659404 said in comment, update the if statement to: 正如@ user3659404在评论中所说,将if语句更新为:

if (vPosBullet < (enemies.alienArmy[i].vPosAlien + 20) && vPosBullet > enemies.alienArmy[i].vPosAlien && hPosBullet > enemies.alienArmy[i].hPosAlien && hPosBullet < (enemies.alienArmy[i].hPosAlien + 50))

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

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