微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java - 如何实现与敌人的子弹碰撞?

如何解决Java - 如何实现与敌人的子弹碰撞?

我尝试用 Java 制作一个 2d 平铺游戏。

所以我有这个 Bullet 类和 Gun 类,它们在我按下鼠标左键时会发射子弹。多颗子弹相撞时如何让敌人消失?

我认为有很多子弹,假设有 5 颗子弹,在子弹与敌人碰撞 5 次后,我应该停止渲染敌人,但是如何实现与敌人的碰撞?

子弹基本上是一个球(filloval)。

子弹类

package Bunnyfights.Entities.Creatures;

import Bunnyfights.Entities.Entity;
import Bunnyfights.Handler;
import Bunnyfights.gfx.Assets;

import java.awt.*;

public class Bullet extends Entity {


    private Snake snake;
    private float dx,dy;
    private float xSpeed = 1.2f,ySpeed = 1.2f;
    private float speed = 1.5f;
    private boolean isDead;

    public Bullet(Handler handler,float x,float y,int width,int height,int dx,int dy) {
        super(handler,x,y,width,height);

        //destination x and y
        this.dx = dx;
        this.dy = dy;

        //distance from destination
        int distance = distanceFromDestination();

        //set x and y speed
        xSpeed = (dx-x)/distance * speed;
        ySpeed = (dy-y)/distance * speed;
    }

    @Override
    public void tick() {
      if(isDead)
          return;

      //move bullet
       x += xSpeed;
       y += ySpeed;

       //if distance from destination < 1 then,bullet dies
       if(distanceFromDestination() <= 1)
           isDead = true;

    }

    @Override
    public void render(Graphics g) {
        if(isDead)
            return;

        g.setColor(Color.RED);
        g.filloval((int)(x - handler.getGameCamera().getxOffset()),(int)(y - handler.getGameCamera().getyOffset()),height);
    }

    public boolean isDead(){
        return isDead;
    }

    private int distanceFromDestination(){
        int distance = (int) Math.sqrt(Math.pow(x - dx,2) + Math.pow(y - dy,2));

        return distance;
    }

}

代表开枪英雄的枪类

package Bunnyfights.Entities.Creatures;

import Bunnyfights.Entities.Entity;
import Bunnyfights.Handler;

import java.awt.*;
import java.util.ArrayList;

public class Gun extends Entity {

    private ArrayList<Bullet> bullets;
    private int bulletWidth = 25,bulletHeight = 25;

    private int fireCoolDown = 30;//player can fire after every 80 ticks
    private int timer;
    private boolean canFire;

    public Gun(Handler handler,float y) {
        super(handler,0);

        bullets = new ArrayList<Bullet>();
    }

    @Override
    public void tick() {

        //counting fire cool down time,if cannot fire
        if(!canFire) {
            timer++;
            if (timer >= fireCoolDown) {
                timer = 0;
                canFire = true;
            }
        }
        for(Bullet bullet : bullets)
            bullet.tick();

        //remove dead bullets
        for(int i = bullets.size() - 1; i >= 0; i--)
            if(bullets.get(i).isDead())
                bullets.remove(i);
    }

    @Override
    public void render(Graphics g) {
    for(Bullet bullet : bullets)
        bullet.render(g);
    }

    public void fire(float x,int dy){
        if(!canFire)
            return;

        Bullet b = new Bullet(handler,bulletWidth,bulletHeight,dx,dy);
        bullets.add(b);
        canFire = false;
    }
}

敌人类(蛇)

package Bunnyfights.Entities.Creatures;

import Bunnyfights.Handler;
import Bunnyfights.States.GameState;
import Bunnyfights.Tiles.Tile;
import Bunnyfights.gfx.Assets;

import javax.sql.rowset.spi.XmlReader;
import java.awt.*;
import java.awt.image.BufferedImage;

public class Snake extends Creature {

    private BufferedImage image;
    public Snake(Handler handler,DEFAULT_CREATURE_WIDTH,DEFAULT_CREATURE_HEIGHT);

    }

    @Override
    public void tick() {
       move();
      //  handler.getGameCamera().centerOnEntity(this);

    }

    @Override
    public void render(Graphics g) {

            g.drawImage(image,(int) (x - handler.getGameCamera().getxOffset()),(int) (y - handler.getGameCamera().getyOffset()),height,null);
    }

    public void movetoPlayer(Player player) {
        float deltaX = player.getX() - this.getX();
        float deltaY = player.getY() - this.getY();
        float hyp = (float) Math.sqrt(deltaX*deltaX + deltaY*deltaY);

        deltaX /= hyp;
        deltaY /= hyp;

        this.setxMove(deltaX * speed);
        this.setyMove(deltaY * speed);
    }

    public void rotateSnake(Player player) {

        if (((player.getX() < (this.getX()+50)) && (player.getX() > (this.getX()-50))) && player.getY() > this.getY()) {
            image = Assets.snakeFace;
        }
        else if (player.getX() > (this.getX()+50)) {
            image = Assets.snakeRight;
        }
        else {
            image = Assets.snakeLeft;
        }

        if (((player.getX() < (this.getX()+50)) && (player.getX() > (this.getX()-50))) && player.getY() < this.getY()) {
            image = Assets.snakeBack;
        }
    }

    public void snakePlayerRelation(Player player) {
        tick();
        movetoPlayer(player);
        rotateSnake(player);
    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。