好的,所以我在课堂上和在线教程之后,几周都在尝试java。我做了一个简单的游戏,其中正方形落在屏幕的底部,而玩家控制一个小球,只在x轴上移动并试图避开它们。
我遇到的问题是方块开始下降得太快。现在我把它们设置如下:
ix = 0;
iy = 1;
然后在我的move()方法中,我有以下内容:
hitbox.x += ix;
hitbox.y += iy;
在这个例子中,ix和iy都是整数。
我的第一个假设是将整数更改为浮点数,然后使用:
ix= 0;
iy = 0.5;
然后:
hitbox.x += ix;
hitbox.y += 0.5f;
但这只会冻结他们追踪的物体。我相信这是因为绳索被视为整数,所以我想如果我修改了我的getX()和getY()方法,也许我可以用某种方式操纵它们来使用十进制数字?但我不太清楚如何。任何有关此问题的帮助/提示/解决方案都将非常感谢。
以下是一些令人敬畏的代码,如果需要,请告诉我们!
敌人经理:
public class EnemyManager {
private int amount;
private List<Enemy> enemies = new ArrayList<Enemy>();
private GameInJavaOne instance;
public EnemyManager(GameInJavaOne instance, int a){
this.amount = a;
this.instance = instance;
spawn();
}
private void spawn(){
Random random = new Random();
int ss = enemies.size();
// If the current amount of enemies is less than the desired amount, we spawn more enemies.
if(ss < amount){
for(int i = 0; i < amount - ss; i++){
enemies.add(new Enemy(instance, random.nextInt(778), random.nextInt(100)+1));
}
// If its greater than the desired number of enemies, remove them.
}else if (ss > 20){
for(int i = 0; i < ss - amount; i++){
enemies.remove(i);
}
}
}
public void draw(Graphics g){
update();
for(Enemy e : enemies) e.draw(g);
}
private void update() {
boolean re = false;
for(int i = 0; i < enemies.size(); i ++){
if(enemies.get(i).isDead()){
enemies.remove(i);
re = true;
}
}
if(re) spawn();
}
public boolean isColliding(Rectangle hitbox){
boolean c =false;
for(int i = 0; i < enemies.size(); i ++){
if(hitbox.intersects(enemies.get(i).getHitbox())) c = true;
}
return c;
}
}
实体:
public abstract class Entity {
protected int x, y, w, h;
protected boolean removed = false;
public Entity(int x, int y){
this.x = x;
this.y = y;
}
public void Draw(Graphics g){
}
public int getX() { return x; }
public int getY() { return y; }
public int getH() { return h; }
public int getW() { return w; }
}
和敌人阶级:
public class Enemy extends Entity{
private Rectangle hitbox;
private int ix, iy;
private boolean dead = false;
private GameInJavaOne instance;
public Enemy(GameInJavaOne instance, int x, int y){
super(x, y);
this.instance = instance;
hitbox = new Rectangle(x, y, 32, 32);
ix = 0;
iy = 1;
}
private void move(){
if(instance.getStage().isCollided(hitbox)){
iy =0;
dead = true;
}
hitbox.x += ix;
hitbox.y += iy;
}
public boolean isDead() {return dead;}
public Rectangle getHitbox() {return hitbox; }
public void draw(Graphics g){
move();
g.setColor(Color.MAGENTA);
g.fillRect(hitbox.x, hitbox.y, hitbox.height, hitbox.width);
}
}
答案 0 :(得分:1)
您正在使用Rectangle
课程来表示您的论坛的位置(即使您将其称为hitbox),Rectangle
确实有成员x
和y
这是整数,所以当你打电话
rectangle.x+=0.5f;
您真正打电话的是rectangle.x+=(int)0.5f;
和(int)0.5f==0
。
如果你想要浮点精度,Rectangle
类就不适合保持盒子的位置。考虑将框的实际位置保持为double或float并转换为int以呈现它。
所以你的渲染代码会变成;
g.fillRect((int)positionX,(int)positionY, hitbox.height, hitbox.width);
其中positionX
和positionY
是双打的。 (如果您希望将Vector2d
和x
放在一起,也可以使用y
Entity
,x
,y
和w
扩展h
课程,但从未使用它们,这似乎很危险,为什么你在扩展Entity
但是重新创建自己的位置代码。