/* built with Studio Sketchpad: * https://sketchpad.cc * * observe the evolution of this sketch: * https://studio.sketchpad.cc/sp/pad/view/ro.CgRtvYqJL2c/rev.2 * * authors: * GoToLoop * license (unless otherwise specified): * creative commons attribution-share alike 3.0 license. * https://creativecommons.org/licenses/by-sa/3.0/ */ /** * Bouncing Angry Bird (2.75) * by ani_abd (2013/Mar) * mod GoToLoop * * http://forum.processing.org/topic/wanna-change-direction-with-keypressed */ final static short w = 0200, h = 0170; //final static short ww = w >> 1, hh = h >> 1; PImage imgBG, imgBird = createImage(w, h, ARGB); final static color BG = 0; final static byte sp = 4; byte spd = sp; int incX = spd, incY = spd; final static short opac = 0xFF, opacMax = 0xFF; final static byte opacStep = 5, opacMin = 0; short x, y, opacity = opac; void setup() { size(640, 480); smooth(); frameRate(50); imageMode(CORNER); // Places imgBird's at a random position: x = (short) random(width - w); y = (short) random(height - h); // Loads background image: //imgBG = loadImage("G1.jpg"); //imgBG.resize(width, height); // Draws bird in the canvas: prepareCanvas(); drawBird(280, 272, 200, 20, 20); // Copies PGraphics g to PImage imgBird: imgBird.copy(get(), 0, 0, w, h, 0, 0, w, h); } void draw() { // Clears canvas: background(BG); //background(imgBG); // Moves & checks canvas' limits for bird: birdUpdate(); // Displays imgBird: int sig = signum(incX); // returns either -1 or 1 for incX scale(sig, 1); // horizontal flip if incX < 0 image(imgBird, x*sig + w*(sig >> 1), y); //frame.setTitle // ("Angry Birds --- FPS: " + round(frameRate) + // " --- Spd: " + spd + " --- Opac: " + opacity); } void keyPressed() { switch (keyCode) { case LEFT: case 'A': incX = -spd; break; case RIGHT: case 'D': incX = spd; break; case UP: case 'W': incY = -spd; break; case DOWN: case 'S': incY = spd; break; case ALT: case 'J': --spd; refreshSpeed(); break; case ' ': case 'K': ++spd; refreshSpeed(); break; case BACKSPACE: case 'H': spd = sp; refreshSpeed(); break; case ENTER: case RETURN: if (looping) noLoop(); else loop(); } } void mousePressed() { if (mouseButton == LEFT) if ( (opacity -= opacStep) < opacMin) opacity = opacMax; if (mouseButton == RIGHT) if ((opacity += opacStep) > opacMax) opacity = opacMin; if (mouseButton == CENTER) opacity = opac; tint(0xFF, opacity); } void prepareCanvas() { // Loads canvas' PGraphics g into pixels[]: loadPixels(); // Makes PGraphics g 100% transparent black: for (int i = pixels.length; i != 0; pixels[--i] = 0); //Arrays.fill(pixels, 0); updatePixels(); } void birdUpdate() { if ( (x += incX) < 0 | x > width - w ) incX *= -1; if ( (y += incY) < 0 | y > height - h ) incY *= -1; } void refreshSpeed() { incX = spd * signum(incX); incY = spd * signum(incY); } final static int signum(int n) { // returns either -1 or 1: return n >> 31 | 1; } void drawBird(int x, int y, color R, color G, color B) { //tail noStroke(); fill(R, G, B); quad(x-210, y-210, x-270, y-197, x-265, y-210, x-220, y-190); quad(x-190, y-212, x-275, y-192, x-277, y-182, x-200, y-212); quad(x-190, y-220, x-265, y-183, x-260, y-175, x-195, y-220); //head stroke(0); strokeWeight(3); fill(R, G, B); beginShape(); curveVertex(x-300, y-200); curveVertex(x-190, y-240); curveVertex(x-250, y-250); curveVertex(x-100, y-100); endShape(CLOSE); beginShape(); curveVertex(x-300, y-230); curveVertex(x-200, y-240); curveVertex(x-235, y-265); curveVertex(x-300, y-110); endShape(CLOSE); ellipse(x-205, y-205, 100, 100); //dark dots on the body noStroke(); fill(R-33, G-6, G-6); ellipse(x-210, y-205, 20, 30); ellipse(x-168, y-200, 20, 30); ellipse(x-225, y-195, 10, 20); ellipse(x-235, y-185, 10, 10); //tan part on the body fill(R+34, G+166, B+117); arc(x-195, y-153, 80, 80, radians(192), radians(328)); noFill(); stroke(0); ellipse(x-205, y-205, 100, 100); noStroke(); fill(R, G, B); rect(x-230, y-256, 27, 20); //left eye stroke(0); fill(-1); ellipse(x-195, y-204, 23, 23); fill(0); ellipse(x-191, y-204, 5, 5); //left eyebrow quad(x-185, y-215, x-215, y-220, x-215, y-213, x-185, y-210); //right eye fill(-1); ellipse(x-173, y-204, 23, 23); fill(0); ellipse(x-178, y-204, 5, 5); //right eyebrow quad(x-185, y-215, x-160, y-220, x-160, y-213, x-185, y-210); //beak fill(R+55, G+176, B-20); strokeWeight(2); stroke(0); triangle(x-185, y-170, x-170, y-185, x-200, y-185); fill(R+55, G+200, B-20); beginShape(); curveVertex(x-140, y-20); curveVertex(x-165, y-185); curveVertex(x-205, y-185); curveVertex(x-200, y-185); curveVertex(x-200, y-185); curveVertex(x-220, y-185); endShape(CLOSE); noStroke(); fill(R+34, G+166, B+117); rect(x-210, y-190, 10, 10); }