/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Button = Container.expand(function (text, assetType) {
var self = Container.call(this);
var buttonGraphics = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0.5
});
var buttonText = new Text2(text, {
size: 30,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
self.addChild(buttonText);
self.down = function (x, y, obj) {
LK.getSound('select').play();
tween(buttonGraphics, {
scaleX: 0.95,
scaleY: 0.95
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(buttonGraphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 100,
easing: tween.easeIn
});
}
});
if (text === 'Back') {
switchToSelectionMode();
}
};
return self;
});
var Character = Container.expand(function (characterType) {
var self = Container.call(this);
self.characterType = characterType;
self.isAnimating = false;
var characterGraphics = self.attachAsset(characterType, {
anchorX: 0.5,
anchorY: 0.5
});
// Character name text
var nameText = new Text2(characterType.charAt(0).toUpperCase() + characterType.slice(1), {
size: 60,
fill: 0xFFFFFF
});
nameText.anchor.set(0.5, 0.5);
nameText.y = 250;
self.addChild(nameText);
self.animateSelection = function () {
if (self.isAnimating) return;
self.isAnimating = true;
tween(characterGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(characterGraphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 200,
easing: tween.easeIn,
onFinish: function onFinish() {
self.isAnimating = false;
}
});
}
});
};
self.down = function (x, y, obj) {
if (gameState === 'selection') {
LK.getSound('select').play();
self.animateSelection();
selectedCharacter = self.characterType;
LK.setTimeout(function () {
switchToGameMode();
}, 400);
} else if (gameState === 'playing' && self.characterType === selectedCharacter) {
performHulaHoopTrick();
}
};
return self;
});
var HulaHoop = Container.expand(function () {
var self = Container.call(this);
self.momentum = 1.0;
self.rotationSpeed = 0.1;
self.isActive = false;
var hoopGraphics = self.attachAsset('hulaHoop', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
if (self.isActive) {
hoopGraphics.rotation += self.rotationSpeed * self.momentum;
// Gradually decrease momentum
self.momentum *= 0.995;
// Update rotation speed based on momentum
self.rotationSpeed = 0.05 + self.momentum * 0.15;
// Check if momentum is too low
if (self.momentum < 0.3) {
self.momentum = 0.3;
// Slow down the hoop when momentum is low
self.rotationSpeed = 0.02;
}
}
};
self.boost = function () {
self.momentum = Math.min(self.momentum + 0.4, 2.0);
// Visual effect for boost
tween(hoopGraphics, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(hoopGraphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 100,
easing: tween.easeIn
});
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2e2e2e
});
/****
* Game Code
****/
var gameState = 'selection'; // 'selection' or 'playing'
var selectedCharacter = null;
var characters = [];
var gameCharacter = null;
var hulaHoop = null;
var backButton = null;
var scoreTxt = null;
var comboCount = 0;
var lastTapTime = 0;
// Create title text
var titleText = new Text2('Hula Hoop Stars', {
size: 120,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 400;
game.addChild(titleText);
// Create subtitle text
var subtitleText = new Text2('Choose Your Character', {
size: 60,
fill: 0xCCCCCC
});
subtitleText.anchor.set(0.5, 0.5);
subtitleText.x = 2048 / 2;
subtitleText.y = 550;
game.addChild(subtitleText);
// Create characters for selection
var characterTypes = ['blossom', 'buttercup', 'bliss'];
var characterPositions = [{
x: 2048 / 2 - 400,
y: 1200
}, {
x: 2048 / 2,
y: 1200
}, {
x: 2048 / 2 + 400,
y: 1200
}];
for (var i = 0; i < characterTypes.length; i++) {
var character = new Character(characterTypes[i]);
character.x = characterPositions[i].x;
character.y = characterPositions[i].y;
characters.push(character);
game.addChild(character);
}
// Create score display
scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
scoreTxt.visible = false;
LK.gui.top.addChild(scoreTxt);
function switchToGameMode() {
gameState = 'playing';
// Hide selection elements
titleText.visible = false;
subtitleText.visible = false;
for (var i = 0; i < characters.length; i++) {
characters[i].visible = false;
}
// Create game character
gameCharacter = new Character(selectedCharacter);
gameCharacter.x = 2048 / 2;
gameCharacter.y = 1400;
game.addChild(gameCharacter);
// Create hula hoop
hulaHoop = new HulaHoop();
hulaHoop.x = 2048 / 2;
hulaHoop.y = 1400;
hulaHoop.isActive = true;
game.addChild(hulaHoop);
// Create back button
backButton = new Button('Back', 'backButton');
backButton.x = 150;
backButton.y = 100;
game.addChild(backButton);
// Show score
scoreTxt.visible = true;
scoreTxt.setText('Score: ' + LK.getScore());
// Reset game variables
comboCount = 0;
lastTapTime = 0;
}
function switchToSelectionMode() {
gameState = 'selection';
// Show selection elements
titleText.visible = true;
subtitleText.visible = true;
for (var i = 0; i < characters.length; i++) {
characters[i].visible = true;
}
// Hide/destroy game elements
if (gameCharacter) {
gameCharacter.destroy();
gameCharacter = null;
}
if (hulaHoop) {
hulaHoop.destroy();
hulaHoop = null;
}
if (backButton) {
backButton.destroy();
backButton = null;
}
// Hide score
scoreTxt.visible = false;
selectedCharacter = null;
}
function performHulaHoopTrick() {
var currentTime = LK.ticks;
var timeSinceLastTap = currentTime - lastTapTime;
// Check for combo timing (within 30-90 ticks for good timing)
if (timeSinceLastTap >= 30 && timeSinceLastTap <= 90) {
comboCount++;
LK.getSound('success').play();
// Bonus points for combos
var points = 10 + comboCount * 5;
LK.setScore(LK.getScore() + points);
} else {
comboCount = 0;
LK.getSound('whoosh').play();
LK.setScore(LK.getScore() + 5);
}
lastTapTime = currentTime;
// Boost hula hoop momentum
if (hulaHoop) {
hulaHoop.boost();
}
// Update score display
scoreTxt.setText('Score: ' + LK.getScore());
// Character animation
if (gameCharacter) {
var characterGraphics = gameCharacter.children[0];
tween(characterGraphics, {
scaleX: 1.1,
scaleY: 0.9
}, {
duration: 150,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(characterGraphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 150,
easing: tween.easeIn
});
}
});
}
}
game.update = function () {
if (gameState === 'playing' && hulaHoop) {
// Check if hula hoop momentum is too low for too long
if (hulaHoop.momentum <= 0.3) {
// Game gets harder over time - if player doesn't tap, they lose
var timeSinceLastTap = LK.ticks - lastTapTime;
if (timeSinceLastTap > 180) {
// 3 seconds at 60fps
LK.showGameOver();
}
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,320 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Button = Container.expand(function (text, assetType) {
+ var self = Container.call(this);
+ var buttonGraphics = self.attachAsset(assetType, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var buttonText = new Text2(text, {
+ size: 30,
+ fill: 0xFFFFFF
+ });
+ buttonText.anchor.set(0.5, 0.5);
+ self.addChild(buttonText);
+ self.down = function (x, y, obj) {
+ LK.getSound('select').play();
+ tween(buttonGraphics, {
+ scaleX: 0.95,
+ scaleY: 0.95
+ }, {
+ duration: 100,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(buttonGraphics, {
+ scaleX: 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 100,
+ easing: tween.easeIn
+ });
+ }
+ });
+ if (text === 'Back') {
+ switchToSelectionMode();
+ }
+ };
+ return self;
+});
+var Character = Container.expand(function (characterType) {
+ var self = Container.call(this);
+ self.characterType = characterType;
+ self.isAnimating = false;
+ var characterGraphics = self.attachAsset(characterType, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Character name text
+ var nameText = new Text2(characterType.charAt(0).toUpperCase() + characterType.slice(1), {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ nameText.anchor.set(0.5, 0.5);
+ nameText.y = 250;
+ self.addChild(nameText);
+ self.animateSelection = function () {
+ if (self.isAnimating) return;
+ self.isAnimating = true;
+ tween(characterGraphics, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 200,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(characterGraphics, {
+ scaleX: 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 200,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ self.isAnimating = false;
+ }
+ });
+ }
+ });
+ };
+ self.down = function (x, y, obj) {
+ if (gameState === 'selection') {
+ LK.getSound('select').play();
+ self.animateSelection();
+ selectedCharacter = self.characterType;
+ LK.setTimeout(function () {
+ switchToGameMode();
+ }, 400);
+ } else if (gameState === 'playing' && self.characterType === selectedCharacter) {
+ performHulaHoopTrick();
+ }
+ };
+ return self;
+});
+var HulaHoop = Container.expand(function () {
+ var self = Container.call(this);
+ self.momentum = 1.0;
+ self.rotationSpeed = 0.1;
+ self.isActive = false;
+ var hoopGraphics = self.attachAsset('hulaHoop', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.update = function () {
+ if (self.isActive) {
+ hoopGraphics.rotation += self.rotationSpeed * self.momentum;
+ // Gradually decrease momentum
+ self.momentum *= 0.995;
+ // Update rotation speed based on momentum
+ self.rotationSpeed = 0.05 + self.momentum * 0.15;
+ // Check if momentum is too low
+ if (self.momentum < 0.3) {
+ self.momentum = 0.3;
+ // Slow down the hoop when momentum is low
+ self.rotationSpeed = 0.02;
+ }
+ }
+ };
+ self.boost = function () {
+ self.momentum = Math.min(self.momentum + 0.4, 2.0);
+ // Visual effect for boost
+ tween(hoopGraphics, {
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 100,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(hoopGraphics, {
+ scaleX: 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 100,
+ easing: tween.easeIn
+ });
+ }
+ });
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x2e2e2e
+});
+
+/****
+* Game Code
+****/
+var gameState = 'selection'; // 'selection' or 'playing'
+var selectedCharacter = null;
+var characters = [];
+var gameCharacter = null;
+var hulaHoop = null;
+var backButton = null;
+var scoreTxt = null;
+var comboCount = 0;
+var lastTapTime = 0;
+// Create title text
+var titleText = new Text2('Hula Hoop Stars', {
+ size: 120,
+ fill: 0xFFFFFF
+});
+titleText.anchor.set(0.5, 0.5);
+titleText.x = 2048 / 2;
+titleText.y = 400;
+game.addChild(titleText);
+// Create subtitle text
+var subtitleText = new Text2('Choose Your Character', {
+ size: 60,
+ fill: 0xCCCCCC
+});
+subtitleText.anchor.set(0.5, 0.5);
+subtitleText.x = 2048 / 2;
+subtitleText.y = 550;
+game.addChild(subtitleText);
+// Create characters for selection
+var characterTypes = ['blossom', 'buttercup', 'bliss'];
+var characterPositions = [{
+ x: 2048 / 2 - 400,
+ y: 1200
+}, {
+ x: 2048 / 2,
+ y: 1200
+}, {
+ x: 2048 / 2 + 400,
+ y: 1200
+}];
+for (var i = 0; i < characterTypes.length; i++) {
+ var character = new Character(characterTypes[i]);
+ character.x = characterPositions[i].x;
+ character.y = characterPositions[i].y;
+ characters.push(character);
+ game.addChild(character);
+}
+// Create score display
+scoreTxt = new Text2('Score: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+scoreTxt.visible = false;
+LK.gui.top.addChild(scoreTxt);
+function switchToGameMode() {
+ gameState = 'playing';
+ // Hide selection elements
+ titleText.visible = false;
+ subtitleText.visible = false;
+ for (var i = 0; i < characters.length; i++) {
+ characters[i].visible = false;
+ }
+ // Create game character
+ gameCharacter = new Character(selectedCharacter);
+ gameCharacter.x = 2048 / 2;
+ gameCharacter.y = 1400;
+ game.addChild(gameCharacter);
+ // Create hula hoop
+ hulaHoop = new HulaHoop();
+ hulaHoop.x = 2048 / 2;
+ hulaHoop.y = 1400;
+ hulaHoop.isActive = true;
+ game.addChild(hulaHoop);
+ // Create back button
+ backButton = new Button('Back', 'backButton');
+ backButton.x = 150;
+ backButton.y = 100;
+ game.addChild(backButton);
+ // Show score
+ scoreTxt.visible = true;
+ scoreTxt.setText('Score: ' + LK.getScore());
+ // Reset game variables
+ comboCount = 0;
+ lastTapTime = 0;
+}
+function switchToSelectionMode() {
+ gameState = 'selection';
+ // Show selection elements
+ titleText.visible = true;
+ subtitleText.visible = true;
+ for (var i = 0; i < characters.length; i++) {
+ characters[i].visible = true;
+ }
+ // Hide/destroy game elements
+ if (gameCharacter) {
+ gameCharacter.destroy();
+ gameCharacter = null;
+ }
+ if (hulaHoop) {
+ hulaHoop.destroy();
+ hulaHoop = null;
+ }
+ if (backButton) {
+ backButton.destroy();
+ backButton = null;
+ }
+ // Hide score
+ scoreTxt.visible = false;
+ selectedCharacter = null;
+}
+function performHulaHoopTrick() {
+ var currentTime = LK.ticks;
+ var timeSinceLastTap = currentTime - lastTapTime;
+ // Check for combo timing (within 30-90 ticks for good timing)
+ if (timeSinceLastTap >= 30 && timeSinceLastTap <= 90) {
+ comboCount++;
+ LK.getSound('success').play();
+ // Bonus points for combos
+ var points = 10 + comboCount * 5;
+ LK.setScore(LK.getScore() + points);
+ } else {
+ comboCount = 0;
+ LK.getSound('whoosh').play();
+ LK.setScore(LK.getScore() + 5);
+ }
+ lastTapTime = currentTime;
+ // Boost hula hoop momentum
+ if (hulaHoop) {
+ hulaHoop.boost();
+ }
+ // Update score display
+ scoreTxt.setText('Score: ' + LK.getScore());
+ // Character animation
+ if (gameCharacter) {
+ var characterGraphics = gameCharacter.children[0];
+ tween(characterGraphics, {
+ scaleX: 1.1,
+ scaleY: 0.9
+ }, {
+ duration: 150,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(characterGraphics, {
+ scaleX: 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 150,
+ easing: tween.easeIn
+ });
+ }
+ });
+ }
+}
+game.update = function () {
+ if (gameState === 'playing' && hulaHoop) {
+ // Check if hula hoop momentum is too low for too long
+ if (hulaHoop.momentum <= 0.3) {
+ // Game gets harder over time - if player doesn't tap, they lose
+ var timeSinceLastTap = LK.ticks - lastTapTime;
+ if (timeSinceLastTap > 180) {
+ // 3 seconds at 60fps
+ LK.showGameOver();
+ }
+ }
+ }
+};
\ No newline at end of file