> show canvas only <


/* built with Studio Sketchpad: 
 *   https://sketchpad.cc
 * 
 * observe the evolution of this sketch: 
 *   https://studio.sketchpad.cc/sp/pad/view/ro.JH2uE6$ETgK/rev.7
 * 
 * authors: 
 *   GoToLoop

 * license (unless otherwise specified): 
 *   creative commons attribution-share alike 3.0 license.
 *   https://creativecommons.org/licenses/by-sa/3.0/ 
 */ 



/** 
 * Drivable Car (v2.11)
 * by  TFGuy44 (2013/Aug)
 * mod GoToLoop
 * 
 * http://forum.processing.org/topic/adding-in-acceleration-and-momentum
 * http://studio.processingtogether.com/sp/pad/export/ro.9Nl$898UQxW3Q/latest
 */

static int gw, gh;
static float x, y, z, v;
static boolean north, south, west, east;

final static float SPD = .2, ROT = .1, ACCEL = .99;

void setup() {
  size(640, 480);
  smooth();

  gw = width;
  gh = height;

  x = gw>>1;
  y = gh>>1;
}

void draw() {
  background(0300);
  update();
  display();
}

void keyPressed() {
  setKeys(keyCode, true);
}

void keyReleased() {
  setKeys(keyCode, false);
}

static final void setKeys(int k, boolean decision) {
  if      (k == UP    | k == 'W')   north = decision;
  else if (k == DOWN  | k == 'S')   south = decision;
  else if (k == LEFT  | k == 'A')   west  = decision;
  else if (k == RIGHT | k == 'D')   east  = decision;
}

static final void update() {
  v += (north? SPD : 0) - (south? SPD : 0);
  z += (east?  ROT : 0) - (west?  ROT : 0);

  x = (x + gw + cos(z)*v) % gw;
  y = (y + gh + sin(z)*v) % gh;

  v *= ACCEL;
}

void display() {
  translate(x, y);
  rotate(z);

  noStroke();
  fill(#008000); 
  rect(-10, -10, 20, 20);

  stroke(0);
  noFill();
  triangle(-8, -8, 7, 0, -8, 8);
}