Commit f8296233 authored by Vũ Gia Vương's avatar Vũ Gia Vương

add User, v2 model, update passTower

parent e282a1b2
...@@ -25,8 +25,8 @@ const CONFIG = { ...@@ -25,8 +25,8 @@ const CONFIG = {
UPDATE_TIME_REMAINING: '203', UPDATE_TIME_REMAINING: '203',
END_GAME: '204', END_GAME: '204',
SPAWN_TOWER: '205', SPAWN_TOWER: '205',
PASS_TOWER: '207',
CLOSE_QR_VIEW: '206', CLOSE_QR_VIEW: '206',
PASS_TOWER: '207',
......
import v2 from "./v2";
class User {
public token: string = '';
public towerNumber: number = 0;
public direction: number = 0;
public distance2Tower: number = 0;
public score: number = 0;
public totalScore: number = 0;
public combo: number = 0;
public curBlock: v2 = v2.zero;
public nextBlock: v2 = v2.zero;
public screenPos: v2 = v2.zero;
public isEndGame: boolean = false;
public history: v2[] = [];
constructor(token: string) {
this.token = token;
}
}
class History{
public time: number = 0;
public score: number = 0;
public tower: number = 0;
}
export default User;
\ No newline at end of file
class v2 {
public x: number = 0;
public y: number = 0;
public static zero = new v2(0, 0);
constructor(x?: number, y?: number) {
this.x = x || 0;
this.y = y || 0;
}
public distanceTo(other: v2): number {
return Math.sqrt(Math.pow(this.x - other.x, 2) + Math.pow(this.y - other.y, 2));
}
public add(other: v2): v2 {
return new v2(this.x + other.x, this.y + other.y);
}
public sub(other: v2): v2 {
return new v2(this.x - other.x, this.y - other.y);
}
public scale(s: number): v2 {
return new v2(this.x * s, this.y * s);
}
public normalize(): v2 {
const length = this.distanceTo(new v2(0, 0));
return new v2(this.x / length, this.y / length);
}
}
export default v2;
\ No newline at end of file
...@@ -3,6 +3,7 @@ import cors from 'cors'; ...@@ -3,6 +3,7 @@ import cors from 'cors';
const app = express(); const app = express();
app.use(cors()); app.use(cors());
app.use(express.json());
app.get('/', (req: Request, res: Response, next: NextFunction) => { app.get('/', (req: Request, res: Response, next: NextFunction) => {
res.send('Hello World') res.send('Hello World')
......
import { Server, Socket } from "socket.io"; import { Server, Socket } from "socket.io";
import CONFIG from "./Config/config"; import CONFIG from "./Config/config";
import User from "./Model/User";
import v2 from "./Model/v2";
const users: { [key: string]: User } = {} const users: { [key: string]: User } = {};
const y_radio: number = 0.5560472 const yRadio: number = 0.5560472;
const distanceBlock: number = 56.43580423808985;
class User {
public token: string = '';
public towerNumber: number = 0;
public direction: number = 0;
public cur_block: v2 = new v2();
public next_block: v2 = new v2();
}
class v2 {
public x: number = 0;
public y: number = 0;
constructor(x?: number, y?: number) {
this.x = x || 0;
this.y = y || 0;
}
}
export function getUserBySocketId(socketId: string) {
return users[socketId];
}
export function setupSocket(io: Server) { export function setupSocket(io: Server) {
io.use((socket: Socket, next) => { io.use((socket: Socket, next) => {
const token = socket.handshake.query.token; // Lấy ID từ client gửi lên const token = socket.handshake.query.token;
console.log('token', token) console.log('token', token)
users[socket.id] = {} as User; users[socket.id] = new User(String(token));
users[socket.id].token = token as string; // Gán ID này vào socket
users[socket.id].towerNumber = 0;
users[socket.id].cur_block = new v2(0, 0);
next(); next();
}); });
io.on("connection", (socket: Socket) => { io.on("connection", (socket: Socket) => {
console.log(`🟢 Client connected: ${socket.id}`); console.log(`🟢 Client connected: ${socket.id}`);
joinRoom(socket); socket.on(CONFIG.EVT.JOIN_ROOM, (data: string) => joinRoom(socket, data));
spawmItem(socket);
passTower(socket); socket.on(CONFIG.EVT.PASS_TOWER, async (data: { nextPos: v2, time: number, distance: number }) => await passTower(socket, data));
disconnectSocket(socket); socket.on(CONFIG.EVT.SPAWN_TOWER, async () => addBlock(socket));
socket.on("disconnect", () => console.log(`🔴 Client disconnected: ${socket.id}`));
}); });
} }
function passTower(socket: Socket) { async function passTower(socket: Socket, data: { nextPos: v2, time: number, distance: number }) {
socket.on(CONFIG.EVT.PASS_TOWER, async (data: string) => { const user = getUserBySocketId(socket.id);
const user = users[socket.id]; // console.log('data', data);
const towerNumber = ++user.towerNumber;
const { pos, dis } = JSON.parse(data) as { pos: v2, dis: number };
user.direction = (Math.random() < 0.5) ? -1 : 1;
const token = user.token;
console.log('towerNumber', towerNumber, token)
var x_distance = ((Math.min(towerNumber, 100) / 100 + 1) + Math.random() * (towerNumber <= 10 ? 0.5 : 1)) * 150;//vg const lastDis = user.curBlock.distanceTo(data.nextPos);
let score = 0
// const distance = Math.abs(lastDis - user.distance2Tower);
const distance = Math.abs(data.distance - user.distance2Tower);
var y_distance = x_distance * y_radio; if (distance < distanceBlock) {
score = 1;
}
if (distance < distanceBlock / 3) {
score = 2;
}
if (score == 0) {
user.isEndGame = true;
}
var next_pos = user.cur_block; if (score == 2) {
next_pos.x += (x_distance * user.direction); user.combo = Math.min(user.combo + 1, 2);
next_pos.y += y_distance; score *= user.combo;
} else {
user.combo = 0;
}
const response = await socket.emitWithAck('request', { next_pos, direction: user.direction, towerNumber, x_distance }, 'bar'); user.totalScore += score;
}); const dataSend = {
totalScore: user.totalScore,
tower: user.towerNumber,
score,
};
const response = await socket.emitWithAck('requestPassTower', dataSend);
if (!user.isEndGame) {
addBlock(socket);
} else {
user.totalScore = 0;
}
} }
function spawmItem(socket: Socket) { async function addBlock(socket: Socket) {
socket.on(CONFIG.EVT.SPAWN_TOWER, async () => { const user = getUserBySocketId(socket.id);
const user = users[socket.id];
const towerNumber = ++user.towerNumber; const towerNumber = ++user.towerNumber;
user.direction = (Math.random() < 0.5) ? -1 : 1; const xDistance = ((Math.min(towerNumber, 100) / 100 + 1) + Math.random() * (towerNumber <= 10 ? 0.5 : 1)) * 150;
const yDistance = xDistance * yRadio;
const token = user.token;
console.log('towerNumber', towerNumber, token)
var x_distance = ((Math.min(towerNumber, 100) / 100 + 1) + Math.random() * (towerNumber <= 10 ? 0.5 : 1)) * 150;//vg
var y_distance = x_distance * y_radio;
var next_pos = user.cur_block;
next_pos.x += (x_distance * user.direction);
next_pos.y += y_distance;
const response = await socket.emitWithAck('request', { next_pos, direction: user.direction, towerNumber, x_distance });
});
}
function disconnectSocket(socket: Socket) { user.curBlock = new v2(user.nextBlock.x, user.nextBlock.y);
socket.on("disconnect", () => { user.direction = (Math.random() < 0.5) ? -1 : 1;
console.log(`🔴 Client disconnected: ${socket.id}`); user.nextBlock.x = user.curBlock.x + (xDistance * user.direction);
}); user.nextBlock.y = user.curBlock.y + yDistance;
user.distance2Tower = user.nextBlock.distanceTo(user.curBlock);
user.screenPos = user.nextBlock.add(user.curBlock).scale(0.5).sub(new v2(0, 100));
const data = {
nextBlock: user.nextBlock,
screenPos: user.screenPos,
direction: user.direction,
distance2Tower: user.distance2Tower,
towerNumber: user.towerNumber - 1,
};
const response = await socket.emitWithAck('requestSpawnTower', data);
} }
function joinRoom(socket: Socket) { function joinRoom(socket: Socket, data: string) {
socket.on(CONFIG.EVT.JOIN_ROOM, (data: string) => {
const { roomName, id } = JSON.parse(data); const { roomName, id } = JSON.parse(data);
console.log(`JOIN_ROOM💬 ${roomName}: ${id}`); console.log(`JOIN_ROOM ${roomName}: ${id}`);
});
} }
function getUserBySocketId(socketId: string) {
return users[socketId];
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment