Asteroids/src/index.js

111 lines
3.1 KiB
JavaScript
Raw Permalink Normal View History

import * as paper from "paper";
2022-08-02 09:38:18 +02:00
let objects = [];
2022-08-04 09:08:59 +02:00
class Object{
constructor(size, position, velocity, path){
2022-08-02 09:38:18 +02:00
this.size = size;
this.position = position;
this.velocity = velocity;
2022-08-04 09:08:59 +02:00
this.path = path;
2022-08-02 09:38:18 +02:00
objects.push(this);
}
update(){
this.position = this.position.add(this.velocity);
this.path.position = this.position;
if(this.position.x > canvas.width + this.size){
this.position = new paper.Point(-this.size, this.position.y);
}else if(this.position.x < -this.size){
this.position = new paper.Point(canvas.width+this.size, this.position.y);
}
if(this.position.y > canvas.height + this.size){
this.position = new paper.Point(this.position.x, -this.size);
}else if(this.position.y < -this.size){
this.position = new paper.Point(this.position.x, canvas.height+this.size);
}
}
}
2022-08-04 09:08:59 +02:00
class Asteroid extends Object{
constructor(size, position, velocity=new paper.Point(0, 0)){
let path = new paper.Path.RegularPolygon(position, Math.max(5, Math.ceil(Math.random()*10)), size);
path.segments.forEach(elem => {
elem.point = elem.point.add(new paper.Point(Math.random()*15, Math.random()*15));
});
path.strokeColor = "#ffffff";
super(size, position, velocity, path);
}
}
class Ship extends Object{
constructor(size, position){
2022-08-04 09:08:59 +02:00
let nodes = [
new paper.Point(position.x, position.y-size),
new paper.Point(position.x+size/2, position.y),
new paper.Point(position.x-size/2, position.y),
new paper.Point(position.x, position.y-size)
];
2022-08-04 09:08:59 +02:00
let path = new paper.Path(nodes);
path.strokeColor = "#ffffff";
path.fillColor = "#ffffffee";
super(size, position, new paper.Point(0, 0), path);
this.forward = nodes[0].subtract(position);
}
2022-08-04 09:08:59 +02:00
rotate(angle){
this.forward.angle += angle;
this.path.rotate(angle)
}
2022-08-02 09:38:18 +02:00
2022-08-04 09:08:59 +02:00
fire(){
new Bullet(this.position, this.forward);
}
};
2022-08-04 09:08:59 +02:00
class Bullet extends Object{
constructor(position, velocity){
let path = new paper.Path.Circle(position, 3);
path.fillColor = "#ffffff";
super(3, position, velocity, path);
}
}
//initialization
const canvas = document.getElementById("canvas");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
paper.setup(canvas);
const ship = new Ship(30, new paper.Point(canvas.width/2, canvas.height/2));
2022-08-02 09:38:18 +02:00
for(let i=0; i<30; i++){
2022-08-02 10:54:51 +02:00
new Asteroid(30, new paper.Point(Math.random()* canvas.width, Math.random()*canvas.height), new paper.Point(Math.random()*5, Math.random()*5));
2022-08-02 09:38:18 +02:00
}
paper.view.onFrame = (event) => {
2022-08-02 09:38:18 +02:00
objects.forEach(elem => {
elem.update();
});
2022-08-02 10:54:51 +02:00
}
const tool = new paper.Tool();
tool.on("keydown", (event) => {
if(event.character == "w"){
2022-08-04 09:08:59 +02:00
ship.velocity = ship.velocity.add(ship.forward.normalize());
2022-08-02 10:54:51 +02:00
}
if(event.key == "right"){
2022-08-04 09:08:59 +02:00
ship.rotate(3);
2022-08-02 10:54:51 +02:00
}else if(event.key == "left"){
2022-08-04 09:08:59 +02:00
ship.rotate(-3);
}
if(event.key == "space"){
ship.fire();
2022-08-02 10:54:51 +02:00
}
});