/**** * Classes ****/ // Paddle class for player var PlayerPaddle = Container.expand(function () { var self = Container.call(this); var paddleGraphics = self.createAsset('paddle', 'Player Paddle Graphics', 0.5, 0.5); self.speed = 10; self.moveUp = function () { if (self.y > 0) { self.y -= self.speed; } }; self.moveDown = function () { if (self.y < game.height - paddleGraphics.height) { self.y += self.speed; } }; }); // Paddle class for AI var AIPaddle = Container.expand(function () { var self = Container.call(this); var paddleGraphics = self.createAsset('ai_paddle', 'AI Paddle Graphics', 0.5, 0.5); self.speed = 10; self.updateDifficulty = function (settingsManager) { var difficulty = settingsManager.getDifficulty(); switch (difficulty) { case 'easy': self.speed = 5; break; case 'normal': self.speed = 10; break; case 'hard': self.speed = 15; break; default: self.speed = 10; break; } }; self.moveUp = function () { if (self.y > 0) { self.y -= self.speed; } }; self.moveDown = function () { if (self.y < game.height - paddleGraphics.height) { self.y += self.speed; } }; self.update = function (ballY) { if (ballY < this.y) { this.moveUp(); } else if (ballY > this.y) { this.moveDown(); } }; }); // Ball class var Ball = Container.expand(function () { var self = Container.call(this); var ballGraphics = self.createAsset('ball', 'Ball Graphics', 0.5, 0.5); self.velocity = { x: 5, y: 5 }; self.move = function (playerPaddleY) { // Slow down ball when moving towards player's paddle for assistance if (self.velocity.x < 0) { self.x += self.velocity.x * 0.75; // 25% slower } else { self.x += self.velocity.x; } self.y += self.velocity.y; // Adjust ball's y velocity to avoid it going out of reach var paddleCenter = playerPaddleY + 50; // Assuming paddle height is 100 if (self.velocity.x < 0 && Math.abs(self.y - paddleCenter) > 200) { self.velocity.y *= 0.9; // Slow down y velocity by 10% } }; self.reset = function () { self.x = game.width / 2; self.y = game.height / 2; self.velocity = { x: 5, y: 5 }; }; self.bounce = function (axis) { if (axis === 'x') { self.velocity.x *= -1.1; // Increase speed by 10% on each paddle hit if (LK.Audio && typeof LK.Audio.play === 'function') { LK.Audio.play('hit_paddle_sound'); } } else if (axis === 'y') { self.velocity.y *= -1; if (LK.Audio && typeof LK.Audio.play === 'function') { LK.Audio.play('wall_hit_sound'); } } }; }); // Background class var Background = Container.expand(function () { var self = Container.call(this); var backgroundGraphics = self.createAsset('background', 'Background Graphics', 0.5, 0.5); // Set background size to cover the entire game area backgroundGraphics.width = game.width; backgroundGraphics.height = game.height; // Ensure the background is visible backgroundGraphics.alpha = 1; }); // SettingsMenu class for the settings interface var SettingsMenu = Container.expand(function () { var self = Container.call(this); self.visible = false; var menuBackground = self.createAsset('settings_background', 'Settings Menu Background', 0.5, 0.5); menuBackground.width = game.width * 0.6; menuBackground.height = game.height * 0.6; var settingsOnceText = new Text2('can only use settings once', { size: 30, fill: '#ffffff' }); settingsOnceText.anchor.set(0.5, 0); settingsOnceText.y = menuBackground.height / 2 - 50; self.addChild(settingsOnceText); self.x = game.width / 2; self.y = (game.height - menuBackground.height) / 2 + menuBackground.height / 2; var difficultyText = new Text2('Difficulty:', { size: 50, fill: '#ffffff' }); difficultyText.anchor.set(0.5, 0); difficultyText.y = -menuBackground.height / 4; self.addChild(difficultyText); var easyButton = self.createAsset('easy_button', 'Easy', 0.5, 0.5); easyButton.y = difficultyText.y + 100; easyButton.on('down', function () { settingsManager.setDifficulty('easy'); self.hide(); }); var normalButton = self.createAsset('normal_button', 'Normal', 0.5, 0.5); normalButton.y = easyButton.y + 100; normalButton.on('down', function () { settingsManager.setDifficulty('normal'); self.hide(); }); var hardButton = self.createAsset('hard_button', 'Hard', 0.5, 0.5); hardButton.y = normalButton.y + 100; hardButton.on('down', function () { settingsManager.setDifficulty('hard'); self.hide(); }); self.addChild(easyButton); self.addChild(normalButton); self.addChild(hardButton); self.show = function () { self.visible = true; self.zIndex = 100; // Removed non-existent function call to 'game.sortChildren()' }; self.hide = function () { self.visible = false; }; }); var ScoreManager = Container.expand(function () { var self = Container.call(this); self.playerScore = 0; self.aiScore = 0; self.scoreTxt = new Text2('0 - 0', { size: 150, fill: "#ffffff" }); self.scoreTxt.anchor.set(.5, 0.1); self.scoreTxt.y = game.height * 0.1; LK.gui.top.addChild(self.scoreTxt); self.scoreTxt.zIndex = 101; self.updateScore = function () { self.scoreTxt.setText(self.playerScore + ' - ' + self.aiScore); }; self.playerScores = function () { self.playerScore += 1; self.updateScore(); }; self.aiScores = function () { self.aiScore += 1; self.updateScore(); }; self.resetScores = function () { self.playerScore = 0; self.aiScore = 0; self.updateScore(); }; }); var SettingsManager = Container.expand(function () { var self = Container.call(this); self.difficulty = 'normal'; self.setDifficulty = function (difficulty) { self.difficulty = difficulty; }; self.getDifficulty = function () { return self.difficulty; }; self.applySettings = function (difficulty) { // Apply the selected settings self.setDifficulty(difficulty); // Close the settings menu // For example, closeSettingsMenu(); }; }); /**** * Initialize Game ****/ // Ball out of bounds // Initialize and add background to the game var game = new LK.Game({ backgroundColor: 0x000000 // Init game with black background }); /**** * Game Code ****/ // Mouse move event for player paddle movement // Initialize and add background to the game game.on('move', function (obj) { var event = obj.event; var pos = event.getLocalPosition(game); playerPaddle.y = pos.y; }); var settingsManager = new SettingsManager(); var playerPaddle = new PlayerPaddle(); var aiPaddle = new AIPaddle(); var ball = new Ball(); var background = game.addChild(new Background()); background.x = game.width / 2; background.y = game.height / 2; console.log('Settings button and menu initialized.'); // Play background music // Initialize settings, paddles, ball, and settings menu var settingsMenu = game.addChild(new SettingsMenu()); var settingsButton = game.createAsset('settings_button', 'Settings Button', 0.5, 0.5); settingsButton.isHovering = false; settingsButton.interactive = true; settingsButton.on('down', function () { if (this.isHovering) { settingsMenu.show(); } }); settingsButton.x = game.width - settingsButton.width / 2 - 20; settingsButton.y = 20 + settingsButton.height / 2; settingsButton.interactive = true; settingsButton.on('move', function (obj) { var localPos = obj.event.getLocalPosition(this); this.isHovering = localPos.x >= 0 && localPos.x <= this.width && localPos.y >= 0 && localPos.y <= this.height; }); settingsButton.on('down', function () { if (this.isHovering) { settingsMenu.show(); } }); // Set initial positions playerPaddle.x = 100; playerPaddle.y = game.height / 2; aiPaddle.x = game.width - 100; aiPaddle.y = game.height / 2; ball.reset(); // Add paddles, ball, and score manager to the game game.addChild(playerPaddle); game.addChild(aiPaddle); game.addChild(ball); var scoreManager = game.addChild(new ScoreManager()); // Global keydown event listener for opening settings // Removed keydown event for settings as the game is touchscreen-compatible and should not rely on keyboard inputs. // Game tick event LK.on('tick', function () { // Move ball ball.move(); // Ball collision with top and bottom if (ball.y <= 0 || ball.y >= game.height) { ball.bounce('y'); } // Ball collision with paddles if (ball.intersects(playerPaddle) || ball.intersects(aiPaddle)) { ball.bounce('x'); } // Ball out of bounds if (ball.x <= 0) { scoreManager.aiScores(); ball.reset(); } else if (ball.x >= game.width) { scoreManager.playerScores(); ball.reset(); } // Update score display is now handled within the ScoreManager class. // Update AI difficulty based on settings aiPaddle.updateDifficulty(settingsManager); // AI movement aiPaddle.update(ball.y); });
/****
* Classes
****/
// Paddle class for player
var PlayerPaddle = Container.expand(function () {
var self = Container.call(this);
var paddleGraphics = self.createAsset('paddle', 'Player Paddle Graphics', 0.5, 0.5);
self.speed = 10;
self.moveUp = function () {
if (self.y > 0) {
self.y -= self.speed;
}
};
self.moveDown = function () {
if (self.y < game.height - paddleGraphics.height) {
self.y += self.speed;
}
};
});
// Paddle class for AI
var AIPaddle = Container.expand(function () {
var self = Container.call(this);
var paddleGraphics = self.createAsset('ai_paddle', 'AI Paddle Graphics', 0.5, 0.5);
self.speed = 10;
self.updateDifficulty = function (settingsManager) {
var difficulty = settingsManager.getDifficulty();
switch (difficulty) {
case 'easy':
self.speed = 5;
break;
case 'normal':
self.speed = 10;
break;
case 'hard':
self.speed = 15;
break;
default:
self.speed = 10;
break;
}
};
self.moveUp = function () {
if (self.y > 0) {
self.y -= self.speed;
}
};
self.moveDown = function () {
if (self.y < game.height - paddleGraphics.height) {
self.y += self.speed;
}
};
self.update = function (ballY) {
if (ballY < this.y) {
this.moveUp();
} else if (ballY > this.y) {
this.moveDown();
}
};
});
// Ball class
var Ball = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.createAsset('ball', 'Ball Graphics', 0.5, 0.5);
self.velocity = {
x: 5,
y: 5
};
self.move = function (playerPaddleY) {
// Slow down ball when moving towards player's paddle for assistance
if (self.velocity.x < 0) {
self.x += self.velocity.x * 0.75; // 25% slower
} else {
self.x += self.velocity.x;
}
self.y += self.velocity.y;
// Adjust ball's y velocity to avoid it going out of reach
var paddleCenter = playerPaddleY + 50; // Assuming paddle height is 100
if (self.velocity.x < 0 && Math.abs(self.y - paddleCenter) > 200) {
self.velocity.y *= 0.9; // Slow down y velocity by 10%
}
};
self.reset = function () {
self.x = game.width / 2;
self.y = game.height / 2;
self.velocity = {
x: 5,
y: 5
};
};
self.bounce = function (axis) {
if (axis === 'x') {
self.velocity.x *= -1.1; // Increase speed by 10% on each paddle hit
if (LK.Audio && typeof LK.Audio.play === 'function') {
LK.Audio.play('hit_paddle_sound');
}
} else if (axis === 'y') {
self.velocity.y *= -1;
if (LK.Audio && typeof LK.Audio.play === 'function') {
LK.Audio.play('wall_hit_sound');
}
}
};
});
// Background class
var Background = Container.expand(function () {
var self = Container.call(this);
var backgroundGraphics = self.createAsset('background', 'Background Graphics', 0.5, 0.5);
// Set background size to cover the entire game area
backgroundGraphics.width = game.width;
backgroundGraphics.height = game.height;
// Ensure the background is visible
backgroundGraphics.alpha = 1;
});
// SettingsMenu class for the settings interface
var SettingsMenu = Container.expand(function () {
var self = Container.call(this);
self.visible = false;
var menuBackground = self.createAsset('settings_background', 'Settings Menu Background', 0.5, 0.5);
menuBackground.width = game.width * 0.6;
menuBackground.height = game.height * 0.6;
var settingsOnceText = new Text2('can only use settings once', {
size: 30,
fill: '#ffffff'
});
settingsOnceText.anchor.set(0.5, 0);
settingsOnceText.y = menuBackground.height / 2 - 50;
self.addChild(settingsOnceText);
self.x = game.width / 2;
self.y = (game.height - menuBackground.height) / 2 + menuBackground.height / 2;
var difficultyText = new Text2('Difficulty:', {
size: 50,
fill: '#ffffff'
});
difficultyText.anchor.set(0.5, 0);
difficultyText.y = -menuBackground.height / 4;
self.addChild(difficultyText);
var easyButton = self.createAsset('easy_button', 'Easy', 0.5, 0.5);
easyButton.y = difficultyText.y + 100;
easyButton.on('down', function () {
settingsManager.setDifficulty('easy');
self.hide();
});
var normalButton = self.createAsset('normal_button', 'Normal', 0.5, 0.5);
normalButton.y = easyButton.y + 100;
normalButton.on('down', function () {
settingsManager.setDifficulty('normal');
self.hide();
});
var hardButton = self.createAsset('hard_button', 'Hard', 0.5, 0.5);
hardButton.y = normalButton.y + 100;
hardButton.on('down', function () {
settingsManager.setDifficulty('hard');
self.hide();
});
self.addChild(easyButton);
self.addChild(normalButton);
self.addChild(hardButton);
self.show = function () {
self.visible = true;
self.zIndex = 100;
// Removed non-existent function call to 'game.sortChildren()'
};
self.hide = function () {
self.visible = false;
};
});
var ScoreManager = Container.expand(function () {
var self = Container.call(this);
self.playerScore = 0;
self.aiScore = 0;
self.scoreTxt = new Text2('0 - 0', {
size: 150,
fill: "#ffffff"
});
self.scoreTxt.anchor.set(.5, 0.1);
self.scoreTxt.y = game.height * 0.1;
LK.gui.top.addChild(self.scoreTxt);
self.scoreTxt.zIndex = 101;
self.updateScore = function () {
self.scoreTxt.setText(self.playerScore + ' - ' + self.aiScore);
};
self.playerScores = function () {
self.playerScore += 1;
self.updateScore();
};
self.aiScores = function () {
self.aiScore += 1;
self.updateScore();
};
self.resetScores = function () {
self.playerScore = 0;
self.aiScore = 0;
self.updateScore();
};
});
var SettingsManager = Container.expand(function () {
var self = Container.call(this);
self.difficulty = 'normal';
self.setDifficulty = function (difficulty) {
self.difficulty = difficulty;
};
self.getDifficulty = function () {
return self.difficulty;
};
self.applySettings = function (difficulty) {
// Apply the selected settings
self.setDifficulty(difficulty);
// Close the settings menu
// For example, closeSettingsMenu();
};
});
/****
* Initialize Game
****/
// Ball out of bounds
// Initialize and add background to the game
var game = new LK.Game({
backgroundColor: 0x000000 // Init game with black background
});
/****
* Game Code
****/
// Mouse move event for player paddle movement
// Initialize and add background to the game
game.on('move', function (obj) {
var event = obj.event;
var pos = event.getLocalPosition(game);
playerPaddle.y = pos.y;
});
var settingsManager = new SettingsManager();
var playerPaddle = new PlayerPaddle();
var aiPaddle = new AIPaddle();
var ball = new Ball();
var background = game.addChild(new Background());
background.x = game.width / 2;
background.y = game.height / 2;
console.log('Settings button and menu initialized.');
// Play background music
// Initialize settings, paddles, ball, and settings menu
var settingsMenu = game.addChild(new SettingsMenu());
var settingsButton = game.createAsset('settings_button', 'Settings Button', 0.5, 0.5);
settingsButton.isHovering = false;
settingsButton.interactive = true;
settingsButton.on('down', function () {
if (this.isHovering) {
settingsMenu.show();
}
});
settingsButton.x = game.width - settingsButton.width / 2 - 20;
settingsButton.y = 20 + settingsButton.height / 2;
settingsButton.interactive = true;
settingsButton.on('move', function (obj) {
var localPos = obj.event.getLocalPosition(this);
this.isHovering = localPos.x >= 0 && localPos.x <= this.width && localPos.y >= 0 && localPos.y <= this.height;
});
settingsButton.on('down', function () {
if (this.isHovering) {
settingsMenu.show();
}
});
// Set initial positions
playerPaddle.x = 100;
playerPaddle.y = game.height / 2;
aiPaddle.x = game.width - 100;
aiPaddle.y = game.height / 2;
ball.reset();
// Add paddles, ball, and score manager to the game
game.addChild(playerPaddle);
game.addChild(aiPaddle);
game.addChild(ball);
var scoreManager = game.addChild(new ScoreManager());
// Global keydown event listener for opening settings
// Removed keydown event for settings as the game is touchscreen-compatible and should not rely on keyboard inputs.
// Game tick event
LK.on('tick', function () {
// Move ball
ball.move();
// Ball collision with top and bottom
if (ball.y <= 0 || ball.y >= game.height) {
ball.bounce('y');
}
// Ball collision with paddles
if (ball.intersects(playerPaddle) || ball.intersects(aiPaddle)) {
ball.bounce('x');
}
// Ball out of bounds
if (ball.x <= 0) {
scoreManager.aiScores();
ball.reset();
} else if (ball.x >= game.width) {
scoreManager.playerScores();
ball.reset();
}
// Update score display is now handled within the ScoreManager class.
// Update AI difficulty based on settings
aiPaddle.updateDifficulty(settingsManager);
// AI movement
aiPaddle.update(ball.y);
});
pong background. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pong ball and paddle.
A settings icon. The settings icon is represented by a gear-like symbol. In this SVG (Scalable Vector Graphics) format, it consists of a circle at the center with a radius of 3 units, symbolizing a central hub. Two curved lines extend from the circle, creating a gear shape. Additionally, there's a subtle arrow-like element pointing upwards, conveying the idea of customization and adjustment. This icon is commonly used to indicate access to configuration or settings options in various applications or interfaces.
Easy text. A text that says easy
Normal text. A text that says Normal
Hard text. A text that says Hard