Code edit (1 edits merged)
Please save this source code
User prompt
No están tirando objetos a la moto, mejora la aparición de las personas y objetos al lado de la ruta. Deben aparecer antes y asegúrate que siguen escalando y alejándose del centro hasta salir por completo de la pantalla, pin un margen alto ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Cada 10 segundos debe repetirse aleatoriamente una de seis frases que serán assets de sonido
Code edit (2 edits merged)
Please save this source code
User prompt
Los objetos al lado del camino deben estar mucho más espaciados ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (3 edits merged)
Please save this source code
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'play')' in or related to this line: 'LK.playMusic('moto').play();' Line Number: 51
Code edit (13 edits merged)
Please save this source code
User prompt
Debe salir del asset karina o de truck1 que es lo mismo ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
El ítem debe salir desde el asset karina y debe caer el algún lugar random de la ruta siguiendo una parábola ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Los assets al lado de la ruta deben seguir escalando y alejarse del centro hasta salir por completo, ahora falla al final ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Cuando l al personas los árboles y los carteles digan de la pantalla, en ves de seguir escalando y alejarse del centro simplemente bajan y rompen la perspectiva ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
Code edit (4 edits merged)
Please save this source code
User prompt
El juego debe tener una barra de power vertical a la derecha, cuando un proyectil lo golpea debe bajar un 3% de la barra, también habrá otro tipo de proyectil que le bajará un 50%, la camioneta debe ser una sola y debe estar siempre delante de la moto bastante alejada, la camioneta debe arrojar ítem que restauran un 3% el power ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Cuando la moto pasa de la mitad izquierda debe hacer un flip en el eje y para que de la sensacion de peespectiva ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Están tirando muchos proyectiles no debe haber más de 3 proyectiles al mismo tiempo
Code edit (1 edits merged)
Please save this source code
User prompt
Todos los personajes deben verse mucho más grandes
User prompt
El efecto de avance esta parcialmente resuelto continúa con eso, el juego no debe tener un game over aún
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Motorcycle = Container.expand(function () { var self = Container.call(this); var motorcycleGraphics = self.attachAsset('motorcycle', { anchorX: 0.5, anchorY: 0.5 }); self.health = 3; self.power = 100; self.speed = 0; self.maxSpeed = 3; self.x = 0; self.update = function () { if (gameStarted) { if (self.speed < self.maxSpeed) { LK.getSound('moto').play(); LK.getSound('gritos').play(); LK.getSound('corruptosLoTuyos').play(); self.speed += 0.02; } roadOffset += self.speed; } }; self.takeDamage = function (damageAmount) { damageAmount = damageAmount || 3; self.power = Math.max(0, self.power - damageAmount); LK.effects.flashObject(self, 0xff0000, 500); LK.getSound('hit').play(); if (self.power <= 0) { LK.showGameOver(); } }; self.restorePower = function (amount) { amount = amount || 3; self.power = Math.min(100, self.power + amount); LK.getSound('power_up').play(); }; return self; }); var PowerItem = Container.expand(function () { var self = Container.call(this); var itemGraphics = self.attachAsset('power_item', { anchorX: 0.5, anchorY: 0.5 }); self.velocityX = 0; self.velocityY = 0; self.gravity = 0.15; self.update = function () { self.x += self.velocityX; self.y += self.velocityY; self.velocityY += self.gravity; }; return self; }); var Projectile = Container.expand(function (isHeavy) { var self = Container.call(this); self.isHeavy = isHeavy || false; var assetName = self.isHeavy ? 'heavy_projectile' : 'projectile'; var projectileGraphics = self.attachAsset(assetName, { anchorX: 0.5, anchorY: 0.5 }); self.velocityX = 0; self.velocityY = 0; self.gravity = 0; self.update = function () { self.x += self.velocityX; self.y += self.velocityY; self.velocityY += self.gravity; self.rotation += 0.1; }; return self; }); var RoadsideObject = Container.expand(function (type) { var self = Container.call(this); self.objectType = type || 'person'; var objectGraphics = self.attachAsset(self.objectType, { anchorX: 0.5, anchorY: 1.0 }); self.throwTimer = 0; // lateral offset base by type (trees further from road than people) self.sideOffsetBase = 120; if (type === 'tree') { self.sideOffsetBase = 220; } if (type === 'sign') { self.sideOffsetBase = 160; } // Configurar delay de lanzamiento por tipo var baseMin = 800, baseRand = 240; if (type === 'person') { baseMin = 840; baseRand = 320; } if (type === 'person2') { baseMin = 720; baseRand = 280; } if (type === 'person3') { baseMin = 600; baseRand = 360; } self.throwDelay = Math.random() * baseRand + baseMin; self.isLeftSide = true; self.originalY = 0; self.hasThrownThisCycle = false; self.minThrowDistanceFromMotorcycleFactor = 0.6; self.update = function () { if (self.objectType === 'person' || self.objectType === 'person2' || self.objectType === 'person3') { self.throwTimer++; if (self.throwTimer >= self.throwDelay && gameStarted && !self.hasThrownThisCycle) { var requiredDistance = horizonDistance * self.minThrowDistanceFromMotorcycleFactor; if (self.y <= motorcycle.y - requiredDistance) { self.throwObject(); self.hasThrownThisCycle = true; self.throwTimer = 0; // Recalcular segfn tipo var nMin = 400, nRand = 120; if (self.objectType === 'person') { nMin = 420; nRand = 160; } if (self.objectType === 'person2') { nMin = 360; nRand = 140; } if (self.objectType === 'person3') { nMin = 300; nRand = 180; } self.throwDelay = Math.random() * nRand + nMin; } } } if (gameStarted && motorcycle.speed > 0) { // aceleracion aparente mayor cerca del fondo (perspectiva grande) var distBefore = Math.max(0, roadY - self.y); var perspBefore = Math.max(0.01, Math.min(1, 1 - distBefore / horizonDistance)); var speedFactor = 1 + 2 * perspBefore; self.y += motorcycle.speed * 3 * speedFactor; var currentDistance = Math.max(0, roadY - self.y); var perspective = Math.max(0.01, Math.min(1, 1 - currentDistance / horizonDistance)); var roadWidth = 2048 * perspective; var sideOffset = self.sideOffsetBase * perspective; if (self.isLeftSide) { self.x = 1024 - roadWidth / 2 - sideOffset; } else { self.x = 1024 + roadWidth / 2 + sideOffset; } self.scaleX = (self.isLeftSide ? -1 : 1) * perspective; self.scaleY = perspective; if (gameStarted && (self.objectType === 'person' || self.objectType === 'person2' || self.objectType === 'person3') && !self.hasThrownThisCycle) { var requiredDistanceNow = horizonDistance * self.minThrowDistanceFromMotorcycleFactor; if (self.y <= motorcycle.y - requiredDistanceNow) { self.throwObject(); self.hasThrownThisCycle = true; self.throwTimer = 0; var nMin2 = 400, nRand2 = 120; if (self.objectType === 'person') { nMin2 = 420; nRand2 = 160; } if (self.objectType === 'person2') { nMin2 = 360; nRand2 = 140; } if (self.objectType === 'person3') { nMin2 = 300; nRand2 = 180; } self.throwDelay = Math.random() * nRand2 + nMin2; } } if (self.y > roadY + 200) { self.y = self.originalY; var resetDistance = roadY - self.originalY; var resetPerspective = Math.max(0.01, Math.min(1, 1 - resetDistance / horizonDistance)); var resetRoadWidth = 2048 * resetPerspective; var resetSideOffset = self.sideOffsetBase * resetPerspective; self.scaleX = (self.isLeftSide ? -1 : 1) * resetPerspective; self.scaleY = resetPerspective; if (self.isLeftSide) { self.x = 1024 - resetRoadWidth / 2 - resetSideOffset; } else { self.x = 1024 + resetRoadWidth / 2 + resetSideOffset; } self.hasThrownThisCycle = false; } } }; self.throwObject = function () { if (projectiles.length >= 3) { return; } var isHeavy = Math.random() < 0.15; var projectile = new Projectile(isHeavy); projectile.x = self.x; projectile.y = self.y - 20; var targetX = motorcycle.x + (Math.random() - 0.5) * 260; var horizontalFactor = isHeavy ? 0.009 : 0.008; projectile.velocityX = (targetX - projectile.x) * horizontalFactor; var initialUpImpulse = isHeavy ? -6 - Math.random() * 2 : -8 - Math.random() * 3; projectile.velocityY = initialUpImpulse; projectile.gravity = isHeavy ? 0.35 : 0.28; projectiles.push(projectile); game.addChild(projectile); LK.getSound('throw').play(); }; return self; }); var Truck = Container.expand(function () { var self = Container.call(this); var truckGraphics = self.attachAsset('truck', { anchorX: 0.5, anchorY: 0.5 }); // karina indicator above the truck before dropping power item var karinaSprite = self.attachAsset('karina', { anchorX: 0.5, anchorY: 1.0 }); self.karinaBaseY = -450; self.karinaUpY = self.karinaBaseY - 30; karinaSprite.y = self.karinaBaseY; karinaSprite.scaleX = 3.0; karinaSprite.scaleY = 3.0; karinaSprite.visible = false; self.speed = -6; self.active = true; self.dropTimer = 0; self.dropDelay = 180; self.targetY = horizonY + (roadY - horizonY) * 0.25; self.baseXFactorFromCenter = 0.42; self.oscAmp = 30; self.oscSpeed = 0.02; self.oscPhase = Math.random() * Math.PI * 2; self.karinaLead = 30; // frames before drop to show karina self.karinaAnimating = false; self.update = function () { if (self.active) { if (self.y > self.targetY) { self.y += self.speed; if (self.y <= self.targetY) { self.y = self.targetY; } } else { self.y = self.targetY; } var currentDistance = roadY - self.y; var perspective = Math.max(0.01, Math.min(1, 1 - currentDistance / (roadY - horizonY))); var roadWidthAtY = 2048 * perspective; var roadRightEdge = 1024 + roadWidthAtY / 2; var centerX = 1024; var targetBaseX = centerX + roadWidthAtY * self.baseXFactorFromCenter; self.oscPhase += self.oscSpeed; self.x = Math.min(roadRightEdge - 40 * perspective, targetBaseX + Math.sin(self.oscPhase) * self.oscAmp * perspective); var distanceToHorizon = roadY - horizonY; var currentDistance = roadY - self.y; var perspective = Math.max(0, 1 - currentDistance / distanceToHorizon); var centerX = 1024; self.scaleX = perspective; self.scaleY = perspective; if (gameStarted) { self.dropTimer++; if (!karinaSprite.visible && self.dropTimer >= self.dropDelay - self.karinaLead) { karinaSprite.visible = true; if (!self.karinaAnimating) { self.karinaAnimating = true; var upDur = Math.max(6, Math.floor(self.karinaLead * 0.4)); var downDur = Math.max(6, self.karinaLead - upDur); tween(karinaSprite, { y: self.karinaUpY }, { duration: upDur, easing: tween.easeOut, onFinish: function onFinish() { tween(karinaSprite, { y: self.karinaBaseY }, { duration: downDur, easing: tween.easeIn, onFinish: function onFinish() { self.karinaAnimating = false; } }); } }); } } if (self.dropTimer >= self.dropDelay) { self.dropPowerItem(); self.dropTimer = 0; karinaSprite.visible = false; karinaSprite.y = self.karinaBaseY; self.karinaAnimating = false; } } } }; self.dropPowerItem = function () { var powerItem = new PowerItem(); powerItem.x = self.x + (Math.random() - 0.5) * 100; powerItem.y = self.y + 50; // choose random point on the road (not targeting the motorcycle) var roadLeft = 200; var roadRight = 1848; var margin = 60; var targetX = roadLeft + margin + Math.random() * Math.max(0, roadRight - roadLeft - margin * 2); var targetY = roadY; powerItem.velocityX = (targetX - powerItem.x) * 0.01; powerItem.velocityY = (targetY - powerItem.y) * 0.008; powerItems.push(powerItem); game.addChild(powerItem); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb }); /**** * Game Code ****/ var roadY = 2732; var horizonY = Math.floor(roadY * 0.6); var roadOffset = 0; var gameStarted = false; var trucksCleared = false; var roadSegments = []; var roadLines = []; var leftSidewalks = []; var rightSidewalks = []; var totalSegments = 90; var horizonDistance = roadY - horizonY; var segmentSpacing = horizonDistance / totalSegments; game.addChild(LK.getAsset('cesped', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 2500, scaleX: 5, scaleY: 3.45 })); game.addChild(LK.getAsset('skyline', { anchor: 0.5, x: 1024, y: 0, scaleX: 5, scaleY: 5 })); for (var i = 0; i < totalSegments; i++) { var distance = i * segmentSpacing; var yPosition = roadY - distance; var perspective = 1 - distance / horizonDistance; var roadWidth = 2048 * perspective; var segmentHeight = segmentSpacing * 1.2 * perspective; if (yPosition >= horizonY) { if (i % 4 == 0) { var centerLine = game.addChild(LK.getAsset('road_line', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: yPosition, scaleX: perspective * 2, scaleY: perspective * 2 })); roadLines.push(centerLine); } var roadSeg = game.addChild(LK.getAsset('road_segment', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: yPosition, scaleX: roadWidth / 100, scaleY: segmentSpacing / 5 * perspective })); roadSegments.push(roadSeg); } } var powerBarBg = LK.getAsset('power_bar_bg', { anchorX: 0.5, anchorY: 1.0, x: 600, y: -300 }); LK.gui.center.addChild(powerBarBg); var powerBarFill = LK.getAsset('power_bar_fill', { anchorX: 0.5, anchorY: 1.0, x: 600, y: -300 }); LK.gui.center.addChild(powerBarFill); var powerItems = []; var roadsideObjects = []; var projectiles = []; var objectTypes = ['person', 'tree', 'sign']; // incluir variantes de personas objectTypes = ['person', 'person2', 'person3', 'person3', 'tree', 'sign']; for (var i = 0; i < 30; i++) { var objectType = objectTypes[i % objectTypes.length]; var leftObject = game.addChild(new RoadsideObject(objectType)); var distance = i / 30 * horizonDistance; var yPos = roadY - distance; var perspective = 1 - distance / horizonDistance; var roadWidth = 2048 * perspective; if (yPos >= horizonY) { leftObject.x = 1024 - roadWidth / 2 - 120 * perspective; leftObject.y = yPos; leftObject.originalY = yPos; leftObject.scaleX = perspective; leftObject.scaleY = perspective; leftObject.isLeftSide = true; roadsideObjects.push(leftObject); } } for (var i = 0; i < 30; i++) { var objectType = objectTypes[i % objectTypes.length]; var rightObject = game.addChild(new RoadsideObject(objectType)); var distance = i / 30 * horizonDistance; var yPos = roadY - distance; var perspective = 1 - distance / horizonDistance; var roadWidth = 2048 * perspective; if (yPos >= horizonY) { rightObject.x = 1024 + roadWidth / 2 + 120 * perspective; rightObject.y = yPos; rightObject.originalY = yPos; rightObject.scaleX = perspective; rightObject.scaleY = perspective; rightObject.isLeftSide = false; roadsideObjects.push(rightObject); } } var scoreTxt = new Text2('Distancia: 0m', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var healthTxt = new Text2('Power: 3', { size: 60, fill: 0xFF0000 }); healthTxt.anchor.set(0, 0); healthTxt.x = 0; healthTxt.y = 0; var motorcycle = game.addChild(new Motorcycle()); motorcycle.x = 800; motorcycle.y = roadY - 250; LK.gui.topRight.addChild(healthTxt); var dragStartX = 0; var isDragging = false; game.down = function (x, y, obj) { if (gameStarted) { isDragging = true; dragStartX = x; } }; game.move = function (x, y, obj) { if (isDragging && gameStarted) { var deltaX = x - dragStartX; var newX = motorcycle.x + deltaX * 0.5; var roadLeft = 200; var roadRight = 1848; if (newX >= roadLeft && newX <= roadRight) { motorcycle.x = newX; } dragStartX = x; } }; game.up = function (x, y, obj) { isDragging = false; }; var trucks = []; var truck1 = game.addChild(new Truck()); truck1.x = 1024; truck1.y = roadY - 600; trucks.push(truck1); game.update = function () { if (!trucksCleared) { var allTrucksCleared = true; for (var i = 0; i < trucks.length; i++) { if (trucks[i].y > roadY - 300) { allTrucksCleared = false; break; } } if (allTrucksCleared) { trucksCleared = true; gameStarted = true; } } if (gameStarted && motorcycle.speed > 0) { var movementFactor = 3; var offset = roadOffset * movementFactor % horizonDistance; for (var i = 0; i < roadSegments.length; i++) { var distanceAlong = (i * segmentSpacing + offset) % horizonDistance; var yPosition = roadY - distanceAlong; var perspective = Math.max(0.01, Math.min(1, 1 - distanceAlong / horizonDistance)); var roadWidth = 2048 * perspective; roadSegments[i].y = yPosition; roadSegments[i].scaleX = roadWidth / 100; roadSegments[i].scaleY = horizonDistance / totalSegments / 5 * perspective; } var lineSpacing = segmentSpacing * 4; for (var j = 0; j < roadLines.length; j++) { var lineDistance = (j * lineSpacing + offset) % horizonDistance; var lineY = roadY - lineDistance; var linePerspective = Math.max(0.01, Math.min(1, 1 - lineDistance / horizonDistance)); roadLines[j].y = lineY; var lineCenterShift = typeof curveCenterShift !== 'undefined' ? curveCenterShift : 0; roadLines[j].x = 1024 + lineCenterShift; roadLines[j].scaleX = linePerspective * 3; roadLines[j].scaleY = linePerspective * 4; } for (var k = 0; k < leftSidewalks.length; k++) { var swDistance = (k * segmentSpacing + offset) % horizonDistance; var swY = roadY - swDistance; var swPerspective = Math.max(0.01, Math.min(1, 1 - swDistance / horizonDistance)); var swRoadWidth = 2048 * swPerspective; var segmentHeight = horizonDistance / totalSegments * 1.2 * swPerspective; leftSidewalks[k].y = swY; rightSidewalks[k].y = swY; leftSidewalks[k].x = 1024 - swRoadWidth / 2 - 80 * swPerspective; leftSidewalks[k].scaleX = swPerspective * 2; leftSidewalks[k].scaleY = segmentHeight / 40; rightSidewalks[k].x = 1024 + swRoadWidth / 2 + 80 * swPerspective; rightSidewalks[k].scaleX = swPerspective * 2; rightSidewalks[k].scaleY = segmentHeight / 40; } } if (gameStarted) { var distance = Math.floor(roadOffset / 10); scoreTxt.setText('Distance: ' + distance + 'm'); LK.setScore(distance); } healthTxt.setText('Power: ' + Math.round(motorcycle.power) + '%'); if (gameStarted) { if (motorcycle.lastX === undefined) { motorcycle.lastX = motorcycle.x; motorcycle.isFlipping = false; } var screenCenter = 1024; var crossedToRight = motorcycle.lastX < screenCenter && motorcycle.x >= screenCenter; var crossedToLeft = motorcycle.lastX > screenCenter && motorcycle.x <= screenCenter; if ((crossedToRight || crossedToLeft) && !motorcycle.isFlipping) { motorcycle.isFlipping = true; tween(motorcycle, { scaleX: -motorcycle.scaleX }, { duration: 0, easing: tween.easeOut, onFinish: function onFinish() { motorcycle.isFlipping = false; } }); } motorcycle.lastX = motorcycle.x; } var powerPercentage = motorcycle.power / 100; powerBarFill.scaleY = powerPercentage; if (powerPercentage > 0.6) { powerBarFill.tint = 0x00ff00; } else if (powerPercentage > 0.3) { powerBarFill.tint = 0xffff00; } else { powerBarFill.tint = 0xff0000; } for (var i = projectiles.length - 1; i >= 0; i--) { var projectile = projectiles[i]; if (projectile.x < -100 || projectile.x > 2148 || projectile.y > 2732 + 100) { projectile.destroy(); projectiles.splice(i, 1); continue; } if (gameStarted && projectile.intersects(motorcycle)) { var damageAmount = projectile.isHeavy ? 20 : 3; motorcycle.takeDamage(damageAmount); projectile.destroy(); projectiles.splice(i, 1); continue; } if (projectile.y >= roadY - 20 && projectile.velocityY > 0) { projectile.destroy(); projectiles.splice(i, 1); } } for (var i = powerItems.length - 1; i >= 0; i--) { var powerItem = powerItems[i]; if (powerItem.x < -100 || powerItem.x > 2148 || powerItem.y > 2732 + 100) { powerItem.destroy(); powerItems.splice(i, 1); continue; } if (gameStarted && powerItem.intersects(motorcycle)) { motorcycle.restorePower(3); powerItem.destroy(); powerItems.splice(i, 1); continue; } if (powerItem.y >= roadY - 20 && powerItem.velocityY > 0) { powerItem.destroy(); powerItems.splice(i, 1); } } if (gameStarted && LK.ticks % 600 == 0) { for (var j = 0; j < roadsideObjects.length; j++) { if (roadsideObjects[j].objectType === 'person' || roadsideObjects[j].objectType === 'person2' || roadsideObjects[j].objectType === 'person3') { var dec = 5; if (roadsideObjects[j].objectType === 'person3') { dec = 8; } if (roadsideObjects[j].objectType === 'person2') { dec = 6; } roadsideObjects[j].throwDelay = Math.max(20, roadsideObjects[j].throwDelay - dec); } } } };
===================================================================
--- original.js
+++ change.js
@@ -14,9 +14,9 @@
});
self.health = 3;
self.power = 100;
self.speed = 0;
- self.maxSpeed = 8;
+ self.maxSpeed = 3;
self.x = 0;
self.update = function () {
if (gameStarted) {
if (self.speed < self.maxSpeed) {
@@ -81,23 +81,35 @@
});
var RoadsideObject = Container.expand(function (type) {
var self = Container.call(this);
self.objectType = type || 'person';
+ var objectGraphics = self.attachAsset(self.objectType, {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
self.throwTimer = 0;
+ // lateral offset base by type (trees further from road than people)
+ self.sideOffsetBase = 120;
+ if (type === 'tree') {
+ self.sideOffsetBase = 220;
+ }
+ if (type === 'sign') {
+ self.sideOffsetBase = 160;
+ }
// Configurar delay de lanzamiento por tipo
- var baseMin = 400,
- baseRand = 120;
+ var baseMin = 800,
+ baseRand = 240;
if (type === 'person') {
- baseMin = 420;
- baseRand = 160;
+ baseMin = 840;
+ baseRand = 320;
}
if (type === 'person2') {
- baseMin = 360;
- baseRand = 140;
+ baseMin = 720;
+ baseRand = 280;
}
if (type === 'person3') {
- baseMin = 300;
- baseRand = 180;
+ baseMin = 600;
+ baseRand = 360;
}
self.throwDelay = Math.random() * baseRand + baseMin;
self.isLeftSide = true;
self.originalY = 0;
@@ -131,18 +143,23 @@
}
}
}
if (gameStarted && motorcycle.speed > 0) {
- self.y += motorcycle.speed * 3;
+ // aceleracion aparente mayor cerca del fondo (perspectiva grande)
+ var distBefore = Math.max(0, roadY - self.y);
+ var perspBefore = Math.max(0.01, Math.min(1, 1 - distBefore / horizonDistance));
+ var speedFactor = 1 + 2 * perspBefore;
+ self.y += motorcycle.speed * 3 * speedFactor;
var currentDistance = Math.max(0, roadY - self.y);
var perspective = Math.max(0.01, Math.min(1, 1 - currentDistance / horizonDistance));
var roadWidth = 2048 * perspective;
+ var sideOffset = self.sideOffsetBase * perspective;
if (self.isLeftSide) {
- self.x = 1024 - roadWidth / 2 - 120 * perspective;
+ self.x = 1024 - roadWidth / 2 - sideOffset;
} else {
- self.x = 1024 + roadWidth / 2 + 120 * perspective;
+ self.x = 1024 + roadWidth / 2 + sideOffset;
}
- self.scaleX = perspective;
+ self.scaleX = (self.isLeftSide ? -1 : 1) * perspective;
self.scaleY = perspective;
if (gameStarted && (self.objectType === 'person' || self.objectType === 'person2' || self.objectType === 'person3') && !self.hasThrownThisCycle) {
var requiredDistanceNow = horizonDistance * self.minThrowDistanceFromMotorcycleFactor;
if (self.y <= motorcycle.y - requiredDistanceNow) {
@@ -169,10 +186,17 @@
if (self.y > roadY + 200) {
self.y = self.originalY;
var resetDistance = roadY - self.originalY;
var resetPerspective = Math.max(0.01, Math.min(1, 1 - resetDistance / horizonDistance));
- self.scaleX = resetPerspective;
+ var resetRoadWidth = 2048 * resetPerspective;
+ var resetSideOffset = self.sideOffsetBase * resetPerspective;
+ self.scaleX = (self.isLeftSide ? -1 : 1) * resetPerspective;
self.scaleY = resetPerspective;
+ if (self.isLeftSide) {
+ self.x = 1024 - resetRoadWidth / 2 - resetSideOffset;
+ } else {
+ self.x = 1024 + resetRoadWidth / 2 + resetSideOffset;
+ }
self.hasThrownThisCycle = false;
}
}
};
@@ -201,8 +225,19 @@
var truckGraphics = self.attachAsset('truck', {
anchorX: 0.5,
anchorY: 0.5
});
+ // karina indicator above the truck before dropping power item
+ var karinaSprite = self.attachAsset('karina', {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ self.karinaBaseY = -450;
+ self.karinaUpY = self.karinaBaseY - 30;
+ karinaSprite.y = self.karinaBaseY;
+ karinaSprite.scaleX = 3.0;
+ karinaSprite.scaleY = 3.0;
+ karinaSprite.visible = false;
self.speed = -6;
self.active = true;
self.dropTimer = 0;
self.dropDelay = 180;
@@ -210,8 +245,10 @@
self.baseXFactorFromCenter = 0.42;
self.oscAmp = 30;
self.oscSpeed = 0.02;
self.oscPhase = Math.random() * Math.PI * 2;
+ self.karinaLead = 30; // frames before drop to show karina
+ self.karinaAnimating = false;
self.update = function () {
if (self.active) {
if (self.y > self.targetY) {
self.y += self.speed;
@@ -236,20 +273,52 @@
self.scaleX = perspective;
self.scaleY = perspective;
if (gameStarted) {
self.dropTimer++;
+ if (!karinaSprite.visible && self.dropTimer >= self.dropDelay - self.karinaLead) {
+ karinaSprite.visible = true;
+ if (!self.karinaAnimating) {
+ self.karinaAnimating = true;
+ var upDur = Math.max(6, Math.floor(self.karinaLead * 0.4));
+ var downDur = Math.max(6, self.karinaLead - upDur);
+ tween(karinaSprite, {
+ y: self.karinaUpY
+ }, {
+ duration: upDur,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(karinaSprite, {
+ y: self.karinaBaseY
+ }, {
+ duration: downDur,
+ easing: tween.easeIn,
+ onFinish: function onFinish() {
+ self.karinaAnimating = false;
+ }
+ });
+ }
+ });
+ }
+ }
if (self.dropTimer >= self.dropDelay) {
self.dropPowerItem();
self.dropTimer = 0;
+ karinaSprite.visible = false;
+ karinaSprite.y = self.karinaBaseY;
+ self.karinaAnimating = false;
}
}
}
};
self.dropPowerItem = function () {
var powerItem = new PowerItem();
powerItem.x = self.x + (Math.random() - 0.5) * 100;
powerItem.y = self.y + 50;
- var targetX = motorcycle.x + (Math.random() - 0.5) * 300;
+ // choose random point on the road (not targeting the motorcycle)
+ var roadLeft = 200;
+ var roadRight = 1848;
+ var margin = 60;
+ var targetX = roadLeft + margin + Math.random() * Math.max(0, roadRight - roadLeft - margin * 2);
var targetY = roadY;
powerItem.velocityX = (targetX - powerItem.x) * 0.01;
powerItem.velocityY = (targetY - powerItem.y) * 0.008;
powerItems.push(powerItem);
@@ -276,35 +345,33 @@
var roadSegments = [];
var roadLines = [];
var leftSidewalks = [];
var rightSidewalks = [];
-var totalSegments = 240;
+var totalSegments = 90;
var horizonDistance = roadY - horizonY;
var segmentSpacing = horizonDistance / totalSegments;
game.addChild(LK.getAsset('cesped', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 2500,
scaleX: 5,
- scaleY: 3.4
+ scaleY: 3.45
}));
+game.addChild(LK.getAsset('skyline', {
+ anchor: 0.5,
+ x: 1024,
+ y: 0,
+ scaleX: 5,
+ scaleY: 5
+}));
for (var i = 0; i < totalSegments; i++) {
var distance = i * segmentSpacing;
var yPosition = roadY - distance;
var perspective = 1 - distance / horizonDistance;
var roadWidth = 2048 * perspective;
var segmentHeight = segmentSpacing * 1.2 * perspective;
if (yPosition >= horizonY) {
- var roadSeg = game.addChild(LK.getAsset('road_segment', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: 1024,
- y: yPosition,
- scaleX: roadWidth / 100,
- scaleY: segmentSpacing / 5 * perspective
- }));
- roadSegments.push(roadSeg);
if (i % 4 == 0) {
var centerLine = game.addChild(LK.getAsset('road_line', {
anchorX: 0.5,
anchorY: 0.5,
@@ -314,26 +381,17 @@
scaleY: perspective * 2
}));
roadLines.push(centerLine);
}
- var leftSidewalk = game.addChild(LK.getAsset('sidewalk_segment', {
- anchorX: 1,
+ var roadSeg = game.addChild(LK.getAsset('road_segment', {
+ anchorX: 0.5,
anchorY: 0.5,
- x: 1024 - roadWidth / 2 - 80 * perspective,
+ x: 1024,
y: yPosition,
- scaleX: perspective * 1.5,
- scaleY: segmentHeight / 40
+ scaleX: roadWidth / 100,
+ scaleY: segmentSpacing / 5 * perspective
}));
- leftSidewalks.push(leftSidewalk);
- var rightSidewalk = game.addChild(LK.getAsset('sidewalk_segment', {
- anchorX: 0,
- anchorY: 0.5,
- x: 1024 + roadWidth / 2 + 80 * perspective,
- y: yPosition,
- scaleX: perspective * 1.5,
- scaleY: segmentHeight / 40
- }));
- rightSidewalks.push(rightSidewalk);
+ roadSegments.push(roadSeg);
}
}
var powerBarBg = LK.getAsset('power_bar_bg', {
anchorX: 0.5,
@@ -465,8 +523,10 @@
var lineDistance = (j * lineSpacing + offset) % horizonDistance;
var lineY = roadY - lineDistance;
var linePerspective = Math.max(0.01, Math.min(1, 1 - lineDistance / horizonDistance));
roadLines[j].y = lineY;
+ var lineCenterShift = typeof curveCenterShift !== 'undefined' ? curveCenterShift : 0;
+ roadLines[j].x = 1024 + lineCenterShift;
roadLines[j].scaleX = linePerspective * 3;
roadLines[j].scaleY = linePerspective * 4;
}
for (var k = 0; k < leftSidewalks.length; k++) {
Un grupo de gente manifestando a cuerpo completo mirando al frente enojada con banderas argentinas, todo en pixel art. In-Game asset. 2d. High contrast. No shadows
Una planta de lechuga en pixel art en el aire. In-Game asset. 2d. High contrast. No shadows
Un queso gruyere en pixel art. In-Game asset. 2d. High contrast. No shadows
moto
Music
gritos
Music
noEsUnaHuida
Sound effect
frase2
Sound effect
frase3
Sound effect
frase6
Sound effect
edge
Sound effect
frase1
Sound effect
frase4
Sound effect
frase5
Sound effect
hit
Sound effect
power_up
Sound effect
throw
Sound effect
piedra
Sound effect
altacoimera
Sound effect
alta
Music
cloaca
Sound effect
corruptosLoTuyos
Sound effect
frase7
Sound effect
queso
Sound effect
espert
Sound effect
afuera
Sound effect
level_complete
Sound effect
pill_throw
Sound effect
diaper_drop
Sound effect
bridge_level
Sound effect
miraConan
Sound effect