/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 1 }); self.speed = gameSpeed; self.update = function () { self.x -= self.speed; // Simple enemy animation enemyGraphics.scaleX = 1 + Math.sin(LK.ticks * 0.15) * 0.1; enemyGraphics.scaleY = 1 + Math.sin(LK.ticks * 0.15) * 0.1; }; return self; }); var Ground = Container.expand(function () { var self = Container.call(this); var groundGraphics = self.attachAsset('ground', { anchorX: 0, anchorY: 0 }); self.speed = gameSpeed; self.update = function () { self.x -= self.speed; }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 1 }); self.speed = gameSpeed; self.update = function () { self.x -= self.speed; }; return self; }); var Ring = Container.expand(function () { var self = Container.call(this); var ringGraphics = self.attachAsset('ring', { anchorX: 0.5, anchorY: 0.5 }); self.speed = gameSpeed; self.collected = false; self.update = function () { self.x -= self.speed; // Floating animation ringGraphics.y = Math.sin(LK.ticks * 0.1) * 5; ringGraphics.rotation += 0.1; }; return self; }); var Sonic = Container.expand(function () { var self = Container.call(this); var sonicGraphics = self.attachAsset('sonic', { anchorX: 0.5, anchorY: 0.5 }); self.velocityY = 0; self.isJumping = false; self.groundY = 0; self.jump = function () { if (!self.isJumping) { self.velocityY = -18; self.isJumping = true; LK.getSound('jump').play(); } }; self.update = function () { // Gravity self.velocityY += 0.8; self.y += self.velocityY; // Check if landed if (self.y >= self.groundY) { self.y = self.groundY; self.velocityY = 0; self.isJumping = false; } // Simple running animation sonicGraphics.rotation += 0.2; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ var gameSpeed = 6; var groundLevel = 2400; var spawnDistance = 0; var distanceScore = 0; var speedIncreaseTimer = 0; var currentMusicTrack = 'bgmusic'; var musicSpeedThreshold = 12; // Game objects arrays var groundPieces = []; var obstacles = []; var rings = []; var enemies = []; // Create Sonic var sonic = game.addChild(new Sonic()); sonic.x = 300; sonic.y = groundLevel - 100; sonic.groundY = groundLevel - 100; // UI Elements var ringScoreText = new Text2('Anillos: 0', { size: 60, fill: 0xFFFFFF }); ringScoreText.anchor.set(0, 0); LK.gui.topLeft.addChild(ringScoreText); ringScoreText.x = 120; ringScoreText.y = 20; var distanceText = new Text2('Distancia: 0m', { size: 50, fill: 0xFFFFFF }); distanceText.anchor.set(0.5, 0); LK.gui.top.addChild(distanceText); distanceText.y = 20; // Initialize ground for (var i = 0; i < 15; i++) { var ground = game.addChild(new Ground()); ground.x = i * 200; ground.y = groundLevel; groundPieces.push(ground); } // Input handling game.down = function (x, y, obj) { sonic.jump(); }; function spawnObstacle() { var obstacle = game.addChild(new Obstacle()); obstacle.x = 2048 + 100; obstacle.y = groundLevel; obstacles.push(obstacle); } function spawnRing() { var ring = game.addChild(new Ring()); ring.x = 2048 + 100; ring.y = groundLevel - 80 - Math.random() * 120; rings.push(ring); } function spawnEnemy() { var enemy = game.addChild(new Enemy()); enemy.x = 2048 + 100; enemy.y = groundLevel; enemies.push(enemy); } function updateScore() { ringScoreText.setText('Anillos: ' + LK.getScore()); distanceText.setText('Distancia: ' + Math.floor(distanceScore) + 'm'); } game.update = function () { // Update distance score distanceScore += gameSpeed * 0.1; // Increase speed over time speedIncreaseTimer++; if (speedIncreaseTimer >= 300) { // Every 5 seconds gameSpeed += 0.5; speedIncreaseTimer = 0; // Switch to speed-up music when game gets faster if (gameSpeed >= musicSpeedThreshold && currentMusicTrack !== 'speedup_music') { currentMusicTrack = 'speedup_music'; LK.playMusic('speedup_music', { fade: { start: 0.3, end: 0.9, duration: 1000 } }); } } // Update spawn distance spawnDistance += gameSpeed; // Spawn objects if (spawnDistance >= 300) { var rand = Math.random(); if (rand < 0.3) { spawnObstacle(); } else if (rand < 0.6) { spawnRing(); } else if (rand < 0.8) { spawnEnemy(); } spawnDistance = 0; } // Update ground pieces for (var i = groundPieces.length - 1; i >= 0; i--) { var ground = groundPieces[i]; ground.speed = gameSpeed; if (ground.x <= -200) { ground.x = (groundPieces.length - 1) * 200; } } // Update and check obstacles for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; obstacle.speed = gameSpeed; if (obstacle.x < -100) { obstacle.destroy(); obstacles.splice(i, 1); continue; } // Collision with sonic if (sonic.intersects(obstacle)) { LK.getSound('hit').play(); LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); return; } } // Update and check rings for (var i = rings.length - 1; i >= 0; i--) { var ring = rings[i]; ring.speed = gameSpeed; if (ring.x < -100) { ring.destroy(); rings.splice(i, 1); continue; } // Collection check if (!ring.collected && sonic.intersects(ring)) { ring.collected = true; LK.setScore(LK.getScore() + 1); LK.getSound('ring').play(); // Ring collection effect tween(ring, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 300, onFinish: function onFinish() { ring.destroy(); } }); rings.splice(i, 1); } } // Update and check enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; enemy.speed = gameSpeed; if (enemy.x < -100) { enemy.destroy(); enemies.splice(i, 1); continue; } // Collision with sonic if (sonic.intersects(enemy)) { LK.getSound('hit').play(); LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); return; } } // Update UI updateScore(); // Win condition - collect 50 rings if (LK.getScore() >= 50) { LK.playMusic('victory_music', { loop: false, fade: { start: 0.2, end: 0.7, duration: 800 } }); LK.showYouWin(); return; } }; // Start background music with fade-in effect LK.playMusic('bgmusic', { fade: { start: 0, end: 0.8, duration: 1500 } });
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 1
});
self.speed = gameSpeed;
self.update = function () {
self.x -= self.speed;
// Simple enemy animation
enemyGraphics.scaleX = 1 + Math.sin(LK.ticks * 0.15) * 0.1;
enemyGraphics.scaleY = 1 + Math.sin(LK.ticks * 0.15) * 0.1;
};
return self;
});
var Ground = Container.expand(function () {
var self = Container.call(this);
var groundGraphics = self.attachAsset('ground', {
anchorX: 0,
anchorY: 0
});
self.speed = gameSpeed;
self.update = function () {
self.x -= self.speed;
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 1
});
self.speed = gameSpeed;
self.update = function () {
self.x -= self.speed;
};
return self;
});
var Ring = Container.expand(function () {
var self = Container.call(this);
var ringGraphics = self.attachAsset('ring', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = gameSpeed;
self.collected = false;
self.update = function () {
self.x -= self.speed;
// Floating animation
ringGraphics.y = Math.sin(LK.ticks * 0.1) * 5;
ringGraphics.rotation += 0.1;
};
return self;
});
var Sonic = Container.expand(function () {
var self = Container.call(this);
var sonicGraphics = self.attachAsset('sonic', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityY = 0;
self.isJumping = false;
self.groundY = 0;
self.jump = function () {
if (!self.isJumping) {
self.velocityY = -18;
self.isJumping = true;
LK.getSound('jump').play();
}
};
self.update = function () {
// Gravity
self.velocityY += 0.8;
self.y += self.velocityY;
// Check if landed
if (self.y >= self.groundY) {
self.y = self.groundY;
self.velocityY = 0;
self.isJumping = false;
}
// Simple running animation
sonicGraphics.rotation += 0.2;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var gameSpeed = 6;
var groundLevel = 2400;
var spawnDistance = 0;
var distanceScore = 0;
var speedIncreaseTimer = 0;
var currentMusicTrack = 'bgmusic';
var musicSpeedThreshold = 12;
// Game objects arrays
var groundPieces = [];
var obstacles = [];
var rings = [];
var enemies = [];
// Create Sonic
var sonic = game.addChild(new Sonic());
sonic.x = 300;
sonic.y = groundLevel - 100;
sonic.groundY = groundLevel - 100;
// UI Elements
var ringScoreText = new Text2('Anillos: 0', {
size: 60,
fill: 0xFFFFFF
});
ringScoreText.anchor.set(0, 0);
LK.gui.topLeft.addChild(ringScoreText);
ringScoreText.x = 120;
ringScoreText.y = 20;
var distanceText = new Text2('Distancia: 0m', {
size: 50,
fill: 0xFFFFFF
});
distanceText.anchor.set(0.5, 0);
LK.gui.top.addChild(distanceText);
distanceText.y = 20;
// Initialize ground
for (var i = 0; i < 15; i++) {
var ground = game.addChild(new Ground());
ground.x = i * 200;
ground.y = groundLevel;
groundPieces.push(ground);
}
// Input handling
game.down = function (x, y, obj) {
sonic.jump();
};
function spawnObstacle() {
var obstacle = game.addChild(new Obstacle());
obstacle.x = 2048 + 100;
obstacle.y = groundLevel;
obstacles.push(obstacle);
}
function spawnRing() {
var ring = game.addChild(new Ring());
ring.x = 2048 + 100;
ring.y = groundLevel - 80 - Math.random() * 120;
rings.push(ring);
}
function spawnEnemy() {
var enemy = game.addChild(new Enemy());
enemy.x = 2048 + 100;
enemy.y = groundLevel;
enemies.push(enemy);
}
function updateScore() {
ringScoreText.setText('Anillos: ' + LK.getScore());
distanceText.setText('Distancia: ' + Math.floor(distanceScore) + 'm');
}
game.update = function () {
// Update distance score
distanceScore += gameSpeed * 0.1;
// Increase speed over time
speedIncreaseTimer++;
if (speedIncreaseTimer >= 300) {
// Every 5 seconds
gameSpeed += 0.5;
speedIncreaseTimer = 0;
// Switch to speed-up music when game gets faster
if (gameSpeed >= musicSpeedThreshold && currentMusicTrack !== 'speedup_music') {
currentMusicTrack = 'speedup_music';
LK.playMusic('speedup_music', {
fade: {
start: 0.3,
end: 0.9,
duration: 1000
}
});
}
}
// Update spawn distance
spawnDistance += gameSpeed;
// Spawn objects
if (spawnDistance >= 300) {
var rand = Math.random();
if (rand < 0.3) {
spawnObstacle();
} else if (rand < 0.6) {
spawnRing();
} else if (rand < 0.8) {
spawnEnemy();
}
spawnDistance = 0;
}
// Update ground pieces
for (var i = groundPieces.length - 1; i >= 0; i--) {
var ground = groundPieces[i];
ground.speed = gameSpeed;
if (ground.x <= -200) {
ground.x = (groundPieces.length - 1) * 200;
}
}
// Update and check obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
obstacle.speed = gameSpeed;
if (obstacle.x < -100) {
obstacle.destroy();
obstacles.splice(i, 1);
continue;
}
// Collision with sonic
if (sonic.intersects(obstacle)) {
LK.getSound('hit').play();
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
}
// Update and check rings
for (var i = rings.length - 1; i >= 0; i--) {
var ring = rings[i];
ring.speed = gameSpeed;
if (ring.x < -100) {
ring.destroy();
rings.splice(i, 1);
continue;
}
// Collection check
if (!ring.collected && sonic.intersects(ring)) {
ring.collected = true;
LK.setScore(LK.getScore() + 1);
LK.getSound('ring').play();
// Ring collection effect
tween(ring, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300,
onFinish: function onFinish() {
ring.destroy();
}
});
rings.splice(i, 1);
}
}
// Update and check enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
enemy.speed = gameSpeed;
if (enemy.x < -100) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Collision with sonic
if (sonic.intersects(enemy)) {
LK.getSound('hit').play();
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
}
// Update UI
updateScore();
// Win condition - collect 50 rings
if (LK.getScore() >= 50) {
LK.playMusic('victory_music', {
loop: false,
fade: {
start: 0.2,
end: 0.7,
duration: 800
}
});
LK.showYouWin();
return;
}
};
// Start background music with fade-in effect
LK.playMusic('bgmusic', {
fade: {
start: 0,
end: 0.8,
duration: 1500
}
});
creates a yellow ring like Sonic's. In-Game asset. 2d
Make a Sonic enemy but in Roblox form. In-Game asset. High contrast. No shadows. 2d
make the typical Sonic 1 floor. In-Game asset. 2d. High contrast. No shadows. 2d
Make an obstacle like Sonic's. In-Game asset. High contrast. No shadows. 2d
make sonic into ball form. In-Game asset. High contrast. No shadows. 2d