/****
* Classes
****/
var Heart = Container.expand(function () {
var self = Container.call(this);
var heartGraphics = self.attachAsset('heart', {
anchorX: 0.5,
anchorY: 0.5
});
});
var Knife = Container.expand(function () {
var self = Container.call(this);
self.angleTo = function (other) {
var dx = other.x - self.x;
var dy = other.y - self.y;
return Math.atan2(dy, dx);
};
var knifeGraphics = self.attachAsset('knife', {
anchorX: 0.5
});
self.speed = 30;
self.stuck = false;
self.falling = false;
self.spinDirection = Math.random() < 0.5 ? -1 : 1;
self._move_migrated = function () {
if (!self.stuck && !self.falling) {
self.y -= self.speed;
}
};
self.fall = function () {
if (self.falling) {
if (!self.fallInitiated) {
knifeGraphics.anchor.x = .5;
knifeGraphics.anchor.y = .5;
self.x += knifeGraphics.width / 2;
self.y += knifeGraphics.height / 2;
self.fallInitiated = true;
}
self.y += self.speed;
self.rotation += self.spinDirection * 0.1;
}
};
self.hit = function (knives) {
for (var i = 0; i < knives.length; i++) {
if (knives[i] !== self && knives[i].stuck) {
var angleDiff = Math.abs(knives[i].hitAngle % (2 * Math.PI) - self.hitAngle % (2 * Math.PI));
if (angleDiff < Math.PI / 24) {
return true;
}
}
}
return false;
};
});
var Target = Container.expand(function () {
var self = Container.call(this);
var targetGraphics = self.attachAsset('target', {
anchorX: 0.5,
anchorY: 0.5
});
self.rotationSpeed = 0.01;
self.rotation = 4 * Math.PI;
self.pointSections = [10, 20, 30, 50, 100]; // Different point values for different zones
self.rotate = function () {
self.rotation += self.rotationSpeed;
};
self.hit = function () {
LK.effects.flashObject(self, 0x00ff00, 500);
};
self.getPointsAtAngle = function (angle) {
// Normalize angle between 0 and 2*PI
var normalizedAngle = Math.abs(angle % (2 * Math.PI));
// Divide target into 5 equal sections
var sectionSize = 2 * Math.PI / self.pointSections.length;
// Determine which section was hit
var sectionIndex = Math.floor(normalizedAngle / sectionSize);
// Return points for that section
return self.pointSections[sectionIndex];
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2e6343
});
/****
* Game Code
****/
var background = game.attachAsset('background', {});
background.width = 2048;
background.height = 2732;
var knives = [];
var targets = [];
var score = 0;
var lives = [new Heart(), new Heart(), new Heart()];
var scoreTxt = new Text2(score.toString(), {
size: 150,
fill: 0xFFFFFF,
font: "Impact",
dropShadow: true,
dropShadowColor: 0x000000,
dropShadowBlur: 4,
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 6
});
scoreTxt.anchor.set(.5, 0);
LK.gui.top.addChild(scoreTxt);
for (var i = 0; i < lives.length; i++) {
lives[i].x = 2048 - (i + 1) * 130 - 15;
lives[i].y = 100 + 15;
game.addChild(lives[i]);
}
var knife = game.addChild(new Knife());
knife.x = 2048 / 2;
knife.y = 2732 - 200;
var target = game.addChild(new Target());
target.x = 2048 / 2;
target.y = 2732 / 2;
// Add score labels to the target
var pointLabels = [];
for (var i = 0; i < target.pointSections.length; i++) {
var label = new Text2(target.pointSections[i].toString(), {
size: 80,
fill: 0xFFFFFF,
font: "Impact",
dropShadow: true,
dropShadowColor: 0x000000,
dropShadowBlur: 4,
dropShadowDistance: 3
});
label.anchor.set(0.5, 0.5);
// Position the labels evenly around the target
var angle = i * 2 * Math.PI / target.pointSections.length;
var radius = target.width * 0.35; // Position labels within the target
label.x = target.x + Math.cos(angle) * radius;
label.y = target.y + Math.sin(angle) * radius;
pointLabels.push(label);
game.addChild(label);
}
game.on('down', function (x, y, obj) {
var newKnife = new Knife();
newKnife.x = knife.x;
newKnife.y = knife.y;
knives.push(newKnife);
game.addChild(newKnife);
});
LK.on('tick', function () {
target.rotate();
// Update point labels to stay aligned with the target rotation
for (var i = 0; i < pointLabels.length; i++) {
var angle = i * 2 * Math.PI / target.pointSections.length + target.rotation;
var radius = target.width * 0.35;
pointLabels[i].x = target.x + Math.cos(angle) * radius;
pointLabels[i].y = target.y + Math.sin(angle) * radius;
// Keep the text orientation normal
pointLabels[i].rotation = angle + Math.PI / 2;
}
for (var i = 0; i < knives.length; i++) {
knives[i]._move_migrated();
knives[i].fall();
}
for (var i = 0; i < knives.length; i++) {
if (Math.abs(knives[i].y - target.y) <= target.height / 2 && !knives[i].stuck) {
knives[i].stuck = true;
knives[i].hitAngle = target.rotation - Math.PI / 2;
if (knives[i].hit(knives)) {
knives[i].falling = true;
var lostLife = lives.pop();
lostLife.destroy();
LK.setScore(score);
scoreTxt.setText(score.toString());
if (lives.length > 0) {
LK.effects.flashScreen(0xff0000, 500);
}
} else {
target.hit();
// Get points based on the section hit
var pointsEarned = target.getPointsAtAngle(knives[i].hitAngle);
score += pointsEarned;
target.rotationSpeed += 0.005 / 3;
LK.setScore(score);
scoreTxt.setText(score.toString());
// Show points earned as floating text
var pointsText = new Text2("+" + pointsEarned, {
size: 100,
fill: 0xFFFF00,
font: "Impact"
});
pointsText.anchor.set(0.5, 0.5);
pointsText.x = knives[i].x;
pointsText.y = knives[i].y - 100;
game.addChild(pointsText);
// Animate and remove the points text
var startY = pointsText.y;
var fadeInterval = LK.setInterval(function () {
pointsText.y -= 3;
pointsText.alpha -= 0.05;
if (pointsText.alpha <= 0) {
LK.clearInterval(fadeInterval);
pointsText.destroy();
}
}, 50);
}
}
if (knives[i].stuck && !knives[i].falling) {
knives[i].rotation = target.rotation - knives[i].hitAngle - Math.PI / 2;
knives[i].x = target.x + Math.cos(target.rotation - knives[i].hitAngle) * target.width / 2;
knives[i].y = target.y + Math.sin(target.rotation - knives[i].hitAngle) * target.height / 2;
}
}
for (var i = knives.length - 1; i >= 0; i--) {
if (knives[i].y < -50) {
knives[i].destroy();
knives.splice(i, 1);
}
if (lives.length === 0) {
LK.showGameOver();
}
}
}); ===================================================================
--- original.js
+++ change.js
@@ -1,282 +1,223 @@
/****
-* Plugins
-****/
-var tween = LK.import("@upit/tween.v1");
-var storage = LK.import("@upit/storage.v1");
-
-/****
* Classes
****/
-var Knife = Container.expand(function () {
+var Heart = Container.expand(function () {
var self = Container.call(this);
- var knifeGraphics = self.attachAsset('knife', {
+ var heartGraphics = self.attachAsset('heart', {
anchorX: 0.5,
anchorY: 0.5
});
- self.isActive = false;
- self.isThrown = false;
- self.throwSpeed = 20;
- self.targetX = 0;
- self.targetY = 0;
- self.resetPosition = function () {
- self.isActive = true;
- self.isThrown = false;
- self.x = 1024;
- self.y = 2200;
+});
+var Knife = Container.expand(function () {
+ var self = Container.call(this);
+ self.angleTo = function (other) {
+ var dx = other.x - self.x;
+ var dy = other.y - self.y;
+ return Math.atan2(dy, dx);
};
- self["throw"] = function () {
- if (!self.isThrown && self.isActive) {
- self.isThrown = true;
- LK.getSound('knifeHit').play();
+ var knifeGraphics = self.attachAsset('knife', {
+ anchorX: 0.5
+ });
+ self.speed = 30;
+ self.stuck = false;
+ self.falling = false;
+ self.spinDirection = Math.random() < 0.5 ? -1 : 1;
+ self._move_migrated = function () {
+ if (!self.stuck && !self.falling) {
+ self.y -= self.speed;
}
};
- self.update = function () {
- if (self.isThrown && self.isActive) {
- self.y -= self.throwSpeed;
- // Check if knife reached the target
- if (self.y <= self.targetY + 150) {
- self.isThrown = false;
- return true;
+ self.fall = function () {
+ if (self.falling) {
+ if (!self.fallInitiated) {
+ knifeGraphics.anchor.x = .5;
+ knifeGraphics.anchor.y = .5;
+ self.x += knifeGraphics.width / 2;
+ self.y += knifeGraphics.height / 2;
+ self.fallInitiated = true;
}
+ self.y += self.speed;
+ self.rotation += self.spinDirection * 0.1;
}
+ };
+ self.hit = function (knives) {
+ for (var i = 0; i < knives.length; i++) {
+ if (knives[i] !== self && knives[i].stuck) {
+ var angleDiff = Math.abs(knives[i].hitAngle % (2 * Math.PI) - self.hitAngle % (2 * Math.PI));
+ if (angleDiff < Math.PI / 24) {
+ return true;
+ }
+ }
+ }
return false;
};
- return self;
});
var Target = Container.expand(function () {
var self = Container.call(this);
var targetGraphics = self.attachAsset('target', {
anchorX: 0.5,
anchorY: 0.5
});
- var targetInnerGraphics = self.attachAsset('targetInner', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- var targetCoreGraphics = self.attachAsset('targetCore', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- self.stuckKnives = [];
self.rotationSpeed = 0.01;
- self.level = 1;
- self.obstacles = [];
- self.addKnife = function (knife, angle) {
- knife.x = 0;
- knife.y = 150;
- knife.rotation = angle;
- knife.isActive = true;
- self.stuckKnives.push(knife);
- self.addChild(knife);
+ self.rotation = 4 * Math.PI;
+ self.pointSections = [10, 20, 30, 50, 100]; // Different point values for different zones
+ self.rotate = function () {
+ self.rotation += self.rotationSpeed;
};
- self.addObstacle = function (count) {
- for (var i = 0; i < count; i++) {
- var obstacle = self.attachAsset('obstacleRect', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- var angle = Math.PI * 2 / count * i;
- obstacle.x = Math.cos(angle) * 110;
- obstacle.y = Math.sin(angle) * 110;
- obstacle.rotation = angle + Math.PI / 2;
- self.obstacles.push(obstacle);
- }
+ self.hit = function () {
+ LK.effects.flashObject(self, 0x00ff00, 500);
};
- self.resetTarget = function () {
- // Remove all stuck knives
- for (var i = 0; i < self.stuckKnives.length; i++) {
- self.removeChild(self.stuckKnives[i]);
- }
- self.stuckKnives = [];
- // Remove obstacles
- for (var i = 0; i < self.obstacles.length; i++) {
- self.removeChild(self.obstacles[i]);
- }
- self.obstacles = [];
- // Reset rotation
- self.rotation = 0;
+ self.getPointsAtAngle = function (angle) {
+ // Normalize angle between 0 and 2*PI
+ var normalizedAngle = Math.abs(angle % (2 * Math.PI));
+ // Divide target into 5 equal sections
+ var sectionSize = 2 * Math.PI / self.pointSections.length;
+ // Determine which section was hit
+ var sectionIndex = Math.floor(normalizedAngle / sectionSize);
+ // Return points for that section
+ return self.pointSections[sectionIndex];
};
- self.levelUp = function () {
- self.level++;
- self.resetTarget();
- // Increase rotation speed with level
- self.rotationSpeed = 0.01 + self.level * 0.002;
- // Add obstacles based on level
- if (self.level > 2) {
- var obstacleCount = Math.min(Math.floor(self.level / 2), 6);
- self.addObstacle(obstacleCount);
- }
- LK.getSound('levelUp').play();
- };
- self.checkCollision = function (knife) {
- // Check collision with stuck knives
- for (var i = 0; i < self.stuckKnives.length; i++) {
- var stuckKnife = self.stuckKnives[i];
- // Convert the angle of the stuck knife to global coordinates
- var stuckAngle = (stuckKnife.rotation + self.rotation) % (Math.PI * 2);
- if (stuckAngle < 0) {
- stuckAngle += Math.PI * 2;
- }
- // Check if the new knife would hit any stuck knife
- // Allow for small tolerance in the angle
- var tolerance = 0.3;
- if (stuckAngle < tolerance || stuckAngle > Math.PI * 2 - tolerance) {
- return true;
- }
- }
- // Check collision with obstacles
- for (var i = 0; i < self.obstacles.length; i++) {
- var obstacle = self.obstacles[i];
- var obstacleGlobalAngle = (obstacle.rotation - Math.PI / 2 + self.rotation) % (Math.PI * 2);
- if (obstacleGlobalAngle < 0) {
- obstacleGlobalAngle += Math.PI * 2;
- }
- var tolerance = 0.3;
- if (obstacleGlobalAngle < tolerance || obstacleGlobalAngle > Math.PI * 2 - tolerance) {
- return true;
- }
- }
- return false;
- };
- self.update = function () {
- self.rotation += self.rotationSpeed;
- };
- return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
- backgroundColor: 0x444444
+ backgroundColor: 0x2e6343
});
/****
* Game Code
****/
-// Game variables
-var currentLevel = 1;
-var knivesPerLevel = 5;
-var knifeCount = 0;
-var score = 0;
-var target;
-var currentKnife;
+var background = game.attachAsset('background', {});
+background.width = 2048;
+background.height = 2732;
var knives = [];
-var gameActive = false;
-var knivesLeft = 0;
-// Initialize the game
-function initGame() {
- // Reset variables
- currentLevel = 1;
- knifeCount = 0;
- score = 0;
- knivesLeft = knivesPerLevel;
- LK.setScore(0);
- // Create target
- target = new Target();
- target.x = 1024;
- target.y = 900;
- game.addChild(target);
- // Create initial knife
- currentKnife = new Knife();
- currentKnife.targetX = target.x;
- currentKnife.targetY = target.y;
- currentKnife.resetPosition();
- game.addChild(currentKnife);
- // Create UI
- createUI();
- // Start game
- gameActive = true;
- // Play background music
- LK.playMusic('bgMusic');
+var targets = [];
+var score = 0;
+var lives = [new Heart(), new Heart(), new Heart()];
+var scoreTxt = new Text2(score.toString(), {
+ size: 150,
+ fill: 0xFFFFFF,
+ font: "Impact",
+ dropShadow: true,
+ dropShadowColor: 0x000000,
+ dropShadowBlur: 4,
+ dropShadowAngle: Math.PI / 6,
+ dropShadowDistance: 6
+});
+scoreTxt.anchor.set(.5, 0);
+LK.gui.top.addChild(scoreTxt);
+for (var i = 0; i < lives.length; i++) {
+ lives[i].x = 2048 - (i + 1) * 130 - 15;
+ lives[i].y = 100 + 15;
+ game.addChild(lives[i]);
}
-// Create user interface
-function createUI() {
- // Score display
- var scoreTxt = new Text2('SCORE: 0', {
+var knife = game.addChild(new Knife());
+knife.x = 2048 / 2;
+knife.y = 2732 - 200;
+var target = game.addChild(new Target());
+target.x = 2048 / 2;
+target.y = 2732 / 2;
+// Add score labels to the target
+var pointLabels = [];
+for (var i = 0; i < target.pointSections.length; i++) {
+ var label = new Text2(target.pointSections[i].toString(), {
size: 80,
- fill: 0xFFFFFF
+ fill: 0xFFFFFF,
+ font: "Impact",
+ dropShadow: true,
+ dropShadowColor: 0x000000,
+ dropShadowBlur: 4,
+ dropShadowDistance: 3
});
- scoreTxt.anchor.set(0.5, 0);
- LK.gui.top.addChild(scoreTxt);
- // Level display
- var levelTxt = new Text2('LEVEL: 1', {
- size: 60,
- fill: 0xFFFFFF
- });
- levelTxt.anchor.set(0, 0);
- levelTxt.x = 100;
- levelTxt.y = 100;
- LK.gui.addChild(levelTxt);
- // Knives left display
- var knivesLeftTxt = new Text2('KNIVES: ' + knivesLeft, {
- size: 60,
- fill: 0xFFFFFF
- });
- knivesLeftTxt.anchor.set(1, 0);
- knivesLeftTxt.x = 1948; // Keeping it within visible screen area
- knivesLeftTxt.y = 100;
- LK.gui.addChild(knivesLeftTxt);
- // Update UI in game loop
- game.updateUI = function () {
- scoreTxt.setText('SCORE: ' + score);
- levelTxt.setText('LEVEL: ' + currentLevel);
- knivesLeftTxt.setText('KNIVES: ' + knivesLeft);
- };
+ label.anchor.set(0.5, 0.5);
+ // Position the labels evenly around the target
+ var angle = i * 2 * Math.PI / target.pointSections.length;
+ var radius = target.width * 0.35; // Position labels within the target
+ label.x = target.x + Math.cos(angle) * radius;
+ label.y = target.y + Math.sin(angle) * radius;
+ pointLabels.push(label);
+ game.addChild(label);
}
-// Game input handling
-game.down = function (x, y, obj) {
- if (gameActive && currentKnife && !currentKnife.isThrown) {
- currentKnife["throw"]();
- knivesLeft--;
+game.on('down', function (x, y, obj) {
+ var newKnife = new Knife();
+ newKnife.x = knife.x;
+ newKnife.y = knife.y;
+ knives.push(newKnife);
+ game.addChild(newKnife);
+});
+LK.on('tick', function () {
+ target.rotate();
+ // Update point labels to stay aligned with the target rotation
+ for (var i = 0; i < pointLabels.length; i++) {
+ var angle = i * 2 * Math.PI / target.pointSections.length + target.rotation;
+ var radius = target.width * 0.35;
+ pointLabels[i].x = target.x + Math.cos(angle) * radius;
+ pointLabels[i].y = target.y + Math.sin(angle) * radius;
+ // Keep the text orientation normal
+ pointLabels[i].rotation = angle + Math.PI / 2;
}
-};
-// Main game update loop
-game.update = function () {
- if (!gameActive) {
- return;
+ for (var i = 0; i < knives.length; i++) {
+ knives[i]._move_migrated();
+ knives[i].fall();
}
- // Update target rotation
- if (target) {
- target.update();
- }
- // Update current knife
- if (currentKnife && currentKnife.isThrown) {
- var hitTarget = currentKnife.update();
- if (hitTarget) {
- // Check if knife hit another knife or obstacle
- if (target.checkCollision(currentKnife)) {
- // Game over
- LK.getSound('gameOver').play();
- gameActive = false;
- LK.showGameOver();
- return;
+ for (var i = 0; i < knives.length; i++) {
+ if (Math.abs(knives[i].y - target.y) <= target.height / 2 && !knives[i].stuck) {
+ knives[i].stuck = true;
+ knives[i].hitAngle = target.rotation - Math.PI / 2;
+ if (knives[i].hit(knives)) {
+ knives[i].falling = true;
+ var lostLife = lives.pop();
+ lostLife.destroy();
+ LK.setScore(score);
+ scoreTxt.setText(score.toString());
+ if (lives.length > 0) {
+ LK.effects.flashScreen(0xff0000, 500);
+ }
+ } else {
+ target.hit();
+ // Get points based on the section hit
+ var pointsEarned = target.getPointsAtAngle(knives[i].hitAngle);
+ score += pointsEarned;
+ target.rotationSpeed += 0.005 / 3;
+ LK.setScore(score);
+ scoreTxt.setText(score.toString());
+ // Show points earned as floating text
+ var pointsText = new Text2("+" + pointsEarned, {
+ size: 100,
+ fill: 0xFFFF00,
+ font: "Impact"
+ });
+ pointsText.anchor.set(0.5, 0.5);
+ pointsText.x = knives[i].x;
+ pointsText.y = knives[i].y - 100;
+ game.addChild(pointsText);
+ // Animate and remove the points text
+ var startY = pointsText.y;
+ var fadeInterval = LK.setInterval(function () {
+ pointsText.y -= 3;
+ pointsText.alpha -= 0.05;
+ if (pointsText.alpha <= 0) {
+ LK.clearInterval(fadeInterval);
+ pointsText.destroy();
+ }
+ }, 50);
}
- // Calculate points based on where knife hit
- var points = 10;
- // Higher points for inner rings (not implemented in this simple version)
- score += points;
- LK.setScore(score);
- // Add knife to target
- target.addKnife(currentKnife, target.rotation);
- // Check if level completed
- if (knivesLeft <= 0) {
- currentLevel++;
- knivesLeft = knivesPerLevel;
- target.levelUp();
- }
- // Create new knife
- currentKnife = new Knife();
- currentKnife.targetX = target.x;
- currentKnife.targetY = target.y;
- currentKnife.resetPosition();
- game.addChild(currentKnife);
}
+ if (knives[i].stuck && !knives[i].falling) {
+ knives[i].rotation = target.rotation - knives[i].hitAngle - Math.PI / 2;
+ knives[i].x = target.x + Math.cos(target.rotation - knives[i].hitAngle) * target.width / 2;
+ knives[i].y = target.y + Math.sin(target.rotation - knives[i].hitAngle) * target.height / 2;
+ }
}
- // Update UI
- if (game.updateUI) {
- game.updateUI();
+ for (var i = knives.length - 1; i >= 0; i--) {
+ if (knives[i].y < -50) {
+ knives[i].destroy();
+ knives.splice(i, 1);
+ }
+ if (lives.length === 0) {
+ LK.showGameOver();
+ }
}
-};
-// Initialize game on start
-initGame();
\ No newline at end of file
+});
\ No newline at end of file
Cartoon flat dart board. Single Game Texture. In-Game asset. 2d. White background. High contrast. No shadows.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
artoon knife pointing up. Symmetrical. Vertical. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows