WIP, tout est en chantier, très content :)

This commit is contained in:
LuckyLaszlo
2022-11-20 15:46:45 +01:00
parent 023b5ed485
commit 48665cfe30
22 changed files with 580 additions and 302 deletions

View File

@@ -1,37 +1,66 @@
/* Server */
enum EventTypes {
gameUpdate = 1,
start,
pause,
resume
import * as en from "../enums.js"
/* From Server */
class ServerEvent {
type: en.EventTypes;
constructor(type: en.EventTypes = 0) {
this.type = type;
}
}
interface EventData {
type: EventTypes;
class EventAssignId extends ServerEvent {
id: string;
constructor(id: string) {
super(en.EventTypes.assignId);
this.id = id;
}
}
class EventGameUpdate implements EventData {
type: EventTypes = EventTypes.gameUpdate;
player1 = {y: 0};
player2 = {y: 0};
class EventMatchmakingComplete extends ServerEvent {
side: en.PlayerSide;
constructor(side: en.PlayerSide) {
super(en.EventTypes.matchmakingComplete);
this.side = side;
}
}
class EventGameUpdate extends ServerEvent {
playerLeft = {y: 0};
playerRight = {y: 0};
ball = {x: 0, y: 0, speed: 0};
constructor() {
super(en.EventTypes.gameUpdate);
}
}
/* Client */
enum InputEnum {
up = 1,
down
/* From Client */
class ClientEvent {
type: en.EventTypes;
constructor(type: en.EventTypes = 0) {
this.type = type;
}
}
class EventInput {
input: InputEnum;
constructor(input: InputEnum = 0) {
class ClientAnnounce extends ClientEvent {
role: en.ClientRole;
id: string;
constructor(role: en.ClientRole, id: string = "") {
super(en.EventTypes.clientAnnounce);
this.role = role;
}
}
class EventInput extends ClientEvent {
input: en.InputEnum;
constructor(input: en.InputEnum = 0) {
super(en.EventTypes.clientInput);
this.input = input;
}
}
export {
EventTypes, EventData, EventGameUpdate,
InputEnum, EventInput
ServerEvent, EventAssignId, EventMatchmakingComplete, EventGameUpdate,
ClientEvent, ClientAnnounce, EventInput
}

View File

@@ -0,0 +1,33 @@
import * as c from "../constants.js"
import {VectorInteger} from "./Vector.js";
import {Rectangle, Racket, Ball} from "./Rectangle.js";
class GameComponents {
wallTop: Rectangle;
wallBottom: Rectangle;
playerLeft: Racket;
playerRight: Racket;
ball: Ball;
constructor(ctx?: CanvasRenderingContext2D)
{
let pos = new VectorInteger;
pos.assign(0, 0);
this.wallTop = new Rectangle(ctx, pos, "grey", c.w, c.wallSize);
pos.assign(0, c.h-c.wallSize);
this.wallBottom = new Rectangle(ctx, pos, "grey", c.w, c.wallSize);
pos.assign(0+c.pw, c.h_mid-c.ph/2);
this.playerLeft = new Racket(ctx, pos, "white", c.pw, c.ph, c.playerSpeed);
pos.assign(c.w-c.pw-c.pw, c.h_mid-c.ph/2);
this.playerRight = new Racket(ctx, pos, "white", c.pw, c.ph, c.playerSpeed);
pos.assign(c.w_mid-c.ballSize/2, c.h_mid-c.ballSize/2);
this.ball = new Ball(ctx, pos, "white", c.ballSize, c.ballSpeed);
this.ball.dir.assign(-0.8, +0.2);
}
}
export {GameComponents}

View File

@@ -77,7 +77,7 @@ class MovingRectangle extends Rectangle implements Moving {
}
}
class Player extends MovingRectangle {
class Racket extends MovingRectangle {
constructor(ctx: CanvasRenderingContext2D, pos: VectorInteger, color: string, width: number, height: number, baseSpeed: number) {
super(ctx, pos, color, width, height, baseSpeed);
}
@@ -88,9 +88,9 @@ class Ball extends MovingRectangle {
super(ctx, pos, color, size, size, baseSpeed);
}
bounce(collider?: Rectangle) {
/* Could be more generic, but testing only player is enough,
because in Pong collider can only be Player or Wall. */
if (collider instanceof Player) {
/* Could be more generic, but testing only Racket is enough,
because in Pong collider can only be Racket or Wall. */
if (collider instanceof Racket) {
this._bouncePlayer(collider);
}
else {
@@ -112,8 +112,8 @@ class Ball extends MovingRectangle {
private _bounceWall() { // Should be enough for Wall
this.dir.y = this.dir.y * -1;
}
private _bouncePlayer(collider: Player) { // WIP
// Bounce for Player need to be more complexe than this
private _bouncePlayer(collider: Racket) { // WIP
// Bounce for Racket need to be more complexe than this
this.speed += this.baseSpeed/20;
this.dir.x = this.dir.x * -1;
}
@@ -154,7 +154,7 @@ class Line extends Rectangle {
}
}
export {Rectangle, MovingRectangle, Player, Ball, Line}
export {Rectangle, MovingRectangle, Racket, Ball, Line}
// How to handle const export in initGame ?
// example for class Rectangle

37
src/shared_js/enums.ts Normal file
View File

@@ -0,0 +1,37 @@
enum EventTypes {
// Class Implemented
gameUpdate = 1,
assignId,
matchmakingComplete,
// Generic
matchmakingInProgress,
matchNewRound, // unused
matchStart, // unused
matchPause, // unused
matchResume, // unused
// Client
clientAnnounce,
clientPlayerReady,
clientInput,
}
enum InputEnum {
up = 1,
down
}
enum PlayerSide {
left = 1,
right
}
enum ClientRole {
player = 1,
spectator
}
export {EventTypes, InputEnum, PlayerSide, ClientRole}

View File

@@ -1,31 +0,0 @@
import * as c from "./constants.js"
import {Vector, VectorInteger} from "./class/Vector.js";
import {Rectangle, MovingRectangle, Player, Ball, Line} from "./class/Rectangle.js";
export let wall_top: Rectangle;
export let wall_bottom: Rectangle;
export let player1: Player;
export let player2: Player;
export let ball: Ball;
function initGame(ctx: CanvasRenderingContext2D)
{
let pos = new VectorInteger;
// Component
pos.assign(0, 0);
wall_top = new Rectangle(ctx, pos, "grey", c.w, c.wallSize);
pos.assign(0, c.h-c.wallSize);
wall_bottom = new Rectangle(ctx, pos, "grey", c.w, c.wallSize);
pos.assign(0+c.pw, c.h_mid-c.ph/2);
player1 = new Player(ctx, pos, "white", c.pw, c.ph, c.playerSpeed);
pos.assign(c.w-c.pw-c.pw, c.h_mid-c.ph/2);
player2 = new Player(ctx, pos, "white", c.pw, c.ph, c.playerSpeed);
pos.assign(c.w_mid-c.ballSize/2, c.h_mid-c.ballSize/2);
ball = new Ball(ctx, pos, "white", c.ballSize, c.ballSpeed);
ball.dir.assign(-0.8, +0.2);
}
export {initGame}