User prompt
It’s not shooting out the direction I’m pointing in
User prompt
When I turn the direction I’m shooting isn’t coming from the tip of the triangle
User prompt
It’s not shooting out of the right part and it’s not changing the direction where it shoots out when I turn
User prompt
Make longest tip of the triangle the front and where it shoots and the direction it moves
User prompt
Make the player slower and steering less sensitive and make the tip of the triangle the front
User prompt
Don’t make the buttons hollow and make it auto move forward forever
User prompt
The buttons don’t work and it’s still not moving forward
User prompt
The buttons don’t work and it’s constantly moving left
User prompt
Make my rocket ship a triangle shape and make it pixel art and all the stuff is hollow
User prompt
Make turning less sensitive and have it move ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Make the shoot one in the middle and left one on the left of the shoot and right on the right side and make them big
Code edit (1 edits merged)
Please save this source code
User prompt
Pixel Asteroid Blaster
Initial prompt
Make a game like asteroids game with the player that turns and has to shoot asteroids but make it black and white in pixel art and there buttons to turn and one to shoot
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Asteroid = Container.expand(function (size) {
var self = Container.call(this);
// Size can be 0 (small), 1 (medium), or 2 (large)
self.size = size || 2;
// Create a container for the asteroid
var asteroidGraphics = new Container();
self.addChild(asteroidGraphics);
// Determine asteroid size
var radius;
if (self.size === 0) {
radius = 16; // small
} else if (self.size === 1) {
radius = 32; // medium
} else {
radius = 64; // large
}
// Create a pixel art circle (asteroid)
var pixelSize = 4; // Size of each "pixel"
var pixelGap = 1; // Gap between pixels for hollow effect
var steps = 16; // Number of points around the circle
// Draw a circle of pixels
for (var i = 0; i < steps; i++) {
var angle = i / steps * Math.PI * 2;
var px = Math.cos(angle) * radius;
var py = Math.sin(angle) * radius;
var pixel = LK.getAsset('asteroidLarge', {
anchorX: 0.5,
anchorY: 0.5,
width: pixelSize - pixelGap,
height: pixelSize - pixelGap,
x: px,
y: py
});
asteroidGraphics.addChild(pixel);
}
// Random velocity
var speed = (3 - self.size) * 0.8 + 0.5; // Smaller asteroids move faster
var angle = Math.random() * Math.PI * 2;
self.velocity = {
x: Math.cos(angle) * speed,
y: Math.sin(angle) * speed
};
// Random rotation
self.rotationSpeed = (Math.random() - 0.5) * 0.05;
self.update = function () {
// Move
self.x += self.velocity.x;
self.y += self.velocity.y;
// Rotate
asteroidGraphics.rotation += self.rotationSpeed;
// Wrap around screen edges
if (self.x < -50) {
self.x = 2098;
}
if (self.x > 2098) {
self.x = -50;
}
if (self.y < -50) {
self.y = 2782;
}
if (self.y > 2782) {
self.y = -50;
}
};
self.getPoints = function () {
return (3 - self.size) * 100; // Small: 300, Medium: 200, Large: 100
};
return self;
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
// Create a container for pixel art bullet
var bulletGraphics = new Container();
self.addChild(bulletGraphics);
// Create a small pixel art square (bullet)
var bulletSize = 8;
var pixelSize = 2; // Size of each "pixel"
var pixelGap = 1; // Gap between pixels for hollow effect
// Draw the outline of the square
var points = [{
x: -bulletSize / 2,
y: -bulletSize / 2
},
// Top left
{
x: bulletSize / 2,
y: -bulletSize / 2
},
// Top right
{
x: bulletSize / 2,
y: bulletSize / 2
},
// Bottom right
{
x: -bulletSize / 2,
y: bulletSize / 2
} // Bottom left
];
// Draw the square outline
for (var i = 0; i < 4; i++) {
var startPoint = points[i];
var endPoint = points[(i + 1) % 4];
// Calculate steps
var dx = endPoint.x - startPoint.x;
var dy = endPoint.y - startPoint.y;
var steps = Math.max(Math.abs(dx), Math.abs(dy)) / pixelSize;
// Draw pixels along the line
for (var step = 0; step <= steps; step++) {
var px = startPoint.x + dx * (step / steps);
var py = startPoint.y + dy * (step / steps);
var pixel = LK.getAsset('bulletShape', {
anchorX: 0.5,
anchorY: 0.5,
width: pixelSize - pixelGap,
height: pixelSize - pixelGap,
x: px,
y: py
});
bulletGraphics.addChild(pixel);
}
}
self.speed = 10;
self.velocity = {
x: 0,
y: 0
};
self.lifespan = 60; // 1 second at 60fps
self.age = 0;
self.update = function () {
self.x += self.velocity.x;
self.y += self.velocity.y;
self.age++;
// Wrap around screen edges
if (self.x < 0) {
self.x = 2048;
}
if (self.x > 2048) {
self.x = 0;
}
if (self.y < 0) {
self.y = 2732;
}
if (self.y > 2732) {
self.y = 0;
}
};
return self;
});
var Button = Container.expand(function (assetId) {
var self = Container.call(this);
// Create a container for pixel art button
var buttonGraphics = new Container();
self.addChild(buttonGraphics);
buttonGraphics.alpha = 0.5;
// Determine button shape based on assetId
var isCircle = assetId === 'fireButton';
var buttonSize = 60; // Radius or half-width
var pixelSize = 6; // Size of each "pixel"
var pixelGap = 2; // Gap between pixels for hollow effect
if (isCircle) {
// Create a pixel art circle
var steps = 16; // Number of points around the circle
for (var i = 0; i < steps; i++) {
var angle = i / steps * Math.PI * 2;
var px = Math.cos(angle) * buttonSize;
var py = Math.sin(angle) * buttonSize;
var pixel = LK.getAsset('fireButton', {
anchorX: 0.5,
anchorY: 0.5,
width: pixelSize - pixelGap,
height: pixelSize - pixelGap,
x: px,
y: py
});
buttonGraphics.addChild(pixel);
}
} else {
// Create a pixel art square
var points = [{
x: -buttonSize,
y: -buttonSize
},
// Top left
{
x: buttonSize,
y: -buttonSize
},
// Top right
{
x: buttonSize,
y: buttonSize
},
// Bottom right
{
x: -buttonSize,
y: buttonSize
} // Bottom left
];
// Draw the square outline
for (var i = 0; i < 4; i++) {
var startPoint = points[i];
var endPoint = points[(i + 1) % 4];
// Calculate steps
var dx = endPoint.x - startPoint.x;
var dy = endPoint.y - startPoint.y;
var steps = Math.max(Math.abs(dx), Math.abs(dy)) / pixelSize;
// Draw pixels along the line
for (var step = 0; step <= steps; step++) {
var px = startPoint.x + dx * (step / steps);
var py = startPoint.y + dy * (step / steps);
var pixel = LK.getAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5,
width: pixelSize - pixelGap,
height: pixelSize - pixelGap,
x: px,
y: py
});
buttonGraphics.addChild(pixel);
}
}
}
self.isPressed = false;
self.down = function (x, y, obj) {
self.isPressed = true;
buttonGraphics.alpha = 0.8;
};
self.up = function (x, y, obj) {
self.isPressed = false;
buttonGraphics.alpha = 0.5;
};
return self;
});
var Ship = Container.expand(function () {
var self = Container.call(this);
// Create a custom triangle ship
var shipGraphics = new Container();
self.addChild(shipGraphics);
// Create a pixel art triangle
var triangleSize = 48;
var pixelSize = 4; // Size of each "pixel"
var pixelGap = 1; // Gap between pixels for hollow effect
// Create triangle points
var points = [{
x: 0,
y: -triangleSize / 2
},
// Top
{
x: triangleSize / 2,
y: triangleSize / 2
},
// Bottom right
{
x: -triangleSize / 2,
y: triangleSize / 2
} // Bottom left
];
// Draw the outline with pixel art style
for (var i = 0; i < 3; i++) {
var startPoint = points[i];
var endPoint = points[(i + 1) % 3];
// Calculate step count based on distance
var dx = endPoint.x - startPoint.x;
var dy = endPoint.y - startPoint.y;
var steps = Math.max(Math.abs(dx), Math.abs(dy)) / pixelSize;
// Draw pixels along the line
for (var step = 0; step <= steps; step++) {
var px = startPoint.x + dx * (step / steps);
var py = startPoint.y + dy * (step / steps);
var pixel = LK.getAsset('shipShape', {
anchorX: 0.5,
anchorY: 0.5,
width: pixelSize - pixelGap,
height: pixelSize - pixelGap,
x: px,
y: py
});
shipGraphics.addChild(pixel);
}
}
shipGraphics.x = 0;
shipGraphics.y = 0;
// Ship properties
self.rotation = 0;
self.rotationSpeed = 0.05; // Reduced for less sensitive turning
self.isRotatingLeft = false;
self.isRotatingRight = false;
self.isMoving = false;
self.isFiring = false;
self.fireDelay = 15; // frames between shots
self.fireTimer = 0;
self.invulnerable = false;
self.invulnerableTime = 0;
// Add movement properties
self.velocity = {
x: 0,
y: 0
};
self.maxSpeed = 5;
self.thrust = 0.1;
self.friction = 0.98; // Slow deceleration
self.update = function () {
// Handle rotation
if (self.isRotatingLeft) {
self.rotation -= self.rotationSpeed;
}
if (self.isRotatingRight) {
self.rotation += self.rotationSpeed;
}
shipGraphics.rotation = self.rotation;
// Only add thrust if a button is pressed to move
if (self.isMoving) {
var angle = self.rotation;
self.velocity.x += Math.cos(angle) * self.thrust;
self.velocity.y += Math.sin(angle) * self.thrust;
// Apply speed limit
var speed = Math.sqrt(self.velocity.x * self.velocity.x + self.velocity.y * self.velocity.y);
if (speed > self.maxSpeed) {
self.velocity.x = self.velocity.x / speed * self.maxSpeed;
self.velocity.y = self.velocity.y / speed * self.maxSpeed;
}
}
// Apply friction to slow down gradually
self.velocity.x *= self.friction;
self.velocity.y *= self.friction;
// Update position
self.x += self.velocity.x;
self.y += self.velocity.y;
// Wrap around screen edges
if (self.x < 0) {
self.x = 2048;
}
if (self.x > 2048) {
self.x = 0;
}
if (self.y < 0) {
self.y = 2732;
}
if (self.y > 2732) {
self.y = 0;
}
// Handle firing
if (self.isFiring) {
if (self.fireTimer <= 0) {
self.fireTimer = self.fireDelay;
return true; // Signal to create a bullet
}
}
if (self.fireTimer > 0) {
self.fireTimer--;
}
// Handle invulnerability
if (self.invulnerable) {
self.invulnerableTime--;
shipGraphics.alpha = Math.sin(LK.ticks * 0.5) * 0.5 + 0.5;
if (self.invulnerableTime <= 0) {
self.invulnerable = false;
shipGraphics.alpha = 1;
}
}
return false;
};
self.makeInvulnerable = function (frames) {
self.invulnerable = true;
self.invulnerableTime = frames;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Game variables
var ship;
var bullets = [];
var asteroids = [];
var score = 0;
var lives = 3;
var level = 1;
var gameStarted = false;
var gameOver = false;
// UI elements
var leftButton;
var rightButton;
var fireButton;
var forwardButton;
var scoreTxt;
var livesTxt;
var levelTxt;
var startText;
// Initialize the game
function initGame() {
// Create ship
ship = new Ship();
ship.x = 2048 / 2;
ship.y = 2732 / 2;
ship.makeInvulnerable(120); // 2 seconds
// Add visual effect to indicate ship is ready for movement
tween(ship, {
alpha: 0.5
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(ship, {
alpha: 1
}, {
duration: 500,
easing: tween.easeInOut
});
}
});
game.addChild(ship);
// Create control buttons
leftButton = new Button('rotateLeftButton');
leftButton.x = 300; // Position on the left side
leftButton.y = 2732 - 200; // Position at the bottom
leftButton.scale.set(2, 2); // Make button bigger
game.addChild(leftButton);
// Fire button in the middle
fireButton = new Button('fireButton');
fireButton.x = 2048 / 2; // Position in middle
fireButton.y = 2732 - 200; // Position at the bottom
fireButton.scale.set(2, 2); // Make button bigger
game.addChild(fireButton);
// Forward button above fire button
forwardButton = new Button('fireButton'); // Reusing the same circular shape
forwardButton.x = 2048 / 2;
forwardButton.y = 2732 - 400; // Position above fire button
forwardButton.scale.set(1.5, 1.5); // Slightly smaller
game.addChild(forwardButton);
rightButton = new Button('rotateRightButton');
rightButton.x = 2048 - 300; // Position on the right side
rightButton.y = 2732 - 200; // Position at the bottom
rightButton.scale.set(2, 2); // Make button bigger
game.addChild(rightButton);
// Create UI text
scoreTxt = new Text2('SCORE: 0', {
size: 40,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
livesTxt = new Text2('LIVES: 3', {
size: 40,
fill: 0xFFFFFF
});
livesTxt.anchor.set(0, 0);
LK.gui.top.addChild(livesTxt);
levelTxt = new Text2('LEVEL: 1', {
size: 40,
fill: 0xFFFFFF
});
levelTxt.anchor.set(1, 0);
LK.gui.topLeft.addChild(levelTxt);
// Start screen text
if (!gameStarted) {
startText = new Text2('TAP TO START', {
size: 80,
fill: 0xFFFFFF
});
startText.anchor.set(0.5, 0.5);
LK.gui.center.addChild(startText);
}
// Clear any existing game objects
bullets = [];
asteroids = [];
// Initialize asteroids for the first level
createAsteroidsForLevel(level);
// Start game music
LK.playMusic('gameMusic', {
loop: true
});
}
function createAsteroidsForLevel(level) {
// Number of asteroids based on level
var numAsteroids = Math.min(4 + level, 12);
for (var i = 0; i < numAsteroids; i++) {
var asteroid = new Asteroid(2); // Start with large asteroids
// Position the asteroid away from the player
do {
asteroid.x = Math.random() * 2048;
asteroid.y = Math.random() * 2732;
} while (distance(asteroid.x, asteroid.y, ship.x, ship.y) < 300);
asteroids.push(asteroid);
game.addChild(asteroid);
}
}
function distance(x1, y1, x2, y2) {
return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}
function createBullet() {
var bullet = new Bullet();
// Position bullet at ship's position
bullet.x = ship.x;
bullet.y = ship.y;
// Calculate bullet velocity based on ship's rotation
var angle = ship.rotation;
bullet.velocity.x = Math.cos(angle) * bullet.speed;
bullet.velocity.y = Math.sin(angle) * bullet.speed;
bullets.push(bullet);
game.addChild(bullet);
// Play shoot sound
LK.getSound('shoot').play();
}
function updateAsteroids() {
for (var i = asteroids.length - 1; i >= 0; i--) {
var asteroid = asteroids[i];
asteroid.update();
// Check for collision with the ship
if (!ship.invulnerable && asteroid.intersects(ship)) {
// Player loses a life
lives--;
livesTxt.setText('LIVES: ' + lives);
// Play explosion sound
LK.getSound('explosion').play();
// Flash screen
LK.effects.flashScreen(0xFF0000, 500);
// Make ship invulnerable for a few seconds
ship.makeInvulnerable(180);
// Game over if no lives left
if (lives <= 0) {
LK.setScore(score);
LK.showGameOver();
gameOver = true;
return;
}
}
}
}
function updateBullets() {
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
bullet.update();
// Remove bullets that have lived too long
if (bullet.age > bullet.lifespan) {
game.removeChild(bullet);
bullets.splice(i, 1);
continue;
}
// Check for collisions with asteroids
var hitAsteroid = false;
for (var j = asteroids.length - 1; j >= 0; j--) {
var asteroid = asteroids[j];
if (bullet.intersects(asteroid)) {
hitAsteroid = true;
// Add score based on asteroid size
score += asteroid.getPoints();
scoreTxt.setText('SCORE: ' + score);
// Play explosion sound
LK.getSound('explosion').play();
// Break asteroid into smaller pieces if it's not already the smallest
if (asteroid.size > 0) {
for (var k = 0; k < 2; k++) {
var newAsteroid = new Asteroid(asteroid.size - 1);
newAsteroid.x = asteroid.x;
newAsteroid.y = asteroid.y;
asteroids.push(newAsteroid);
game.addChild(newAsteroid);
}
}
// Remove the asteroid
game.removeChild(asteroid);
asteroids.splice(j, 1);
break;
}
}
if (hitAsteroid) {
// Remove the bullet
game.removeChild(bullet);
bullets.splice(i, 1);
}
}
// Check if all asteroids are destroyed
if (asteroids.length === 0) {
// Next level
level++;
levelTxt.setText('LEVEL: ' + level);
// Create new asteroids for the next level
createAsteroidsForLevel(level);
}
}
// Main game update function
game.update = function () {
if (!gameStarted) {
return;
}
// Update ship controls based on button state
ship.isRotatingLeft = leftButton.isPressed;
ship.isRotatingRight = rightButton.isPressed;
ship.isFiring = fireButton.isPressed;
ship.isMoving = forwardButton.isPressed; // Move forward with dedicated forward button
// Update ship
if (ship.update()) {
createBullet();
}
// Update bullets and check for collisions
updateBullets();
// Update asteroids and check for collisions
updateAsteroids();
};
// Event handlers
game.down = function (x, y, obj) {
if (!gameStarted) {
gameStarted = true;
if (startText) {
LK.gui.center.removeChild(startText);
startText = null;
}
}
// Ensure buttons can detect touch events when pressed
var local;
// Check left button
local = leftButton.toLocal({
x: x,
y: y
});
if (local.x >= -leftButton.width / 2 && local.x <= leftButton.width / 2 && local.y >= -leftButton.height / 2 && local.y <= leftButton.height / 2) {
leftButton.down(local.x, local.y, {});
}
// Check fire button
local = fireButton.toLocal({
x: x,
y: y
});
if (local.x >= -fireButton.width / 2 && local.x <= fireButton.width / 2 && local.y >= -fireButton.height / 2 && local.y <= fireButton.height / 2) {
fireButton.down(local.x, local.y, {});
}
// Check forward button
local = forwardButton.toLocal({
x: x,
y: y
});
if (local.x >= -forwardButton.width / 2 && local.x <= forwardButton.width / 2 && local.y >= -forwardButton.height / 2 && local.y <= forwardButton.height / 2) {
forwardButton.down(local.x, local.y, {});
}
// Check right button
local = rightButton.toLocal({
x: x,
y: y
});
if (local.x >= -rightButton.width / 2 && local.x <= rightButton.width / 2 && local.y >= -rightButton.height / 2 && local.y <= rightButton.height / 2) {
rightButton.down(local.x, local.y, {});
}
};
// Add up handler to handle releasing buttons
game.up = function (x, y, obj) {
// Reset all button states when touch/click is released
leftButton.up(0, 0, {});
fireButton.up(0, 0, {});
rightButton.up(0, 0, {});
forwardButton.up(0, 0, {});
};
// Initialize the game when this script runs
initGame(); ===================================================================
--- original.js
+++ change.js
@@ -400,8 +400,9 @@
// UI elements
var leftButton;
var rightButton;
var fireButton;
+var forwardButton;
var scoreTxt;
var livesTxt;
var levelTxt;
var startText;
@@ -433,13 +434,20 @@
leftButton.x = 300; // Position on the left side
leftButton.y = 2732 - 200; // Position at the bottom
leftButton.scale.set(2, 2); // Make button bigger
game.addChild(leftButton);
+ // Fire button in the middle
fireButton = new Button('fireButton');
fireButton.x = 2048 / 2; // Position in middle
fireButton.y = 2732 - 200; // Position at the bottom
fireButton.scale.set(2, 2); // Make button bigger
game.addChild(fireButton);
+ // Forward button above fire button
+ forwardButton = new Button('fireButton'); // Reusing the same circular shape
+ forwardButton.x = 2048 / 2;
+ forwardButton.y = 2732 - 400; // Position above fire button
+ forwardButton.scale.set(1.5, 1.5); // Slightly smaller
+ game.addChild(forwardButton);
rightButton = new Button('rotateRightButton');
rightButton.x = 2048 - 300; // Position on the right side
rightButton.y = 2732 - 200; // Position at the bottom
rightButton.scale.set(2, 2); // Make button bigger
@@ -598,9 +606,9 @@
// Update ship controls based on button state
ship.isRotatingLeft = leftButton.isPressed;
ship.isRotatingRight = rightButton.isPressed;
ship.isFiring = fireButton.isPressed;
- ship.isMoving = fireButton.isPressed; // Use fire button for forward movement too
+ ship.isMoving = forwardButton.isPressed; // Move forward with dedicated forward button
// Update ship
if (ship.update()) {
createBullet();
}
@@ -635,8 +643,16 @@
});
if (local.x >= -fireButton.width / 2 && local.x <= fireButton.width / 2 && local.y >= -fireButton.height / 2 && local.y <= fireButton.height / 2) {
fireButton.down(local.x, local.y, {});
}
+ // Check forward button
+ local = forwardButton.toLocal({
+ x: x,
+ y: y
+ });
+ if (local.x >= -forwardButton.width / 2 && local.x <= forwardButton.width / 2 && local.y >= -forwardButton.height / 2 && local.y <= forwardButton.height / 2) {
+ forwardButton.down(local.x, local.y, {});
+ }
// Check right button
local = rightButton.toLocal({
x: x,
y: y
@@ -650,7 +666,8 @@
// Reset all button states when touch/click is released
leftButton.up(0, 0, {});
fireButton.up(0, 0, {});
rightButton.up(0, 0, {});
+ forwardButton.up(0, 0, {});
};
// Initialize the game when this script runs
initGame();
\ No newline at end of file