WIP, tout est en chantier, très content :)
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
33
src/shared_js/class/GameComponents.ts
Normal file
33
src/shared_js/class/GameComponents.ts
Normal 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}
|
||||
@@ -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
37
src/shared_js/enums.ts
Normal 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}
|
||||
@@ -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}
|
||||
Reference in New Issue
Block a user