xxxxxxxxxx
320
let canvasWidth = 640;
let canvasHeight = 480;
let player;
let playerX = 300;
let playerY = 100;
let speed = 4;
let fr = 30;
let voiceSpeed = 30;
let keySpeed = 4;
let spriteWidth = 64;
let spriteHeight = 64;
let monster;
let monsterX = 300;
let monsterY = 300;
let ghost;
let ghostX = 600;
let ghostY = 400;
let colliderWidth = 40;
let colliderHeight = 40;
let direction = 90;
let enemyRadius = 200;
let classifier;
let label;
let confidence;
let voiceControls = false;
let score = 0;
let song;
let soundDestroy;
let gameScene = "title";
let sceneColor;
let sceneText;
let sceneSubtitle;
let skin = "Evo"; // "Evo" or "Warbler"
function preload() {
// Warbler Character
if (skin == "Warbler") {
playerImg = loadImage("images/player.png");
playerImg = loadSpriteSheet("images/player_animation.png", spriteWidth, spriteHeight, 4);
bgImg = loadImage("images/First Level.png");
}
// Evo Character
if (skin == "Evo") {
playerImg = loadImage("images/evo.png");
playerImg = loadSpriteSheet("images/evo_animation.png", spriteWidth, spriteHeight, 4);
bgImg = loadImage("images/Donut Land.png");
}
walkAnimation = loadAnimation(playerImg);
monsterImg = loadImage("images/monster.png");
ghostImg = loadImage("images/ghost.png");
projectileImg = loadImage("images/projectile.png");
let options = { probabilityThreshold: 0.95 };
classifier = ml5.soundClassifier('SpeechCommands18w', options);
song = loadSound("music/Scott_Holmes_-_Hotshot.mp3"/*, loaded*/);
soundDestroy = loadSound("music/sndPop.mp3");
}
function setup() {
createCanvas(canvasWidth, canvasHeight);
player = createSprite(playerX, playerY);
//player.addImage(playerImg);
player.addAnimation('walk', walkAnimation);
frameRate(fr);
monster = createSprite(monsterX, monsterY);
monster.addImage(monsterImg);
ghost = createSprite(ghostX, ghostY);
ghost.addImage(ghostImg, "ghost.png");
enemies = new Group();
enemies.add(monster);
enemies.add(ghost);
projectiles = new Group();
player.setCollider("rectangle", 0, 0, colliderWidth, colliderHeight);
monster.setCollider("rectangle", 0, 0, colliderWidth, colliderHeight);
ghost.setCollider("rectangle", 0, 0, colliderWidth, colliderHeight);
if (voiceControls == true) {
classifier.classify(gotResults);
}
for (let i = 0; i < 8; i++) {
let angle = random(360);
let posX = canvasWidth/2 * angle;
let posY = canvasHeight/2 * angle;
createEnemy(posX, posY);
}
}
function loaded() {
song.play();
song.loop();
song.setVolume(0.2);
}
function gotResults(error, results) {
if (error) {
console.log(error);
}
speed = voiceSpeed;
if (results[0].label == "right") {
playerRight();
}
if (results[0].label == "left") {
playerLeft();
}
if (results[0].label == "down") {
playerDown();
}
if (results[0].label == "up") {
playerUp();
}
speed = keySpeed;
console.log(results[0].label);
playerControls(results[0].label);
}
function playerControls() {
if (keyIsDown(RIGHT_ARROW) || keyIsDown(68)) { // D
playerRight();
}
if (keyIsDown(LEFT_ARROW) || keyIsDown(65)) { // A
playerLeft();
}
if (keyIsDown(DOWN_ARROW) || keyIsDown(83)) { // S
playerDown();
}
if (keyIsDown(UP_ARROW) || keyIsDown(87)) { // W
playerUp();
}
}
function playerRight() {
player.position.x += speed;
if (player.position.x + spriteWidth/2 > canvasWidth) {
player.position.x = canvasWidth - spriteWidth/2;
}
}
function playerLeft() {
player.position.x -= speed;
if (player.position.x < 0 + spriteWidth/2) {
player.position.x = 0 + spriteWidth/2;
}
}
function playerDown() {
player.position.y += speed;
if (player.position.y + spriteHeight/2 > canvasHeight) {
player.position.y = canvasHeight - spriteHeight/2;
}
}
function playerUp() {
player.position.y -= speed;
if (player.position.y < 0 + spriteHeight/2) {
player.position.y = 0 + spriteHeight/2;
}
}
function enemyMovements() {
direction += 2;
monster.setSpeed(3, direction);
if (player.position.x > ghost.position.x - enemyRadius &&
player.position.x < ghost.position.x + enemyRadius &&
player.position.y > ghost.position.y - enemyRadius &&
player.position.y < ghost.position.y + enemyRadius) {
ghost.attractionPoint(0.2, player.position.x, player.position.y);
} else {
ghost.velocity.x = 0;
ghost.velocity.y = 0;
}
ghost.maxSpeed = 4;
}
function collisions() {
enemies.overlap(projectiles, destroyOther);
player.collide(enemies, gameOver);
}
function destroyOther (destroyed, projectile) {
soundDestroy.play();
destroyed.remove();
projectiles.remove(projectile);
score += 1;
}
function gameOver() {
gameScene = "gameOver";
sceneText = "GAME OVER." + "\n" + "Final Score: " + score;
sceneColor = "red";
console.log("GAME OVER. Final Score: " + score);
sceneSubtitle = "Click to Restart";
song.stop();
//window.location.reload();
}
function mousePressed() {
if (gameScene == "level") {
let projectile = createSprite(player.position.x, player.position.y);
projectile.addImage(projectileImg);
projectile.attractionPoint(10+speed, mouseX, mouseY);
projectile.setCollider("rectangle", 0, 0, colliderWidth, colliderHeight);
projectiles.add(projectile);
}
if (gameScene == "title") {
gameScene = "level";
loaded();
}
if (gameScene == "gameOver" || gameScene == "winGame") {
score = 0;
window.location.reload();
}
}
function createEnemy(x,y) {
let newEnemy = createSprite(x,y);
let enemyImg = loadImage("images/enemy.png");
newEnemy.addImage(enemyImg);
newEnemy.setSpeed(2.5, random(360));
newEnemy.setCollider("rectangle", 0, 0, colliderHeight, colliderWidth);
enemies.add(newEnemy);
}
function enemySpawn() {
for (let i = 0; i < enemies.length; i++) {
let spawn = enemies[i];
if (spawn.position.x < - colliderWidth) {
spawn.position.x = canvasWidth + colliderWidth;
}
if (spawn.position.x > canvasWidth + colliderWidth) {
spawn.position.x = - colliderWidth;
}
if (spawn.position.y < - colliderWidth) {
spawn.position.y = canvasHeight + colliderHeight;
}
if (spawn.position.y > canvasHeight + colliderHeight) {
spawn.position.y = - colliderHeight;
}
}
}
function textSetup() {
fill("white");
textAlign(CENTER);
textSize(60);
}
function winGame() {
gameScene = "winGame";
sceneText = "You Win!" + "\n" + "Final Score: " + score;
sceneColor = "green";
console.log("You Win! Final Score: " + score);
sceneSubtitle = "Click to Restart";
song.stop();
}
function level() {
background(bgImg);
playerControls();
collisions();
enemyMovements();
enemySpawn();
drawSprites();
}
function title() {
sceneText = "Donut Land Invasion";
sceneColor = "pink";
sceneSubtitle = "Click to Start";
}
function draw() {
if (gameScene == "title") {
title();
}
if (gameScene == "gameOver") {
gameOver();
}
if (gameScene == "level") {
level();
if (score >= 10) {
winGame();
}
} else {
textSetup();
background(sceneColor);
text(sceneText, 0, 150, canvasWidth, canvasHeight);
text(sceneSubtitle, 0, 300, canvasWidth, canvasHeight);
}
}