Code edit (20 edits merged)
Please save this source code
User prompt
change the flying enemy graphics asset whenever it changes zigzagdirection
Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
Code edit (2 edits merged)
Please save this source code
User prompt
Fix Bug: 'TypeError: Cannot read properties of undefined (reading '0')' in this line: 'self.x = self.path[duration - self.delayCounter][0];' Line Number: 58
User prompt
Fix Bug: 'ReferenceError: delayCounter is not defined' in this line: 'self.x = self.path[duration - delayCounter][0];' Line Number: 58
Code edit (4 edits merged)
Please save this source code
User prompt
Fix Bug: 'Uncaught TypeError: Cannot set properties of undefined (setting '0')' in this line: 'return start * (1 - t) + end * t;' Line Number: 9
Code edit (5 edits merged)
Please save this source code
User prompt
Fix Bug: 'Uncaught ReferenceError: number_of_steps is not defined' in this line: 'var stepping_constant = 1 / number_of_steps;' Line Number: 13
User prompt
Fix Bug: 'Uncaught ReferenceError: createQuadraticBezierCurve is not defined' in this line: 'var temp = createQuadraticBezierCurve(0, 0, 50, 50, 25, 25, 10);' Line Number: 24
Code edit (1 edits merged)
Please save this source code
User prompt
GoldCoin should follow a curved path to endpoint, not a straight one
Code edit (4 edits merged)
Please save this source code
User prompt
write a function that creates a random bezier curve between two points
Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
User prompt
Fix Bug: 'ReferenceError: zigzagDirection is not defined' in this line: 'this.rotation = zigzagDirection * 2;' Line Number: 320
User prompt
Fix Bug: 'ReferenceError: zigzagDirection is not defined' in this line: 'this.rotation = zigzagDirection * 2;' Line Number: 320
Code edit (7 edits merged)
Please save this source code
User prompt
Fix Bug: 'Error: [object Object]addChildAt: The index 631.7750000000001 supplied is out of bounds 14' in this line: 'self.addChildAt(newTower, newTower.y);' Line Number: 475
Code edit (1 edits merged)
Please save this source code
Code edit (3 edits merged)
Please save this source code
User prompt
Fix Bug: 'Error: [object Object]addChildAt: The index 1300 supplied is out of bounds 17' in this line: 'self.addChildAt(newTower, newTower.y);' Line Number: 475
var playerGold = 30; var playerScore = 0; var enemySpawnDelay = 120; var upgradeLevel = 0; var upgradeCost = 100; var towerDamage = [1, 1.5, 2, 2.5, 3, 3.5, 4, 5, 8]; var towerShotDelay = [60, 55, 50, 40, 35, 30, 25, 20, 15]; var TreasureChest = Container.expand(function () { var self = Container.call(this); var chestGraphics = self.createAsset('treasureChestSprite', 'Treasure Chest Sprite', 0.5, 0.5); self.addChild(chestGraphics); }); var UpgradeButton = Container.expand(function () { var self = Container.call(this); var upgradeButtonGraphics = self.createAsset('buttonSprite', 'Button Sprite', 0.5, 0.5); self.addChild(upgradeButtonGraphics); }); var GoldCoin = Container.expand(function (startX, startY, endX, endY, delay) { var self = Container.call(this); GoldCoin.delayIncrement = 0; self.game = this; var coinGraphics = self.createAsset('goldCoinSprite', 'Gold Coin Sprite', 0.5, 0.5); self.addChild(coinGraphics); self.x = startX; self.y = startY; var distance = Math.sqrt(Math.pow(endX - startX, 2) + Math.pow(endY - startY, 2)); self.delayCounter = delay * 2; var duration = 60 + delay; var vx = (endX - startX) / duration; var vy = (endY - startY) / duration; self.alpha = 0; self.move = function () { if (self.delayCounter > 0) { self.delayCounter--; } else { self.alpha = 1; var angle = Math.atan2(endY - startY, endX - startX); var sinAngle = Math.sin(angle); var cosAngle = Math.cos(angle); var curveAmplitude = 10; var curveFrequency = 0.1; self.x += vx; self.y += vy + curveAmplitude * Math.sin(curveFrequency * (self.game.ticks - self.delayCounter)); self.rotation = Math.atan2(vy + curveAmplitude * Math.cos(curveFrequency * (self.game.ticks - self.delayCounter)), vx) * sinAngle + cosAngle; } if (--duration <= 0) { self.destroy(); } }; }); var CityWall = Container.expand(function () { var self = Container.call(this); var wallGraphics = self.createAsset('cityWallSprite', 'City Wall Sprite', 0.5, 0.5); self.addChild(wallGraphics); }); var TrollEnemy = Container.expand(function () { var self = Container.call(this); var trollGraphics = self.createAsset('trollSprite', 'Troll Enemy Sprite', .5, .5); trollGraphics.scale.set(2.5); self.hitpoints = 30; self.move = function (towers) { var minDist = Infinity; var closestTower = null; for (var i = 0; i < self.game.towers.length; i++) { var dx = self.game.towers[i].x - self.x; var dy = self.game.towers[i].y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; closestTower = self.game.towers[i]; } } if (closestTower && minDist < closestTower.width / 2 + this.width / 2) { closestTower.health -= 0.5; if (closestTower.health <= 0) { var towerIndex = self.game.towers.indexOf(closestTower); if (towerIndex > -1) { self.game.towers.splice(towerIndex, 1); } closestTower.destroy(); } } else if (closestTower && minDist < 100) { var avoidanceForce = 8; var ax = this.x - closestTower.x; var ay = this.y - closestTower.y; var len = Math.sqrt(ax * ax + ay * ay); ax = ax / len * avoidanceForce; ay = ay / len * avoidanceForce; this.x += ax; this.y += ay; } else { this.zigzagCounter = this.zigzagCounter || 0; this.zigzagDirection = this.zigzagDirection || 1; if (this.zigzagCounter++ % self.zigzagTension === 0) this.zigzagDirection *= -1; this.x += 4 * this.zigzagDirection; this.y += 2; if (Math.random() < 0.01) { this.zigzagTension = Math.floor(Math.random() * 40) + 10; } if (this.x > 2048) { this.zigzagDirection = -1; } if (this.x < 0) { this.zigzagDirection = 1; } var scaleIncrement = (1 - 0.1) / 200; this.scale.x += scaleIncrement; this.scale.y += scaleIncrement; this.scale.x = Math.min(this.scale.x, 1); this.scale.y = Math.min(this.scale.y, 1); if (this.zigzagCounter % 5 == 0) { this.rotation = (0.5 - Math.random()) * (Math.PI * 2 / 100); } } }; self.die = function () { playerGold += 20; playerScore += 300; this.game.updateScoreLabel(); this.game.updateGoldLabel(); for (var i = 0; i < 10; i++) { var t = new GoldCoin(this.x, this.y, 720, 2500, i); } var index = this.game.enemies.indexOf(this); if (index > -1) { this.game.enemies.splice(index, 1); } this.destroy(); }; }); var DeathKnightEnemy = Container.expand(function () { var self = Container.call(this); var dKnightGraphics = self.createAsset('deathKnightSprite', 'DeathKnight Enemy Sprite', .5, .5); dKnightGraphics.scale.set(2.5); self.hitpoints = 100; self.move = function (towers) { var minDist = Infinity; var closestTower = null; for (var i = 0; i < self.game.towers.length; i++) { var dx = self.game.towers[i].x - self.x; var dy = self.game.towers[i].y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; closestTower = self.game.towers[i]; } } if (closestTower && minDist < closestTower.width / 2 + this.width / 2) { closestTower.health -= 1; if (closestTower.health <= 0) { var towerIndex = self.game.towers.indexOf(closestTower); if (towerIndex > -1) { self.game.towers.splice(towerIndex, 1); } closestTower.destroy(); } } else if (closestTower && minDist < 100) { var avoidanceForce = 8; var ax = this.x - closestTower.x; var ay = this.y - closestTower.y; var len = Math.sqrt(ax * ax + ay * ay); ax = ax / len * avoidanceForce; ay = ay / len * avoidanceForce; this.x += ax; this.y += ay; } else { this.zigzagCounter = this.zigzagCounter || 0; this.zigzagDirection = this.zigzagDirection || 1; if (this.zigzagCounter++ % self.zigzagTension === 0) this.zigzagDirection *= -1; this.x += 4 * this.zigzagDirection; this.y += 2; if (Math.random() < 0.01) { this.zigzagTension = Math.floor(Math.random() * 40) + 10; } if (this.x > 2048) { this.zigzagDirection = -1; } if (this.x < 0) { this.zigzagDirection = 1; } var scaleIncrement = (1 - 0.1) / 200; this.scale.x += scaleIncrement; this.scale.y += scaleIncrement; this.scale.x = Math.min(this.scale.x, 1); this.scale.y = Math.min(this.scale.y, 1); if (this.zigzagCounter % 10 == 0) { this.rotation = (0.5 - Math.random()) * (Math.PI * 2 / 100); } } }; self.die = function () { playerGold += 50; playerScore += 2222; this.game.updateScoreLabel(); this.game.updateGoldLabel(); for (var i = 0; i < 20; i++) { var t = new GoldCoin(this.x, this.y, 720, 2500, i); } var index = this.game.enemies.indexOf(this); if (index > -1) { this.game.enemies.splice(index, 1); } this.destroy(); }; }); var Tower = Container.expand(function (gameInstance) { var self = Container.call(this); self.game = gameInstance; self.upgradeLevel = upgradeLevel; var towerGraphics = self.createAsset('towerSprite', 'Tower Sprite', .5, .5); var towerGraphics1 = self.createAsset('towerSprite1', 'Tower Sprite1', .5, .5); var towerGraphics2 = self.createAsset('towerSprite2', 'Tower Sprite2', .5, .5); var towerGraphics3 = self.createAsset('towerSprite3', 'Tower Sprite3', .5, .5); var towerGraphics4 = self.createAsset('towerSprite4', 'Tower Sprite4', .5, .5); var towerGraphics5 = self.createAsset('towerSprite5', 'Tower Sprite5', .5, .5); var towerGraphics6 = self.createAsset('towerSprite6', 'Tower Sprite6', .5, .5); var towerGraphics7 = self.createAsset('towerSprite7', 'Tower Sprite7', .5, .5); var towerGraphics8 = self.createAsset('towerSprite8', 'Tower Sprite8', .5, .5); towerGraphics.scale.set(2); towerGraphics1.scale.set(2); towerGraphics2.scale.set(2); towerGraphics3.scale.set(2); towerGraphics4.scale.set(2); towerGraphics5.scale.set(2); towerGraphics6.scale.set(2); towerGraphics7.scale.set(2); towerGraphics8.scale.set(2); towerGraphics1.alpha = 0; towerGraphics2.alpha = 0; towerGraphics3.alpha = 0; towerGraphics4.alpha = 0; towerGraphics5.alpha = 0; towerGraphics6.alpha = 0; towerGraphics7.alpha = 0; towerGraphics8.alpha = 0; var a = [towerGraphics1, towerGraphics2, towerGraphics3, towerGraphics4, towerGraphics5, towerGraphics6, towerGraphics7, towerGraphics8]; if (upgradeLevel > 0) { towerGraphics.alpha = 0; for (var i = 0; i < 8; i++) { if (i + 1 == upgradeLevel) { a[i].alpha = 1; } else { a[i].alpha = 0; } } } self.shoot = function (enemies) { if (self.shootCounter++ % towerShotDelay[self.upgradeLevel] === 0) { for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= 300) { console.log('shot'); var bullet = new Bullet(self.upgradeLevel); bullet.x = self.x; bullet.y = self.y; bullet.target = enemy; var tx = bullet.target.x - bullet.x; var ty = bullet.target.y - bullet.y; var rad = Math.atan2(ty, tx); bullet.rotation = rad + Math.PI / 2; bullet.vx = Math.cos(rad); bullet.vy = Math.sin(rad); self.game.addBullet(bullet); break; } } } }; self.upgrade = function () {}; self.shootCounter = 0; self.health = 200; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.createAsset('enemySprite', 'Enemy Sprite', .5, .5); enemyGraphics.scale.set(0.8); self.hitpoints = 3; self.zigzagTension = Math.floor(Math.random() * 40) + 10; self.move = function (towers) { var minDist = Infinity; var closestTower = null; for (var i = 0; i < self.game.towers.length; i++) { var dx = self.game.towers[i].x - self.x; var dy = self.game.towers[i].y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; closestTower = self.game.towers[i]; } } if (closestTower && minDist < closestTower.width / 2 + this.width / 2) { closestTower.health -= 0.5; if (closestTower.health <= 0) { var towerIndex = self.game.towers.indexOf(closestTower); if (towerIndex > -1) { self.game.towers.splice(towerIndex, 1); } closestTower.destroy(); } } else if (closestTower && minDist < 100) { var avoidanceForce = 8; var ax = this.x - closestTower.x; var ay = this.y - closestTower.y; var len = Math.sqrt(ax * ax + ay * ay); ax = ax / len * avoidanceForce; ay = ay / len * avoidanceForce; this.x += ax; this.y += ay; } else { this.zigzagCounter = this.zigzagCounter || 0; this.zigzagDirection = this.zigzagDirection || 1; if (this.zigzagCounter++ % self.zigzagTension === 0) this.zigzagDirection *= -1; this.x += 4 * this.zigzagDirection; this.y += 2; if (Math.random() < 0.01) { this.zigzagTension = Math.floor(Math.random() * 40) + 10; } if (this.x > 2048) { this.zigzagDirection = -1; } if (this.x < 0) { this.zigzagDirection = 1; } var scaleIncrement = (1 - 0.1) / 200; this.scale.x += scaleIncrement; this.scale.y += scaleIncrement; this.scale.x = Math.min(this.scale.x, 1); this.scale.y = Math.min(this.scale.y, 1); this.rotation = (0.5 - Math.random()) * (Math.PI * 2 / 50); } }; self.die = function () { playerGold += 5; playerScore += 100; this.game.updateScoreLabel(); this.game.updateGoldLabel(); for (var i = 0; i < 4; i++) { var t = new GoldCoin(this.x, this.y, 720, 2500, i); this.game.addChild(t); this.game.goldCoins.push(t); } var index = this.game.enemies.indexOf(this); if (index > -1) { this.game.enemies.splice(index, 1); } this.destroy(); }; }); var OrcEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.createAsset('orcEnemySprite', 'Orc Enemy Sprite', .5, .5); enemyGraphics.scale.set(0.8); self.hitpoints = 6; self.zigzagTension = Math.floor(Math.random() * 20) + 10; self.move = function (towers) { var minDist = Infinity; var closestTower = null; for (var i = 0; i < self.game.towers.length; i++) { var dx = self.game.towers[i].x - self.x; var dy = self.game.towers[i].y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < minDist) { minDist = dist; closestTower = self.game.towers[i]; } } if (closestTower && minDist < closestTower.width / 2 + this.width / 2) { closestTower.health -= 0.8; if (closestTower.health <= 0) { var towerIndex = self.game.towers.indexOf(closestTower); if (towerIndex > -1) { self.game.towers.splice(towerIndex, 1); } closestTower.destroy(); } } else if (closestTower && minDist < 100) { var avoidanceForce = 8; var ax = this.x - closestTower.x; var ay = this.y - closestTower.y; var len = Math.sqrt(ax * ax + ay * ay); ax = ax / len * avoidanceForce; ay = ay / len * avoidanceForce; this.x += ax; this.y += ay; } else { this.zigzagCounter = this.zigzagCounter || 0; this.zigzagDirection = this.zigzagDirection || 1; if (this.zigzagCounter++ % self.zigzagTension === 0) this.zigzagDirection *= -1; this.x += 4 * this.zigzagDirection; this.y += 2; if (Math.random() < 0.01) { this.zigzagTension = Math.floor(Math.random() * 40) + 10; } if (this.x > 2048) { this.zigzagDirection = -1; } if (this.x < 0) { this.zigzagDirection = 1; } var scaleIncrement = (1 - 0.1) / 200; this.scale.x += scaleIncrement; this.scale.y += scaleIncrement; this.scale.x = Math.min(this.scale.x, 1); this.scale.y = Math.min(this.scale.y, 1); if (this.zigzagCounter % 5 == 0) { this.rotation = (0.5 - Math.random()) * (Math.PI * 2 / 100); } } }; self.die = function () { playerGold += 10; playerScore += 150; this.game.updateScoreLabel(); this.game.updateGoldLabel(); for (var i = 0; i < 8; i++) { var t = new GoldCoin(this.x, this.y, 720, 2500, i); this.game.addChild(t); this.game.goldCoins.push(t); } var index = this.game.enemies.indexOf(this); if (index > -1) { this.game.enemies.splice(index, 1); } this.destroy(); }; }); var Bullet = Container.expand(function (upgradeLevel) { var self = Container.call(this); self.game = null; self.upgradeLevel = upgradeLevel; self.damage = towerDamage[self.upgradeLevel]; var bulletGraphics = self.createAsset('bullet', 'Bullet Graphics', .5, .5); bulletGraphics.scale.set(0.2); var bulletGraphics1 = self.createAsset('bulletSprite1', 'Bullet Sprite1', .5, .5); var bulletGraphics2 = self.createAsset('bulletSprite2', 'Bullet Sprite2', .5, .5); var bulletGraphics3 = self.createAsset('bulletSprite3', 'Bullet Sprite3', .5, .5); var bulletGraphics4 = self.createAsset('bulletSprite4', 'Bullet Sprite4', .5, .5); var bulletGraphics5 = self.createAsset('bulletSprite5', 'Bullet Sprite5', .5, .5); var bulletGraphics6 = self.createAsset('bulletSprite6', 'Bullet Sprite6', .5, .5); var bulletGraphics7 = self.createAsset('bulletSprite7', 'Bullet Sprite7', .5, .5); var bulletGraphics8 = self.createAsset('bulletSprite8', 'Bullet Sprite8', .5, .5); bulletGraphics1.scale.set(.2); bulletGraphics2.scale.set(.2); bulletGraphics3.scale.set(.2); bulletGraphics4.scale.set(.2); bulletGraphics5.scale.set(.2); bulletGraphics6.scale.set(.2); bulletGraphics7.scale.set(.2); bulletGraphics8.scale.set(.2); bulletGraphics1.alpha = 0; bulletGraphics2.alpha = 0; bulletGraphics3.alpha = 0; bulletGraphics4.alpha = 0; bulletGraphics5.alpha = 0; bulletGraphics6.alpha = 0; bulletGraphics7.alpha = 0; bulletGraphics8.alpha = 0; var a = [bulletGraphics1, bulletGraphics2, bulletGraphics3, bulletGraphics4, bulletGraphics5, bulletGraphics6, bulletGraphics7, bulletGraphics8]; if (self.upgradeLevel > 0) { bulletGraphics.alpha = 0; for (var i = 0; i < 8; i++) { if (i + 1 == self.upgradeLevel) { a[i].alpha = 1; } else { a[i].setAlpha = 0; } } } self.vx = 0; self.vy = 0; self.move = function () { if (this.target) { var tx = this.target.x - this.x; var ty = this.target.y - this.y; var dist = Math.sqrt(tx * tx + ty * ty); if (dist > 0) { this.x += this.vx * 10; this.y += this.vy * 10; } if (dist < this.width / 2 + this.target.width / 2) { this.hit(); } else if (this.x < 0 || this.x > 2048 || this.y < 0 || this.y > 2732) { this.destroy(); } } }; self.hit = function () { this.target.hitpoints -= this.damage; if (this.target.hitpoints <= 0 && !this.target.dead) { this.target.dead = true; this.target.die(); } this.destroy(); }; }); var Game = Container.expand(function () { var self = Container.call(this); self.updateGoldLabel = function () { goldLabel.setText('Gold: ' + playerGold); }; self.updateScoreLabel = function () { scoreLabel.setText('Score: ' + playerScore); }; self.updateCostLabel = function () { costLabel.setText('Cost: ' + upgradeCost); }; self.playerGold = 0; self.addBullet = function (bullet) { bullets.push(bullet); self.addChild(bullet); }; self.sufficientDistanceToOtherTowers = function (position) { for (var i = 0; i < self.towers.length; i++) { var tower = self.towers[i]; var dx = tower.x - position.x; var dy = tower.y - position.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 120) { return false; } } return true; }; var background = self.createAsset('background', 'Background Image', 0, 0); background.width = 2048; background.height = 2732; background.y = 0; self.addChildAt(background, 0); self.towers = []; self.enemies = []; var bullets = []; self.goldCoins = []; var selectedTowerType = null; var initialEnemy = new Enemy(); initialEnemy.game = self; initialEnemy.x = 300 + Math.random() * (1848 - 300); initialEnemy.y = 200; initialEnemy.scale.set(0.1); self.enemies.push(initialEnemy); self.addChild(initialEnemy); LK.on('tick', function () { self.enemySpawnCounter = self.enemySpawnCounter || 0; self.totalEnemiesSpawned = self.totalEnemiesSpawned || 0; if (++self.enemySpawnCounter >= enemySpawnDelay) { var newEnemy; if (self.totalEnemiesSpawned > 3 && self.totalEnemiesSpawned % 50 == 0) { newEnemy = new DeathKnightEnemy(); } else if (self.totalEnemiesSpawned > 3 && self.totalEnemiesSpawned % 10 == 0) { newEnemy = new TrollEnemy(); } else { if (Math.random() < 0.2) { newEnemy = new OrcEnemy(); } else { newEnemy = new Enemy(); } } if (newEnemy) { newEnemy.game = self; newEnemy.x = 300 + Math.random() * (1848 - 300); newEnemy.y = 200; newEnemy.scale.set(0.1); self.enemies.push(newEnemy); self.addChild(newEnemy); } self.totalEnemiesSpawned++; if (self.totalEnemiesSpawned > 0 && self.totalEnemiesSpawned % 20 == 0) { enemySpawnDelay -= 4; if (enemySpawnDelay < 20) { enemySpawnDelay = 20; } } self.enemySpawnCounter = 0; } for (var i = 0; i < self.enemies.length; i++) { self.enemies[i].move(); if (self.enemies[i].y >= 2332 - self.enemies[i].height / 2) { LK.showGameOver(); } } for (var j = 0; j < self.towers.length; j++) { self.towers[j].shoot(self.enemies); } for (var k = bullets.length - 1; k >= 0; k--) { bullets[k].move(); if (!bullets[k].parent) { bullets.splice(k, 1); } } for (var l = self.goldCoins.length - 1; l >= 0; l--) { self.goldCoins[l].move(); if (!self.goldCoins[l].parent) { self.goldCoins.splice(l, 1); } } }); stage.on('down', function (obj) { var position = obj.event.getLocalPosition(self); if (position.y >= 600 && position.y <= 2250) { if (playerGold >= 10) { if (self.sufficientDistanceToOtherTowers(position)) { playerGold -= 10; var newTower = self.addChild(new Tower(self)); newTower.x = position.x; newTower.y = position.y; self.towers.push(newTower); self.towers.sort(function (a, b) { return a.y - b.y; }); self.towers.forEach(function (tower, index) { self.addChildAt(tower, 6 + index); console.log('y and zIndex:' + tower.y + ', ' + tower.parent.getChildIndex(tower)); }); self.updateGoldLabel(); } } } }); stage.on('move', function (obj) {}); stage.on('up', function (obj) {}); var cityWall = self.addChild(new CityWall()); cityWall.y = 2632; cityWall.x = 332; cityWall.scale.y = 0.5; cityWall.scale.x = 0.5; var cityWall2 = self.addChild(new CityWall()); cityWall2.y = 2632; cityWall2.x = 1012; cityWall2.scale.y = 0.5; cityWall2.scale.x = 0.5; var cityWall3 = self.addChild(new CityWall()); cityWall3.y = 2632; cityWall3.x = 1691; cityWall3.scale.y = 0.5; cityWall3.scale.x = 0.5; var bottomBlackBox = self.createAsset('blackBox', 'Black Box at bottom', 0, 1); bottomBlackBox.width = 2048; bottomBlackBox.height = 400; bottomBlackBox.y = 2732; self.addChild(bottomBlackBox); var goldLabel = new Text2('Gold: 30', { size: 100, fill: '#ffd700', align: 'left', dropShadow: true }); goldLabel.x = 120; goldLabel.y = 2632 - bottomBlackBox.height + (bottomBlackBox.height - goldLabel.height) / 2; self.addChild(goldLabel); var scoreLabel = new Text2('Score: 0', { size: 100, fill: '#ccbbff', align: 'left', dropShadow: true }); scoreLabel.x = 120; scoreLabel.y = 2772 - bottomBlackBox.height + (bottomBlackBox.height - scoreLabel.height) / 2; self.addChild(scoreLabel); var instructionLabel = new Text2("Tap to build towers (cost 10 gold)\nDon't let enemies reach the City Wall!", { size: 58, fill: '#eeeeee', align: 'left', dropShadow: true }); instructionLabel.x = 920; instructionLabel.y = 2632 - bottomBlackBox.height + (bottomBlackBox.height - instructionLabel.height) / 2; self.addChild(instructionLabel); var treasureChest = self.addChild(new TreasureChest()); treasureChest.scale.x = 1.3; treasureChest.scale.y = 1.3; treasureChest.x = 720; treasureChest.y = goldLabel.y + 65; var upgradeButton = self.addChild(new UpgradeButton()); upgradeButton.x = 1500; upgradeButton.y = 2590; self.upgradeLabel = new Text2("Upgrade Towers:", { size: 58, fill: '#dddddd', align: 'left', dropShadow: true }); self.upgradeLabel.x = 920; self.upgradeLabel.y = 2552; self.addChild(self.upgradeLabel); var costLabel = new Text2("Cost: 100", { size: 58, fill: '#dddd00', align: 'left', dropShadow: true }); costLabel.x = 1600; costLabel.y = 2552; self.addChild(costLabel); self.upgradeTowers = function () { if (playerGold >= upgradeCost) { playerGold -= upgradeCost; upgradeLevel += 1; upgradeCost *= 2; self.updateGoldLabel(); self.updateCostLabel(); if (upgradeLevel == 8) { self.upgradeLabel.setText('All upgraded - Go for the High Score!'); if (upgradeButton) { upgradeButton.destroy(); upgradeButton = null; } if (costLabel) { costLabel.destroy(); costLabel = null; } } } }; upgradeButton.on('down', self.upgradeTowers); });
===================================================================
--- original.js
+++ change.js
@@ -33,10 +33,16 @@
if (self.delayCounter > 0) {
self.delayCounter--;
} else {
self.alpha = 1;
+ var angle = Math.atan2(endY - startY, endX - startX);
+ var sinAngle = Math.sin(angle);
+ var cosAngle = Math.cos(angle);
+ var curveAmplitude = 10;
+ var curveFrequency = 0.1;
self.x += vx;
- self.y += vy;
+ self.y += vy + curveAmplitude * Math.sin(curveFrequency * (self.game.ticks - self.delayCounter));
+ self.rotation = Math.atan2(vy + curveAmplitude * Math.cos(curveFrequency * (self.game.ticks - self.delayCounter)), vx) * sinAngle + cosAngle;
}
if (--duration <= 0) {
self.destroy();
}
a medieval style stone tower. top down view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
an evil goblin. pixelart. top down view. In-Game asset. 2d. Blank background. High contrast. No shadows.
a silver sling bullet. pixelart. top down view. In-Game asset. 2d. Blank background. High contrast. No shadows.
brown wooden board. game gui style. 2048x400 pixels. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A medieval stone wall seen from the front. pixelart. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A large scary troll. front top down view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A treasure chest. Medieval style. cartoony. Open and full of gold coins. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A metalic square button with the symbol of a tower from chess. Pixelart. Gamegui style. Medieval. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a medieval style stone tower. top down view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a medieval style stone tower. top down view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a medieval style stone tower. top down view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a medieval style stone tower. top down view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a medieval style stone tower. top down view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a medieval style stone tower. top down view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a colossal menacing black knight in heavy armor. pixelart game sprite. front view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a crossbow bolt made of bronze. straight. pixelart. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a straight crossbow bolt made of gold. top down view. pixelart. bolt only, crossbow not included. vertical display, from bottom to top. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a straight crossbow bolt made of jade. top down view. pixelart. bolt only, crossbow not included. vertical display, from bottom to top. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a straight crossbow bolt made of cobalt. top down view. pixelart. bolt only, crossbow not included. vertical display, from bottom to top. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a straight magic missile. top down view. pixelart. bolt only, crossbow not included. vertical display, from bottom to top. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
a yellow fire arrow, pointing up. top down view. pixelart. vertical. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A red hunting arrow, pointing straight up. Pixelart. Vertical view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A purple posion dart. Feathers pointing down in the picture. Pixelart.vertical. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
an orc warrior with a large head and red eyes. pixelart. top down view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A fierce balrog. Pixelart. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A smooth round gold coin. Pixelart. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
An evil snotling flying on a dragonfly. front view. enemy character in a game. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
A flying red dragon breathing fire. side view. enemy character in a game. pixelart.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.