We are about to switch to a new forum software. Until then we have removed the registration on this forum.
Hi folks! Just converted & refined "Hoppy Beaver" sketch from KhanAcademy.org's Processing.JS version, which uses JS syntax, to both Processing's Java/JS Modes! :bz
You can check that out online in its original form @ https://www.KhanAcademy.org/computing/computer-programming/programming-games-visualizations/side-scroller/a/scoring-and-winning
And also in JS Mode @ http://Studio.ProcessingTogether.com/sp/pad/export/ro.9bTfM49wCIJza
Hope y'all like it too: :-bd
/** * Hoppy Beaver (v1.0) * Author: Pamela (2014/Feb) * Processing: GoToLoop (2015/Jan) * * Forum.Processing.org/two/discussion/8997/hoppy-beaver * * www.KhanAcademy.org/computing/computer-programming/ * programming-games-visualizations/side-scroller/a/scoring-and-winning * * Studio.ProcessingTogether.com/sp/pad/export/ro.9bTfM49wCIJza */ /* @pjs pauseOnBlur = true; preload = "creatures/Hopper-Happy.png, creatures/Hopper-Jumping.png, cute/GrassBlock.png"; */ /* @pjs pauseOnBlur = true; preload = "/static/uploaded_resources/p.6273/Hopper-Happy.png, /static/uploaded_resources/p.6273/Hopper-Jumping.png, /static/uploaded_resources/p.6273/GrassBlock.png"; */ static final String KHAN = "https://" + "www.KaSandbox.org/third_party/" + "javascript-khansrc/live-editor/build/images/"; static final String SKETCHPAD = "/static/uploaded_resources/p.6273/"; static final boolean REMOTE = true; //static final boolean REMOTE = false; static final color BG = #E0FFFF, SOIL = #80502A; static final short SMOOTH = 4, FPS = 60, SCROLL = 2; static final short STICKS = 200, TURFS = 30; Stick[] sticks = new Stick[STICKS]; Grass[] turfs = new Grass[TURFS]; Beaver beaver; Score score; void setup() { size(500, 400, JAVA2D); smooth(SMOOTH); frameRate(FPS); noStroke(); textSize(Score.SIZE); textAlign(CENTER, CENTER); rectMode(CORNER); imageMode(CORNER); //String path = REMOTE? SKETCHPAD : ""; String path = REMOTE? KHAN : ""; //(Beaver.falling = loadImage(path + "Hopper-Happy.png")) (Beaver.falling = loadImage(path + "creatures/Hopper-Happy.png")) .resize(Beaver.SIZE, Beaver.SIZE); //(Beaver.jumping = loadImage(path + "Hopper-Jumping.png")) (Beaver.jumping = loadImage(path + "creatures/Hopper-Jumping.png")) .resize(Beaver.SIZE, Beaver.SIZE); //(Grass.lawn = loadImage(path + "GrassBlock.png")) (Grass.lawn = loadImage(path + "cute/GrassBlock.png")) .resize(Grass.SIZE, Grass.SIZE); beaver = new Beaver(width>>1, height - Beaver.GROUND); Stick.counter = score = new Score(80, 20); for (int y = round (height*.85), i = 0; i != TURFS; ++i) turfs[i] = new Grass(i*Grass.GAP, y); for (int y = round (height*.65), i = 0; i != STICKS; ++i) sticks[i] = new Stick(i*Stick.GAP + width, (int) random(20, y)); } void draw() { background(BG); fill(SOIL); rect(0, height*.9, width, height*.1); for (Grass t : turfs) t.script(); fill(Stick.INK); for (Stick s : sticks) if (beaver.gotStick(s)) s.x ^= ~++score.collected | ++score.dead; else s.script(); keyCode = keyPressed | mousePressed? beaver.jump() : beaver.fall(); beaver.display(); fill(Score.INK); score.display(); if (score.dead == STICKS) { boolean win = score.collected/(float)STICKS >= Score.PERCENT; fill(win? #008000 : #FF0000); text(win? "YOU WIN!!!" : "Collect More Next Time..." , width>>1, height>>1); } } static abstract class BeaverStatic { static final int SIZE = 40, GROUND = SIZE+10, SPD = 5; static PImage falling, jumping; } final class Beaver extends BeaverStatic { boolean isJumping; int x, y; Beaver(int xx, int yy) { x = xx; y = yy; } void display() { image(isJumping? jumping : falling, x, y); } int fall() { isJumping = false; return y = min(y + SPD, height - GROUND); } int jump() { isJumping = true; return y = max(y - SPD, 0); } boolean gotStick(Stick s) { return x+SIZE > s.x & x < s.x+Stick.W & y+SIZE > s.y & y < s.y+Stick.H; } } static abstract class GrassStatic { static final int SIZE = 20, GAP = 20; static PImage lawn; } final class Grass extends GrassStatic { short x, y; Grass(int xx, int yy) { x = (short) xx; y = (short) yy; } void script() { update(); display(); } void update() { if ((x -= SCROLL) < -SIZE) x = (short) width; } void display() { image(lawn, x, y); } } static abstract class StickStatic { static final color INK = #5A4A00; static final short W = 10, H = 50, GAP = 40; static Score counter; } final class Stick extends StickStatic { short x, y; Stick(int xx, int yy) { x = (short) xx; y = (short) yy; } void script() { if (x < -W) return; update(); if (x < -W) ++counter.dead; else if (x < width) display(); } void update() { x -= SCROLL; } void display() { rect(x, y, W, H); } } final class Score { static final color INK = #0000FF; static final short SIZE = 18; static final float PERCENT = .9; short x, y; short collected = 0, dead = 0; Score(int xx, int yy) { x = (short) xx; y = (short) yy; } void display() { text("Score: " + nf(collected, 3) + "/" + STICKS, x, y); } }
Comments
This time, Java Mode converted to P5*JS framework, which relies on JS syntax just like Khan's PJS version:
Now a modern version using newest ES6 JS's keyword
class
: :bzhttps://developer.Mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
It's now also hosted to be played online just like the previous Pjs version: \m/
http://p5js.SketchPad.cc/sp/pad/view/ro.GrwKUsycNrY/latest
http://p5js.ProcessingTogether.com/sp/pad/export/ro.Cp2G$x5ApiPI5r
Wow !!! =D>