发布于2024-03-09 13:31 阅读(824) 评论(0) 点赞(6) 收藏(4)
好吧,我已经尝试 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);
}
}
您正在使用一个Rectangle
类来表示您的盒子的位置(即使您称其为hitbox),Rectangle
确实有成员x
并且y
哪些是整数,所以当您调用
rectangle.x+=0.5f;
你真正调用的是rectangle.x+=(int)0.5f;
and (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
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/686165/ceae9b90b71383627de4/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!