Java 当方法需要int参数时使用float?

Java 当方法需要int参数时使用float?,java,Java,我正在用java编写一个游戏,其中小行星飞越屏幕撞击宇宙飞船。小行星的速度是一个浮点数,但每个小行星的X和Y值是一个整数。因此,每当速度达到一个新的整数值时,小行星的运动就会跳跃。 我不能对X和Y值使用float或double值,因为用于冲突的矩形类需要int作为参数 我尝试了一个使用double的函数,所以我可以使用天花板函数 public static int doubleToInt(double d){ int i = Math.ceil(d); } 但这也

我正在用java编写一个游戏,其中小行星飞越屏幕撞击宇宙飞船。小行星的速度是一个浮点数,但每个小行星的X和Y值是一个整数。因此,每当速度达到一个新的整数值时,小行星的运动就会跳跃。 我不能对X和Y值使用float或double值,因为用于冲突的矩形类需要int作为参数

我尝试了一个使用double的函数,所以我可以使用天花板函数

    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);

}
import java.awt.*;
导入java.util.Random;
公共级小行星{
//游戏的主要敌人,一颗小行星!
//这些是通过主游戏循环中的for循环生成的。
int x;
int-y;
int r=4;//每个小行星的半径。
静态浮动速度=1;;//小行星的速度随着时间的推移而增加。
空洞移动(小行星岩){
如果(已到达底部(岩石)){
//rock.x=randInt(520550);//随机开始,这样小行星可能会偏移一点。
//rock.y=randInt(0,Game.theGame.getHeight());//y位置,每个小行星的常数。铸造为整数。随机数
initAsteroids(rock,rock.r+500501+rock.r);//此范围用于小行星繁殖后。
//岩石x=100;
}
x-=速度;
}
私有布尔值已到达底部(小行星岩){
如果(岩石x+岩石r<0){
返回true;
}否则{
返回false;
}
}
虚空绘制(Graphics2D g){//渲染小行星
g、 setColor(Color.RED);
g、 椭圆形(x,y,r,r);
}
公共边界(小行星岩){
返回新矩形(rock.x,rock.y,rock.r,rock.r);
}
}是的,只需执行以下操作:

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()

的相同行为,将
double
赋值给
int
是a,因此该语言不允许隐式强制转换(代码中的内容)。如果您使用强制转换明确声明您的意图,代码将编译:

int i = (int) Math.ceil(d);

我不得不说,你的取整方法有点不寻常,但如果这是你需要的,那就这样吧。一些替代方法是使用
Math.round(d)
并将其强制转换,或者通过将
d
强制转换为
int
将双精度转换为int,您可以:

int i = (int)d;
如果您看一下这个,您可以看到在从0到2的双倍数字的情况下会发生什么:

    for(double d = 0; d < 2; d+=0.1) {
        System.out.print((int)d);
    }
for(双d=0;d<2;d+=0.1){
系统输出打印((int)d);
}
这是印刷品:

0 0 0 0 0 0 0 0 0 0 0 1. 1. 1. 1. 1. 1. 1. 1. 一,


在你的情况下,双倍(速度)将增加,并影响飞船每次达到一个新的整数。如果您的坐标系是离散的,则必须如此

您可以轻松地混合使用浮点和整数数学(在几乎任何语言中),只有编译器要求它明确指出您需要的类型转换可能会溢出

一个简单的设计是简单地使用float(或double)作为坐标,并在创建矩形时将其转换为int:

int i = (int) floatValue;
选择哪种转换方法其实无关紧要,替代方法是Math.round()、floor()或ceil()——只要你在任何地方都坚持使用它(避免将苹果和桔子进行比较)

由于位置已经封装在小行星类中,并且移动方法也在小行星类中,因此不需要太多更改。

返回数学类型。ceil(double)仅为double。所以最好使用Double的Double wrapper类,该类具有获取Double的int值并从intValue()返回int值的函数,intValue方法在内部对int进行类型转换,java已经在这样做了,那么为什么还要编写一些额外的代码–
你可以这样做

Double k= Math.ceil(d);
int i=k.intValue();

你能发布小行星的位置更新吗?“因此,每次速度达到一个新的整数值时,小行星的运动都会跳跃”->如果发生这种情况,它不应该逐像素跳跃,也不应该是“跳跃”。在实际放置矩形之前,可能有一个乘法/除法错误地四舍五入到int,这使得移动不平稳为什么这会造成太多问题?屏幕上的像素是离散的。不能在屏幕上的像素之间绘制。顺便说一句,我会使用数学。轮(d)或纯
(int)d
轮和int cast并不总是做相同的事情-可能会有问题,取决于游戏空间的分辨率。描述不足以给出真正深刻的答案,但是我建议您对坐标的x/y部分使用
float
或prefably
double
,并且“尽可能晚地”(即,当您希望将它们传递给矩形构造函数时)将它们强制转换为
int
。BTW:如果这是关于Swing的,那么你甚至可以考虑使用<代码>矩形2D2/代码>而不是<代码>矩形,你根本就不会有这个问题。@每10个点的FoStudioSnman n像素可能是跳跃的。每勾0.1像素或每勾0.2像素怎么样?i、 每5个刻度1个像素。你可以将双精度转换为整数。哦,非常抱歉,我不知道隐式转换和显式转换之间的区别。我收回!:-)!当我写这个小方法时,我没有考虑到有一个圆函数,我只想到了ceil和floor。这肯定更有意义。你能详细说明一下吗?返回类型的数学。ceil(double)仅为double。所以最好使用Double的Double wrapper类,它有函数获取Double的int值,并从intValue()返回int值,intValue方法在内部对int进行类型转换,java已经在做这件事,那么为什么要在您的答案中编写一些额外的代码输出呢。