first commit

This commit is contained in:
Brian Fertig 2025-07-27 22:58:51 -06:00
commit 1c51bcef34
8 changed files with 146 additions and 0 deletions

View File

@ -0,0 +1,5 @@
---
description: Indenting Rules
---
All tabs should consist of four spaces.

BIN
assets/player-thrust.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
assets/player.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
assets/reticle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
assets/starfield.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

20
index.html Normal file
View File

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Phaser 3 Spaceship Shooter</title>
<style>
body {
margin: 0;
overflow: hidden;
}
canvas {
display: block;
}
</style>
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/phaser@v3.90.0/dist/phaser.min.js"></script>
<script type="module" src="main.js"></script>
</body>
</html>

120
main.js Normal file
View File

@ -0,0 +1,120 @@
const config = {
type: Phaser.AUTO,
scale: {
mode: Phaser.Scale.RESIZE,
width: 1920,
height: 1080,
},
parent: 'game',
backgroundColor: '#111',
physics: {
default: 'arcade',
arcade: {
gravity: { y: 0 },
debug: false
}
},
scene: {
preload: preload,
create: create,
update: update
},
pixelArt: true
};
const game = new Phaser.Game(config);
let ship;
let cursors;
let bullets;
let bulletSpeed = 500;
let thrustSpeed = 200;
function preload() {
// Load assets here if needed
this.load.image('ship', 'assets/player.png');
this.load.image('player-thrust', 'assets/player-thrust.png');
this.load.image('starfield', 'assets/starfield.png');
}
function create() {
// Prevent right-click context menu
this.input.on('contextmenu', (event) => {
event.preventDefault();
});
// Change cursor to custom reticle (you need a 'reticle.png' image)
this.input.setDefaultCursor('url(assets/reticle.png), auto');
// Create the spaceship
ship = this.physics.add.sprite(400, 300, 'ship');
ship.setCollideWorldBounds(true);
ship.setDisplaySize(48, 48);
// Create bullet group
bullets = this.add.group({
classType: Phaser.Physics.Arcade.Sprite,
key: 'bullet',
repeat: 10,
setXY: { x: 0, y: 0, stepX: 0, stepY: 0 }
});
// Set bullet properties
bullets.getChildren().forEach(bullet => {
bullet.setActive(false);
bullet.setVisible(false);
});
// Input handling
this.input.on('pointerdown', (pointer) => {
if (pointer.leftButtonDown()) {
fireBullet();
} else if (pointer.rightButtonDown()) {
ship.setVelocity(0, 0);
ship.setAcceleration(0, 0);
ship.setDrag(0);
}
});
// Mouse movement
this.input.on('pointermove', (pointer) => {
const angle = Phaser.Math.Angle.Between(
ship.x, ship.y,
pointer.x, pointer.y
);
ship.setRotation(angle);
});
}
function update(time, delta) {
// Thrust on right click - continuous movement towards the mouse
if (this.input.activePointer.rightButtonDown()) {
const angle = Phaser.Math.Angle.Between(
ship.x, ship.y,
this.input.activePointer.x, this.input.activePointer.y
);
ship.setVelocity(
Math.cos(angle) * thrustSpeed,
Math.sin(angle) * thrustSpeed
);
} else {
// If not thrusting, apply drag to slow down
ship.setDrag(100);
}
}
function fireBullet() {
const bullet = bullets.getFirstDead();
if (bullet) {
bullet.setPosition(ship.x, ship.y);
bullet.setActive(true);
bullet.setVisible(true);
// Set direction based on the ship's rotation
const angle = ship.rotation;
bullet.setVelocity(
Math.cos(angle) * bulletSpeed,
Math.sin(angle) * bulletSpeed
);
}
}

1
start_web.bat Normal file
View File

@ -0,0 +1 @@
python -m http.server 8000