我有一个2维Minecraft克隆的处理脚本。我目前停留在放置块,因为我需要将它们捕捉到大小为block_size
的网格。这是代码:
final float block_size = 8;
final float ground_level = 8;
final float sky_level = 256;
final float x_min = 0;
final float x_max = 256;
class Player {
float x;
float y;
boolean facing;
Player(float spawn_x, float spawn_y) {
x = spawn_x;
y = spawn_y;
}
void move() {
if (keyPressed) {
if (key == CODED) {
switch(key) {
case 'a':
x--;
facing = false;
break;
case 'd':
x++;
facing = true;
break;
case ' ':
y--;
}
} else {
switch(keyCode) {
case LEFT:
x--;
facing = false;
break;
case RIGHT:
x++;
facing = true;
break;
case UP:
y--;
}
}
}
}
void physics() {
if (y < ground_level) {
y++;
}
x = constrain(x, x_min, x_max);
y = constrain(y, ground_level, sky_level);
}
void place_block() {
}
void break_block() {
}
}
class Block {
Block(float x_, float y_) {
}
void display() {
}
}
Player player = new Player(2, (x_max - x_min) / 2);
ArrayList<Block> blocks = new ArrayList<Block>();
问题出在Block(float x_, float y_)
构造函数中。我需要确保x
永远不会高于x_
,尽可能接近x_
,也要block_size
的倍数。与y
相同。
我试过了x = floor(x_ / block_size) * block_size;
,但它没有用。有没有人可以使用一行或两行代码?
答案 0 :(得分:0)
正如您所提到的,一般来说,floor(x_ / block_size) * block_size
将返回一个block_size
的倍数值,并且始终小于或等于原始x_
。但是,您必须确保在划分时不会遇到“精度损失错误”,因为当信息可能丢失时,Java不允许隐式地将值转换为另一种形式(例如float to int,但是规则并不总是适用,请参阅this answer)。将float x_
除以int block_size
时,您需要先将_x
转换为float:
int x = floor(_x / (float)block_size) * block_size
对于y
,您只需交换参数名称。