> show canvas only <


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

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



/* Move Object Example (v2.40)
 * by GoToLoop (2012/Dec)
 *
 * http://forum.processing.org/topic/keypressed-problem
 *
 * http://forum.processing.org/topic/
 * how-to-move-an-object-diagonally-using-keycode
 *
 * http://forum.processing.org/topic/
 * how-do-i-make-an-object-disappear-upon-collision
 *
 * http://studio.processingtogether.com/sp/pad/export/ro.9bY07S95k2C2a/latest
 */

// Object's variables:
static int x, y;     // positions
static int w, h;     // dimensions
static int ww, hh;   // radii
static int gw, gh;   // canvas - radii
boolean ballOrBox;   // current shape

// Object's constants:
final static byte  SPX  = 30, SPY = 20; // speed movement
final static byte  BOLD = 4;            // border thickness
final static color COLOUR = #0000FF;    // #blue

// General constants:
final static byte  FPS = 60;
final static color BG  = #FFFF00;       // #yellow

// General boolean variables:
static boolean north, south, west, east;

static final void initVars(int wdt, int hgt) {
  x = wdt>>1;    // center of screen 
  y = hgt>>1;

  w = wdt/10;    // 1/10th size of screen
  h = hgt/10;

  ww = w>>1;     // distances from center (radii)
  hh = h>>1;

  gw = wdt - ww; // diff. of (canvas dimensions - obj. radii)
  gh = hgt - hh;
}

void setup() {
  size(800, 600);
  smooth();            // turn on drawing smoothness
  frameRate(FPS);      // set frames / second

  rectMode(CENTER);    // coordinates are relative from center
  ellipseMode(CENTER);

  fill(COLOUR);        // object's paint color
  stroke(0);           // #black
  strokeWeight(BOLD);  // object's border thickness

  initVars(width, height);
}

void draw() {
  background(BG);

  moveObject();
  confineToEdges();
  displayObject();
}

void keyPressed() {
  final int k = keyCode;

  if (k == ' ' | k == ENTER | k == RETURN)
    ballOrBox = !ballOrBox;

  else setDirection(k, true);
}

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

static final void setDirection(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 moveObject() {
  x += (east?  SPX : 0) - (west?  SPX : 0);
  y += (south? SPY : 0) - (north? SPY : 0);
}

static final void confineToEdges() {
  x = constrain(x, ww, gw);
  y = constrain(y, hh, gh);
}

void displayObject() {
  if (ballOrBox)    ellipse(x, y, w, h);
  else              rect(x, y, w, h);
}