Path: blob/main/projects/polybranch/polybranch.pjs
1834 views
/* @pjs globalKeyEvents=true; pauseOnBlur=true; */ void bindJavascript(JavaScript js) { javascript = js; } JavaScript javascript; PVector[] tris = { new PVector(200,200), new PVector(400,200), new PVector(0,100) }; PShape[] levelText = new PShape[11]; boolean[] keys = new boolean[4]; int originX; int originY; boolean paused; //Tree testTree; Player player; Game g; PVector focalPoint; void setup(){ paused = true; size(800,800); //frameRate(30); originX = width/2; originY = height/2; for(int i = 0; i < levelText.length; i++){ levelText[i] = loadShape("svg/level"+(i+2)+".svg"); levelText[i].disableStyle(); } colorMode(HSB, 255); imageMode(CENTER); rectMode(CENTER); ellipseMode(CENTER); shapeMode(CENTER); focalPoint = new PVector(width/2,height/2); noStroke(); background(230); //testTree = new Tree(5, bob); player = new Player(); g = new Game(); //Layer layer = new Layer(16, width, height); noLoop(); processingIsReady(); } void draw(){ if(frameCount % 30 == 0){ //println(frameRate); //println("LEVEL "+g.level+" SCORE:"+g.score+" SPEED "+g.speed); } if(keys[0] || keys[1] || keys[2] || keys[3]){ player.hue += g.speed*100; if(player.hue > 255){ player.hue = 0; } } if(keys[0] || keys[1]){ if(keys[0]){ //originY += player.speed; if(player.velY < 0 && dist(player.pos.x, player.pos.y, originX, originY + player.velY) > (height/2 - player.r - 8)){ player.velY = 0; } player.velY += 0.3; } if(keys[1]){ //originY -= player.speed; if(player.velY > 0 && dist(player.pos.x, player.pos.y, originX, originY + player.velY) > (height/2 - player.r - 8)){ player.velY = 0; } player.velY -= 0.3; } }else if(player.velY != 0.0){ if(player.velY > 0){ player.velY -= 0.5; if(player.velY < 0){ player.velY = 0; } }else if(player.velY < 0){ player.velY += 0.5; if(player.velY > 0){ player.velY = 0; } } // float brakes = (player.velY > 0) ? -0.5 : 0.5; // player.velY += brakes; } if(keys[2] || keys[3]){ if(keys[2]){ //originX += player.speed; if(player.velX < 0 && dist(player.pos.x, player.pos.y, originX + player.velX, originY) > (height/2 - player.r - 8)){ player.velX = 0; } player.velX += 0.3; } if(keys[3]){ //originX -= player.speed; if(player.velX > 0 && dist(player.pos.x, player.pos.y, originX + player.velX, originY) > (height/2 - player.r - 8)){ player.velX = 0; } player.velX -= 0.3; } }else if(player.velX != 0.0){ if(player.velX > 0){ player.velX -= 0.5; if(player.velX < 0){ player.velX = 0; } }else if(player.velX < 0){ player.velX += 0.5; if(player.velX > 0){ player.velX = 0; } } // float brakes = (player.velX > 0) ? -0.5 : 0.5; // player.velX += brakes; } originX += player.velX; originY += player.velY; if(dist(player.pos.x, player.pos.y, originX, originY) > (height/2 - player.r - 8)){ float a = myAngleBetween(player.pos, new PVector(originX, originY))-PI; originX = (int)(player.pos.x + (height/2 - player.r - 8) * cos(a)); originY = (int)(player.pos.y + (height/2 - player.r - 8) * sin(a)); } background(255); g.update(); } //testtesttest void mousePressed(){ player.speed++; } void keyPressed(){ if (keyCode == UP || key == 'w' || key == 'W') { keys[0] = true; } if (keyCode == DOWN || key == 's' || key == 'S') { keys[1] = true; } if (keyCode == LEFT || key == 'a' || key == 'A') { keys[2] = true; } if (keyCode == RIGHT || key == 'd' || key == 'D') { keys[3] = true; } // if(key == 'a'){ // player.r -= 0.5; // } // if(key == 'z'){ // player.r += 0.5; // } // // if(key == 's'){ // g.numBranches ++; // } // if(key == 'x'){ // g.numBranches --; // } // if(key == 'p'){ // pause(); // } // if(key == 'r'){ // newGame(); // } } void keyReleased(){ if (keyCode == UP || key == 'w' || key == 'W') { keys[0] = false; //player.velY = 0; } if (keyCode == DOWN || key == 's' || key == 'S') { keys[1] = false; //player.velY = 0; } if (keyCode == LEFT || key == 'a' || key == 'A') { keys[2] = false; //player.velX = 0; } if (keyCode == RIGHT || key == 'd' || key == 'D') { keys[3] = false; //player.velX = 0; } } public void pause(){ if(paused){ loop(); paused = false; jsStartGame(true); }else{ noLoop(); paused = true; } } public void newGame(){ player.reset(); g.newGame(); } public int getNextScore(int indexIn){ if(indexIn >= g.scores.length){ return 0; }else{ return g.scores[indexIn]; } } //void mouseMoved(){ // originX = mouseX; // originY = mouseY; // //if(dist(int(mouseX),int(mouseY), int(width/2), int(height/2)) < width/2){ // // //} //} //utility functions! float myAngleBetween (PVector myPVector1, PVector myPVector2) { float a = atan2(myPVector1.y-myPVector2.y, myPVector1.x-myPVector2.x); if (a<0) { a+=TWO_PI; } return a; } void drawPolygon(float cX, float cY, float r, int numSides, float weight, color cIn){ float a = TWO_PI / numSides; noFill(); stroke(cIn); strokeWeight(weight); beginShape(); for(int i = 0; i < numSides; i++){ vertex(cX + r * cos(a*i), cY + r * sin(a*i)); } endShape(CLOSE); } float easeInExpo(float x, float t, float b, float c, float d) { return (t==0) ? b : c * pow(2, 10 * (t/d - 1)) + b; } //create some kind of tree or branch object that takes in an initial triangle and a number of limbs //function limb(PVector baseA, PVector baseB){} class Branch{ PVector[] verticies = new PVector[3]; PVector[] easedVerticies = new PVector[3]; color col; int hu,sat,br,alph; int minBr = 50; int maxBr = 90; Branch(){ verticies[0] = new PVector(0,0); verticies[1] = new PVector(0,0); verticies[2] = new PVector(0,0); //initialized eased verticies as blanks easedVerticies[0] = new PVector(0,0); easedVerticies[1] = new PVector(0,0); easedVerticies[2] = new PVector(0,0); hu = 0; sat = 0; br = (int)random(minBr,maxBr); alph = 255; } Branch(PVector a, PVector b, PVector c){ verticies[0] = a; verticies[1] = b; verticies[2] = c; //initialized eased verticies as blanks easedVerticies[0] = new PVector(0,0); easedVerticies[1] = new PVector(0,0); easedVerticies[2] = new PVector(0,0); hu = 0; sat = 0; br = (int)random(minBr,maxBr); alph = 255; } public void setPos(float oX, float oY, float w, float h, float easedDist){ easedVerticies[0].x = verticies[0].x*easedDist+(oX-(w)/2); easedVerticies[0].y = verticies[0].y*easedDist+(oY-h/2); easedVerticies[1].x = verticies[1].x*easedDist+(oX-(w)/2); easedVerticies[1].y = verticies[1].y*easedDist+(oY-h/2); easedVerticies[2].x = verticies[2].x*easedDist+(oX-(w)/2); easedVerticies[2].y = verticies[2].y*easedDist+(oY-h/2); } public void render(float oX, float oY, float w, float h, float easedDist){ alph = (easedDist > 2) ? (int)map(easedDist, 2, 8, 255, 0) : 255; if(easedDist <= 0.8){ fill(hu,sat,map(easedDist, 0.0, 0.8, 230, br),alph); stroke(0, map(easedDist, 0.0, 0.8, 0, 255)); }else if(easedDist <= 1.02){ stroke(0,alph); fill(hu,sat,br,alph); }else{ stroke(255,alph); fill(hu,sat,300-br,alph); } strokeWeight(0.4); triangle(easedVerticies[0].x, easedVerticies[0].y, easedVerticies[1].x, easedVerticies[1].y, easedVerticies[2].x, easedVerticies[2].y); } //collision detection functions public void playerOverlap(){ if(dist(player.pos.x,player.pos.y,easedVerticies[0].x,easedVerticies[0].y) < player.r || dist(player.pos.x,player.pos.y,easedVerticies[1].x,easedVerticies[1].y) < player.r || dist(player.pos.x,player.pos.y,easedVerticies[2].x,easedVerticies[2].y) < player.r){ //return true; br = sat = 100; g.gameOver(); }else if(PointInTriangle(player.pos.x,player.pos.y,easedVerticies[2].x,easedVerticies[2].y,easedVerticies[1].x,easedVerticies[1].y,easedVerticies[0].x,easedVerticies[0].y)){ //return true; br = sat = 100; g.gameOver(); }else if(circleLineIntersect(player.pos.x,player.pos.y, player.r, easedVerticies[0].x,easedVerticies[0].y, easedVerticies[1].x,easedVerticies[1].y) || circleLineIntersect(player.pos.x,player.pos.y, player.r, easedVerticies[1].x,easedVerticies[1].y, easedVerticies[2].x,easedVerticies[2].y) || circleLineIntersect(player.pos.x,player.pos.y, player.r, easedVerticies[2].x,easedVerticies[2].y, easedVerticies[0].x,easedVerticies[0].y)){ //return true; br = sat = 100; g.gameOver(); }else{ //return false; } } float sign(float p1x, float p1y, float p2x, float p2y, float p3x, float p3y){ return (p1x - p3x) * (p2y - p3y) - (p2x - p3x) * (p1y - p3y); } boolean PointInTriangle(float ptx, float pty, float v1x, float v1y, float v2x, float v2y, float v3x, float v3y){ boolean b1, b2, b3; b1 = sign(ptx, pty, v1x, v1y, v2x, v2y) < 0.0; b2 = sign(ptx, pty, v2x, v2y, v3x, v3y) < 0.0; b3 = sign(ptx, pty, v3x, v3y, v1x, v1y) < 0.0; return ((b1 == b2) && (b2 == b3)); } // Thanks, Casey!! :) // Code adapted from Paul Bourke: // http://local.wasp.uwa.edu.au/~pbourke/geometry/sphereline/raysphere.c boolean circleLineIntersect(float cx, float cy, float cr, float x1, float y1, float x2, float y2) { float dx = x2 - x1; float dy = y2 - y1; float a = dx * dx + dy * dy; float b = 2 * (dx * (x1 - cx) + dy * (y1 - cy)); float c = cx * cx + cy * cy; c += x1 * x1 + y1 * y1; c -= 2 * (cx * x1 + cy * y1); c -= cr * cr; float bb4ac = b * b - 4 * a * c; //println(bb4ac); if (bb4ac < 0) { // Not intersecting return false; } else { float mu = (-b + sqrt( b*b - 4*a*c )) / (2*a); float ix1 = x1 + mu*(dx); float iy1 = y1 + mu*(dy); mu = (-b - sqrt(b*b - 4*a*c )) / (2*a); float ix2 = x1 + mu*(dx); float iy2 = y1 + mu*(dy); // The intersection points //ellipse(ix1, iy1, 10, 10); //ellipse(ix2, iy2, 10, 10); float testX; float testY; // Figure out which point is closer to the circle if (dist(x1, y1, cx, cy) < dist(x2, y2, cx, cy)) { testX = x2; testY = y2; } else { testX = x1; testY = y1; } if (dist(testX, testY, ix1, iy1) < dist(x1, y1, x2, y2) || dist(testX, testY, ix2, iy2) < dist(x1, y1, x2, y2)) { return true; } else { return false; } } } } class Layer { public int numSides; int startVertex; Tree tree; int layerWidth, layerHeight; int ringWeight = 6; float distance; float easedDistance; boolean passed = false; String type; //active, inactive, level Layer(int numSidesIn, int w, int h, String typeIn) { numSides = numSidesIn; layerWidth = w; layerHeight = h; distance = 1; type = typeIn; if (type == "active") { startVertex = int(random(0, numSides)); float aX = (layerWidth/2) + (layerWidth/2 - ringWeight/2) * cos((TWO_PI/numSides)*startVertex); float aY = (layerHeight/2) + (layerHeight/2 - ringWeight/2) * sin((TWO_PI/numSides)*startVertex); float bX = (layerWidth/2) + (layerWidth/2 - ringWeight/2) * cos((TWO_PI/numSides)*(startVertex-1)); float bY = (layerHeight/2) + (layerHeight/2 - ringWeight/2) * sin((TWO_PI/numSides)*(startVertex-1)); tree = new Tree(11, new Branch( new PVector(aX, aY), new PVector(bX, bY), new PVector(lerp(aX, layerWidth/2, 0.7), lerp(aY, layerHeight/2, 0.7)))); } else { tree = new Tree(); } //drawPolygon(layerWidth/2, layerHeight/2, layerWidth/2 - ringWeight/2, numSides, ringWeight, color(255,0,0,0.5)); } public void updateDist(float increment) { distance += increment; // if(easedDistance > 4){ // reset(); // } easedDistance = easeInExpo(distance, distance, 0, 1, 1); if (easedDistance >= map(g.speed, 0.0025, 0.008, 0.999, 0.9) && easedDistance <= map(g.speed, 0.0025, 0.008, 1.02, 1.04)) { if(type == "active"){ tree.checkCollisions(); }else if(type == "level"){ if(g.speed != g.speeds[g.level-1]){ g.speed = g.speeds[g.level-1]; jsIncrementLevel(); } } }else if (easedDistance > 1 && !passed && type == "active") { passed = true; g.score += 100; jsUpdateScore(g.score); jsTriggerBell(); } } public int getNumSides() { return numSides; } public void reset(String typeIn) { type = typeIn; distance = 0; easedDistance = 0; passed = false; tree.reset(); } public void render() { //fill(255,100); //rect(lerp(width/2, originX, easedDistance),lerp(height/2, originY,easedDistance), width*2*easedDistance, height*2*easedDistance); //image(pg, lerp(width/2, originX, easedDistance),lerp(height/2, originY,easedDistance), width*2*easedDistance, height*2*easedDistance); if (type == "active") { tree.render(lerp(width/2, originX, easedDistance), lerp(height/2, originY, easedDistance), layerWidth*easedDistance, layerHeight*easedDistance, easedDistance); } else if (type == "level") { if (easedDistance < 0.8) { fill(map(easedDistance, 0.0, 0.8, 255, 100)); } else { int alph = (easedDistance > 2) ? (int)map(easedDistance, 2, 8, 255, 0) : 255; fill(100,alph); } //text("Level "+g.level, lerp(width/2, originX, easedDistance), lerp(height/2, originY, easedDistance)); noStroke(); shape(levelText[(g.level-2)], lerp(width/2, originX, easedDistance), lerp(height/2, originY, easedDistance), levelText[(g.level-2)].width*easedDistance, levelText[(g.level-2)].height*easedDistance); } //color c = (easedDistance > 1) ? color(0,0,255) : color(100); color c = color(100); drawPolygon(lerp(width/2, originX, easedDistance), lerp(height/2, originY, easedDistance), (layerWidth*easedDistance)/2 - (ringWeight*easedDistance)/2, numSides, ringWeight*easedDistance, c); } // class Tree { Branch branches[]; int numBranches; int index = 0; float trunkLen; Tree(int numBranchesIn, Branch trunk) { numBranches = numBranchesIn; branches = new Branch[16]; //println(numSides); for (int i = 0; i < branches.length; i++) { branches[i] = new Branch(); } branches[index] = trunk; index ++; trunkLen = dist(lerp(trunk.verticies[0].x, trunk.verticies[1].x, 0.5), lerp(trunk.verticies[0].y, trunk.verticies[1].y, 0.5), trunk.verticies[2].x, trunk.verticies[2].y); this.populateRandomBranches(branches[0], (random(1))); //println("trunks is "+trunkLen); } Tree() { numBranches = 0; branches = new Branch[16]; for (int i = 0; i < branches.length; i++) { branches[i] = new Branch(); } } void populateRandomBranches(Branch trunkIn, float sides) { int side; if (sides > 0.2) { side = 2; } else { side = int(random(2)); } if ((side == 1 || side == 2) && index < numBranches) { float angle = myAngleBetween(trunkIn.verticies[2], trunkIn.verticies[0])+random(HALF_PI); float len = dist(trunkIn.verticies[2].x, trunkIn.verticies[2].y, trunkIn.verticies[0].x, trunkIn.verticies[0].y) * 0.7; if (len > (trunkLen*0.4)) { //check if the random angle will fit inside the circle if (dist((trunkIn.verticies[2].x + len * cos(angle)), (trunkIn.verticies[2].y + len * sin(angle)), width/2, height/2) < width/2) { //println(index); branches[index] = new Branch( new PVector(trunkIn.verticies[2].x, trunkIn.verticies[2].y), new PVector(lerp(trunkIn.verticies[2].x, trunkIn.verticies[1].x, 0.3), lerp(trunkIn.verticies[2].y, trunkIn.verticies[1].y, 0.3)), new PVector((trunkIn.verticies[2].x + len * cos(angle)), (trunkIn.verticies[2].y + len * sin(angle)))); index ++; populateRandomBranches(branches[index-1], (random(1))); //check if the min or max angle fit inside the area } else if (dist((trunkIn.verticies[2].x + len * cos(myAngleBetween(trunkIn.verticies[2], trunkIn.verticies[0])+HALF_PI)), (trunkIn.verticies[2].y + len * sin(myAngleBetween(trunkIn.verticies[2], trunkIn.verticies[0])+HALF_PI)), width/2, height/2) < width/2 || dist((trunkIn.verticies[2].x + len * cos(myAngleBetween(trunkIn.verticies[2], trunkIn.verticies[0]))), (trunkIn.verticies[2].y + len * sin(myAngleBetween(trunkIn.verticies[2], trunkIn.verticies[0]))), width/2, height/2) < width/2) { populateRandomBranches(trunkIn, 1); }//otherwise don't do it. } } if ((side == 0 || side == 2) && index < numBranches) { float angle = myAngleBetween(trunkIn.verticies[2], trunkIn.verticies[1])-random(HALF_PI); float len = dist(trunkIn.verticies[2].x, trunkIn.verticies[2].y, trunkIn.verticies[1].x, trunkIn.verticies[1].y) * 0.7; if (len > (trunkLen*0.4)) { //check if the random angle will fit inside the circle if (dist((trunkIn.verticies[2].x + len * cos(angle)), (trunkIn.verticies[2].y + len * sin(angle)), width/2, height/2) < width/2) { //println(index); branches[index] = new Branch( new PVector(lerp(trunkIn.verticies[2].x, trunkIn.verticies[0].x, 0.3), lerp(trunkIn.verticies[2].y, trunkIn.verticies[0].y, 0.3)), new PVector(trunkIn.verticies[2].x, trunkIn.verticies[2].y), new PVector((trunkIn.verticies[2].x + len * cos(angle)), (trunkIn.verticies[2].y + len * sin(angle)))); index ++; populateRandomBranches(branches[index-1], (random(1))); } else if (dist((trunkIn.verticies[2].x + len * cos(myAngleBetween(trunkIn.verticies[2], trunkIn.verticies[1])-HALF_PI)), (trunkIn.verticies[2].y + len * sin(myAngleBetween(trunkIn.verticies[2], trunkIn.verticies[1])-HALF_PI)), width/2, height/2) < width / 2 || dist((trunkIn.verticies[2].x + len * cos(myAngleBetween(trunkIn.verticies[2], trunkIn.verticies[1]))), (trunkIn.verticies[2].y + len * sin(myAngleBetween(trunkIn.verticies[2], trunkIn.verticies[1]))), width/2, height/2) < width / 2) { populateRandomBranches(trunkIn, 0); } } } //if(index < numBranches){ // if(side == 2){ // populateRandomBranches(branches[index-1], int(random(3))); // populateRandomBranches(branches[index-2], int(random(3))); // }else{ // populateRandomBranches(branches[index-1], int(random(3))); // } //} } void reset() { index = 1; numBranches = g.numBranches; for (int i = 1; i < numBranches; i++) { branches[i].br = (int)random(50, 200); branches[i].verticies[0].x = 0; branches[i].verticies[0].y = 0; } startVertex = int(random(0, numSides)); float aX = (layerWidth/2) + (layerWidth/2 - ringWeight/2) * cos((TWO_PI/numSides)*startVertex); float aY = (layerHeight/2) + (layerHeight/2 - ringWeight/2) * sin((TWO_PI/numSides)*startVertex); float bX = (layerWidth/2) + (layerWidth/2 - ringWeight/2) * cos((TWO_PI/numSides)*(startVertex-1)); float bY = (layerHeight/2) + (layerHeight/2 - ringWeight/2) * sin((TWO_PI/numSides)*(startVertex-1)); branches[0] = new Branch( new PVector(aX, aY), new PVector(bX, bY), new PVector(lerp(aX, width/2, 0.7), lerp(aY, width/2, 0.7))); trunkLen = dist(lerp(branches[0].verticies[0].x, branches[0].verticies[1].x, 0.5), lerp(branches[0].verticies[0].y, branches[0].verticies[1].y, 0.5), branches[0].verticies[2].x, branches[0].verticies[2].y); populateRandomBranches(branches[0], 2); } void checkCollisions() { for (int i = 0; i < numBranches; i++) { if (branches[i].verticies[0].x != 0 && branches[i].verticies[0].y != 0) { //branches[i].render(context); branches[i].playerOverlap(); } } } void render(float oX, float oY, float w, float h, float easedDist) { for (int i = 0; i < numBranches; i++) { if (branches[i].verticies[0].x != 0 && branches[i].verticies[0].y != 0) { //branches[i].render(context); branches[i].setPos(oX, oY, w, h, easedDist); branches[i].render(oX, oY, w, h, easedDist); } } } } } class Player{ PVector pos; float r; int speed; float velX, velY; float hue; Player(){ pos = new PVector(width/2,height/2); r = 20; speed = 6; hue = 0; } public void reset(){ pos.x = width/2; pos.y = width/2; r = 20; speed = 6; velX = velY = 0; } } //tree has been moved inside layer as an internal class class Game{ ArrayList layers; String origin; boolean drawnPlayer; int score; int level; int levelUp = 3; boolean isGameOver; int numBranches; float[] speeds = { 0.0025, 0.003, 0.0035, 0.004, 0.0045, 0.005, 0.0055, 0.006, 0.0065, 0.007, 0.0075, 0.008 }; int[] scores = { 0, 500, 2000, 4000, 6500, 9500, 13000, 18000, 24000, 31000, 39000, 48000 }; float speed; Game(){ score = 0; origin = "I EXIST"; layers = new ArrayList(); drawnPlayer = false; isGameOver = false; numBranches = 6; level = 1; speed = speeds[0]; //make layers for(int i = 0; i < 13; i++){ // if(i < 4){ // layers.add(new Layer(16, width, height, "active")); // }else{ layers.add(new Layer(16, width, height, "inactive")); // } } //set the distance var for these 6 layers for(int i = layers.size(); i > 0; i--){ Layer layer = (Layer) layers.get(i-1); //println(1.0/(i)); layer.distance = 1.3/layers.size()*i; layer.easedDistance = easeInExpo(layer.distance, layer.distance, 0,1,1); //println(easeInExpo(1.3, 1.3, 0,1,1)); } //println("game has "+layers.size()); } public void update(){ drawnPlayer = false; for(int i = 0; i < layers.size(); i++){ if(!isGameOver){ Layer layer = (Layer) layers.get(i); if(layer.easedDistance > 8 && i == layers.size()-1){ layers.add(0, layer); layers.remove(layers.size()-1); checkLevel(); if(levelUp == 0 || levelUp == 2){ layer.reset("inactive"); levelUp ++; }else if(levelUp == 1){ layer.reset("level"); levelUp ++; }else{ layer.reset("active"); } }else{ layer.updateDist(speed); if(!isGameOver){ if(layer.easedDistance >= 1 && !drawnPlayer){ drawPlayer(); } layer.render(); } } } } } void drawPlayer(){ noStroke(); fill(0, 100, 100,200); ellipse(width/2,height/2,player.r*2,player.r*2); drawPolygon(lerp(width/2, originX, 1), lerp(height/2, originY,1), width/2, 16, 6, color(0,0,0)); drawnPlayer = true; } void checkLevel(){ if(score > scores[11] && level < 12){ level = 12; numBranches = 16; levelUp = 0; //speed = 0.004; }else if(score > scores[10] && level < 11){ level = 11; numBranches = 16; levelUp = 0; //speed = 0.004; }else if(score > scores[9] && level < 10){ level = 10; numBranches = 15; levelUp = 0; //speed = 0.004; }else if(score > scores[8] && level < 9){ level = 9; numBranches = 14; levelUp = 0; //speed = 0.004; }else if(score > scores[7] && level < 8){ level = 8; numBranches = 13; levelUp = 0; //speed = 0.004; }else if(score > scores[6] && level < 7){ level = 7; numBranches = 12; levelUp = 0; //speed = 0.004; }else if(score > scores[5] && level < 6){ level = 6; numBranches = 11; levelUp = 0; //speed = 0.004; }else if(score > scores[4] && level < 5){ level = 5; numBranches = 10; levelUp = 0; //speed = 0.004; }else if(score > scores[3] && level < 4){ level = 4; numBranches = 9; levelUp = 0; //speed = 0.004; }else if(score > scores[2] && level < 3){ level = 3; numBranches = 8; levelUp = 0; //speed = 0.0035; }else if(score > scores[1] && level < 2){ level = 2; numBranches = 7; levelUp = 0; //speed = 0.003; }else{ //level = 1; //numBranches = 6; //speed = 0.0025; } // if(score < 30000){ // speed = map(score, 0,30000, 0.0025,0.009); // } } public void newGame(){ score = 0; numBranches = 6; level = 1; speed = speeds[0]; isGameOver = false; layers.clear(); originX = width/2; originY = height/2; for(int i = 0; i < 13; i++){ if(i < 4){ layers.add(new Layer(16, width, height, "active")); }else{ layers.add(new Layer(16, width, height, "inactive")); } } //set the distance var for these 6 layers for(int i = layers.size(); i > 0; i--){ Layer layer = (Layer) layers.get(i-1); layer.distance = 1.3/layers.size()*i; layer.easedDistance = easeInExpo(layer.distance, layer.distance, 0,1,1); } redraw(); //loop(); //paused = false; } public void gameOver(){ if(!isGameOver){ jsGameOver(score); isGameOver = true; background(0,0,255); for(int i = 0; i < layers.size(); i++){ Layer layer = (Layer) layers.get(i); layer.render(); } //drawPlayer(); //println(g.level+" "+g.score); noLoop(); paused = true; } } // public void display(){ // for(int i = 0; i < layers.size(); i++){ // Layer layer = (Layer) layers.get(i); // layer.render(); // } // } }