/****
* 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();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,262 @@
-/****
+/****
+* 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: 0x000000
-});
\ No newline at end of file
+ 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();
+ }
+};
\ No newline at end of file