/*Jessica Nip
Section A
jknip@andrew.cmu.edu
Project-12
*/
//define global variables------------------------------------------------------
var x;
var y;
var dx;
var dy;
var current_block;
var old_blocks = [];
var blockw = 90;
var blockh = 70;
var clicked = false;
var score = 0;
var gameover = false;
var windowmargin = 10;
var start_speed;
var bground = ["https://i.imgur.com/gZ7wNWJ.png"];
var intro = "STACK THE HIGHEST TOWER.";
//colors
var darkblue;
var lightpink;
var lightred;
var grey;
var grey2;
var grey3;
var grey4;
var canvasw;
var canvash;
//---------------------------------------------------------------------------
function preload() {
//background skyline
bground = loadImage(bground[0]);
}
//---------------------------------------------------------------------------
function setup() {
//define initial canvas settings
createCanvas(350, 600);
x = width/2;
y = 10;
dx = 1;
dy = 0;
frameRate(30);
canvash = height;
canvasw = width;
start_speed = 1;
//define color RGB
darkblue = color(44,62,80);
lightpink = color(252,146,179);
lightred = color(252,67,73);
grey = color(225);
grey2 = color(215,218,219);
grey3 = color(160);
grey4 = color(200);
//call object function
current_block = new blockFeeder(width/2, 10, blockw,blockh,start_speed);
}
//---------------------------------------------------------------------------
function draw() {
background(grey2);
//skyline
fill(darkblue);
image(bground, 0, height*(3/5)-25, width, height/3);
rect(0,height*(8/10), width, height);
//sun
fill(lightred);
ellipse(width*(3/4),200,70,70);
//gameover screen
if (gameover){
fill(darkblue);
rect(0,0,width,height);
fill(255);
textSize(22);
textStyle(BOLD);
text("GAME OVER", width/4, height/2-height/30);
textStyle(NORMAL);
textSize(14);
text("Your tower was " + score + "/F.", width/4, height/2);
}
//stacking blocks correctly
else {
current_block.draw();
current_block.update();
for (var i = 0; i < old_blocks.length; i++) {
if (score > 3){
old_blocks[i].y += 2;
}
old_blocks[i].draw();
}
//gameover if blocks not stacked in same column
if (score > 0){
if (old_blocks[score-1].y > height){
gameover = true;
}
}
countScore();
//if block hits bottom of canvas, push block into old blocks array
if (current_block.hitbottom) {
old_blocks.push(current_block);
start_speed += 1;
current_block = new blockFeeder(width/2, 10, blockw,blockh,start_speed);
}
}
}
//create object-------------------------------------------------------------
function blockFeeder(x, y, width, height, speed) {
this.x = x;
this.y = y;
this.dx = speed;
this.dy = 0;
this.width = width;
this.height = height;
this.isclicked = false;
this.hitbottom = false;
this.draw = function() {
//crane (make it not fall with clicked block)
if (!this.isclicked){
fill(darkblue);
noStroke();
rect(this.x + this.width/2, this.y - windowmargin, this.width/6, this.height/6);
}
//floor
fill(grey3);
stroke(grey);
rect(this.x, this.y, this.width, this.height);
//block window decor
fill(grey);
rect(this.x + windowmargin, this.y + windowmargin*2, this.width/3, this.height/2);
rect(this.x + windowmargin*5, this.y + windowmargin*2, this.width/3, this.height/2);
fill(grey4);
stroke(grey);
rect(this.x + windowmargin, this.y + windowmargin*2, this.width/3, this.height/3);
rect(this.x + windowmargin*5, this.y + windowmargin*2, this.width/3, this.height/3);
}
//create horizontal crane movement
this.update = function() {
this.x += this.dx;
this.y += this.dy;
if ((this.x + this.width) > canvasw) {
this.dx = -this.dx;
} else if (this.x < 0) {
this.dx = -this.dx;
}
//make new block stack on previous height boundary
if (score == 0){
if (this.y + this.height > canvash) {
this.dy = 0;
this.hitbottom = true;
this.y = canvash - this.height;
}
}
//check if new block collides with bottom block accordingly
else {
if (this.y + this.height > old_blocks[score-1].y) {
if (abs(this.x-old_blocks[score-1].x) < blockw/2){
this.dy = 0;
this.hitbottom = true;
this.y = old_blocks[score-1].y - this.height;
}
else {
this.dy = 0;
this.hitbottom = true;
this.y = old_blocks[score-1].y - this.height;
gameover = true;
}
}
}
}
//move block to bottom of canvas when clicked
this.pressedButton = function(){
this.isclicked = true;
if (!this.hitbottom){
this.dx = 0;
this.dy = 10;
}
}
}
//---------------------------------------------------------------------------
function countScore(){
//define type settings
strokeWeight(1);
fill(255);
noStroke();
textSize(20);
textStyle(NORMAL);
text(score + "/F", width - 45, height - 20);
textSize(13);
textStyle(BOLD);
text(intro, windowmargin*2, height-20);
//when block stacks, add score
if (current_block.hitbottom) {
score += 1;
}
}
//---------------------------------------------------------------------------
function mousePressed() {
//follow block rules when mouse is pressed
current_block.pressedButton();
//remove intro when mouse pressed
intro = " ";
}
Instructions
Stack the highest tower by aligning blocks with at least 50% accuracy! The horizontal and vertical speed increases will make the level harder over time. Your tower height will also be recorded.
Description
Inspired by classic tower stack mobile games, I wanted to create an alternative version of it using a simple horizontal “crane”, with pressure given to the player from its increased speed over time. As the player begins to stack a higher tower, original blocks also begin to slide downwards, creating more time pressure for players. I also wanted to explore creating minimalistic graphics for a challenging, interactive game.