问题描述
我尝试用 Java 制作一个 2d 平铺游戏。
所以我有这个 Bullet 类和 Gun 类,它们在我按下鼠标左键时会发射子弹。多颗子弹相撞时如何让敌人消失?
我认为有很多子弹,假设有 5 颗子弹,在子弹与敌人碰撞 5 次后,我应该停止渲染敌人,但是如何实现与敌人的碰撞?
子弹类
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 (将#修改为@)