User prompt
reset the music volume when you press mute
User prompt
Please fix the bug: 'Uncaught TypeError: LK.pauseMusic is not a function' in or related to this line: 'LK.pauseMusic();' Line Number: 64
User prompt
every time I mute it, the music doesn't start over, it picks up where it left off
User prompt
add music mute button
User prompt
add background
User prompt
add music
User prompt
and when I select the acceleration keys, keep the text above it.
User prompt
Put 5x and 10x acceleration keys too
User prompt
put game acceleration buttons at the bottom of the screen. one for 1x speed and one for 2x speed
User prompt
if the team I selected doesn't win, I get a lost screen
User prompt
Please fix the bug: 'ReferenceError: scoreText is not defined' in or related to this line: 'scoreText.setText('Rock: ' + rockCount + ' Paper: ' + paperCount + ' Scissors: ' + scissorsCount);' Line Number: 288
User prompt
add a menu screen to choose our team before the game starts
User prompt
let them be in a round arena
Code edit (1 edits merged)
Please save this source code
User prompt
Rock Paper Scissors Battle Arena
Initial prompt
Give me a rock-paper-scissors game. 15 of each, and when they hit each other, the stronger one turns the other one to himself.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var TeamButton = Container.expand(function (teamType, yPosition) {
var self = Container.call(this);
self.teamType = teamType;
self.selected = false;
// Button background
self.buttonBg = self.attachAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5
});
// Team icon
var assetNames = ['rock', 'paper', 'scissors'];
self.teamIcon = self.attachAsset(assetNames[teamType], {
anchorX: 0.5,
anchorY: 0.5,
x: -100,
scaleX: 1.5,
scaleY: 1.5
});
// Team name text
var teamNames = ['ROCK', 'PAPER', 'SCISSORS'];
self.teamText = new Text2(teamNames[teamType], {
size: 60,
fill: 0xFFFFFF
});
self.teamText.anchor.set(0.5, 0.5);
self.teamText.x = 50;
self.addChild(self.teamText);
// Position button
self.x = 2048 / 2;
self.y = yPosition;
self.setSelected = function (selected) {
self.selected = selected;
if (selected) {
self.removeChild(self.buttonBg);
self.buttonBg = self.attachAsset('selectedButton', {
anchorX: 0.5,
anchorY: 0.5
});
} else {
self.removeChild(self.buttonBg);
self.buttonBg = self.attachAsset('menuButton', {
anchorX: 0.5,
anchorY: 0.5
});
}
};
self.down = function (x, y, obj) {
if (menuActive) {
selectTeam(self.teamType);
}
};
return self;
});
var Unit = Container.expand(function (type) {
var self = Container.call(this);
// Store unit type (0=rock, 1=paper, 2=scissors)
self.type = type;
// Create visual representation
var assetNames = ['rock', 'paper', 'scissors'];
var graphics = self.attachAsset(assetNames[type], {
anchorX: 0.5,
anchorY: 0.5
});
// Movement properties
self.speedX = (Math.random() - 0.5) * 4;
self.speedY = (Math.random() - 0.5) * 4;
// Ensure minimum speed
if (Math.abs(self.speedX) < 1) self.speedX = self.speedX > 0 ? 1 : -1;
if (Math.abs(self.speedY) < 1) self.speedY = self.speedY > 0 ? 1 : -1;
// Collision state tracking
self.lastColliding = {};
self.update = function () {
// Move unit
self.x += self.speedX;
self.y += self.speedY;
// Bounce off circular arena walls
var centerX = 2048 / 2;
var centerY = 2732 / 2;
var arenaRadius = 900; // Arena radius
// Calculate distance from center
var dx = self.x - centerX;
var dy = self.y - centerY;
var distanceFromCenter = Math.sqrt(dx * dx + dy * dy);
// If unit is outside arena, bounce it back
if (distanceFromCenter > arenaRadius) {
// Calculate angle from center to unit
var angle = Math.atan2(dy, dx);
// Position unit at arena edge
self.x = centerX + Math.cos(angle) * arenaRadius;
self.y = centerY + Math.sin(angle) * arenaRadius;
// Reflect velocity vector off the circular boundary
var normalX = Math.cos(angle);
var normalY = Math.sin(angle);
var dotProduct = self.speedX * normalX + self.speedY * normalY;
self.speedX = self.speedX - 2 * dotProduct * normalX;
self.speedY = self.speedY - 2 * dotProduct * normalY;
}
};
self.convertTo = function (newType) {
if (self.type === newType) return;
self.type = newType;
// Remove old graphics
while (self.children.length > 0) {
self.removeChild(self.children[0]);
}
// Add new graphics
var assetNames = ['rock', 'paper', 'scissors'];
var newGraphics = self.attachAsset(assetNames[newType], {
anchorX: 0.5,
anchorY: 0.5
});
// Conversion animation
newGraphics.scaleX = 0.1;
newGraphics.scaleY = 0.1;
tween(newGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.bounceOut
});
LK.getSound('convert').play();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2C3E50
});
/****
* Game Code
****/
var units = [];
var rockCount = 15;
var paperCount = 15;
var scissorsCount = 15;
var gameEnded = false;
var menuActive = true;
var selectedTeam = -1;
var teamButtons = [];
// Create menu title
var menuTitle = new Text2('Choose Your Team', {
size: 120,
fill: 0xFFFFFF
});
menuTitle.anchor.set(0.5, 0.5);
menuTitle.x = 2048 / 2;
menuTitle.y = 400;
game.addChild(menuTitle);
// Create team selection buttons
for (var i = 0; i < 3; i++) {
var button = new TeamButton(i, 800 + i * 200);
teamButtons.push(button);
game.addChild(button);
}
// Create start button
var startButton = new Text2('START BATTLE', {
size: 80,
fill: 0x27ae60
});
startButton.anchor.set(0.5, 0.5);
startButton.x = 2048 / 2;
startButton.y = 1800;
game.addChild(startButton);
function selectTeam(teamType) {
selectedTeam = teamType;
// Update button states
for (var i = 0; i < teamButtons.length; i++) {
teamButtons[i].setSelected(i === teamType);
}
// Make start button clickable
startButton.tint = 0x27ae60;
}
function startGame() {
if (selectedTeam === -1) return;
menuActive = false;
// Remove menu elements
game.removeChild(menuTitle);
game.removeChild(startButton);
for (var i = 0; i < teamButtons.length; i++) {
game.removeChild(teamButtons[i]);
}
// Create arena boundary visual
var arena = game.addChild(LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2,
alpha: 0.3
}));
// Initialize game
initializeGame();
}
// Add click handler for start button
game.down = function (x, y, obj) {
if (menuActive) {
// Check if start button was clicked
var startBounds = {
left: startButton.x - 200,
right: startButton.x + 200,
top: startButton.y - 50,
bottom: startButton.y + 50
};
if (x >= startBounds.left && x <= startBounds.right && y >= startBounds.top && y <= startBounds.bottom) {
startGame();
}
}
};
function initializeGame() {
// Create score display
var scoreText = new Text2('Rock: 15 Paper: 15 Scissors: 15', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Show selected team indicator
var teamNames = ['ROCK', 'PAPER', 'SCISSORS'];
var teamIndicator = new Text2('You chose: ' + teamNames[selectedTeam], {
size: 60,
fill: 0xFFD700
});
teamIndicator.anchor.set(0.5, 0);
teamIndicator.y = 100;
LK.gui.top.addChild(teamIndicator);
// Create units
for (var i = 0; i < 45; i++) {
var type = Math.floor(i / 15); // 0-14 = rock, 15-29 = paper, 30-44 = scissors
var unit = new Unit(type);
// Random position within circular arena
var centerX = 2048 / 2;
var centerY = 2732 / 2;
var arenaRadius = 850; // Slightly smaller than boundary for spawning
// Generate random position within circle
var angle = Math.random() * Math.PI * 2;
var distance = Math.random() * arenaRadius;
unit.x = centerX + Math.cos(angle) * distance;
unit.y = centerY + Math.sin(angle) * distance;
units.push(unit);
game.addChild(unit);
}
}
function updateScore() {
rockCount = 0;
paperCount = 0;
scissorsCount = 0;
for (var i = 0; i < units.length; i++) {
if (units[i].type === 0) rockCount++;else if (units[i].type === 1) paperCount++;else if (units[i].type === 2) scissorsCount++;
}
scoreText.setText('Rock: ' + rockCount + ' Paper: ' + paperCount + ' Scissors: ' + scissorsCount);
}
function checkWinCondition() {
if (gameEnded) return;
var activeTypes = 0;
if (rockCount > 0) activeTypes++;
if (paperCount > 0) activeTypes++;
if (scissorsCount > 0) activeTypes++;
if (activeTypes === 1) {
gameEnded = true;
var winner = '';
if (rockCount > 0) winner = 'Rock';else if (paperCount > 0) winner = 'Paper';else winner = 'Scissors';
LK.getSound('victory').play();
// Flash victory effect
LK.effects.flashScreen(0xFFD700, 2000);
LK.setTimeout(function () {
LK.showYouWin();
}, 2000);
}
}
function checkCollisions() {
for (var i = 0; i < units.length; i++) {
var unit1 = units[i];
for (var j = i + 1; j < units.length; j++) {
var unit2 = units[j];
// Check if units are colliding
var dx = unit1.x - unit2.x;
var dy = unit1.y - unit2.y;
var distance = Math.sqrt(dx * dx + dy * dy);
var isColliding = distance < 50;
var wasColliding = unit1.lastColliding[j] || false;
if (isColliding && !wasColliding) {
// Collision just started
if (unit1.type !== unit2.type) {
// Different types - battle!
var winner = -1;
// Rock (0) beats Scissors (2)
if (unit1.type === 0 && unit2.type === 2) winner = 0;else if (unit1.type === 2 && unit2.type === 0) winner = 1;
// Paper (1) beats Rock (0)
else if (unit1.type === 1 && unit2.type === 0) winner = 0;else if (unit1.type === 0 && unit2.type === 1) winner = 1;
// Scissors (2) beats Paper (1)
else if (unit1.type === 2 && unit2.type === 1) winner = 0;else if (unit1.type === 1 && unit2.type === 2) winner = 1;
if (winner === 0) {
unit2.convertTo(unit1.type);
} else if (winner === 1) {
unit1.convertTo(unit2.type);
}
}
// Bounce units apart
var bounceForce = 2;
var angle = Math.atan2(dy, dx);
unit1.speedX = Math.cos(angle) * bounceForce;
unit1.speedY = Math.sin(angle) * bounceForce;
unit2.speedX = -Math.cos(angle) * bounceForce;
unit2.speedY = -Math.sin(angle) * bounceForce;
}
// Update collision state
unit1.lastColliding[j] = isColliding;
if (!unit2.lastColliding) unit2.lastColliding = {};
unit2.lastColliding[i] = isColliding;
}
}
}
game.update = function () {
if (menuActive || gameEnded) return;
checkCollisions();
// Update score every 30 ticks (0.5 seconds)
if (LK.ticks % 30 === 0) {
updateScore();
checkWinCondition();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -5,8 +5,61 @@
/****
* Classes
****/
+var TeamButton = Container.expand(function (teamType, yPosition) {
+ var self = Container.call(this);
+ self.teamType = teamType;
+ self.selected = false;
+ // Button background
+ self.buttonBg = self.attachAsset('menuButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Team icon
+ var assetNames = ['rock', 'paper', 'scissors'];
+ self.teamIcon = self.attachAsset(assetNames[teamType], {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: -100,
+ scaleX: 1.5,
+ scaleY: 1.5
+ });
+ // Team name text
+ var teamNames = ['ROCK', 'PAPER', 'SCISSORS'];
+ self.teamText = new Text2(teamNames[teamType], {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ self.teamText.anchor.set(0.5, 0.5);
+ self.teamText.x = 50;
+ self.addChild(self.teamText);
+ // Position button
+ self.x = 2048 / 2;
+ self.y = yPosition;
+ self.setSelected = function (selected) {
+ self.selected = selected;
+ if (selected) {
+ self.removeChild(self.buttonBg);
+ self.buttonBg = self.attachAsset('selectedButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ } else {
+ self.removeChild(self.buttonBg);
+ self.buttonBg = self.attachAsset('menuButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ }
+ };
+ self.down = function (x, y, obj) {
+ if (menuActive) {
+ selectTeam(self.teamType);
+ }
+ };
+ return self;
+});
var Unit = Container.expand(function (type) {
var self = Container.call(this);
// Store unit type (0=rock, 1=paper, 2=scissors)
self.type = type;
@@ -93,39 +146,113 @@
var rockCount = 15;
var paperCount = 15;
var scissorsCount = 15;
var gameEnded = false;
-// Create arena boundary visual
-var arena = game.addChild(LK.getAsset('arena', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: 2048 / 2,
- y: 2732 / 2,
- alpha: 0.3
-}));
-// Create score display
-var scoreText = new Text2('Rock: 15 Paper: 15 Scissors: 15', {
- size: 80,
+var menuActive = true;
+var selectedTeam = -1;
+var teamButtons = [];
+// Create menu title
+var menuTitle = new Text2('Choose Your Team', {
+ size: 120,
fill: 0xFFFFFF
});
-scoreText.anchor.set(0.5, 0);
-LK.gui.top.addChild(scoreText);
-// Create units
-for (var i = 0; i < 45; i++) {
- var type = Math.floor(i / 15); // 0-14 = rock, 15-29 = paper, 30-44 = scissors
- var unit = new Unit(type);
- // Random position within circular arena
- var centerX = 2048 / 2;
- var centerY = 2732 / 2;
- var arenaRadius = 850; // Slightly smaller than boundary for spawning
- // Generate random position within circle
- var angle = Math.random() * Math.PI * 2;
- var distance = Math.random() * arenaRadius;
- unit.x = centerX + Math.cos(angle) * distance;
- unit.y = centerY + Math.sin(angle) * distance;
- units.push(unit);
- game.addChild(unit);
+menuTitle.anchor.set(0.5, 0.5);
+menuTitle.x = 2048 / 2;
+menuTitle.y = 400;
+game.addChild(menuTitle);
+// Create team selection buttons
+for (var i = 0; i < 3; i++) {
+ var button = new TeamButton(i, 800 + i * 200);
+ teamButtons.push(button);
+ game.addChild(button);
}
+// Create start button
+var startButton = new Text2('START BATTLE', {
+ size: 80,
+ fill: 0x27ae60
+});
+startButton.anchor.set(0.5, 0.5);
+startButton.x = 2048 / 2;
+startButton.y = 1800;
+game.addChild(startButton);
+function selectTeam(teamType) {
+ selectedTeam = teamType;
+ // Update button states
+ for (var i = 0; i < teamButtons.length; i++) {
+ teamButtons[i].setSelected(i === teamType);
+ }
+ // Make start button clickable
+ startButton.tint = 0x27ae60;
+}
+function startGame() {
+ if (selectedTeam === -1) return;
+ menuActive = false;
+ // Remove menu elements
+ game.removeChild(menuTitle);
+ game.removeChild(startButton);
+ for (var i = 0; i < teamButtons.length; i++) {
+ game.removeChild(teamButtons[i]);
+ }
+ // Create arena boundary visual
+ var arena = game.addChild(LK.getAsset('arena', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 2048 / 2,
+ y: 2732 / 2,
+ alpha: 0.3
+ }));
+ // Initialize game
+ initializeGame();
+}
+// Add click handler for start button
+game.down = function (x, y, obj) {
+ if (menuActive) {
+ // Check if start button was clicked
+ var startBounds = {
+ left: startButton.x - 200,
+ right: startButton.x + 200,
+ top: startButton.y - 50,
+ bottom: startButton.y + 50
+ };
+ if (x >= startBounds.left && x <= startBounds.right && y >= startBounds.top && y <= startBounds.bottom) {
+ startGame();
+ }
+ }
+};
+function initializeGame() {
+ // Create score display
+ var scoreText = new Text2('Rock: 15 Paper: 15 Scissors: 15', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ scoreText.anchor.set(0.5, 0);
+ LK.gui.top.addChild(scoreText);
+ // Show selected team indicator
+ var teamNames = ['ROCK', 'PAPER', 'SCISSORS'];
+ var teamIndicator = new Text2('You chose: ' + teamNames[selectedTeam], {
+ size: 60,
+ fill: 0xFFD700
+ });
+ teamIndicator.anchor.set(0.5, 0);
+ teamIndicator.y = 100;
+ LK.gui.top.addChild(teamIndicator);
+ // Create units
+ for (var i = 0; i < 45; i++) {
+ var type = Math.floor(i / 15); // 0-14 = rock, 15-29 = paper, 30-44 = scissors
+ var unit = new Unit(type);
+ // Random position within circular arena
+ var centerX = 2048 / 2;
+ var centerY = 2732 / 2;
+ var arenaRadius = 850; // Slightly smaller than boundary for spawning
+ // Generate random position within circle
+ var angle = Math.random() * Math.PI * 2;
+ var distance = Math.random() * arenaRadius;
+ unit.x = centerX + Math.cos(angle) * distance;
+ unit.y = centerY + Math.sin(angle) * distance;
+ units.push(unit);
+ game.addChild(unit);
+ }
+}
function updateScore() {
rockCount = 0;
paperCount = 0;
scissorsCount = 0;
@@ -195,9 +322,9 @@
}
}
}
game.update = function () {
- if (gameEnded) return;
+ if (menuActive || gameEnded) return;
checkCollisions();
// Update score every 30 ticks (0.5 seconds)
if (LK.ticks % 30 === 0) {
updateScore();