For our final project, Sharon and I made a game named, “TOM.” In order to play TOM, users are to:
- Use the arrow keys (up, down, left, right) to move the main character, TOM
- Avoid contact with bombs – if contact is made, TOM dies and the game is over
- Avoid contact with puffs – if contact is made, TOM loses a point (-1)
- Consume hearts – if contact is made, TOM earns a point (+1)
- Notice: If bombs make contact with hearts, the bomb bursts and gets rid of the hearts
- Notice: Hearts randomly get patched across the canvas. It shrinks in size and disappears if not consumed by TOM.
- Notice: When the game starts, you might immediately see the game over sign because the randomly generated bombs overlap with the initial position of TOM (100,100). Don’t panic and just refresh the webpage so you can restart.
Your goal is to get as much point as possible. Compete with friends and see who can get the most points!
Please download the file and use the local file to access the html file of TOM.
//Kyunga Ko
//15104B
//kyungak@andrew.cmu.edu
//Capstone Project:Tom and Toms (COMPLETE VERSION)
var bomb;
var puff;
var heart;
var explosion;
var tomcharacter;
var eating;
var gameover;
var scoreboard;
var score = 0;
function preload() {
//Preloading gameover and scoreboard image
gameover = loadImage("https://i.imgur.com/VlLC4xC.png");
scoreboard = loadImage("https://i.imgur.com/8ke3Z26.png");
}
function setup() {
createCanvas(800,800);
//Grouping variables
bomb = new Group();
puff = new Group();
heart = new Group();
explosion = new Group();
tomcharacter = new Group();
eating = new Group();
//Create bomb at random locations on canvas
for(var i=0; i<15; i++) {
createBomb(random(0,width), random(0,height));
}
//Single character "Tom" is created
for(var i=0; i<1; i++) {
createTom(100, 100);
}
}
function draw() {
background(230);
//Reduce the size of the heart by the rate of the frameCount
if(frameCount%60==0 & heart.length<5) {
//Create hearts at random locations on the canvas
createHeart(random(0,width), random(0,height));
}
//Recycle puff on four sides = randomly displaced
if(frameCount%60==0 & puff.length<10) {
var canvasside = floor(random(0,4));
if(canvasside == 0) //left
createPuff(0, random(height));
if(canvasside == 1) //right
createPuff(width, random(height));
if(canvasside == 2) //top
createPuff(random(width), 0);
if(canvasside == 3) //bottom
createPuff(random(width), height);
}
//(BOMB) Bomb orientation in general
for(var i = 0; i<bomb.length; i++) {
var b = bomb[i];
b.noisePosition += 0.1;
b.rotation += (noise(b.noisePosition)-0.5)*10;
b.setSpeed(2, b.rotation);
randomrelocation(b);
}
//(PUFF) When puff collides with bomb and heart
for(var i = 0; i<puff.length; i++) {
var p = puff[i];
randomrelocation(p);
for(var j = 0; j<bomb.length; j++) {
var b = bomb[j];
//Distance btw puff and bomb
var dis = p5.Vector.dist(p.position, b.position);
//Puff and bomb does not attract
if(dis < 70) {
var angle = degrees(atan2(b.position.y-p.position.y,
b.position.x-p.position.x));
//repel
var attraction = -30 / dis;
p.addSpeed(attraction, angle);
}
}
for(var z = 0; z<heart.length; z++) {
var h = heart[z];
//Distance btw heart and puff
var dis2 = p5.Vector.dist(p.position, h.position);
//Puff and heart attract
if(dis2 < 30) {
var angle2 = degrees(atan2(h.position.y-p.position.y,
h.position.x-p.position.x));
var attraction2 = 100 / dis2;
p.addSpeed(attraction2, angle2);
}
}
}
//(HEART) When heart collides with bomb and puff
for(var i = 0; i<heart.length; i++) {
var h = heart[i]; //save in a temp variable
h.scale = map(h.life, 300, 0, 1, 0);
h.overlap(bomb, bombeatsheart);
h.overlap(puff, puffeatsheart);
}
//(TOM) When Tom collides with bomb and heart
for(var i = 0; i<tomcharacter.length; i++) {
var t = tomcharacter[i]; //save in a temp variable
t.overlap(bomb, bombmeetstom);
t.overlap(heart, heartmeetstom);
t.overlap(puff, puffmeetstom);
}
//Scoreboard
image(scoreboard, 580, 15); //Scoreboard image
textSize(30);
fill(0);
text(score,670,90); //Displays the score
//Draws all sprites
drawSprites();
}
//Makes Tom move up, down, left, right using the arrow keys
function keyPressed(){
var tab = 20;
var clickCount = 0;
for (var i = 0; i<tomcharacter.length; i++ ){
var t = tomcharacter[i];
if (keyIsPressed === true){
clickCount ++; //clickcount increases with movement
}
if (keyIsDown(LEFT_ARROW)){
t.position.x -= tab; //left
}
if (keyIsDown(RIGHT_ARROW)){
t.position.x += tab; //right
}
if (keyIsDown(UP_ARROW)){
t.position.y -= tab; //up
} else if (keyIsDown(DOWN_ARROW)){
t.position.y += tab; //down
}
}
}
//The object dissapears outside the canvas and is randomly located again
function randomrelocation(w) {
//wrap around the screen
if (w.position.x > width)
w.position.x = 0;
if (w.position.x < 0)
w.position.x = width;
if (w.position.y > height)
w.position.y = 0;
if (w.position.y < 0)
w.position.y = height;
}
//When puff eats the heart, they multiply x2
function puffeatsheart(puff, heart) {
puff.remove();
createPuff(heart.position.x, heart.position.y);
}
//When Tom meets puff, score decreases by one
function puffmeetstom(puff, tomcharacter) {
tomcharacter.remove();
score--;
}
//Bomb eats/gets rid of the heart + explosion sign
function bombeatsheart(bomb, heart) {
bomb.remove();
createExplosion(heart.position.x, heart.position.y);
createExplosion(heart.position.x, heart.position.y);
createExplosion(heart.position.x, heart.position.y);
createExplosion(heart.position.x, heart.position.y);
createExplosion(heart.position.x, heart.position.y);
createExplosion(heart.position.x, heart.position.y);
createExplosion(heart.position.x, heart.position.y);
}
//Tom eats heart and +1 sign comes up
function heartmeetstom(heart, tomcharacter) {
tomcharacter.remove();
aftereatingheart(heart.position.x, heart.position.y);
score++;
}
//When bomb meets Tom, Tom dies and game over sign comes up
function bombmeetstom(bomb, Tom) {
bomb.remove();
noLoop();
push();
scale(0.7);
image(gameover, 175, 400);
pop();
}
//Bomb is created
function createBomb(x, y) {
var b = createSprite(x, y);
b.addAnimation("bomb", "https://i.imgur.com/N4m1kty.png");
b.setSpeed(2, random(0,360));
b.noisePosition = random(0, 1000);
b.maxSpeed = 2;
bomb.add(b);
}
//When bomb eats heart, explosion is created to indicate that a heart was ate
function createExplosion(x, y) {
var e = createSprite(x, y);
e.addAnimation("bomb", "https://i.imgur.com/wzVAcbK.png");
e.setSpeed(2, random(0,360));
e.noisePosition = random(0, 1000);
e.maxSpeed = 2;
explosion.add(e);
}
//After Tom eats heart, +1 sign is created
function aftereatingheart(x, y) {
var a = createSprite(x,y);
a.addAnimation("eat", "https://i.imgur.com/b9C1Xyl.png");
a.setSpeed(2, random(0,360));
a.noisePosition = random(0, 1000);
a.maxSpeed = 2;
eating.add(a);
}
//Puff is created
function createPuff(x, y) {
var p = createSprite(x, y);
p.addAnimation("puff", "https://i.imgur.com/cs8Mkcr.png");
p.setSpeed(-2, random(0,360));
p.maxSpeed = 1;
puff.add(p);
}
//Heart is created
function createHeart(x, y) {
var h = createSprite(x, y);
h.addAnimation("heart", "https://i.imgur.com/u2uRAYl.png");
h.life = 300;
heart.add(h);
}
//Tom is created
function createTom(x, y) {
var t = createSprite(x, y);
t.addAnimation("tomcharacter", "https://i.imgur.com/Q8FnPtP.png",
"https://i.imgur.com/QzOR227.png");
tomcharacter.add(t);
}