/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var facekit = LK.import("@upit/facekit.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.health = 30;
self.maxHealth = 30;
self.lastPlayerIntersecting = false;
self.update = function () {
self.x -= self.speed;
// Check collision with player
var currentIntersecting = self.intersects(player);
if (!self.lastPlayerIntersecting && currentIntersecting) {
player.takeDamage(20);
self.destroy();
enemies.splice(enemies.indexOf(self), 1);
LK.getSound('hit').play();
}
self.lastPlayerIntersecting = currentIntersecting;
// Check if player is screaming at enemy
if (facekit.volume > 0.6 && self.intersects(player)) {
self.health -= 2;
if (self.health <= 0) {
LK.setScore(LK.getScore() + 10);
scoreText.setText(LK.getScore());
self.destroy();
enemies.splice(enemies.indexOf(self), 1);
LK.getSound('destroy').play();
}
}
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.lastPlayerIntersecting = false;
self.update = function () {
self.x -= self.speed;
// Check collision with player
var currentIntersecting = self.intersects(player);
if (!self.lastPlayerIntersecting && currentIntersecting) {
if (facekit.volume < 0.4) {
player.takeDamage(15);
LK.getSound('hit').play();
}
}
self.lastPlayerIntersecting = currentIntersecting;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.baseSize = 120;
self.power = 0;
self.health = 100;
self.maxHealth = 100;
self.update = function () {
// Get voice input
var volume = facekit.volume;
var pitch = facekit.pitch;
// Calculate power based on volume
self.power = Math.min(volume * 2, 1);
// Scale player based on power
var scale = 1 + self.power * 0.5;
playerGraphics.scaleX = scale;
playerGraphics.scaleY = scale;
// Movement based on pitch
if (pitch > 0) {
if (pitch > 200) {
self.y -= 8 * self.power;
} else if (pitch < 150) {
self.y += 8 * self.power;
}
}
// Keep player in bounds
if (self.y < 100) self.y = 100;
if (self.y > 2600) self.y = 2600;
// Visual feedback for power
var intensity = self.power;
var red = Math.floor(255 * intensity);
var green = Math.floor(107 * (1 - intensity * 0.5));
var blue = Math.floor(107 * (1 - intensity * 0.5));
playerGraphics.tint = red << 16 | green << 8 | blue;
};
self.takeDamage = function (damage) {
self.health -= damage;
LK.effects.flashObject(self, 0xff0000, 200);
if (self.health <= 0) {
LK.showGameOver();
}
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.lastPlayerIntersecting = false;
self.rotationSpeed = 0.1;
self.update = function () {
self.x -= self.speed;
powerupGraphics.rotation += self.rotationSpeed;
// Check collision with player
var currentIntersecting = self.intersects(player);
if (!self.lastPlayerIntersecting && currentIntersecting) {
player.health = Math.min(player.health + 25, player.maxHealth);
LK.setScore(LK.getScore() + 5);
scoreText.setText(LK.getScore());
healthText.setText('Health: ' + player.health);
self.destroy();
powerups.splice(powerups.indexOf(self), 1);
LK.getSound('powerup').play();
}
self.lastPlayerIntersecting = currentIntersecting;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2c3e50
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 300;
player.y = 1366;
var enemies = [];
var obstacles = [];
var powerups = [];
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var healthText = new Text2('Health: 100', {
size: 60,
fill: 0xFFFFFF
});
healthText.anchor.set(0, 0);
healthText.x = 150;
healthText.y = 100;
LK.gui.topLeft.addChild(healthText);
var volumeIndicator = new Text2('Volume: 0%', {
size: 50,
fill: 0xFFFFFF
});
volumeIndicator.anchor.set(1, 0);
volumeIndicator.x = -50;
volumeIndicator.y = 100;
LK.gui.topRight.addChild(volumeIndicator);
var pitchIndicator = new Text2('Pitch: 0 Hz', {
size: 50,
fill: 0xFFFFFF
});
pitchIndicator.anchor.set(1, 0);
pitchIndicator.x = -50;
pitchIndicator.y = 180;
LK.gui.topRight.addChild(pitchIndicator);
var instructions = new Text2('Scream "Waaaaaaa!" to power up!\nHigh pitch = UP, Low pitch = DOWN', {
size: 40,
fill: 0xFFFFFF
});
instructions.anchor.set(0.5, 1);
instructions.x = 0;
instructions.y = -50;
LK.gui.bottom.addChild(instructions);
// Game timers
var enemySpawnTimer = 0;
var obstacleSpawnTimer = 0;
var powerupSpawnTimer = 0;
game.update = function () {
// Update UI
var volumePercent = Math.floor(facekit.volume * 100);
volumeIndicator.setText('Volume: ' + volumePercent + '%');
pitchIndicator.setText('Pitch: ' + Math.floor(facekit.pitch) + ' Hz');
healthText.setText('Health: ' + player.health);
// Spawn enemies
enemySpawnTimer++;
if (enemySpawnTimer > 120) {
enemySpawnTimer = 0;
var enemy = new Enemy();
enemy.x = 2200;
enemy.y = 200 + Math.random() * 2200;
enemies.push(enemy);
game.addChild(enemy);
}
// Spawn obstacles
obstacleSpawnTimer++;
if (obstacleSpawnTimer > 180) {
obstacleSpawnTimer = 0;
var obstacle = new Obstacle();
obstacle.x = 2200;
obstacle.y = 200 + Math.random() * 2200;
obstacles.push(obstacle);
game.addChild(obstacle);
}
// Spawn powerups
powerupSpawnTimer++;
if (powerupSpawnTimer > 300) {
powerupSpawnTimer = 0;
var powerup = new PowerUp();
powerup.x = 2200;
powerup.y = 200 + Math.random() * 2200;
powerups.push(powerup);
game.addChild(powerup);
}
// Clean up off-screen enemies
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i].x < -100) {
enemies[i].destroy();
enemies.splice(i, 1);
}
}
// Clean up off-screen obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
if (obstacles[i].x < -100) {
obstacles[i].destroy();
obstacles.splice(i, 1);
}
}
// Clean up off-screen powerups
for (var i = powerups.length - 1; i >= 0; i--) {
if (powerups[i].x < -100) {
powerups[i].destroy();
powerups.splice(i, 1);
}
}
// Win condition
if (LK.getScore() >= 500) {
LK.showYouWin();
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var facekit = LK.import("@upit/facekit.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.health = 30;
self.maxHealth = 30;
self.lastPlayerIntersecting = false;
self.update = function () {
self.x -= self.speed;
// Check collision with player
var currentIntersecting = self.intersects(player);
if (!self.lastPlayerIntersecting && currentIntersecting) {
player.takeDamage(20);
self.destroy();
enemies.splice(enemies.indexOf(self), 1);
LK.getSound('hit').play();
}
self.lastPlayerIntersecting = currentIntersecting;
// Check if player is screaming at enemy
if (facekit.volume > 0.6 && self.intersects(player)) {
self.health -= 2;
if (self.health <= 0) {
LK.setScore(LK.getScore() + 10);
scoreText.setText(LK.getScore());
self.destroy();
enemies.splice(enemies.indexOf(self), 1);
LK.getSound('destroy').play();
}
}
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.lastPlayerIntersecting = false;
self.update = function () {
self.x -= self.speed;
// Check collision with player
var currentIntersecting = self.intersects(player);
if (!self.lastPlayerIntersecting && currentIntersecting) {
if (facekit.volume < 0.4) {
player.takeDamage(15);
LK.getSound('hit').play();
}
}
self.lastPlayerIntersecting = currentIntersecting;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.baseSize = 120;
self.power = 0;
self.health = 100;
self.maxHealth = 100;
self.update = function () {
// Get voice input
var volume = facekit.volume;
var pitch = facekit.pitch;
// Calculate power based on volume
self.power = Math.min(volume * 2, 1);
// Scale player based on power
var scale = 1 + self.power * 0.5;
playerGraphics.scaleX = scale;
playerGraphics.scaleY = scale;
// Movement based on pitch
if (pitch > 0) {
if (pitch > 200) {
self.y -= 8 * self.power;
} else if (pitch < 150) {
self.y += 8 * self.power;
}
}
// Keep player in bounds
if (self.y < 100) self.y = 100;
if (self.y > 2600) self.y = 2600;
// Visual feedback for power
var intensity = self.power;
var red = Math.floor(255 * intensity);
var green = Math.floor(107 * (1 - intensity * 0.5));
var blue = Math.floor(107 * (1 - intensity * 0.5));
playerGraphics.tint = red << 16 | green << 8 | blue;
};
self.takeDamage = function (damage) {
self.health -= damage;
LK.effects.flashObject(self, 0xff0000, 200);
if (self.health <= 0) {
LK.showGameOver();
}
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.lastPlayerIntersecting = false;
self.rotationSpeed = 0.1;
self.update = function () {
self.x -= self.speed;
powerupGraphics.rotation += self.rotationSpeed;
// Check collision with player
var currentIntersecting = self.intersects(player);
if (!self.lastPlayerIntersecting && currentIntersecting) {
player.health = Math.min(player.health + 25, player.maxHealth);
LK.setScore(LK.getScore() + 5);
scoreText.setText(LK.getScore());
healthText.setText('Health: ' + player.health);
self.destroy();
powerups.splice(powerups.indexOf(self), 1);
LK.getSound('powerup').play();
}
self.lastPlayerIntersecting = currentIntersecting;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2c3e50
});
/****
* Game Code
****/
var player = game.addChild(new Player());
player.x = 300;
player.y = 1366;
var enemies = [];
var obstacles = [];
var powerups = [];
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var healthText = new Text2('Health: 100', {
size: 60,
fill: 0xFFFFFF
});
healthText.anchor.set(0, 0);
healthText.x = 150;
healthText.y = 100;
LK.gui.topLeft.addChild(healthText);
var volumeIndicator = new Text2('Volume: 0%', {
size: 50,
fill: 0xFFFFFF
});
volumeIndicator.anchor.set(1, 0);
volumeIndicator.x = -50;
volumeIndicator.y = 100;
LK.gui.topRight.addChild(volumeIndicator);
var pitchIndicator = new Text2('Pitch: 0 Hz', {
size: 50,
fill: 0xFFFFFF
});
pitchIndicator.anchor.set(1, 0);
pitchIndicator.x = -50;
pitchIndicator.y = 180;
LK.gui.topRight.addChild(pitchIndicator);
var instructions = new Text2('Scream "Waaaaaaa!" to power up!\nHigh pitch = UP, Low pitch = DOWN', {
size: 40,
fill: 0xFFFFFF
});
instructions.anchor.set(0.5, 1);
instructions.x = 0;
instructions.y = -50;
LK.gui.bottom.addChild(instructions);
// Game timers
var enemySpawnTimer = 0;
var obstacleSpawnTimer = 0;
var powerupSpawnTimer = 0;
game.update = function () {
// Update UI
var volumePercent = Math.floor(facekit.volume * 100);
volumeIndicator.setText('Volume: ' + volumePercent + '%');
pitchIndicator.setText('Pitch: ' + Math.floor(facekit.pitch) + ' Hz');
healthText.setText('Health: ' + player.health);
// Spawn enemies
enemySpawnTimer++;
if (enemySpawnTimer > 120) {
enemySpawnTimer = 0;
var enemy = new Enemy();
enemy.x = 2200;
enemy.y = 200 + Math.random() * 2200;
enemies.push(enemy);
game.addChild(enemy);
}
// Spawn obstacles
obstacleSpawnTimer++;
if (obstacleSpawnTimer > 180) {
obstacleSpawnTimer = 0;
var obstacle = new Obstacle();
obstacle.x = 2200;
obstacle.y = 200 + Math.random() * 2200;
obstacles.push(obstacle);
game.addChild(obstacle);
}
// Spawn powerups
powerupSpawnTimer++;
if (powerupSpawnTimer > 300) {
powerupSpawnTimer = 0;
var powerup = new PowerUp();
powerup.x = 2200;
powerup.y = 200 + Math.random() * 2200;
powerups.push(powerup);
game.addChild(powerup);
}
// Clean up off-screen enemies
for (var i = enemies.length - 1; i >= 0; i--) {
if (enemies[i].x < -100) {
enemies[i].destroy();
enemies.splice(i, 1);
}
}
// Clean up off-screen obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
if (obstacles[i].x < -100) {
obstacles[i].destroy();
obstacles.splice(i, 1);
}
}
// Clean up off-screen powerups
for (var i = powerups.length - 1; i >= 0; i--) {
if (powerups[i].x < -100) {
powerups[i].destroy();
powerups.splice(i, 1);
}
}
// Win condition
if (LK.getScore() >= 500) {
LK.showYouWin();
}
};