世界、玩家登录、加入广播。

This commit is contained in:
janing
2025-12-14 22:36:05 +08:00
commit 4dc5fc6cca
34 changed files with 2965 additions and 0 deletions

View 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;
}
}

View 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;
}

View 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()
};
}