xxxxxxxxxx
291
// background music:
// https:https://opengameart.org/content/the-fall-of-arcana-epic-game-theme-music
// spirit drained effect:
// https://opengameart.org/content/energy-drain
let x = 200;
let y = 300;
let player = Player();
console.log(player);
let spirit1, spirit2;
let collisionRadius = 10;
let score = 0; // counts the number of birds eaten
// set up game states
let gameState = 0;
// 0 is start menu
// 1 intructions menu
// 2 game
let charIdleSprite;
let spiritwispingSprite, spiritdyingSprite;
let startButtonImage, instructionsButtonImage;
let titleScreen, intructionsScreen;
let gameBackground;
let backgroundMusic, drainSound;
function preload() {
charIdleSprite = loadImage("sprites/blinking mask0 (2).gif");
spiritwispingSprite = loadImage("sprites/little spirit.gif");
spiritdyingSprite = loadImage("sprites/spirit_absorbed.gif");
gameBackground = loadImage("sprites/Bg2.png");
startButtonImage = loadImage("UI/buttons0.png");
instructionsButtonImage = loadImage("UI/buttons1.png");
titleScreen = loadImage("UI/Bg0.png");
instructionsScreen = loadImage("UI/Bg1.png");
backgroundMusic = loadSound("Audio/game_music.mp4");
meowSound = loadSound("Audio/qubodup-PowerDrain.flac");
}
function setup() {
createCanvas(400, 400);
imageMode(CENTER);
spirit1 = spirit();
spirit2 = spirit();
startButton = Button(100, 300, startButtonImage);
instructionsButton = Button(200, 300, instructionsButtonImage);
backgroundMusic.play();
backgroundMusic.loop(true);
}
function draw() {
background(220);
if (gameState == 0) {
startMenu();
} else if (gameState == 1) {
intructionsMenu();
} else if (gameState == 2) {
game();
}
}
function startMenu() {
image(titleScreen, width / 2, height / 2);
startButton.display();
instructionsButton.display();
if (startButton.clicked()) {
gameState = 2;
}
if (instructionsButton.clicked()) {
gameState = 1;
}
}
function intructionsMenu() {
image(instructionsScreen, width / 2, height / 2);
startButton.display();
if (startButton.clicked()) {
gameState = 2;
}
}
// button xy, image, be clicked
function Button(x, y, img) {
// x,y,img arguments are like let x = 0
// width and height of image
let w = 64;
let h = 32;
// button toggle
let isClicked = false;
function display() {
image(img, x, y);
// draw text intead of a button
// rectMode(CENTER);
// fill('gold');
// rect(x, y, 64, 32);
// fill(0);
// textAlign(CENTER, CENTER);
// text(buttonText, x, y);
}
function clicked() {
// mouse clicked
// inside the button
// didn't click on previous frame
if (mouseIsPressed) {
// rectangle collision detection
if (
mouseX > x - w / 2 &&
mouseX < x + w / 2 &&
mouseY > y - h / 2 &&
mouseY < y + h / 2
) {
if (!isClicked) {
isClicked = true;
return true;
}
}
} else if (isClicked) {
// after clicking and releasing, we can click again
isClicked = false;
}
return false;
}
return { display, clicked };
}
function game() {
image(gameBackground, width / 2, height / 2);
player.move();
player.display();
spirit1.move();
spirit1.display();
spirit2.move();
spirit2.display();
// detect collision between bird1 and player
let spirit1Collide = detectCollision(player, spirit1);
// react to collision event
if (spirit1Collide && spirit1.getStatus()) {
spirit1.die();
drainSound.play();
score = score + 1;
}
// if player gets to 10, they win the game
if (score >= 10) {
gameState = 0;
score = 0; // reset the score/game
spirit1.reset();
spirit2.reset();
}
// ui score display
image(spiritwispingSprite, 420, 30);
fill("blue");
textSize(36);
textFont("Jacquarda Bastarda 9");
text(score, 440, 38);
}
function Player() {
let x = 200;
let y = 300;
let animationState = 0;
function move() {
// if the player is not eating
if (animationState != 2) {
animationState = 0; // assume player is idle
}
if (keyIsDown(RIGHT_ARROW)) {
x = x + 5;
animationState = 0; // walk animation
}
if (keyIsDown(LEFT_ARROW)) {
x = x - 5;
animationState = 0; // walk animation
}
}
}
function display() {
if (animationState == 0) {
image(charIdleSprite, x, y);
// debugging the detection area
// noFill();
// circle(x, y, collisionRadius * 2);
}
function getPosition() {
return { x, y };
}
// makes member functions available to other parts of the program
return { move, display, getPosition, };
}
function spirit() {
let x = random(0, width);
let y = 0; // top of canvas
let speed = random(2, 8);
let isAlive = true;
let animationState = 0;
// 0 is idle/flying
// 1 is eaten
function move() {
y = y + speed;
if (y > height) {
reset();
}
}
function reset() {
y = 0;
x = random(0, width);
speed = random(2, 8);
animationState = 0;
isAlive = true;
}
function display() {
if (animationState == 0) {
image(spiritwispingSprite, x, y);
} else if (animationState == 1) {
image(spiritdyingSprite, x, y);
}
}
function getPosition() {
return { x, y };
}
function die() {
animationState = 1;
isAlive = false;
}
function getStatus() {
return isAlive;
}
return { move, display, getPosition, die, getStatus, reset };
}
function detectCollision(objA, objB) {
let aPosition = objA.getPosition();
let bPosition = objB.getPosition();
let d = dist(aPosition.x, aPosition.y, bPosition.x, bPosition.y);
let isColliding = d < collisionRadius;
return isColliding; // returns true or false
}
// save an image of the canvas
function mousePressed() {
// save("character.jpg");
}