/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Character = Container.expand(function (characterType) {
var self = Container.call(this);
self.characterType = characterType;
self.isTransformed = false;
// Base character graphics
var baseGraphics = self.attachAsset(characterType + 'Base', {
anchorX: 0.5,
anchorY: 0.5
});
// Character name text
var nameText = new Text2(characterType.toUpperCase(), {
size: 60,
fill: 0xFFFFFF
});
nameText.anchor.set(0.5, 0.5);
nameText.x = 0;
nameText.y = -250;
self.addChild(nameText);
// Transformation elements
self.transformElements = [];
self.createTransformationElements = function () {
// Clear existing transformation elements
for (var i = 0; i < self.transformElements.length; i++) {
self.transformElements[i].destroy();
}
self.transformElements = [];
if (self.characterType === 'dash') {
// Create muscles
var leftMuscle = LK.getAsset('muscle', {
anchorX: 0.5,
anchorY: 0.5
});
leftMuscle.x = -120;
leftMuscle.y = -50;
self.addChild(leftMuscle);
self.transformElements.push(leftMuscle);
var rightMuscle = LK.getAsset('muscle', {
anchorX: 0.5,
anchorY: 0.5
});
rightMuscle.x = 120;
rightMuscle.y = -50;
self.addChild(rightMuscle);
self.transformElements.push(rightMuscle);
} else if (self.characterType === 'dot') {
// Create teeth
var leftTooth = LK.getAsset('tooth', {
anchorX: 0.5,
anchorY: 0.5
});
leftTooth.x = -40;
leftTooth.y = 50;
self.addChild(leftTooth);
self.transformElements.push(leftTooth);
var rightTooth = LK.getAsset('tooth', {
anchorX: 0.5,
anchorY: 0.5
});
rightTooth.x = 40;
rightTooth.y = 50;
self.addChild(rightTooth);
self.transformElements.push(rightTooth);
} else if (self.characterType === 'del') {
// Create stretchy arms
var leftArm = LK.getAsset('arm', {
anchorX: 0,
anchorY: 0.5
});
leftArm.x = -200;
leftArm.y = 0;
leftArm.scaleX = 1.5;
self.addChild(leftArm);
self.transformElements.push(leftArm);
var rightArm = LK.getAsset('arm', {
anchorX: 1,
anchorY: 0.5
});
rightArm.x = 200;
rightArm.y = 0;
rightArm.scaleX = 1.5;
self.addChild(rightArm);
self.transformElements.push(rightArm);
} else if (self.characterType === 'dee') {
// Create cape
var cape = LK.getAsset('cape', {
anchorX: 0.5,
anchorY: 0
});
cape.x = 0;
cape.y = -200;
self.addChild(cape);
self.transformElements.push(cape);
}
};
self.transform = function () {
if (self.isTransformed) {
self.untransform();
return;
}
self.isTransformed = true;
self.createTransformationElements();
// Base transformation animation
tween(baseGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 300,
easing: tween.elasticOut
});
// Character-specific transformations and animations
if (self.characterType === 'dash') {
LK.getSound('powerUp').play();
LK.effects.flashObject(self, 0xffff00, 500);
// Animate muscles growing
for (var i = 0; i < self.transformElements.length; i++) {
var muscle = self.transformElements[i];
muscle.scaleX = 0;
muscle.scaleY = 0;
tween(muscle, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 400,
easing: tween.bounceOut
});
}
} else if (self.characterType === 'dot') {
LK.getSound('chomp').play();
// Animate teeth appearing and chomping
for (var i = 0; i < self.transformElements.length; i++) {
var tooth = self.transformElements[i];
tooth.scaleY = 0;
tween(tooth, {
scaleY: 1.5
}, {
duration: 300,
easing: tween.bounceOut,
onFinish: function onFinish() {
// Chomping animation
tween(tooth, {
scaleY: 1.2
}, {
duration: 200
});
}
});
}
} else if (self.characterType === 'del') {
LK.getSound('stretch').play();
// Animate arms stretching
for (var i = 0; i < self.transformElements.length; i++) {
var arm = self.transformElements[i];
var originalScaleX = arm.scaleX;
tween(arm, {
scaleX: originalScaleX * 2
}, {
duration: 600,
easing: tween.elasticOut
});
}
} else if (self.characterType === 'dee') {
LK.getSound('fly').play();
// Animate cape and flying motion
var cape = self.transformElements[0];
cape.alpha = 0;
tween(cape, {
alpha: 1
}, {
duration: 300
});
// Flying animation - move up and down
self.startFlying();
}
};
self.startFlying = function () {
if (!self.isTransformed || self.characterType !== 'dee') return;
var originalY = self.y;
tween(self, {
y: originalY - 30
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
if (self.isTransformed) {
tween(self, {
y: originalY + 30
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
if (self.isTransformed) {
self.startFlying();
}
}
});
}
}
});
};
self.untransform = function () {
self.isTransformed = false;
// Stop any ongoing animations
tween.stop(self);
tween.stop(baseGraphics);
// Reset base graphics
tween(baseGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.easeOut
});
// Remove transformation elements
for (var i = 0; i < self.transformElements.length; i++) {
tween(self.transformElements[i], {
alpha: 0,
scaleX: 0,
scaleY: 0
}, {
duration: 200,
easing: tween.easeIn,
onFinish: function onFinish() {
if (self.transformElements[i]) {
self.transformElements[i].destroy();
}
}
});
}
self.transformElements = [];
// Reset position for Dee
if (self.characterType === 'dee') {
tween(self, {
y: self.originalY
}, {
duration: 300
});
}
};
self.down = function (x, y, obj) {
self.transform();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
// Sound effects
// Transformation effects
// Character base assets
// Title text
var titleText = new Text2('PBS KIDS SUPER HEROES', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 200;
game.addChild(titleText);
// Instructions text
var instructionsText = new Text2('TAP TO TRANSFORM!', {
size: 60,
fill: 0xFFFF00
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = 2048 / 2;
instructionsText.y = 300;
game.addChild(instructionsText);
// Create characters
var characters = [];
var characterTypes = ['dash', 'dot', 'del', 'dee'];
var characterNames = ['DASH', 'DOT', 'DEL', 'DEE'];
// Position characters in a 2x2 grid
var gridPositions = [{
x: 2048 / 4,
y: 2732 / 2 - 200
},
// Top left
{
x: 3 * 2048 / 4,
y: 2732 / 2 - 200
},
// Top right
{
x: 2048 / 4,
y: 2732 / 2 + 200
},
// Bottom left
{
x: 3 * 2048 / 4,
y: 2732 / 2 + 200
} // Bottom right
];
for (var i = 0; i < characterTypes.length; i++) {
var character = new Character(characterTypes[i]);
character.x = gridPositions[i].x;
character.y = gridPositions[i].y;
character.originalY = character.y; // Store original Y for reset
game.addChild(character);
characters.push(character);
}
// Add sparkle effects periodically
var sparkleTimer = 0;
game.update = function () {
sparkleTimer++;
// Add sparkle effects every 2 seconds
if (sparkleTimer % 120 === 0) {
for (var i = 0; i < characters.length; i++) {
if (characters[i].isTransformed) {
LK.effects.flashObject(characters[i], 0xffffff, 300);
}
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Character = Container.expand(function (characterType) {
var self = Container.call(this);
self.characterType = characterType;
self.isTransformed = false;
// Base character graphics
var baseGraphics = self.attachAsset(characterType + 'Base', {
anchorX: 0.5,
anchorY: 0.5
});
// Character name text
var nameText = new Text2(characterType.toUpperCase(), {
size: 60,
fill: 0xFFFFFF
});
nameText.anchor.set(0.5, 0.5);
nameText.x = 0;
nameText.y = -250;
self.addChild(nameText);
// Transformation elements
self.transformElements = [];
self.createTransformationElements = function () {
// Clear existing transformation elements
for (var i = 0; i < self.transformElements.length; i++) {
self.transformElements[i].destroy();
}
self.transformElements = [];
if (self.characterType === 'dash') {
// Create muscles
var leftMuscle = LK.getAsset('muscle', {
anchorX: 0.5,
anchorY: 0.5
});
leftMuscle.x = -120;
leftMuscle.y = -50;
self.addChild(leftMuscle);
self.transformElements.push(leftMuscle);
var rightMuscle = LK.getAsset('muscle', {
anchorX: 0.5,
anchorY: 0.5
});
rightMuscle.x = 120;
rightMuscle.y = -50;
self.addChild(rightMuscle);
self.transformElements.push(rightMuscle);
} else if (self.characterType === 'dot') {
// Create teeth
var leftTooth = LK.getAsset('tooth', {
anchorX: 0.5,
anchorY: 0.5
});
leftTooth.x = -40;
leftTooth.y = 50;
self.addChild(leftTooth);
self.transformElements.push(leftTooth);
var rightTooth = LK.getAsset('tooth', {
anchorX: 0.5,
anchorY: 0.5
});
rightTooth.x = 40;
rightTooth.y = 50;
self.addChild(rightTooth);
self.transformElements.push(rightTooth);
} else if (self.characterType === 'del') {
// Create stretchy arms
var leftArm = LK.getAsset('arm', {
anchorX: 0,
anchorY: 0.5
});
leftArm.x = -200;
leftArm.y = 0;
leftArm.scaleX = 1.5;
self.addChild(leftArm);
self.transformElements.push(leftArm);
var rightArm = LK.getAsset('arm', {
anchorX: 1,
anchorY: 0.5
});
rightArm.x = 200;
rightArm.y = 0;
rightArm.scaleX = 1.5;
self.addChild(rightArm);
self.transformElements.push(rightArm);
} else if (self.characterType === 'dee') {
// Create cape
var cape = LK.getAsset('cape', {
anchorX: 0.5,
anchorY: 0
});
cape.x = 0;
cape.y = -200;
self.addChild(cape);
self.transformElements.push(cape);
}
};
self.transform = function () {
if (self.isTransformed) {
self.untransform();
return;
}
self.isTransformed = true;
self.createTransformationElements();
// Base transformation animation
tween(baseGraphics, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 300,
easing: tween.elasticOut
});
// Character-specific transformations and animations
if (self.characterType === 'dash') {
LK.getSound('powerUp').play();
LK.effects.flashObject(self, 0xffff00, 500);
// Animate muscles growing
for (var i = 0; i < self.transformElements.length; i++) {
var muscle = self.transformElements[i];
muscle.scaleX = 0;
muscle.scaleY = 0;
tween(muscle, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 400,
easing: tween.bounceOut
});
}
} else if (self.characterType === 'dot') {
LK.getSound('chomp').play();
// Animate teeth appearing and chomping
for (var i = 0; i < self.transformElements.length; i++) {
var tooth = self.transformElements[i];
tooth.scaleY = 0;
tween(tooth, {
scaleY: 1.5
}, {
duration: 300,
easing: tween.bounceOut,
onFinish: function onFinish() {
// Chomping animation
tween(tooth, {
scaleY: 1.2
}, {
duration: 200
});
}
});
}
} else if (self.characterType === 'del') {
LK.getSound('stretch').play();
// Animate arms stretching
for (var i = 0; i < self.transformElements.length; i++) {
var arm = self.transformElements[i];
var originalScaleX = arm.scaleX;
tween(arm, {
scaleX: originalScaleX * 2
}, {
duration: 600,
easing: tween.elasticOut
});
}
} else if (self.characterType === 'dee') {
LK.getSound('fly').play();
// Animate cape and flying motion
var cape = self.transformElements[0];
cape.alpha = 0;
tween(cape, {
alpha: 1
}, {
duration: 300
});
// Flying animation - move up and down
self.startFlying();
}
};
self.startFlying = function () {
if (!self.isTransformed || self.characterType !== 'dee') return;
var originalY = self.y;
tween(self, {
y: originalY - 30
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
if (self.isTransformed) {
tween(self, {
y: originalY + 30
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
if (self.isTransformed) {
self.startFlying();
}
}
});
}
}
});
};
self.untransform = function () {
self.isTransformed = false;
// Stop any ongoing animations
tween.stop(self);
tween.stop(baseGraphics);
// Reset base graphics
tween(baseGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.easeOut
});
// Remove transformation elements
for (var i = 0; i < self.transformElements.length; i++) {
tween(self.transformElements[i], {
alpha: 0,
scaleX: 0,
scaleY: 0
}, {
duration: 200,
easing: tween.easeIn,
onFinish: function onFinish() {
if (self.transformElements[i]) {
self.transformElements[i].destroy();
}
}
});
}
self.transformElements = [];
// Reset position for Dee
if (self.characterType === 'dee') {
tween(self, {
y: self.originalY
}, {
duration: 300
});
}
};
self.down = function (x, y, obj) {
self.transform();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
// Sound effects
// Transformation effects
// Character base assets
// Title text
var titleText = new Text2('PBS KIDS SUPER HEROES', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 200;
game.addChild(titleText);
// Instructions text
var instructionsText = new Text2('TAP TO TRANSFORM!', {
size: 60,
fill: 0xFFFF00
});
instructionsText.anchor.set(0.5, 0.5);
instructionsText.x = 2048 / 2;
instructionsText.y = 300;
game.addChild(instructionsText);
// Create characters
var characters = [];
var characterTypes = ['dash', 'dot', 'del', 'dee'];
var characterNames = ['DASH', 'DOT', 'DEL', 'DEE'];
// Position characters in a 2x2 grid
var gridPositions = [{
x: 2048 / 4,
y: 2732 / 2 - 200
},
// Top left
{
x: 3 * 2048 / 4,
y: 2732 / 2 - 200
},
// Top right
{
x: 2048 / 4,
y: 2732 / 2 + 200
},
// Bottom left
{
x: 3 * 2048 / 4,
y: 2732 / 2 + 200
} // Bottom right
];
for (var i = 0; i < characterTypes.length; i++) {
var character = new Character(characterTypes[i]);
character.x = gridPositions[i].x;
character.y = gridPositions[i].y;
character.originalY = character.y; // Store original Y for reset
game.addChild(character);
characters.push(character);
}
// Add sparkle effects periodically
var sparkleTimer = 0;
game.update = function () {
sparkleTimer++;
// Add sparkle effects every 2 seconds
if (sparkleTimer % 120 === 0) {
for (var i = 0; i < characters.length; i++) {
if (characters[i].isTransformed) {
LK.effects.flashObject(characters[i], 0xffffff, 300);
}
}
}
};