Code edit (1 edits merged)
Please save this source code
User prompt
Sky Pilot Adventures
Initial prompt
Toca planes (2016). Tap on any plane to get started, tap on ginger ๐ฑ, Harvey ๐ถ, twitter ๐ฆ, jacky ๐ฐ, or buzzy ๐น to choose, tap on the plane to watch it begin flying, before it lands into space, to reach to the pictures taking.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var PhotoOpportunity = Container.expand(function () {
var self = Container.call(this);
self.captured = false;
var photoGraphics = self.attachAsset('photo_opportunity', {
anchorX: 0.5,
anchorY: 0.5
});
// Add pulsing animation
var pulseUp = function pulseUp() {
tween(photoGraphics, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: pulseDown
});
};
var pulseDown = function pulseDown() {
tween(photoGraphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: pulseUp
});
};
pulseUp();
self.capture = function () {
if (!self.captured) {
self.captured = true;
LK.getSound('photo_capture').play();
LK.setScore(LK.getScore() + 50);
scoreText.setText('Score: ' + LK.getScore());
// Flash effect
tween(photoGraphics, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
}
};
self.down = function (x, y, obj) {
if (gameState === 'flying') {
self.capture();
}
};
return self;
});
var Pilot = Container.expand(function (pilotType) {
var self = Container.call(this);
self.pilotType = pilotType;
self.isSelected = false;
var pilotGraphics = self.attachAsset('pilot_' + pilotType, {
anchorX: 0.5,
anchorY: 0.5
});
// Create pilot name text
var nameText = new Text2(pilotType.charAt(0).toUpperCase() + pilotType.slice(1), {
size: 36,
fill: 0xFFFFFF
});
nameText.anchor.set(0.5, 0.5);
nameText.y = 120;
self.addChild(nameText);
self.select = function () {
self.isSelected = true;
pilotGraphics.alpha = 1.0;
tween(pilotGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 300,
easing: tween.easeOut
});
};
self.deselect = function () {
self.isSelected = false;
pilotGraphics.alpha = 0.7;
tween(pilotGraphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 300,
easing: tween.easeOut
});
};
self.down = function (x, y, obj) {
if (gameState === 'selection') {
selectPilot(self.pilotType);
}
};
// Initialize as deselected
self.deselect();
return self;
});
var Plane = Container.expand(function (planeType) {
var self = Container.call(this);
self.planeType = planeType;
self.speed = 0;
self.altitude = 0;
self.isFlying = false;
var planeGraphics = self.attachAsset('plane_' + planeType, {
anchorX: 0.5,
anchorY: 0.5
});
self.launch = function () {
self.isFlying = true;
self.speed = 8;
LK.getSound('takeoff').play();
tween(self, {
rotation: -0.3
}, {
duration: 1000,
easing: tween.easeOut
});
};
self.update = function () {
if (self.isFlying) {
self.y -= self.speed;
self.altitude = Math.max(0, startY - self.y);
// Update altitude display
altitudeText.setText('Altitude: ' + Math.floor(self.altitude) + 'm');
// Check for space achievement
if (self.altitude >= 3000 && !spaceAchieved) {
spaceAchieved = true;
LK.setScore(LK.getScore() + 1000);
scoreText.setText('Score: ' + LK.getScore());
LK.getSound('milestone').play();
// Show you win when reaching space
LK.setTimeout(function () {
LK.showYouWin();
}, 1000);
}
// Check altitude milestones
var currentMilestone = Math.floor(self.altitude / 500);
if (currentMilestone > lastMilestone) {
lastMilestone = currentMilestone;
LK.setScore(LK.getScore() + 100);
scoreText.setText('Score: ' + LK.getScore());
LK.getSound('milestone').play();
}
}
};
self.down = function (x, y, obj) {
if (gameState === 'ready' && !self.isFlying) {
self.launch();
gameState = 'flying';
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Sound assets
// Photo opportunity assets
// Plane assets
// Pilot character assets
// Game state variables
var gameState = 'selection'; // 'selection', 'ready', 'flying'
var selectedPilot = null;
var currentPlane = null;
var pilots = [];
var photoOpportunities = [];
var startY = 0;
var spaceAchieved = false;
var lastMilestone = 0;
// UI Elements
var titleText = new Text2('Sky Pilot Adventures', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 200;
game.addChild(titleText);
var instructionText = new Text2('Choose Your Pilot!', {
size: 48,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 300;
game.addChild(instructionText);
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var altitudeText = new Text2('Altitude: 0m', {
size: 48,
fill: 0xFFFFFF
});
altitudeText.anchor.set(0.5, 0);
altitudeText.y = 80;
LK.gui.top.addChild(altitudeText);
// Create pilots
var pilotTypes = ['ginger', 'harvey', 'twitter', 'jacky', 'buzzy'];
var pilotPositions = [{
x: 300,
y: 600
}, {
x: 650,
y: 600
}, {
x: 1000,
y: 600
}, {
x: 1350,
y: 600
}, {
x: 1700,
y: 600
}];
for (var i = 0; i < pilotTypes.length; i++) {
var pilot = new Pilot(pilotTypes[i]);
pilot.x = pilotPositions[i].x;
pilot.y = pilotPositions[i].y;
pilots.push(pilot);
game.addChild(pilot);
}
function selectPilot(pilotType) {
// Deselect all pilots
for (var i = 0; i < pilots.length; i++) {
pilots[i].deselect();
}
// Select chosen pilot
selectedPilot = pilotType;
for (var i = 0; i < pilots.length; i++) {
if (pilots[i].pilotType === pilotType) {
pilots[i].select();
break;
}
}
// Hide pilots and show plane
for (var i = 0; i < pilots.length; i++) {
pilots[i].visible = false;
}
// Create and show plane
currentPlane = new Plane(pilotType);
currentPlane.x = 1024;
currentPlane.y = 2500;
startY = currentPlane.y;
game.addChild(currentPlane);
// Update instruction
instructionText.setText('Tap Your Plane to Launch!');
gameState = 'ready';
// Generate photo opportunities
generatePhotoOpportunities();
}
function generatePhotoOpportunities() {
// Clear existing photo opportunities
for (var i = photoOpportunities.length - 1; i >= 0; i--) {
photoOpportunities[i].destroy();
}
photoOpportunities = [];
// Create photo opportunities at different altitudes
for (var altitude = 500; altitude <= 3000; altitude += 400) {
var photo = new PhotoOpportunity();
photo.x = 200 + Math.random() * 1648; // Random x position
photo.y = startY - altitude;
photoOpportunities.push(photo);
game.addChild(photo);
}
}
// Game update loop
game.update = function () {
// Clean up destroyed photo opportunities
for (var i = photoOpportunities.length - 1; i >= 0; i--) {
if (photoOpportunities[i].destroyed) {
photoOpportunities.splice(i, 1);
}
}
// Update camera position to follow plane
if (currentPlane && currentPlane.isFlying) {
var targetY = Math.max(0, currentPlane.y - 1366);
game.y = targetY;
// Hide instruction text when flying
if (gameState === 'flying') {
instructionText.visible = false;
titleText.visible = false;
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var PhotoOpportunity = Container.expand(function () {
var self = Container.call(this);
self.captured = false;
var photoGraphics = self.attachAsset('photo_opportunity', {
anchorX: 0.5,
anchorY: 0.5
});
// Add pulsing animation
var pulseUp = function pulseUp() {
tween(photoGraphics, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: pulseDown
});
};
var pulseDown = function pulseDown() {
tween(photoGraphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: pulseUp
});
};
pulseUp();
self.capture = function () {
if (!self.captured) {
self.captured = true;
LK.getSound('photo_capture').play();
LK.setScore(LK.getScore() + 50);
scoreText.setText('Score: ' + LK.getScore());
// Flash effect
tween(photoGraphics, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
}
};
self.down = function (x, y, obj) {
if (gameState === 'flying') {
self.capture();
}
};
return self;
});
var Pilot = Container.expand(function (pilotType) {
var self = Container.call(this);
self.pilotType = pilotType;
self.isSelected = false;
var pilotGraphics = self.attachAsset('pilot_' + pilotType, {
anchorX: 0.5,
anchorY: 0.5
});
// Create pilot name text
var nameText = new Text2(pilotType.charAt(0).toUpperCase() + pilotType.slice(1), {
size: 36,
fill: 0xFFFFFF
});
nameText.anchor.set(0.5, 0.5);
nameText.y = 120;
self.addChild(nameText);
self.select = function () {
self.isSelected = true;
pilotGraphics.alpha = 1.0;
tween(pilotGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 300,
easing: tween.easeOut
});
};
self.deselect = function () {
self.isSelected = false;
pilotGraphics.alpha = 0.7;
tween(pilotGraphics, {
scaleX: 1.0,
scaleY: 1.0
}, {
duration: 300,
easing: tween.easeOut
});
};
self.down = function (x, y, obj) {
if (gameState === 'selection') {
selectPilot(self.pilotType);
}
};
// Initialize as deselected
self.deselect();
return self;
});
var Plane = Container.expand(function (planeType) {
var self = Container.call(this);
self.planeType = planeType;
self.speed = 0;
self.altitude = 0;
self.isFlying = false;
var planeGraphics = self.attachAsset('plane_' + planeType, {
anchorX: 0.5,
anchorY: 0.5
});
self.launch = function () {
self.isFlying = true;
self.speed = 8;
LK.getSound('takeoff').play();
tween(self, {
rotation: -0.3
}, {
duration: 1000,
easing: tween.easeOut
});
};
self.update = function () {
if (self.isFlying) {
self.y -= self.speed;
self.altitude = Math.max(0, startY - self.y);
// Update altitude display
altitudeText.setText('Altitude: ' + Math.floor(self.altitude) + 'm');
// Check for space achievement
if (self.altitude >= 3000 && !spaceAchieved) {
spaceAchieved = true;
LK.setScore(LK.getScore() + 1000);
scoreText.setText('Score: ' + LK.getScore());
LK.getSound('milestone').play();
// Show you win when reaching space
LK.setTimeout(function () {
LK.showYouWin();
}, 1000);
}
// Check altitude milestones
var currentMilestone = Math.floor(self.altitude / 500);
if (currentMilestone > lastMilestone) {
lastMilestone = currentMilestone;
LK.setScore(LK.getScore() + 100);
scoreText.setText('Score: ' + LK.getScore());
LK.getSound('milestone').play();
}
}
};
self.down = function (x, y, obj) {
if (gameState === 'ready' && !self.isFlying) {
self.launch();
gameState = 'flying';
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Sound assets
// Photo opportunity assets
// Plane assets
// Pilot character assets
// Game state variables
var gameState = 'selection'; // 'selection', 'ready', 'flying'
var selectedPilot = null;
var currentPlane = null;
var pilots = [];
var photoOpportunities = [];
var startY = 0;
var spaceAchieved = false;
var lastMilestone = 0;
// UI Elements
var titleText = new Text2('Sky Pilot Adventures', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 200;
game.addChild(titleText);
var instructionText = new Text2('Choose Your Pilot!', {
size: 48,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 300;
game.addChild(instructionText);
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var altitudeText = new Text2('Altitude: 0m', {
size: 48,
fill: 0xFFFFFF
});
altitudeText.anchor.set(0.5, 0);
altitudeText.y = 80;
LK.gui.top.addChild(altitudeText);
// Create pilots
var pilotTypes = ['ginger', 'harvey', 'twitter', 'jacky', 'buzzy'];
var pilotPositions = [{
x: 300,
y: 600
}, {
x: 650,
y: 600
}, {
x: 1000,
y: 600
}, {
x: 1350,
y: 600
}, {
x: 1700,
y: 600
}];
for (var i = 0; i < pilotTypes.length; i++) {
var pilot = new Pilot(pilotTypes[i]);
pilot.x = pilotPositions[i].x;
pilot.y = pilotPositions[i].y;
pilots.push(pilot);
game.addChild(pilot);
}
function selectPilot(pilotType) {
// Deselect all pilots
for (var i = 0; i < pilots.length; i++) {
pilots[i].deselect();
}
// Select chosen pilot
selectedPilot = pilotType;
for (var i = 0; i < pilots.length; i++) {
if (pilots[i].pilotType === pilotType) {
pilots[i].select();
break;
}
}
// Hide pilots and show plane
for (var i = 0; i < pilots.length; i++) {
pilots[i].visible = false;
}
// Create and show plane
currentPlane = new Plane(pilotType);
currentPlane.x = 1024;
currentPlane.y = 2500;
startY = currentPlane.y;
game.addChild(currentPlane);
// Update instruction
instructionText.setText('Tap Your Plane to Launch!');
gameState = 'ready';
// Generate photo opportunities
generatePhotoOpportunities();
}
function generatePhotoOpportunities() {
// Clear existing photo opportunities
for (var i = photoOpportunities.length - 1; i >= 0; i--) {
photoOpportunities[i].destroy();
}
photoOpportunities = [];
// Create photo opportunities at different altitudes
for (var altitude = 500; altitude <= 3000; altitude += 400) {
var photo = new PhotoOpportunity();
photo.x = 200 + Math.random() * 1648; // Random x position
photo.y = startY - altitude;
photoOpportunities.push(photo);
game.addChild(photo);
}
}
// Game update loop
game.update = function () {
// Clean up destroyed photo opportunities
for (var i = photoOpportunities.length - 1; i >= 0; i--) {
if (photoOpportunities[i].destroyed) {
photoOpportunities.splice(i, 1);
}
}
// Update camera position to follow plane
if (currentPlane && currentPlane.isFlying) {
var targetY = Math.max(0, currentPlane.y - 1366);
game.y = targetY;
// Hide instruction text when flying
if (gameState === 'flying') {
instructionText.visible = false;
titleText.visible = false;
}
}
};