无法弄清楚为什么我的一个敌人的碰撞检测不起作用

时间:2013-11-05 15:58:05

标签: java collision

我有一个侧滚动游戏,我在游戏中有4个敌人。无论我射入多少子弹,其中一个敌人都不会死亡。前两个敌人的代码完全相同,我无法弄清楚为什么它不起作用。

董事会成员:

package knowlesm.main;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Board extends JPanel implements ActionListener, Runnable {
    Character p;
    Image img;
    Timer time;
    Thread animator;
    Enemy en, en2, en3, en4;
    Ammo a1;
    int v = 72;
    boolean lost = false;

    static Font font = new Font("SansSerif", Font.BOLD, 24);

    public Board() {

        p = new Character();
        addKeyListener(new AL());
        setFocusable(true);
        ImageIcon i = new ImageIcon("res/background.png");
        img = i.getImage();
        time = new Timer(5, this);
        time.start();
        en = new Enemy(700, 200, "res/enemy_1.png");
        en2 = new Enemy(700, 200, "res/enemy_1.png");
        en3 = new Enemy(700, 200, "res/enemy_1.png");
        en4 = new Enemy(700, 200, "res/enemy_1.png");
        a1 = new Ammo(700, 200, "res/ammo.png");

    }

    public void actionPerformed(ActionEvent e) {
        System.out.println(p.x);
        try{
        checkCollisions();  
        } catch (Exception error){
            System.out.println("Can't make rectangle probably");
        }

        ArrayList bullets = Character.getBullets();
        for (int w = 0; w < bullets.size(); w++) {
            Bullet m = (Bullet) bullets.get(w);
            if (m.getVisible() == true)
                m.move();
            else
                bullets.remove(w);
        }
        p.Move();
        if (p.x > 400)
            en.move(p.getdx(), p.getLeft());
        if (p.x > 600) {
            en2.move(p.getdx(), p.getLeft());
        }
        if (p.x > 1800)
            en3.move(p.getdx(), p.getLeft());
        if (p.x > 2000) {
            en4.move(p.getdx(), p.getLeft());
        }
        if (p.x > 1200) {
            a1.move(p.getdx(), p.getLeft());
        }

        repaint();
    }

    private void checkCollisions() {
        Rectangle r1 = en.getBounds();
        Rectangle r2 = en2.getBounds();
        Rectangle r3 = a1.getBounds();
        Rectangle r4 = en3.getBounds();
        Rectangle r5 = en4.getBounds();

        ArrayList bullets = Character.getBullets();
        for (int w = 0; w < bullets.size(); w++) {
            Bullet m = (Bullet) bullets.get(w);
            Rectangle m1 = m.getBounds();
            if (r1.intersects(m1) && en.isAlive) {
                en.isAlive = false;
                m.visible = false;
            }  if (r2.intersects(m1) && en2.isAlive) {
                en2.isAlive = false;
                m.visible = false;
            }  if (r4.intersects(m1) && en2.isAlive) {
                en3.isAlive = false;
                m.visible = false;
            }  if (r5.intersects(m1) && en2.isAlive) {
                en4.isAlive = false;
                m.visible = false;
            } 
        }

        Rectangle d = p.getBounds();

        if ((d.intersects(r1) && en.isAlive() == true)
                || (d.intersects(r2) && en2.isAlive() == true)
                    || (d.intersects(r4) && en3.isAlive() == true)
                        || (d.intersects(r5) && en4.isAlive() == true)){
            lost = true;
        }   
        if (d.intersects(r3)){
            a1.isThere = false;
            p.ammo = 10;
        }
    }

    boolean k = false;

    public void paint(Graphics g) {
        if (lost)
            System.exit(0);
        if (p.dy == 1 && k == false) {
            k = true;
            animator = new Thread(this);
            animator.start();
        }
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;

        if ((p.GetX() - 590) % 2400 == 0)
            p.nx = 0;
        if ((p.GetX() - 1790) % 2400 == 0)
            p.nx2 = 0;
        g2d.drawImage(img, 685 - p.nx2, 0, null);
        if (p.GetX() >= 590)
            g2d.drawImage(img, 685 - p.nx, 0, null);
        g2d.drawImage(p.getImage(), p.left, v, null);

        ArrayList bullets = Character.getBullets();
        for (int w = 0; w < bullets.size(); w++) {
            Bullet m = (Bullet) bullets.get(w);
            g2d.drawImage(m.getImage(), m.getX(), m.getY(), null);
        }
        g2d.setFont(font);
        g2d.setColor(Color.BLUE);
        g2d.drawString("Ammo left " + p.ammo, 500, 20);
        if (p.x > 400) {
            if (en.isAlive == true)
                g2d.drawImage(en.getImage(), en.getX(), en.getY(), null);
        }
        if (p.x > 600) {
            if (en2.isAlive == true)
                g2d.drawImage(en2.getImage(), en2.getX(), en2.getY(), null);
        }
        if (p.x > 1800){
            if(en3.isAlive == true){
                g2d.drawImage(en3.getImage(), en3.getX(), en3.getY(), null);
            }
        }
        if (p.x > 1800){
            if(en4.isAlive == true){
                g2d.drawImage(en3.getImage(), en3.getX(), en3.getY(), null);
            }
        }
        if (p.x > 1200) {
            if (a1.isThere == true) {
                g2d.drawImage(a1.getImage(), a1.getX(), a1.getY(), null);
            }
        }

    }

    private class AL extends KeyAdapter {
        public void keyReleased(KeyEvent e) {
            p.KeyReleased(e);
        }

        public void keyPressed(KeyEvent e) {
            p.KeyPressed(e);
        }
    }

    public void run() {
        long beforeTime, timeDiff, sleep;

        beforeTime = System.currentTimeMillis();
        while (done == false) {
            cycle();
            timeDiff = System.currentTimeMillis() - beforeTime;
            sleep = 10 - timeDiff;
            if (sleep < 0)
                sleep = 2;
            try {
                Thread.sleep(sleep);
            } catch (Exception e) {
            }
            beforeTime = System.currentTimeMillis();
        }
        done = false;
        h = false;
        k = false;

    }

    boolean done = false;
    boolean h = false;

    public void cycle() {
        if (h == false)
            v--;
        if (v == -10)
            h = true;
        if (h == true && v < 72)
            v++;
        if (v == 72)
            done = true;
    }

}

