我正在用java编写游戏,小行星飞过屏幕撞向宇宙飞船。小行星的速度是浮点数,但每个小行星的X和Y值是整数。结果,每当速度达到新的整数值时,小行星的运动就会跳跃。 我不能对X和Y值使用float或double值,因为我需要碰撞的矩形类需要int作为参数。
我尝试使用双打功能,所以我可以使用天花板功能,
public static int doubleToInt(double d){
int i = Math.ceil(d);
}
但这也导致了转换为整数的问题。有更好的方法吗?
编辑:小行星类的适用代码:
import java.awt.*;
import java.util.Random;
public class Asteroid {
// the main enemy class of the game, an asteroid!
// these are generated through a for loop in the main game loop.
int x ;
int y ;
int r = 4; // radius of each asteroid.
static float speed = 1;; // speed of asteroids, increases as time goes by.
void move(Asteroid rock){
if(hasReachedBottom(rock)){
//rock.x = randInt(520,550); // random to start, so that the asteroids may be offset a bit.
//rock.y = randInt(0,Game.theGame.getHeight()); // y position, constant for each asteroid. Casted as an int. random number
initAsteroids(rock,rock.r + 500,501 + rock.r );// this range is for after the asteroids spawn.
//rock.x = 100;
}
x -= speed;
}
private boolean hasReachedBottom(Asteroid rock){
if(rock.x + rock.r < 0){
return true;
} else {
return false;
}
}
void paint(Graphics2D g){ // render an asteroid
g.setColor(Color.RED);
g.fillOval(x, y, r, r);
}
public Rectangle getBounds(Asteroid rock){
return new Rectangle(rock.x,rock.y,rock.r,rock.r);
}
}
答案 0 :(得分:1)
是的,只需:
int i = ((int)d); // cast to int - same like applying Math.floor()
i += (d-i > 0 ? 1 : 0); // in case the fraction part of the integer is bigger than zero, add 1 (ciel)
这实际上是在实现Math.ciel()
答案 1 :(得分:1)
如果你想将一个双精度转换成一个int,你可以:
int i = (int)d;
如果你看看这个,你可以看到在从0到2的双数字的情况下会发生什么:
for(double d = 0; d < 2; d+=0.1) {
System.out.print((int)d);
}
这是印刷品:
0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
在你的情况下,双倍(速度)会增加并且每次达到新的整数时都会影响宇宙飞船。如果您的坐标系是离散的,则必须如此。
答案 2 :(得分:0)
将double
分配给int
是narrowing conversion,因此语言不允许隐式转换(代码中包含的内容)。如果你用演员表明你的意图,代码将编译:
int i = (int) Math.ceil(d);
我必须说你的舍入方法有点不寻常,但如果它是你需要的,那就这样吧。一些替代方案是使用Math.round(d)
并对其进行投射,或通过将d
投射到int
来向下舍入。
答案 3 :(得分:0)
您可以轻松地混合浮点数和整数数学(几乎所有语言),只有编译器要求它在您需要可能溢出的类型转换时明确说明。
一个简单的设计是简单地使用float(或double)作为坐标,并在创建矩形时转换为int:
int i = (int) floatValue;
你选择的转换方法真的无关紧要,交替的是Math.round(),floor()或ceil() - ,只要你一直使用它(避免比较)苹果到橘子)。
由于该位置已经封装在您的小行星类中,并且移动方法也位于小行星类上,因此不需要进行太多更改。
答案 4 :(得分:0)
Math.ceil(double)的返回类型仅为double。所以最好使用Double的double包装器类,它具有获取double的int值并从intValue()返回int值的函数,intValue方法在内部对int进行类型转换,已经java正在做的事情为什么要写一些额外的代码 -
你可以这样做。
Double k= Math.ceil(d);
int i=k.intValue();