|
|
@@ -31,6 +31,46 @@ export class BlockManager extends Component {
|
|
|
})
|
|
|
public kuangContainer: Node = null;
|
|
|
|
|
|
+ // Block1节点
|
|
|
+ @property({
|
|
|
+ type: Node,
|
|
|
+ tooltip: '拖拽Block1节点到这里(Canvas/GameLevelUI/BlockSelectionUI/diban/kuang/Block1)'
|
|
|
+ })
|
|
|
+ public block1Container: Node = null;
|
|
|
+
|
|
|
+ // Block2节点
|
|
|
+ @property({
|
|
|
+ type: Node,
|
|
|
+ tooltip: '拖拽Block2节点到这里(Canvas/GameLevelUI/BlockSelectionUI/diban/kuang/Block2)'
|
|
|
+ })
|
|
|
+ public block2Container: Node = null;
|
|
|
+
|
|
|
+ // Block3节点
|
|
|
+ @property({
|
|
|
+ type: Node,
|
|
|
+ tooltip: '拖拽Block3节点到这里(Canvas/GameLevelUI/BlockSelectionUI/diban/kuang/Block3)'
|
|
|
+ })
|
|
|
+ public block3Container: Node = null;
|
|
|
+
|
|
|
+ // 价格节点装饰器
|
|
|
+ @property({
|
|
|
+ type: Node,
|
|
|
+ tooltip: '拖拽Block1价格节点到这里(Canvas/GameLevelUI/BlockSelectionUI/diban/kuang/Block1/db01/Price)'
|
|
|
+ })
|
|
|
+ public block1PriceNode: Node = null;
|
|
|
+
|
|
|
+ @property({
|
|
|
+ type: Node,
|
|
|
+ tooltip: '拖拽Block2价格节点到这里(Canvas/GameLevelUI/BlockSelectionUI/diban/kuang/Block2/db01/Price)'
|
|
|
+ })
|
|
|
+ public block2PriceNode: Node = null;
|
|
|
+
|
|
|
+ @property({
|
|
|
+ type: Node,
|
|
|
+ tooltip: '拖拽Block3价格节点到这里(Canvas/GameLevelUI/BlockSelectionUI/diban/kuang/Block3/db01/Price)'
|
|
|
+ })
|
|
|
+ public block3PriceNode: Node = null;
|
|
|
+
|
|
|
// 金币标签节点
|
|
|
@property({
|
|
|
type: Node,
|
|
|
@@ -258,6 +298,33 @@ export class BlockManager extends Component {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // 如果没有指定Block1Container,尝试找到它
|
|
|
+ if (!this.block1Container) {
|
|
|
+ this.block1Container = find('Canvas/GameLevelUI/BlockSelectionUI/diban/kuang/Block1');
|
|
|
+ if (!this.block1Container) {
|
|
|
+ console.error('找不到Block1节点');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果没有指定Block2Container,尝试找到它
|
|
|
+ if (!this.block2Container) {
|
|
|
+ this.block2Container = find('Canvas/GameLevelUI/BlockSelectionUI/diban/kuang/Block2');
|
|
|
+ if (!this.block2Container) {
|
|
|
+ console.error('找不到Block2节点');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果没有指定Block3Container,尝试找到它
|
|
|
+ if (!this.block3Container) {
|
|
|
+ this.block3Container = find('Canvas/GameLevelUI/BlockSelectionUI/diban/kuang/Block3');
|
|
|
+ if (!this.block3Container) {
|
|
|
+ console.error('找不到Block3节点');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// 如果没有指定coinLabelNode,尝试找到它
|
|
|
if (!this.coinLabelNode) {
|
|
|
this.coinLabelNode = find('Canvas/GameLevelUI/CoinNode/CoinLabel');
|
|
|
@@ -272,6 +339,28 @@ export class BlockManager extends Component {
|
|
|
this.placedBlocksContainer = find('Canvas/GameLevelUI/PlacedBlocks');
|
|
|
}
|
|
|
|
|
|
+ // 如果没有指定价格节点,尝试找到它们
|
|
|
+ if (!this.block1PriceNode) {
|
|
|
+ this.block1PriceNode = find('Canvas/GameLevelUI/BlockSelectionUI/diban/kuang/Block1/db01/Price');
|
|
|
+ if (!this.block1PriceNode) {
|
|
|
+ console.warn('找不到Block1价格节点');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!this.block2PriceNode) {
|
|
|
+ this.block2PriceNode = find('Canvas/GameLevelUI/BlockSelectionUI/diban/kuang/Block2/db01/Price');
|
|
|
+ if (!this.block2PriceNode) {
|
|
|
+ console.warn('找不到Block2价格节点');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!this.block3PriceNode) {
|
|
|
+ this.block3PriceNode = find('Canvas/GameLevelUI/BlockSelectionUI/diban/kuang/Block3/db01/Price');
|
|
|
+ if (!this.block3PriceNode) {
|
|
|
+ console.warn('找不到Block3价格节点');
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// 确保有PlacedBlocks节点用于存放已放置的方块
|
|
|
this.ensurePlacedBlocksNode();
|
|
|
|
|
|
@@ -462,22 +551,33 @@ export class BlockManager extends Component {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- const kuangNode = this.kuangContainer;
|
|
|
- if (!kuangNode) {
|
|
|
- console.error('找不到kuang节点');
|
|
|
- return;
|
|
|
+ // 使用Block1、Block2、Block3节点作为方块容器
|
|
|
+ const blockContainers = [
|
|
|
+ this.block1Container,
|
|
|
+ this.block2Container,
|
|
|
+ this.block3Container
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 检查所有Block容器是否存在
|
|
|
+ for (let i = 0; i < blockContainers.length; i++) {
|
|
|
+ if (!blockContainers[i]) {
|
|
|
+ console.error(`找不到Block${i + 1}节点`);
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ // 方块在各自容器中的位置偏移(相对于容器中心)
|
|
|
const offsets = [
|
|
|
- new Vec3(-200, 0, 0),
|
|
|
- new Vec3(0, 0, 0),
|
|
|
- new Vec3(200, 0, 0)
|
|
|
+ new Vec3(0, 0, 0), // Block1中心
|
|
|
+ new Vec3(0, 0, 0), // Block2中心
|
|
|
+ new Vec3(0, 0, 0) // Block3中心
|
|
|
];
|
|
|
|
|
|
- const dbNodes = [
|
|
|
- kuangNode.getChildByName('db01'),
|
|
|
- kuangNode.getChildByName('db02'),
|
|
|
- kuangNode.getChildByName('db03')
|
|
|
+ // 价格节点使用装饰器属性
|
|
|
+ const priceNodes = [
|
|
|
+ this.block1PriceNode,
|
|
|
+ this.block2PriceNode,
|
|
|
+ this.block3PriceNode
|
|
|
];
|
|
|
|
|
|
// 获取当前关卡的武器配置列表
|
|
|
@@ -542,7 +642,7 @@ export class BlockManager extends Component {
|
|
|
}
|
|
|
|
|
|
const block = instantiate(prefab);
|
|
|
- kuangNode.addChild(block);
|
|
|
+ blockContainers[i].addChild(block);
|
|
|
|
|
|
block.position = offsets[i];
|
|
|
|
|
|
@@ -555,27 +655,32 @@ export class BlockManager extends Component {
|
|
|
block['weaponId'] = weaponConfig.id;
|
|
|
|
|
|
this.originalPositions.set(block, offsets[i].clone());
|
|
|
- this.blockLocations.set(block, 'kuang');
|
|
|
+ this.blockLocations.set(block, `block${i + 1}`);
|
|
|
this.blocks.push(block);
|
|
|
|
|
|
- if (dbNodes[i]) {
|
|
|
- const priceNode = dbNodes[i].getChildByName('Price');
|
|
|
- if (priceNode) {
|
|
|
- this.blockPriceMap.set(block, priceNode);
|
|
|
- priceNode.active = true;
|
|
|
-
|
|
|
- // 根据武器配置和方块形状设置价格
|
|
|
- this.setBlockPriceByWeaponConfig(block, priceNode);
|
|
|
- }
|
|
|
+ // 处理价格显示
|
|
|
+ if (priceNodes[i]) {
|
|
|
+ this.blockPriceMap.set(block, priceNodes[i]);
|
|
|
+ priceNodes[i].active = true;
|
|
|
|
|
|
- this.associateDbNodeWithBlock(block, dbNodes[i]);
|
|
|
+ // 根据武器配置和方块形状设置价格
|
|
|
+ this.setBlockPriceByWeaponConfig(block, priceNodes[i]);
|
|
|
+ } else {
|
|
|
+ console.warn(`Block${i + 1}容器下找不到Price节点`);
|
|
|
}
|
|
|
|
|
|
+ // 关联Block容器与方块(替代原来的dbNode关联)
|
|
|
+ this.associateBlockContainerWithBlock(block, blockContainers[i]);
|
|
|
+
|
|
|
+ // 设置方块位置信息到blockLocations映射中
|
|
|
+ const blockLocation = `block${i + 1}`;
|
|
|
+ this.blockLocations.set(block, blockLocation);
|
|
|
+
|
|
|
// 设置方块的武器外观,传入目标形状ID以确保正确加载图片
|
|
|
this.setupBlockWeaponVisual(block, weaponConfig, targetShapeId);
|
|
|
|
|
|
- // 设置BlockInfo组件信息
|
|
|
- this.setupBlockInfo(block, weaponConfig, targetShapeId);
|
|
|
+ // 设置BlockInfo组件信息,传入容器位置信息
|
|
|
+ this.setupBlockInfo(block, weaponConfig, targetShapeId, blockLocation);
|
|
|
|
|
|
// 为新生成的方块添加标签
|
|
|
BlockTag.addTag(block);
|
|
|
@@ -593,34 +698,44 @@ export class BlockManager extends Component {
|
|
|
}
|
|
|
|
|
|
// 将db节点与方块关联
|
|
|
- associateDbNodeWithBlock(block: Node, dbNode: Node) {
|
|
|
- block['dbNode'] = dbNode;
|
|
|
+ // 将Block容器与方块关联
|
|
|
+ associateBlockContainerWithBlock(block: Node, blockContainer: Node) {
|
|
|
+ block['blockContainer'] = blockContainer;
|
|
|
|
|
|
block.on(Node.EventType.TRANSFORM_CHANGED, () => {
|
|
|
- if (dbNode && block.parent) {
|
|
|
+ if (blockContainer && block.parent) {
|
|
|
const location = this.blockLocations.get(block);
|
|
|
+ const priceNode = this.blockPriceMap.get(block);
|
|
|
|
|
|
if (location === 'grid') {
|
|
|
- dbNode.active = false;
|
|
|
+ // 方块在网格区域时,隐藏价格标签
|
|
|
+ if (priceNode) {
|
|
|
+ priceNode.active = false;
|
|
|
+ }
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 检查方块是否正在被拖动,如果是则隐藏价格标签
|
|
|
if (block['isDragging']) {
|
|
|
- dbNode.active = false;
|
|
|
+ if (priceNode) {
|
|
|
+ priceNode.active = false;
|
|
|
+ }
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- dbNode.active = true;
|
|
|
-
|
|
|
- const worldPos = block.parent.getComponent(UITransform).convertToWorldSpaceAR(block.position);
|
|
|
- const localPos = dbNode.parent.getComponent(UITransform).convertToNodeSpaceAR(worldPos);
|
|
|
-
|
|
|
- dbNode.position = new Vec3(localPos.x, localPos.y - 80, localPos.z);
|
|
|
+ // 方块在Block容器区域时,显示价格标签
|
|
|
+ if (priceNode && location && location.startsWith('block')) {
|
|
|
+ priceNode.active = true;
|
|
|
+ }
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ // 保留原方法以兼容可能的调用(现在委托给新方法)
|
|
|
+ associateDbNodeWithBlock(block: Node, dbNode: Node) {
|
|
|
+ this.associateBlockContainerWithBlock(block, dbNode);
|
|
|
+ }
|
|
|
+
|
|
|
// 更新金币显示
|
|
|
updateCoinDisplay() {
|
|
|
if (this.coinLabelNode) {
|
|
|
@@ -996,13 +1111,14 @@ export class BlockManager extends Component {
|
|
|
for (const block of this.blocks) {
|
|
|
if (block.isValid) {
|
|
|
const location = this.blockLocations.get(block);
|
|
|
- if (location === 'kuang') {
|
|
|
+ // 清除kuang区域和Block容器中的方块
|
|
|
+ if (location === 'kuang' || location === 'block1' || location === 'block2' || location === 'block3') {
|
|
|
blocksToRemove.push(block);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- console.log('[BlockManager] 找到需要清理的kuang区域方块数量:', blocksToRemove.length);
|
|
|
+ console.log('[BlockManager] 找到需要清理的方块数量:', blocksToRemove.length);
|
|
|
|
|
|
for (const block of blocksToRemove) {
|
|
|
const dbNode = block['dbNode'];
|
|
|
@@ -1029,7 +1145,7 @@ export class BlockManager extends Component {
|
|
|
// 清理武器配置映射
|
|
|
this.blockWeaponConfigs.delete(block);
|
|
|
|
|
|
- console.log('[BlockManager] 销毁kuang区域方块:', block.name);
|
|
|
+ console.log('[BlockManager] 销毁方块:', block.name, '位置:', this.blockLocations.get(block));
|
|
|
block.destroy();
|
|
|
}
|
|
|
|
|
|
@@ -1351,8 +1467,9 @@ export class BlockManager extends Component {
|
|
|
* @param block 方块节点
|
|
|
* @param weaponConfig 武器配置
|
|
|
* @param targetShapeId 目标形状ID
|
|
|
+ * @param blockLocation 方块所在位置
|
|
|
*/
|
|
|
- private setupBlockInfo(block: Node, weaponConfig: WeaponConfig, targetShapeId?: string) {
|
|
|
+ private setupBlockInfo(block: Node, weaponConfig: WeaponConfig, targetShapeId?: string, blockLocation?: string) {
|
|
|
const blockInfo = block.getComponent(BlockInfo);
|
|
|
if (!blockInfo) {
|
|
|
console.warn(`[BlockManager] 方块 ${block.name} 没有BlockInfo组件`);
|
|
|
@@ -1386,7 +1503,7 @@ export class BlockManager extends Component {
|
|
|
}
|
|
|
|
|
|
// 设置位置信息
|
|
|
- blockInfo.currentLocation = 'kuang';
|
|
|
+ blockInfo.currentLocation = blockLocation || 'kuang';
|
|
|
blockInfo.gridPosition = new cc.Vec2(-1, -1);
|
|
|
|
|
|
// 设置状态信息
|