Code edit (1 edits merged)
Please save this source code
User prompt
Cluck the Gap: Mouth Bridge Builder
Initial prompt
Hiii i want my game to be where u open ur mouth and the board will get progressively longer then when u close ur mouth the board will hopefully be the long enough length to reach the other side of the land so the chicken will cross the board that looks like a road then on the next level it will do the same thing and for 3 levels like that
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); var facekit = LK.import("@upit/facekit.v1"); /**** * Classes ****/ var Bridge = Container.expand(function () { var self = Container.call(this); self.blocks = []; self.extending = false; self.currentLength = 0; self.maxLength = 500; self.placed = false; self.extend = function () { if (self.placed || self.currentLength >= self.maxLength) { return; } self.extending = true; self.currentLength += 10; // Update existing blocks for (var i = 0; i < self.blocks.length; i++) { self.blocks[i].width = self.currentLength; } // Create a new block if needed if (self.blocks.length === 0) { var block = self.attachAsset('bridgeBlock', { anchorX: 0, anchorY: 0.5, width: self.currentLength, height: 30 }); self.blocks.push(block); } }; self.place = function () { if (!self.extending || self.placed) { return; } self.extending = false; self.placed = true; LK.getSound('place').play(); return self.currentLength; }; self.reset = function () { self.currentLength = 0; self.extending = false; self.placed = false; for (var i = 0; i < self.blocks.length; i++) { self.blocks[i].width = 0; } }; return self; }); var Chicken = Container.expand(function () { var self = Container.call(this); var chickenGraphics = self.attachAsset('chicken', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.moving = false; self.fell = false; self.crossed = false; self.startMoving = function () { self.moving = true; }; self.update = function () { if (self.moving && !self.fell && !self.crossed) { self.x += self.speed; } }; self.fall = function () { if (self.fell) { return; } self.fell = true; tween(self, { y: self.y + 500, alpha: 0 }, { duration: 1000, easing: tween.easeIn, onFinish: function onFinish() { self.moving = false; } }); LK.getSound('fail').play(); }; self.crossComplete = function () { self.crossed = true; self.moving = false; LK.getSound('success').play(); LK.setScore(LK.getScore() + 1); }; self.reset = function (x, y) { self.x = x; self.y = y; self.alpha = 1; self.moving = false; self.fell = false; self.crossed = false; }; return self; }); var Gap = Container.expand(function () { var self = Container.call(this); var gapGraphics = self.attachAsset('gap', { anchorX: 0.5, anchorY: 0 }); return self; }); var Level = Container.expand(function (levelConfig) { var self = Container.call(this); // Initialize with default config if none provided self.config = levelConfig || { gapWidth: 300, startX: 300, endX: 800, platformY: 1800 }; // Create platforms self.startPlatform = new Platform(); self.startPlatform.x = self.config.startX; self.startPlatform.y = self.config.platformY; self.addChild(self.startPlatform); self.endPlatform = new Platform(); self.endPlatform.x = self.config.endX; self.endPlatform.y = self.config.platformY; self.addChild(self.endPlatform); // Create gap self.gap = new Gap(); self.gap.x = (self.config.startX + self.config.endX) / 2; self.gap.y = self.config.platformY; self.gap.width = self.config.gapWidth; self.addChild(self.gap); // Create bridge self.bridge = new Bridge(); self.bridge.x = self.config.startX + 100; // Bridge starts at edge of platform self.bridge.y = self.config.platformY - 15; // Slightly above platform self.addChild(self.bridge); // Create chicken self.chicken = new Chicken(); self.chicken.x = self.config.startX - 50; self.chicken.y = self.config.platformY - 50; self.addChild(self.chicken); self.reset = function () { self.bridge.reset(); self.chicken.reset(self.config.startX - 50, self.config.platformY - 50); }; return self; }); var Platform = Container.expand(function () { var self = Container.call(this); var platformGraphics = self.attachAsset('platform', { anchorX: 0.5, anchorY: 0 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game state variables var currentLevel = 0; var levels = []; var levelConfigs = [{ gapWidth: 300, startX: 600, endX: 1100, platformY: 1800 }, { gapWidth: 400, startX: 500, endX: 1200, platformY: 1800 }, { gapWidth: 500, startX: 400, endX: 1300, platformY: 1800 }]; var gameActive = false; var mouthWasOpen = false; var levelComplete = false; var allLevelsComplete = false; // Initialize UI elements var titleText = new Text2('Cluck the Gap', { size: 120, fill: 0x000000 }); titleText.anchor.set(0.5, 0.5); titleText.x = 2048 / 2; titleText.y = 400; game.addChild(titleText); var instructionText = new Text2('Open your mouth to extend the bridge\nClose your mouth to place it', { size: 60, fill: 0x000000 }); instructionText.anchor.set(0.5, 0.5); instructionText.x = 2048 / 2; instructionText.y = 550; game.addChild(instructionText); var startButton = LK.getAsset('bridgeBlock', { width: 300, height: 100, anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 700 }); game.addChild(startButton); var startText = new Text2('START', { size: 80, fill: 0xFFFFFF }); startText.anchor.set(0.5, 0.5); startText.x = 2048 / 2; startText.y = 700; game.addChild(startText); var levelText = new Text2('Level 1', { size: 80, fill: 0x000000 }); levelText.anchor.set(0.5, 0); levelText.visible = false; LK.gui.top.addChild(levelText); var scoreText = new Text2('Chickens Saved: 0', { size: 60, fill: 0x000000 }); scoreText.anchor.set(1, 0); scoreText.visible = false; LK.gui.topRight.addChild(scoreText); // Initialize game levels function setupLevels() { // Clear any existing levels if (levels.length > 0) { for (var i = 0; i < levels.length; i++) { if (levels[i].parent) { levels[i].parent.removeChild(levels[i]); } } levels = []; } // Create new levels for (var i = 0; i < levelConfigs.length; i++) { var level = new Level(levelConfigs[i]); level.visible = false; game.addChild(level); levels.push(level); } } // Start the game function startGame() { // Reset game state LK.setScore(0); currentLevel = 0; levelComplete = false; allLevelsComplete = false; gameActive = true; // Hide menu elements titleText.visible = false; instructionText.visible = false; startButton.visible = false; startText.visible = false; // Show game UI levelText.visible = true; levelText.setText('Level ' + (currentLevel + 1)); scoreText.visible = true; scoreText.setText('Chickens Saved: ' + LK.getScore()); // Setup levels setupLevels(); // Show current level levels[currentLevel].visible = true; // Start background music LK.playMusic('bgMusic'); } // Move to next level function nextLevel() { if (currentLevel >= levelConfigs.length - 1) { // All levels complete allLevelsComplete = true; LK.showYouWin(); return; } // Hide current level levels[currentLevel].visible = false; // Move to next level currentLevel++; // Show new level levelText.setText('Level ' + (currentLevel + 1)); levels[currentLevel].visible = true; levelComplete = false; } // Event handlers startButton.down = function () { startGame(); }; // Main game update loop game.update = function () { if (!gameActive) { return; } // Update current level var level = levels[currentLevel]; if (!level) { return; } // Check for mouth open/close to control bridge if (facekit.mouthOpen && !mouthWasOpen) { // Mouth just opened mouthWasOpen = true; } else if (facekit.mouthOpen && mouthWasOpen) { // Mouth staying open - extend bridge level.bridge.extend(); } else if (!facekit.mouthOpen && mouthWasOpen) { // Mouth just closed - place bridge mouthWasOpen = false; level.bridge.place(); // Start chicken moving level.chicken.startMoving(); } // Update chicken movement level.chicken.update(); // Check for chicken falling if (level.chicken.moving && !level.chicken.fell && !level.chicken.crossed) { // Check if chicken has reached the bridge if (level.chicken.x >= level.bridge.x) { // Check if bridge is long enough var requiredLength = level.config.endX - level.bridge.x; if (!level.bridge.placed || level.bridge.currentLength < requiredLength) { // Bridge not placed or too short - chicken falls level.chicken.fall(); // Reset level after delay LK.setTimeout(function () { level.reset(); }, 2000); } } // Check if chicken has successfully crossed if (level.chicken.x >= level.config.endX - 50) { // Chicken safely crossed level.chicken.crossComplete(); scoreText.setText('Chickens Saved: ' + LK.getScore()); // Mark level as complete levelComplete = true; // Move to next level after delay LK.setTimeout(function () { nextLevel(); }, 2000); } } }; // Play background music LK.playMusic('bgMusic', { fade: { start: 0, end: 0.3, duration: 1000 } });
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
var facekit = LK.import("@upit/facekit.v1");
/****
* Classes
****/
var Bridge = Container.expand(function () {
var self = Container.call(this);
self.blocks = [];
self.extending = false;
self.currentLength = 0;
self.maxLength = 500;
self.placed = false;
self.extend = function () {
if (self.placed || self.currentLength >= self.maxLength) {
return;
}
self.extending = true;
self.currentLength += 10;
// Update existing blocks
for (var i = 0; i < self.blocks.length; i++) {
self.blocks[i].width = self.currentLength;
}
// Create a new block if needed
if (self.blocks.length === 0) {
var block = self.attachAsset('bridgeBlock', {
anchorX: 0,
anchorY: 0.5,
width: self.currentLength,
height: 30
});
self.blocks.push(block);
}
};
self.place = function () {
if (!self.extending || self.placed) {
return;
}
self.extending = false;
self.placed = true;
LK.getSound('place').play();
return self.currentLength;
};
self.reset = function () {
self.currentLength = 0;
self.extending = false;
self.placed = false;
for (var i = 0; i < self.blocks.length; i++) {
self.blocks[i].width = 0;
}
};
return self;
});
var Chicken = Container.expand(function () {
var self = Container.call(this);
var chickenGraphics = self.attachAsset('chicken', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.moving = false;
self.fell = false;
self.crossed = false;
self.startMoving = function () {
self.moving = true;
};
self.update = function () {
if (self.moving && !self.fell && !self.crossed) {
self.x += self.speed;
}
};
self.fall = function () {
if (self.fell) {
return;
}
self.fell = true;
tween(self, {
y: self.y + 500,
alpha: 0
}, {
duration: 1000,
easing: tween.easeIn,
onFinish: function onFinish() {
self.moving = false;
}
});
LK.getSound('fail').play();
};
self.crossComplete = function () {
self.crossed = true;
self.moving = false;
LK.getSound('success').play();
LK.setScore(LK.getScore() + 1);
};
self.reset = function (x, y) {
self.x = x;
self.y = y;
self.alpha = 1;
self.moving = false;
self.fell = false;
self.crossed = false;
};
return self;
});
var Gap = Container.expand(function () {
var self = Container.call(this);
var gapGraphics = self.attachAsset('gap', {
anchorX: 0.5,
anchorY: 0
});
return self;
});
var Level = Container.expand(function (levelConfig) {
var self = Container.call(this);
// Initialize with default config if none provided
self.config = levelConfig || {
gapWidth: 300,
startX: 300,
endX: 800,
platformY: 1800
};
// Create platforms
self.startPlatform = new Platform();
self.startPlatform.x = self.config.startX;
self.startPlatform.y = self.config.platformY;
self.addChild(self.startPlatform);
self.endPlatform = new Platform();
self.endPlatform.x = self.config.endX;
self.endPlatform.y = self.config.platformY;
self.addChild(self.endPlatform);
// Create gap
self.gap = new Gap();
self.gap.x = (self.config.startX + self.config.endX) / 2;
self.gap.y = self.config.platformY;
self.gap.width = self.config.gapWidth;
self.addChild(self.gap);
// Create bridge
self.bridge = new Bridge();
self.bridge.x = self.config.startX + 100; // Bridge starts at edge of platform
self.bridge.y = self.config.platformY - 15; // Slightly above platform
self.addChild(self.bridge);
// Create chicken
self.chicken = new Chicken();
self.chicken.x = self.config.startX - 50;
self.chicken.y = self.config.platformY - 50;
self.addChild(self.chicken);
self.reset = function () {
self.bridge.reset();
self.chicken.reset(self.config.startX - 50, self.config.platformY - 50);
};
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
var platformGraphics = self.attachAsset('platform', {
anchorX: 0.5,
anchorY: 0
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game state variables
var currentLevel = 0;
var levels = [];
var levelConfigs = [{
gapWidth: 300,
startX: 600,
endX: 1100,
platformY: 1800
}, {
gapWidth: 400,
startX: 500,
endX: 1200,
platformY: 1800
}, {
gapWidth: 500,
startX: 400,
endX: 1300,
platformY: 1800
}];
var gameActive = false;
var mouthWasOpen = false;
var levelComplete = false;
var allLevelsComplete = false;
// Initialize UI elements
var titleText = new Text2('Cluck the Gap', {
size: 120,
fill: 0x000000
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 400;
game.addChild(titleText);
var instructionText = new Text2('Open your mouth to extend the bridge\nClose your mouth to place it', {
size: 60,
fill: 0x000000
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 2048 / 2;
instructionText.y = 550;
game.addChild(instructionText);
var startButton = LK.getAsset('bridgeBlock', {
width: 300,
height: 100,
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 700
});
game.addChild(startButton);
var startText = new Text2('START', {
size: 80,
fill: 0xFFFFFF
});
startText.anchor.set(0.5, 0.5);
startText.x = 2048 / 2;
startText.y = 700;
game.addChild(startText);
var levelText = new Text2('Level 1', {
size: 80,
fill: 0x000000
});
levelText.anchor.set(0.5, 0);
levelText.visible = false;
LK.gui.top.addChild(levelText);
var scoreText = new Text2('Chickens Saved: 0', {
size: 60,
fill: 0x000000
});
scoreText.anchor.set(1, 0);
scoreText.visible = false;
LK.gui.topRight.addChild(scoreText);
// Initialize game levels
function setupLevels() {
// Clear any existing levels
if (levels.length > 0) {
for (var i = 0; i < levels.length; i++) {
if (levels[i].parent) {
levels[i].parent.removeChild(levels[i]);
}
}
levels = [];
}
// Create new levels
for (var i = 0; i < levelConfigs.length; i++) {
var level = new Level(levelConfigs[i]);
level.visible = false;
game.addChild(level);
levels.push(level);
}
}
// Start the game
function startGame() {
// Reset game state
LK.setScore(0);
currentLevel = 0;
levelComplete = false;
allLevelsComplete = false;
gameActive = true;
// Hide menu elements
titleText.visible = false;
instructionText.visible = false;
startButton.visible = false;
startText.visible = false;
// Show game UI
levelText.visible = true;
levelText.setText('Level ' + (currentLevel + 1));
scoreText.visible = true;
scoreText.setText('Chickens Saved: ' + LK.getScore());
// Setup levels
setupLevels();
// Show current level
levels[currentLevel].visible = true;
// Start background music
LK.playMusic('bgMusic');
}
// Move to next level
function nextLevel() {
if (currentLevel >= levelConfigs.length - 1) {
// All levels complete
allLevelsComplete = true;
LK.showYouWin();
return;
}
// Hide current level
levels[currentLevel].visible = false;
// Move to next level
currentLevel++;
// Show new level
levelText.setText('Level ' + (currentLevel + 1));
levels[currentLevel].visible = true;
levelComplete = false;
}
// Event handlers
startButton.down = function () {
startGame();
};
// Main game update loop
game.update = function () {
if (!gameActive) {
return;
}
// Update current level
var level = levels[currentLevel];
if (!level) {
return;
}
// Check for mouth open/close to control bridge
if (facekit.mouthOpen && !mouthWasOpen) {
// Mouth just opened
mouthWasOpen = true;
} else if (facekit.mouthOpen && mouthWasOpen) {
// Mouth staying open - extend bridge
level.bridge.extend();
} else if (!facekit.mouthOpen && mouthWasOpen) {
// Mouth just closed - place bridge
mouthWasOpen = false;
level.bridge.place();
// Start chicken moving
level.chicken.startMoving();
}
// Update chicken movement
level.chicken.update();
// Check for chicken falling
if (level.chicken.moving && !level.chicken.fell && !level.chicken.crossed) {
// Check if chicken has reached the bridge
if (level.chicken.x >= level.bridge.x) {
// Check if bridge is long enough
var requiredLength = level.config.endX - level.bridge.x;
if (!level.bridge.placed || level.bridge.currentLength < requiredLength) {
// Bridge not placed or too short - chicken falls
level.chicken.fall();
// Reset level after delay
LK.setTimeout(function () {
level.reset();
}, 2000);
}
}
// Check if chicken has successfully crossed
if (level.chicken.x >= level.config.endX - 50) {
// Chicken safely crossed
level.chicken.crossComplete();
scoreText.setText('Chickens Saved: ' + LK.getScore());
// Mark level as complete
levelComplete = true;
// Move to next level after delay
LK.setTimeout(function () {
nextLevel();
}, 2000);
}
}
};
// Play background music
LK.playMusic('bgMusic', {
fade: {
start: 0,
end: 0.3,
duration: 1000
}
});