如何量化float类型的值?

时间:2018-04-03 00:26:35

标签: processing

我有一个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;,但它没有用。有没有人可以使用一行或两行代码?

1 个答案:

答案 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,您只需交换参数名称。