世界、玩家登录、加入广播。
This commit is contained in:
71
server/src/models/Player.ts
Normal file
71
server/src/models/Player.ts
Normal file
@@ -0,0 +1,71 @@
|
||||
import { Position } from './Position';
|
||||
|
||||
/**
|
||||
* 玩家角色数据
|
||||
*/
|
||||
export interface Player {
|
||||
/** 玩家唯一ID */
|
||||
id: string;
|
||||
|
||||
/** 玩家昵称 */
|
||||
name: string;
|
||||
|
||||
/** 当前位置 */
|
||||
position: Position;
|
||||
|
||||
/** 出生点位置 */
|
||||
spawnPoint: Position;
|
||||
|
||||
/** 当前生命值 */
|
||||
hp: number;
|
||||
|
||||
/** 最大生命值 */
|
||||
maxHp: number;
|
||||
|
||||
/** 是否存活 */
|
||||
isAlive: boolean;
|
||||
|
||||
/** 创建时间 */
|
||||
createdAt: number;
|
||||
|
||||
/** 最后登录时间 */
|
||||
lastLoginAt: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建新玩家
|
||||
*/
|
||||
export function createPlayer(id: string, name: string, spawnPoint: Position): Player {
|
||||
const maxHp = 10; // 初始最大生命值10点
|
||||
|
||||
return {
|
||||
id,
|
||||
name,
|
||||
position: { ...spawnPoint }, // 初始位置在出生点
|
||||
spawnPoint: { ...spawnPoint },
|
||||
hp: maxHp,
|
||||
maxHp,
|
||||
isAlive: true,
|
||||
createdAt: Date.now(),
|
||||
lastLoginAt: Date.now()
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 玩家复活
|
||||
*/
|
||||
export function respawnPlayer(player: Player): void {
|
||||
player.position = { ...player.spawnPoint };
|
||||
player.hp = player.maxHp;
|
||||
player.isAlive = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 玩家受伤
|
||||
*/
|
||||
export function damagePlayer(player: Player, damage: number): void {
|
||||
player.hp = Math.max(0, player.hp - damage);
|
||||
if (player.hp <= 0) {
|
||||
player.isAlive = false;
|
||||
}
|
||||
}
|
||||
37
server/src/models/Position.ts
Normal file
37
server/src/models/Position.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
/**
|
||||
* 位置坐标接口
|
||||
*/
|
||||
export interface Position {
|
||||
x: number;
|
||||
y: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建位置对象
|
||||
*/
|
||||
export function createPosition(x: number, y: number): Position {
|
||||
return { x, y };
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算两点之间的距离
|
||||
*/
|
||||
export function getDistance(pos1: Position, pos2: Position): number {
|
||||
const dx = pos1.x - pos2.x;
|
||||
const dy = pos1.y - pos2.y;
|
||||
return Math.sqrt(dx * dx + dy * dy);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查位置是否在范围内
|
||||
*/
|
||||
export function isInBounds(pos: Position, width: number, height: number): boolean {
|
||||
return pos.x >= 0 && pos.x < width && pos.y >= 0 && pos.y < height;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查位置是否在圆形区域内
|
||||
*/
|
||||
export function isInCircle(pos: Position, center: Position, radius: number): boolean {
|
||||
return getDistance(pos, center) <= radius;
|
||||
}
|
||||
37
server/src/models/World.ts
Normal file
37
server/src/models/World.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import { Position } from './Position';
|
||||
|
||||
/**
|
||||
* 世界数据结构
|
||||
*/
|
||||
export interface World {
|
||||
/** 世界宽度 */
|
||||
width: number;
|
||||
|
||||
/** 世界高度 */
|
||||
height: number;
|
||||
|
||||
/** 出生区域半径 */
|
||||
spawnRadius: number;
|
||||
|
||||
/** 世界中心点 */
|
||||
center: Position;
|
||||
|
||||
/** 世界创建时间 */
|
||||
createdAt: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建世界实例
|
||||
*/
|
||||
export function createWorld(width: number, height: number, spawnRadius: number): World {
|
||||
return {
|
||||
width,
|
||||
height,
|
||||
spawnRadius,
|
||||
center: {
|
||||
x: width / 2,
|
||||
y: height / 2
|
||||
},
|
||||
createdAt: Date.now()
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user