Files

917 lines
27 KiB
JavaScript

// 种田功能测试场景
import Unit from '../../objects/Unit.js';
import Crop from '../../objects/Crop.js';
import { InputSystem } from '../../systems/InputSystem.js';
import { SelectionSystem } from '../../systems/SelectionSystem.js';
import { CommandSystem } from '../../systems/CommandSystem.js';
import { ItemManager } from '../../items/ItemManager.js';
import { Inventory } from '../../items/Inventory.js';
import { InventoryUI } from '../../ui/InventoryUI.js';
export default class FarmingTestScene extends Phaser.Scene {
constructor() {
super({ key: 'FarmingTestScene' });
this.isPlantingMode = false;
this.selectedSeed = null;
}
preload() {
// 加载物品数据
this.load.json('items', './data/items.json');
}
create() {
// 物理世界和相机边界
const worldSize = 1000;
this.physics.world.setBounds(-worldSize, -worldSize, worldSize * 2, worldSize * 2);
this.cameras.main.setBounds(-worldSize, -worldSize, worldSize * 2, worldSize * 2);
// 初始化系统
this.inputSystem = new InputSystem(this, {
keyboard: true,
mouse: true,
joystick: false,
selection: true
});
this.selectionSystem = new SelectionSystem(this);
this.commandSystem = new CommandSystem(this);
// 创建单位组
this.unitGroup = this.add.group();
// 创建背景
this.createBackground();
// 创建玩家
this.createPlayer();
// 初始化物品管理器
this.itemManager = new ItemManager(this);
// 初始化背包系统
this.initInventory();
// 创建作物组
this.cropGroup = this.add.group();
// 设置输入处理
this.setupInput();
// 创建侧边栏UI
this.createSidebar();
// 显示提示信息
this.showInstructions();
// 显示单位状态
this.updateUnitStatus(this.player);
// 显示默认提示
this.generalInfoText.setText('欢迎使用种田功能测试场景');
// 监听种植事件
this.events.on('plant-seed', (seed, user) => {
console.log('DEBUG: FarmingTestScene 收到 plant-seed 事件');
this.startPlantingMode(seed, user);
});
// 监听作物收获事件
this.events.on('crop-harvested', (crop) => {
console.log('DEBUG: FarmingTestScene 收到 crop-harvested 事件');
this.harvestCrop(crop);
});
// 监听显示消息事件
this.events.on('show-message', (message) => {
console.log(`DEBUG: FarmingTestScene 收到 show-message 事件: ${message}`);
this.showMessage(message);
});
// 初始化测试物品
this.itemManager.onDataLoaded(() => {
this.initTestItems();
});
}
/**
* 创建背景
*/
createBackground() {
// 创建纯色背景
this.add.rectangle(0, 0, this.sys.game.config.width, this.sys.game.config.height, 0x1a1a2e);
// 创建网格地面
const gridGraphics = this.add.graphics();
gridGraphics.lineStyle(1, 0x333333, 0.5);
const gridSize = 32;
const gridCount = 50;
for (let x = -gridCount; x <= gridCount; x++) {
gridGraphics.moveTo(x * gridSize, -gridCount * gridSize);
gridGraphics.lineTo(x * gridSize, gridCount * gridSize);
}
for (let y = -gridCount; y <= gridCount; y++) {
gridGraphics.moveTo(-gridCount * gridSize, y * gridSize);
gridGraphics.lineTo(gridCount * gridSize, y * gridSize);
}
gridGraphics.stroke();
}
/**
* 创建玩家
*/
createPlayer() {
// 为玩家创建纯色纹理
if (!this.textures.exists('player')) {
const canvas = document.createElement('canvas');
canvas.width = 32;
canvas.height = 32;
const ctx = canvas.getContext('2d');
ctx.fillStyle = '#4a90e2';
ctx.beginPath();
ctx.arc(16, 16, 16, 0, Math.PI * 2);
ctx.fill();
this.textures.addCanvas('player', canvas);
}
// 创建玩家单位
this.player = new Unit(this, 0, 0, 'player');
// 设置玩家属性
this.player.name = '测试玩家';
this.player.health = 100;
this.player.nutrition = 100;
this.player.hydration = 100;
this.player.equipWeapon = function(weapon) {
this.weapon = weapon;
console.log(`${this.name} 装备了 ${weapon.name}`);
};
// 添加到单位组
this.unitGroup.add(this.player);
// 自动选中玩家
this.events.emit('select-unit', this.player);
// 添加碰撞检测
this.physics.add.collider(this.unitGroup, this.unitGroup);
// 保持相机中心在世界原点
this.cameras.main.centerOn(0, 0);
}
/**
* 初始化背包系统
*/
initInventory() {
// 创建背包(6x4网格)
this.player.inventory = new Inventory(6, 4);
// 创建背包UI
this.inventoryUI = new InventoryUI(this, this.player.inventory, 40);
}
/**
* 初始化测试物品
*/
initTestItems() {
// 给玩家添加一些种子
const wheatSeed = this.itemManager.createItem('wheat_seed', 0, 0);
const carrotSeed = this.itemManager.createItem('carrot_seed', 0, 0);
// 将种子添加到玩家背包
if (wheatSeed) {
this.player.inventory.addItem(wheatSeed);
wheatSeed.destroy();
}
if (carrotSeed) {
this.player.inventory.addItem(carrotSeed);
carrotSeed.destroy();
}
// 更新背包UI
this.inventoryUI.updateUI();
}
/**
* 设置输入处理
*/
setupInput() {
console.log('DEBUG: setupInput 方法被调用');
// 键盘输入
this.cursors = this.input.keyboard.createCursorKeys();
// 背包快捷键(B键)
this.input.keyboard.on('keydown-B', () => {
console.log('DEBUG: B键被按下,切换背包显示');
this.inventoryUI.toggle();
});
// 使用物品快捷键(Q键)
this.input.keyboard.on('keydown-Q', () => {
console.log('DEBUG: Q键被按下,尝试使用选中的物品');
if (this.inventoryUI && this.inventoryUI.selectedItem) {
console.log('DEBUG: 有选中的物品,调用useItem方法');
this.inventoryUI.useItem(this.inventoryUI.selectedItem);
}
});
// 空格键返回启动场景
this.input.keyboard.on('keydown-SPACE', () => {
console.log('DEBUG: 空格键被按下,返回启动场景');
this.scene.start('BootScene');
});
// 鼠标点击处理
this.input.on('pointerdown', (pointer) => {
console.log(`DEBUG: 鼠标点击事件触发,按键: ${pointer.button}, 位置: x=${pointer.x}, y=${pointer.y}`);
console.log(`DEBUG: 当前种植模式状态: isPlantingMode=${this.isPlantingMode}, selectedSeed=${this.selectedSeed ? this.selectedSeed.name : 'null'}`);
// 检查点击位置是否在UI元素上(背包UI或侧边栏)
const isUIClick = this.isPointInUI(pointer);
console.log(`DEBUG: 是否点击在UI元素上: ${isUIClick}`);
if (pointer.rightButtonDown()) {
// 右键点击取消种植模式
console.log('DEBUG: 鼠标右键点击,取消种植模式');
this.cancelPlantingMode();
} else if (this.isPlantingMode && this.selectedSeed && !isUIClick) {
// 左键点击地面种植作物,确保不是点击UI元素
console.log('DEBUG: 满足种植条件且不是UI点击,调用 plantSeedAt 方法');
this.plantSeedAt(pointer);
}
});
// 创建交互按钮
this.createButtons();
console.log('DEBUG: 输入处理设置完成');
}
/**
* 创建交互按钮
*/
createButtons() {
const buttonWidth = 200;
const buttonHeight = 40;
const buttonY = this.sys.game.config.height - 150;
// 创建拾取物品按钮
this.createButton(this.sys.game.config.width - buttonWidth - 10, buttonY - 50, '拾取物品(F)', () => {
// 调用与F键相同的拾取功能
this.inputSystem.handleQuickPickup();
});
// 创建背包按钮
this.createButton(this.sys.game.config.width - buttonWidth - 10, buttonY, '打开/关闭背包', () => {
this.inventoryUI.toggle();
});
// 创建随机物品按钮
this.createButton(this.sys.game.config.width - buttonWidth - 10, buttonY + 50, '创建随机种子', () => {
const seedTypes = ['wheat_seed', 'carrot_seed'];
const randomSeedType = seedTypes[Math.floor(Math.random() * seedTypes.length)];
this.itemManager.createItem(randomSeedType, this.player.x + 50, this.player.y);
});
// 创建返回菜单按钮
this.createButton(this.sys.game.config.width - buttonWidth - 10, buttonY + 100, '返回菜单', () => {
this.scene.start('BootScene');
});
}
/**
* 创建按钮
*/
createButton(x, y, text, callback) {
// 创建按钮背景
const button = this.add.rectangle(x, y, 200, 40, 0x333333);
button.setOrigin(0.5, 0.5);
button.setScrollFactor(0, 0);
button.setDepth(15);
// 创建按钮文本
const buttonText = this.add.text(x, y, text, {
fontSize: '16px',
fill: '#ffffff',
fontFamily: 'Arial'
});
buttonText.setOrigin(0.5, 0.5);
buttonText.setScrollFactor(0, 0);
buttonText.setDepth(16);
// 设置按钮交互
button.setInteractive({
useHandCursor: true
});
// 按钮事件
button.on('pointerdown', callback);
button.on('pointerover', () => {
button.setFillStyle(0x555555);
});
button.on('pointerout', () => {
button.setFillStyle(0x333333);
});
}
/**
* 开始种植模式
*/
startPlantingMode(seed, user) {
console.log('DEBUG: startPlantingMode 方法被调用');
console.log(`DEBUG: 种子信息: ${JSON.stringify(seed.getInfo())}`);
this.isPlantingMode = true;
this.selectedSeed = seed;
console.log(`DEBUG: 设置 isPlantingMode = ${this.isPlantingMode}, selectedSeed = ${this.selectedSeed.name}`);
this.generalInfoText.setText(`点击地面种植 ${seed.name}`);
console.log(`DEBUG: 更新提示信息: 点击地面种植 ${seed.name}`);
// 显示种植光标,初始位置设置为当前鼠标位置
console.log(`DEBUG: 当前鼠标位置: x=${this.input.mousePointer.x}, y=${this.input.mousePointer.y}`);
this.plantingCursor = this.add.text(this.input.mousePointer.x, this.input.mousePointer.y, '🌱', {
fontSize: '24px'
});
console.log(`DEBUG: 种植光标创建结果: ${this.plantingCursor ? '成功' : '失败'}`);
this.plantingCursor.setOrigin(0.5, 0.5);
this.plantingCursor.setScrollFactor(0, 0);
this.plantingCursor.setDepth(100);
console.log(`DEBUG: 种植光标属性设置完成: origin=${this.plantingCursor.originX},${this.plantingCursor.originY}, scrollFactor=${this.plantingCursor.scrollFactorX}, depth=${this.plantingCursor.depth}`);
// 存储当前场景引用,确保回调函数中this指向正确
const scene = this;
// 跟随鼠标移动 - 使用命名的事件监听器,方便后续移除
this.mouseMoveListener = (pointer) => {
console.log(`DEBUG: 鼠标移动事件触发,指针位置: x=${pointer.x}, y=${pointer.y}`);
// 检查种植光标是否存在,避免null引用错误
if (scene.plantingCursor) {
scene.plantingCursor.setPosition(pointer.x, pointer.y);
}
};
// 添加鼠标移动事件监听
console.log('DEBUG: 添加鼠标移动事件监听');
this.input.on('pointermove', this.mouseMoveListener);
// 更新背包UI,切换到取消种植按钮
if (this.inventoryUI) {
console.log('DEBUG: 更新背包UI,切换到取消种植按钮');
this.inventoryUI.updatePlantButtonState(true);
}
console.log('DEBUG: 种植模式启动完成');
}
/**
* 取消种植模式
*/
cancelPlantingMode() {
console.log('DEBUG: cancelPlantingMode 方法被调用');
this.isPlantingMode = false;
this.selectedSeed = null;
console.log(`DEBUG: 重置种植模式状态: isPlantingMode=${this.isPlantingMode}, selectedSeed=${this.selectedSeed}`);
this.generalInfoText.setText('欢迎使用种田功能测试场景');
console.log('DEBUG: 重置提示信息');
if (this.plantingCursor) {
console.log('DEBUG: 销毁种植光标');
this.plantingCursor.destroy();
this.plantingCursor = null;
console.log(`DEBUG: 种植光标销毁结果: ${this.plantingCursor ? '失败' : '成功'}`);
}
// 移除鼠标移动事件监听 - 使用存储的监听器引用
if (this.mouseMoveListener) {
console.log('DEBUG: 移除鼠标移动事件监听');
this.input.off('pointermove', this.mouseMoveListener);
this.mouseMoveListener = null;
console.log(`DEBUG: 鼠标移动监听器移除结果: ${this.mouseMoveListener ? '失败' : '成功'}`);
}
// 更新背包UI,切换回种植按钮
if (this.inventoryUI) {
console.log('DEBUG: 更新背包UI,切换回种植按钮');
this.inventoryUI.updatePlantButtonState(false);
// 取消背包中选中的物品,保持UI一致性
console.log('DEBUG: 取消背包中选中的物品');
this.inventoryUI.deselectItem();
}
console.log('DEBUG: 种植模式取消完成');
}
/**
* 在指定位置种植种子
*/
plantSeedAt(pointer) {
console.log('DEBUG: plantSeedAt 方法被调用');
// 检查背包中是否还有该种子
let seedItem = null;
if (this.player.inventory) {
// 查找背包中是否还有该类型的种子
const allItems = this.player.inventory.getAllItems();
if (allItems instanceof Map) {
allItems.forEach(item => {
if (item.itemTypeId === this.selectedSeed.itemTypeId) {
seedItem = item;
}
});
} else {
seedItem = allItems.find(item => item.itemTypeId === this.selectedSeed.itemTypeId);
}
}
if (!seedItem) {
console.log('DEBUG: 背包中没有该种子,取消种植');
this.showMessage(`背包中没有 ${this.selectedSeed.name},无法种植`);
this.cancelPlantingMode();
return;
}
// 将屏幕坐标转换为世界坐标
const worldPoint = this.cameras.main.getWorldPoint(pointer.x, pointer.y);
console.log(`DEBUG: 屏幕坐标转世界坐标: 屏幕(${pointer.x},${pointer.y}) -> 世界(${worldPoint.x},${worldPoint.y})`);
// 创建作物
console.log(`DEBUG: 准备创建作物,类型: ${this.selectedSeed.properties.crop_type}, 生长时间: ${this.selectedSeed.properties.growth_time}`);
const crop = new Crop(
this,
worldPoint.x,
worldPoint.y,
this.selectedSeed.properties.crop_type,
this.selectedSeed.properties.growth_time
);
console.log(`DEBUG: 作物创建结果: ${crop ? '成功' : '失败'}`);
if (crop) {
// 从背包中移除种子
if (this.player.inventory) {
console.log(`DEBUG: 从背包中移除种子 ${seedItem.id}`);
this.player.inventory.removeItem(seedItem.id);
// 更新背包UI
this.inventoryUI.updateUI();
}
// 添加到作物组
this.cropGroup.add(crop);
console.log(`DEBUG: 作物已添加到作物组,当前作物数量: ${this.cropGroup.getLength()}`);
// 显示种植成功消息
this.showMessage(`已种植 ${this.selectedSeed.name}`);
console.log(`DEBUG: 显示种植成功消息: 已种植 ${this.selectedSeed.name}`);
} else {
console.log('DEBUG: 作物创建失败');
this.showMessage(`种植 ${this.selectedSeed.name} 失败`);
}
// 取消种植模式
this.cancelPlantingMode();
console.log('DEBUG: 种植完成,取消种植模式');
}
/**
* 收获作物
*/
harvestCrop(crop) {
// 创建对应的作物物品
const cropItemId = crop.cropType;
const cropItem = this.itemManager.createItem(cropItemId, crop.x, crop.y);
// 尝试将作物添加到玩家背包
if (cropItem) {
if (this.player.inventory) {
const success = this.player.inventory.addItem(cropItem);
if (success) {
// 更新背包UI
this.inventoryUI.updateUI();
this.showMessage(`收获了 ${cropItem.name}`);
cropItem.destroy(); // 从地面移除,已添加到背包
} else {
// 背包满了,作物掉在地上
this.showMessage(`背包已满,${cropItem.name} 掉在地上了`);
}
}
}
// 销毁作物对象
crop.destroy();
console.log('DEBUG: 作物已销毁');
}
/**
* 显示提示信息
*/
showInstructions() {
const titleText = this.add.text(10, 10, '种田功能测试场景', {
fontSize: '20px',
fill: '#ffffff'
});
titleText.setScrollFactor(0, 0);
titleText.setDepth(10);
const moveText = this.add.text(10, 40, 'WASD或方向键移动单位,左键点击选择单位', {
fontSize: '16px',
fill: '#ffffff'
});
moveText.setScrollFactor(0, 0);
moveText.setDepth(10);
const inventoryText = this.add.text(10, 70, '按B键打开/关闭背包', {
fontSize: '16px',
fill: '#ffffff'
});
inventoryText.setScrollFactor(0, 0);
inventoryText.setDepth(10);
const plantingText = this.add.text(10, 100, '在背包中使用种子,然后点击地面种植', {
fontSize: '16px',
fill: '#ffffff'
});
plantingText.setScrollFactor(0, 0);
plantingText.setDepth(10);
const harvestText = this.add.text(10, 130, '点击成熟的作物进行收获', {
fontSize: '16px',
fill: '#ffffff'
});
harvestText.setScrollFactor(0, 0);
harvestText.setDepth(10);
const spaceText = this.add.text(10, 160, '按空格键返回启动场景', {
fontSize: '16px',
fill: '#ffffff'
});
spaceText.setScrollFactor(0, 0);
spaceText.setDepth(10);
}
/**
* 创建侧边栏UI
*/
createSidebar() {
// 侧边栏宽度
const sidebarWidth = 300;
const sidebarDepth = 5;
// 创建侧边栏背景
this.sidebar = this.add.rectangle(
this.sys.game.config.width - sidebarWidth,
0,
sidebarWidth,
this.sys.game.config.height,
0x111111,
0.9
);
this.sidebar.setOrigin(0, 0);
this.sidebar.setScrollFactor(0, 0);
this.sidebar.setDepth(sidebarDepth);
// 添加侧边栏边框
this.sidebarBorder = this.add.rectangle(
this.sys.game.config.width - sidebarWidth,
0,
sidebarWidth,
this.sys.game.config.height,
0x444444,
0
);
this.sidebarBorder.setOrigin(0, 0);
this.sidebarBorder.setStrokeStyle(2, 0x444444, 1);
this.sidebarBorder.setScrollFactor(0, 0);
this.sidebarBorder.setDepth(sidebarDepth + 1);
// 侧边栏标题
const title = this.add.text(
this.sys.game.config.width - sidebarWidth + 20,
20,
'游戏信息面板',
{
fontSize: '20px',
fill: '#ffffff',
fontWeight: 'bold'
}
);
title.setScrollFactor(0, 0);
title.setDepth(sidebarDepth + 2);
// 通用信息区域标题
const generalTitle = this.add.text(
this.sys.game.config.width - sidebarWidth + 20,
50,
'通用信息:',
{
fontSize: '16px',
fill: '#4CAF50',
fontWeight: 'bold'
}
);
generalTitle.setScrollFactor(0, 0);
generalTitle.setDepth(sidebarDepth + 2);
this.generalInfoText = this.add.text(
this.sys.game.config.width - sidebarWidth + 20,
75,
'',
{
fontSize: '14px',
fill: '#ffffff',
wordWrap: {
width: sidebarWidth - 40
}
}
);
this.generalInfoText.setScrollFactor(0, 0);
this.generalInfoText.setDepth(sidebarDepth + 2);
// 角色属性区域标题
const characterTitle = this.add.text(
this.sys.game.config.width - sidebarWidth + 20,
120,
'角色属性:',
{
fontSize: '16px',
fill: '#2196F3',
fontWeight: 'bold'
}
);
characterTitle.setScrollFactor(0, 0);
characterTitle.setDepth(sidebarDepth + 2);
this.unitStatusText = this.add.text(
this.sys.game.config.width - sidebarWidth + 20,
145,
'',
{
fontSize: '14px',
fill: '#ffffff',
wordWrap: {
width: sidebarWidth - 40
}
}
);
this.unitStatusText.setScrollFactor(0, 0);
this.unitStatusText.setDepth(sidebarDepth + 2);
}
/**
* 更新单位状态显示
*/
updateUnitStatus(unit) {
let statusText = `${unit.name} 状态:\n`;
statusText += `生命值: ${unit.health}\n`;
statusText += `营养值: ${unit.nutrition}\n`;
statusText += `水分值: ${unit.hydration}\n`;
if (unit.weapon) {
statusText += `武器: ${unit.weapon.name}`;
}
this.unitStatusText.setText(statusText);
}
/**
* 检查点击位置是否在UI元素上
* @param {Phaser.Input.Pointer} pointer - 指针对象
* @returns {boolean} 是否点击在UI元素上
*/
isPointInUI(pointer) {
// 检查是否点击在背包UI上
if (this.inventoryUI && this.inventoryUI.isOpen) {
const uiRect = this.inventoryUI.container.getBounds();
if (Phaser.Geom.Rectangle.Contains(uiRect, pointer.x - this.inventoryUI.container.x, pointer.y - this.inventoryUI.container.y)) {
return true;
}
}
// 检查是否点击在侧边栏上
if (this.sidebar) {
const sidebarRect = this.sidebar.getBounds();
if (Phaser.Geom.Rectangle.Contains(sidebarRect, pointer.x, pointer.y)) {
return true;
}
}
// 检查是否点击在物品信息面板上
if (this.inventoryUI && this.inventoryUI.itemInfoPanel) {
const infoRect = this.inventoryUI.itemInfoPanel.getBounds();
if (Phaser.Geom.Rectangle.Contains(infoRect, pointer.x, pointer.y)) {
return true;
}
}
// 检查是否点击在作物详情面板上
if (this.cropDetailsPanel) {
const detailsRect = this.cropDetailsPanel.getBounds();
if (Phaser.Geom.Rectangle.Contains(detailsRect, pointer.x, pointer.y)) {
return true;
}
}
// 检查是否点击在交互按钮上(返回菜单按钮等)
// 这里可以添加按钮的点击区域检查
return false;
}
/**
* 显示作物详情信息
* @param {Crop} crop - 作物对象
*/
showCropDetails(crop) {
console.log('DEBUG: showCropDetails 方法被调用');
// 销毁之前的作物详情面板
this.hideCropDetails();
// 创建作物详情面板
const panelWidth = 250;
const panelHeight = 150;
const panelX = this.sys.game.config.width - panelWidth - 20;
const panelY = 100;
this.cropDetailsPanel = this.add.rectangle(
panelX,
panelY,
panelWidth,
panelHeight,
0x000000,
0.8
);
this.cropDetailsPanel.setOrigin(0, 0);
this.cropDetailsPanel.setStrokeStyle(2, 0x4CAF50);
this.cropDetailsPanel.setDepth(200);
this.cropDetailsPanel.setScrollFactor(0, 0);
// 阻止事件冒泡
this.cropDetailsPanel.setInteractive();
this.cropDetailsPanel.on('pointerdown', (pointer) => {
return false;
});
// 作物信息文本
const cropInfo = crop.getInfo();
const growthProgress = Math.min(100, Math.floor(((Date.now() - cropInfo.plantedTime) / cropInfo.growthTime) * 100));
const stageNames = ['种子', '幼苗', '成长中', '成熟'];
let detailsText = `${cropInfo.type} 作物\n`;
detailsText += `生长阶段: ${stageNames[cropInfo.growthStage]}\n`;
detailsText += `生长进度: ${growthProgress}%\n`;
detailsText += `可收获: ${cropInfo.isHarvestable ? '是' : '否'}`;
this.cropDetailsText = this.add.text(
panelX + 10,
panelY + 10,
detailsText,
{ font: '14px Arial', fill: '#ffffff', wordWrap: { width: panelWidth - 20 } }
);
this.cropDetailsText.setDepth(210);
this.cropDetailsText.setScrollFactor(0, 0);
// 如果作物可收获,添加收获按钮
if (cropInfo.isHarvestable) {
this.harvestButton = this.add.text(
panelX + 10,
panelY + 100,
'[收获作物]',
{ font: '14px Arial', fill: '#00ff00' }
);
this.harvestButton.setDepth(210);
this.harvestButton.setScrollFactor(0, 0);
this.harvestButton.setInteractive({
useHandCursor: true,
cursor: 'pointer'
});
// 绑定收获按钮事件
this.harvestButton.on('pointerdown', (pointer) => {
console.log('DEBUG: 点击收获按钮');
this.harvestCrop(crop);
this.hideCropDetails();
return false; // 阻止事件冒泡,防止触发角色移动
});
this.harvestButton.on('pointerover', (pointer) => {
this.harvestButton.setFill('#ffff00');
return false;
});
this.harvestButton.on('pointerout', (pointer) => {
this.harvestButton.setFill('#00ff00');
return false;
});
}
// 添加关闭按钮
this.closeCropDetailsButton = this.add.text(
panelX + panelWidth - 25,
panelY + 5,
'X',
{ font: '18px Arial', fill: '#ffffff' }
);
this.closeCropDetailsButton.setDepth(210);
this.closeCropDetailsButton.setScrollFactor(0, 0);
this.closeCropDetailsButton.setInteractive({
useHandCursor: true,
cursor: 'pointer'
});
this.closeCropDetailsButton.on('pointerdown', (pointer) => {
this.hideCropDetails();
return false;
});
this.closeCropDetailsButton.on('pointerover', (pointer) => {
this.closeCropDetailsButton.setFill('#ff0000');
return false;
});
this.closeCropDetailsButton.on('pointerout', (pointer) => {
this.closeCropDetailsButton.setFill('#ffffff');
return false;
});
}
/**
* 隐藏作物详情信息
*/
hideCropDetails() {
if (this.cropDetailsPanel) {
this.cropDetailsPanel.destroy();
this.cropDetailsPanel = null;
}
if (this.cropDetailsText) {
this.cropDetailsText.destroy();
this.cropDetailsText = null;
}
if (this.harvestButton) {
this.harvestButton.destroy();
this.harvestButton = null;
}
if (this.closeCropDetailsButton) {
this.closeCropDetailsButton.destroy();
this.closeCropDetailsButton = null;
}
}
/**
* 显示消息
*/
showMessage(message) {
// 创建消息
const messageText = this.add.text(
this.player.x,
this.player.y - 50,
message,
{
font: '20px Arial',
fill: '#ffffff',
backgroundColor: '#000000',
padding: { x: 10, y: 5 }
}
);
messageText.setOrigin(0.5, 0.5);
messageText.setDepth(20);
messageText.setScrollFactor(1);
// 3秒后自动移除消息
this.time.delayedCall(3000, () => {
if (messageText) {
messageText.destroy();
}
});
}
update() {
this.inputSystem.update();
// 更新所有单位
this.unitGroup.getChildren().forEach(unit => {
if (unit.update) {
unit.update();
}
unit.updateMovement();
// 更新单位状态显示
this.updateUnitStatus(unit);
});
}
}