User prompt
also make it if it crouching monstores wint spawn and make it go back up when stop crouching
User prompt
when it crouches dont let it go up just down
User prompt
when u crouch jumps and glitches fix it
User prompt
add chrouching aniamation ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'window.addEventListener is not a function' in or related to this line: 'window.addEventListener('keydown', function (e) {' Line Number: 383
User prompt
with the joystick make crouching work with it or when u press s
User prompt
add joystick for movement
User prompt
there is no mobile button
User prompt
Please fix the bug: 'storage.has is not a function' in or related to this line: 'if (storage && storage.has('touchControlsEnabled')) {' Line Number: 114 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'storage is not defined' in or related to this line: 'if (storage && storage.has('touchControlsEnabled')) {' Line Number: 109 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
make it so u can enable touch controls from pause button even on pc
User prompt
make it mobile firendly
Remix started
Copy Mario vs Monsters
/****
* Plugins
****/
var storage = LK.import("@upit/storage.v1");
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Define a class for enemies
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.update = function () {
// Track last position for collision detection
self.lastX = self.x;
self.lastY = self.y;
self.lastWasIntersecting = false;
self.x -= self.speed;
if (self.x < -50) {
self.destroy();
}
};
});
// Define a class for joystick controls
var Joystick = Container.expand(function () {
var self = Container.call(this);
// Create outer circle
var outerCircle = LK.getAsset('button', {
width: 300,
height: 300,
color: 0x000000,
shape: 'ellipse',
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3
});
// Create inner circle (the stick)
var innerCircle = LK.getAsset('button', {
width: 150,
height: 150,
color: 0x3498db,
shape: 'ellipse',
anchorX: 0.5,
anchorY: 0.5
});
self.addChild(outerCircle);
self.addChild(innerCircle);
self.active = false;
self.startX = 0;
self.startY = 0;
self.deltaX = 0;
self.deltaY = 0;
self.maxDistance = 100; // Max distance the joystick can move
self.down = function (x, y) {
self.active = true;
self.startX = x;
self.startY = y;
innerCircle.x = 0;
innerCircle.y = 0;
};
self.move = function (x, y) {
if (self.active) {
// Calculate delta from start position
self.deltaX = x - self.startX;
self.deltaY = y - self.startY;
// Calculate distance
var distance = Math.sqrt(self.deltaX * self.deltaX + self.deltaY * self.deltaY);
// Normalize if distance exceeds max
if (distance > self.maxDistance) {
self.deltaX = self.deltaX / distance * self.maxDistance;
self.deltaY = self.deltaY / distance * self.maxDistance;
}
// Update inner circle position
innerCircle.x = self.deltaX;
innerCircle.y = self.deltaY;
}
};
self.up = function () {
self.active = false;
self.deltaX = 0;
self.deltaY = 0;
innerCircle.x = 0;
innerCircle.y = 0;
};
return self;
});
// Define a class for the mobile jump button
var MobileButton = Container.expand(function () {
var self = Container.call(this);
// Create the button shape
var button = new Container();
var buttonBg = LK.getAsset('button', {
width: 200,
height: 200,
color: 0x3498db,
shape: 'ellipse',
anchorX: 0.5,
anchorY: 0.5
});
button.addChild(buttonBg);
// Add jump text
var jumpText = new Text2("JUMP", {
size: 50,
fill: 0xFFFFFF,
stroke: 0x000000,
strokeThickness: 3
});
jumpText.anchor.set(0.5, 0.5);
button.addChild(jumpText);
self.addChild(button);
// Handle touch events
self.down = function () {
buttonBg.alpha = 0.7;
if (player && typeof player.jump === 'function') {
player.jump();
}
};
self.up = function () {
buttonBg.alpha = 1;
};
return self;
});
// Define a class for pause menu items
var PauseMenuItem = Container.expand(function () {
var self = Container.call(this);
self.createItem = function (text, y, callback) {
var menuText = new Text2(text, {
size: 70,
fill: 0xFFFFFF,
stroke: 0x000000,
strokeThickness: 3
});
menuText.anchor.set(0.5, 0.5);
menuText.y = y;
self.addChild(menuText);
self.down = function () {
if (callback) {
callback();
}
};
return self;
};
return self;
});
//<Assets used in the game will automatically appear here>
// Define a class for the player character
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.jumpHeight = 40;
self.isJumping = false;
self.velocityY = 0;
self.velocityX = 0;
self.maxSpeed = 10;
self.update = function () {
// Track last position for collision detection
self.lastX = self.x;
self.lastY = self.y;
// Apply horizontal movement
self.x += self.velocityX;
// Keep player within screen bounds
if (self.x < 100) {
self.x = 100;
}
if (self.x > 2048 - 100) {
self.x = 2048 - 100;
}
if (self.isJumping) {
self.y += self.velocityY;
self.velocityY += 0.7; // Decreased gravity effect by 30%
if (self.y >= 2732 / 2) {
// Ground level
self.y = 2732 / 2;
self.isJumping = false;
self.velocityY = 0;
}
}
// Check for keyboard 's' key press for crouching only when not jumping
if (!self.isJumping) {
if (LK.isKeyDown && LK.isKeyDown('s')) {
self.crouch();
}
// Removed the else condition that would stand up
}
};
self.jump = function () {
if (!self.isJumping && !self.isCrouching) {
self.isJumping = true;
self.velocityY = -self.jumpHeight;
}
};
self.isCrouching = false;
self.crouch = function () {
if (!self.isCrouching && !self.isJumping) {
self.isCrouching = true;
// Stop any existing tweens
tween.stop(playerGraphics.scale, {
y: true
});
tween.stop(self, {
y: true
});
// Animate player crouching with tween
tween(playerGraphics.scale, {
y: 0.5
}, {
duration: 200,
easing: tween.easeOut
});
// Move player down to compensate for height reduction with animation
tween(self, {
y: self.y + playerGraphics.height * 0.25
}, {
duration: 200,
easing: tween.easeOut
});
}
};
self.standUp = function () {
// This method is now empty to prevent standing up
// The player will remain crouched until the game is reset
};
self.moveWithJoystick = function (deltaX, deltaY) {
// Normalize the input to proper speed
var normalizedX = deltaX / 100; // Based on maxDistance in Joystick
var normalizedY = deltaY / 100; // Based on maxDistance in Joystick
// Set velocity based on joystick position
self.velocityX = normalizedX * self.maxSpeed;
// Handle crouching based on joystick Y position (down), only when not jumping
if (!self.isJumping) {
if (normalizedY > 0.5) {
self.crouch();
}
// Removed the else condition that would stand up
}
// Optional: Make the character face the direction it's moving
if (normalizedX > 0) {
playerGraphics.scale.x = 1; // Face right
} else if (normalizedX < 0) {
playerGraphics.scale.x = -1; // Face left
}
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Make background fit the screen properly
var background = game.addChild(LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5
}));
background.x = 2048 / 2;
background.y = 2732 / 2;
// Game configuration
var gameConfig = {
touchControlsEnabled: true
};
// Check if there's a stored preference for touch controls
if (storage && storage.touchControlsEnabled !== undefined) {
gameConfig.touchControlsEnabled = storage.touchControlsEnabled;
}
// Initialize player
var player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 / 2;
// Initialize enemies
var enemies = [];
var enemySpawnInterval = 100;
var enemySpawnCounter = 0;
// Create a new Text2 object to display the score with better mobile visibility
var scoreText = new Text2('Score: 0', {
size: 120,
fill: 0xFFFFFF,
stroke: 0x000000,
strokeThickness: 5
});
// Add the score text to the game GUI at the top center of the screen
// Anchoring properly for responsive display
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Handle game updates
game.update = function () {
player.update();
// Reset player velocity if joystick is not active
if (!joystick.active) {
player.velocityX = 0;
}
// Spawn enemies
enemySpawnCounter++;
if (enemySpawnCounter >= enemySpawnInterval) {
var enemy = new Enemy();
enemy.x = 2048;
enemy.y = 2732 / 2;
enemies.push(enemy);
game.addChild(enemy);
// Randomize the spawn interval for the next enemy
enemySpawnInterval = Math.floor(Math.random() * 150) + 50;
enemySpawnCounter = 0;
}
// Update enemies with better collision detection
for (var j = enemies.length - 1; j >= 0; j--) {
enemies[j].update();
// More precise collision detection
if (player.intersects(enemies[j])) {
if (!enemies[j].lastWasIntersecting) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
enemies[j].lastWasIntersecting = true;
} else {
enemies[j].lastWasIntersecting = false;
// Check if player passed the enemy
if (player.x > enemies[j].x && !enemies[j].passed) {
enemies[j].passed = true;
LK.setScore(LK.getScore() + 1);
scoreText.setText(LK.getScore());
// Visual feedback when scoring
var pointText = new Text2('+1', {
size: 60,
fill: 0xFFFFFF
});
pointText.x = enemies[j].x;
pointText.y = enemies[j].y - 100;
game.addChild(pointText);
// Animate and remove the +1 text
LK.setTimeout(function () {
pointText.destroy();
}, 1000);
}
}
}
};
// Custom pause handler
LK.on('pause', function () {
// Create touch controls toggle menu item
var toggleItem = new PauseMenuItem().createItem(gameConfig.touchControlsEnabled ? "Disable Touch Controls" : "Enable Touch Controls", 200, function () {
// Toggle touch controls setting
gameConfig.touchControlsEnabled = !gameConfig.touchControlsEnabled;
// Save setting in storage
if (storage) {
storage.touchControlsEnabled = gameConfig.touchControlsEnabled;
}
// Update button visibility when setting changes
updateButtonVisibility();
// Resume game after changing setting
LK.resumeGame();
});
// Position the menu item in the center of the screen
toggleItem.x = 2048 / 2;
toggleItem.y = 2732 / 2;
// Add to pause menu
LK.gui.center.addChild(toggleItem);
});
// Create joystick for movement
var joystick = new Joystick();
joystick.x = 300; // Position on bottom left
joystick.y = 2732 - 300;
game.addChild(joystick);
// Create mobile jump button
var mobileButton = new MobileButton();
mobileButton.x = 2048 - 200; // Position on bottom right
mobileButton.y = 2732 - 200;
game.addChild(mobileButton);
// Function to update mobile controls visibility based on settings
function updateButtonVisibility() {
mobileButton.visible = gameConfig.touchControlsEnabled;
joystick.visible = gameConfig.touchControlsEnabled;
}
// Setup keyboard input handling if not already present
if (!LK.isKeyDown) {
LK.isKeyDown = function () {
var keysDown = {};
LK.on('keydown', function (e) {
keysDown[e.key.toLowerCase()] = true;
});
LK.on('keyup', function (e) {
keysDown[e.key.toLowerCase()] = false;
});
return function (key) {
return !!keysDown[key.toLowerCase()];
};
}();
}
// Initial visibility
updateButtonVisibility();
// Handle player jump with improved controls for mobile
game.down = function (x, y, obj) {
// Already handled by the button's down event when touch controls enabled
// For anywhere else on screen: only jump when touch controls are enabled AND not pressing the button
if (gameConfig.touchControlsEnabled && obj.event && obj.event.target !== mobileButton && obj.event.target !== joystick) {
player.jump();
}
};
// Add move handler for joystick controls
game.move = function (x, y, obj) {
if (gameConfig.touchControlsEnabled && joystick.active) {
player.moveWithJoystick(joystick.deltaX, joystick.deltaY);
}
};
// Initialize the score to zero
scoreText.setText('0');
// Make score text more visible on mobile screens
scoreText.size = 120; ===================================================================
--- original.js
+++ change.js
@@ -187,12 +187,10 @@
// Check for keyboard 's' key press for crouching only when not jumping
if (!self.isJumping) {
if (LK.isKeyDown && LK.isKeyDown('s')) {
self.crouch();
- } else if (self.isCrouching && (!LK.isKeyDown || !LK.isKeyDown('s'))) {
- // Stand up when 's' key is released
- self.standUp();
}
+ // Removed the else condition that would stand up
}
};
self.jump = function () {
if (!self.isJumping && !self.isCrouching) {
@@ -227,34 +225,10 @@
});
}
};
self.standUp = function () {
- if (self.isCrouching) {
- // Stop any existing tweens
- tween.stop(playerGraphics.scale, {
- y: true
- });
- tween.stop(self, {
- y: true
- });
- // Animate player standing up with tween
- tween(playerGraphics.scale, {
- y: 1
- }, {
- duration: 200,
- easing: tween.easeOut
- });
- // Move player up to original position with animation
- tween(self, {
- y: self.y - playerGraphics.height * 0.25
- }, {
- duration: 200,
- easing: tween.easeOut,
- onFinish: function onFinish() {
- self.isCrouching = false;
- }
- });
- }
+ // This method is now empty to prevent standing up
+ // The player will remain crouched until the game is reset
};
self.moveWithJoystick = function (deltaX, deltaY) {
// Normalize the input to proper speed
var normalizedX = deltaX / 100; // Based on maxDistance in Joystick
@@ -264,11 +238,10 @@
// Handle crouching based on joystick Y position (down), only when not jumping
if (!self.isJumping) {
if (normalizedY > 0.5) {
self.crouch();
- } else if (self.isCrouching) {
- self.standUp();
}
+ // Removed the else condition that would stand up
}
// Optional: Make the character face the direction it's moving
if (normalizedX > 0) {
playerGraphics.scale.x = 1; // Face right