Если вы хотите плавных переходов, вам придется отказаться от «добавления фиксированного целочисленного расстояния» в обработчиках клавиш и вместо этого отслеживать, какие клавиши нажаты или нет, а затем ускорять / замедлять игрока каждый раз draw()
работает. В качестве простой иллюстрации:
Box box;
boolean[] active = new boolean[256];
void setup() {
size(500,500);
box = new Box(width/2, height/2);
}
void draw() {
pushStyle();
background(0);
box.update(active); // First, make the box update its velocity,
box.draw(); // then, tell the box to draw itself.
popStyle();
}
void keyPressed() { active[keyCode] = true; }
void keyReleased() { active[keyCode] = false; }
С простым классом ящика:
class Box {
final float MAX_SPEED = 1, ACCELERATION = 0.1, DECELERATION = 0.5;
float x, y;
float dx=0, dy=0;
Box(float _x, float _y) { x=_x; y=_y; }
void draw() {
// We first update our position, based on current speed,
x += dx;
y += dy;
// and then we draw ourselves.
noStroke();
fill(255);
rect(x,y,30,30);
}
void update(boolean[] keys) {
if (keys[38]) { dy -= ACCELERATION ; }
else if (keys[40]) { dy += ACCELERATION ; }
else { dy *= DECELERATION; }
if (keys[37]) { dx -= ACCELERATION ; }
else if (keys[39]) { dx += ACCELERATION ; }
else { dx *= DECELERATION; }
dx = constrain(dx, -MAX_SPEED, MAX_SPEED);
dy = constrain(dy, -MAX_SPEED, MAX_SPEED);
}
}
Важной частью здесь является код update
, который обновляет скорость x и y ящика так, что если в данный момент нажата клавиша направления, мы увеличиваем скорость (dx
/ dy
) в этом направлении. Важно отметить, что если нажать клавиши no , мы также снизим скорость до значения, равного 0.
Наконец, чтобы не допустить бесконечной скорости, мы ограничиваем максимум допустимая скорость.