弹药课:

package knowlesm.main;

import java.awt.Image;
import java.awt.Rectangle;

import javax.swing.ImageIcon;
import java.awt.*;
public class Ammo {

    int x, y;
    boolean isThere = true;
    Image img;

    public Ammo(int startX, int startY, String Location) {
        x = startX;
        y = startY;
        ImageIcon ammo = new ImageIcon(Location);
        img = ammo.getImage();
    }

    public void move(int dx, int left)
    {
            if (dx == 1 && !((left + dx )< 150))//Added this to only move enemy when character moves forward (not back)
            x = x - dx;
    }

    public Rectangle getBounds() {
        return new Rectangle(x, y, 100, 100);
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public boolean isThere() {
        return isThere;
    }

    public Image getImage(){
        return img;
    }
}

Bullet类:

package knowlesm.main;

import java.awt.Image;
import java.awt.Rectangle;

import javax.swing.ImageIcon;

public class Bullet {
    int x, y;
    Image img;
    boolean visible;

    public Bullet(int startX, int startY) {
        x = startX;
        y = startY;
        ImageIcon newBullet = new ImageIcon("res/bullet.png");
        img = newBullet.getImage();
        visible = true;
    }

    public Rectangle getBounds(){
        return new Rectangle(x, y, 20, 20);
    }

    public int getX(){
        return x;
    }

    public int getY(){
        return y;
    }

    public boolean getVisible(){
        return visible;
    }

    public Image getImage(){
        return img;
    }
    public void move(){
        x += 4;
        if ( x > 750) 
            visible = false;
    }
}

角色等级:

package knowlesm.main;

import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.util.ArrayList;

import javax.swing.ImageIcon;

public class Character {
    int x, dx, y, nx, nx2, left, dy;
    Image still;
    ImageIcon i_left = new ImageIcon("res/character_left.png");
    ImageIcon i = new ImageIcon("res/character.png");
    ImageIcon i2 = new ImageIcon("res/character_1.png");
    ImageIcon i_jump = new ImageIcon("res/character_jump.png");
    int ammo = 10;

    static ArrayList bullets;

    public Character() {
        still = i.getImage();
        x = 75;
        y = 72;
        nx2 = 685;
        nx = 0;
        left = 150;
        bullets = new ArrayList();
    }

    public static ArrayList getBullets(){
        return bullets;
    }

    public void fire(){
        if ( ammo > 0){
            ammo--;
        Bullet z = new Bullet((left + 150), (y + 365 / 2));
        bullets.add(z);
        }
    }

    public void Move() {
        if (dx != -1) {
            if (left + dx <= 150) {
                left = left + dx;
            } else {
                x += dx;
                nx2 += dx;
                nx += dx;
            }
        } else {
            if ( left + dx > 0)
                left = left + dx;
        }
    }

    public Rectangle getBounds(){
        return new Rectangle(left, y, 150, 365);
    }

    public int getLeft(){
        return left;
    }

    public int GetX() {
        return x;
    }

    public int GetY() {
        return y;
    }

    public Image getImage() {
        return still;
    }

    public int getdx(){
        return dx;
    }

    public int getnx(){
        return nx;
    }

    public int getnx2(){
        return nx2;
    }

    public int ammo(){
        return ammo;
    }

    int w = 0;
    boolean walking = false;

    public void KeyPressed(KeyEvent e) {
        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT || key == KeyEvent.VK_A) {
            dx = -1;
            still = i_left.getImage();
        }
        if (key == KeyEvent.VK_RIGHT || key == KeyEvent.VK_D) {
            boolean walking = true;
            if(walking){
                w++;
                if(w % 2 == 0){
                    still = i2.getImage();
                } else {
                    still = i.getImage();
                }
            }
            dx = 1;
        }
        if (key == KeyEvent.VK_UP || key == KeyEvent.VK_W || key == KeyEvent.VK_SPACE){
            dy = 1;
            still = i_jump.getImage();
        }
        if (key == KeyEvent.VK_F){
            fire();
        }
    }

    public void KeyReleased(KeyEvent e) {
        int key = e.getKeyCode();

        if (key == KeyEvent.VK_LEFT || key == KeyEvent.VK_A)
            dx = 0;
        if (key == KeyEvent.VK_RIGHT || key == KeyEvent.VK_D)
            dx = 0;
            walking = false;
            w = 0;
        if (key == KeyEvent.VK_UP || key == KeyEvent.VK_W || key == KeyEvent.VK_SPACE)
            dy = 0;
            still = i.getImage(); 
    }
}

敌人类:

package knowlesm.main;

import java.awt.Image;
import java.awt.*;
import java.awt.Rectangle;

import javax.swing.ImageIcon;

public class Enemy {

    Image img;
    int x, y;
    boolean isAlive = true;

    public Enemy(int startX, int startY, String location){
        x = startX;
        y = startY;
        ImageIcon e = new ImageIcon(location);
        img = e.getImage();
    }

    public Rectangle getBounds(){
        return new Rectangle(x, y, 107, 100);
    }

    public int getX(){
        return x;
    }

    public int getY(){
        return y;
    }

    public boolean isAlive(){
        return isAlive;
    }

    public Image getImage(){
        return img;
    }

    public void move(int dx, int left)
    {
            if (dx == 1 && !((left + dx )< 150))//Added this to only move enemy when character moves forward (not back)
            x = x - dx;
    }
}

框架类:

package knowlesm.main;

import java.io.File;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.JFrame;

public class Frame {

    public static void main (String args[]){
        JFrame frame = new JFrame("2D Game");
        frame.add(new Board());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(700, 365);
        frame.setVisible(true);
        playSound();
    }

    public static void playSound(){
        try{
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("res/02-buckboard-chase.wav").getAbsoluteFile());
            Clip clip = AudioSystem.getClip();
            clip.open(audioInputStream);
            clip.start();
        }catch(Exception ex){
            System.out.println("Error with playing sound.");
            ex.printStackTrace();
        }
    }
}

碰撞检测在板类中。为什么它不适用于所有敌人类型?

1 个答案:

答案 0 :(得分:3)

        if (r1.intersects(m1) && en.isAlive) {
            en.isAlive = false;
            m.visible = false;
        }  if (r2.intersects(m1) && en2.isAlive) {
            en2.isAlive = false;
            m.visible = false;
        }  if (r4.intersects(m1) && en2.isAlive) {
            en3.isAlive = false;
            m.visible = false;
        }  if (r5.intersects(m1) && en2.isAlive) {
            en4.isAlive = false;
            m.visible = false;
        } 

你总是检查en2是否存活,但是你应该检查en3或en4是否还活着。