|
发表于 2008-9-27 16:05:39
|
显示全部楼层
来不及做出演示了,发出我的草稿。
[codes=jass]
理论,如果我的猜想和叙述有错误,请帮忙指出。
我把位面技术理解为动态世界的技术。按条件(游戏进程)改变游戏中的各种元素。
其实我觉得,在War3架构下,地图中的基本元素(单位,物品,技能,魔法效果,可破坏物和地形装饰物,地形类型,声音)应该是同步的显示的,全局的,怎么可能异步实现?
但我仍愿意尝试看是否能够做到。
--------------------------------
位面技术的核心应该是:
如何动态隐藏、替换地图中的各种元素?
地图中的元素有:单位,物品,技能,魔法效果,可破坏物和地形装饰物,地形类型,声音。
位面切换时,这些元素应该完全或部分隐藏(删除),而且互不干扰。
也可以移动这些元素到指定地点,但这貌似也属于使用“2个世界”的方法?
-------------------------------
我的想法:
在地图玩家只有1个或者地图中玩家游戏进程一致的条件下,位面技术(其实该叫隐藏技术)是可以实现的。而地图多玩家且游戏进程不一致条件下,位面技术不可能,即使实现也可能不稳定(在War3现有架构下)。
---------------------------------------------------------
下面我举3个例子来印证这个想法。 ↓
---------------------------------------------------------
例1:(地图单玩家时)【可实现】
有一幅地图,并且有player一个玩家,player有英雄A。
如何实现:当player进入地图时显示夏天的景色,30秒后周围的环境变成了秋天?
--------------------------------
//夏天景色包含的元素(卖雪糕的商人一个[单位],商店一座[建筑单位],洛丹伦夏树木若干[可破坏物],一个水槽[装饰物],长满草地土地一片[地形纹理],被丢弃的刀一把[物品])
//秋天景色包含的元素(戴草帽的商人一个,生命之泉一个,秋天树木若干,一个秋天的装饰物,秋天的泥地,一件衣服)
---------------------------------------------------------------------------------------------------------------------------------------------------------------
例2:(地图多玩家但游戏进程一致时)【可实现】
有一幅地图,并且有player1,player2二个玩家,二个玩家的开始点一样。英雄A为player1所有,英雄B为player2所有。当2个玩家进入地图开始游戏时显示夏天的景色。
如何实现:当2个玩家都完成某任务时,地图显示秋天的景色?
(夏秋的元素见上)
---------------------------------------------------------------------------------------------------------------------------------------
例3:(地图多玩家且游戏进程不一致)【我不能实现】
有一幅地图,并且有player1,player2二个玩家,二个玩家的开始点一样。英雄A为player1所有,英雄B为player2所有。
如何实现:当player1进入的游戏时候显示夏天,player2进入的游戏时候显示秋天?30秒后,player1眼前的景色变成了秋天;40秒后,而player2眼前的景色变成了夏天?
注意:玩家的开始点相同
---------------------------------------------------------------------------------------------------------------------------------------
实现的方法概述:
单位,物品,可破坏物,地形类型的改变或者隐藏可以套用一些现成的函数,再结合一些特殊的条件(如单位接近某地图元素,如单位完成了某任务,如游戏时间改变)很容易达到所谓的位面技术的要求。
一些地形装饰物我采用将单位模型改成地形装饰物然后用隐藏单位的办法隐藏。
而技能和魔法效果怎么办?即如何使A位面单位使用的技能效果不被B位面的玩家单位看到,并且不影响B位面的任何单位?
技能互不影响可以用联盟状态。而不同位面技能不可见,怎么办?我没想到办法。。。。如果你知道请指教我:[email protected]
==================================
例1和例2的是一样的。其实例1和例2不叫位面技术。叫隐藏技术差不多。主要是如何实现例3。例3是真正的位面技术。我不能完成。如果你实现了请指教我:[email protected]。
但例1例2还是具备实用性的,重复利用同一区域创建不同的游戏环境,可以节约游戏资源(根据条件删除不需要的地图元素),也能带给玩家新鲜的感觉,让游戏玩法更加丰富。但不恰当的设置可能导致地形混乱。
======================================================================================
下面是一些具体实现前2个例子的过程: ↓
------------------------------------------------------------------------------------------------------------------------------------------
设有目标单位A(unit A)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//初始化A单位(某区域内锁定视角,碰撞关闭。)(其实该采用更改通行状态的方法更精确的控制碰撞)
function SetInit takes unit Tunit,boolean show returns nothing
local rect unitrec=RectFromCenterSizeBJ(GetUnitLoc(Tunit),100.00, 100.00)
call SetCameraBoundsToRectForPlayerBJ(GetOwningPlayer(Tunit),unitrec)
call SetUnitPathing(Tunit,show)
endfunction
///call SetInit(A,false)
----------------------------------------------------------------
隐藏地图中元素的一些具体方法:
1~如何切换单位
切换(隐藏)单位可能的方法:
1~添加乌鸦形态后,改变单位飞行高度为5000。(先在编辑器设置A单位阴影图象为无,在同一点这个办法比ShowUnit好。。。)
2~使用钻地,隐身,虚无状态,妖术,吞噬等技能
3~使用ShowUnit函数(设置单位隐藏/显示状态,主要适用于碰撞体积较大的建筑单位)
//////////////////////////////////////////////////////////////////
function HideShowUnit takes unit A ,integer mode returns nothing
//mode=1 hide,mode!=1 show
if mode==1 then
if (IsUnitType(A,UNIT_TYPE_STRUCTURE) == true) then
call ShowUnit(A,false)
else
call UnitAddAbility(A,'Amrf')
call SetUnitFlyHeight(A,5000.00,0.00)
endif
else
if (IsUnitType(A,UNIT_TYPE_STRUCTURE) == true) then
call ShowUnit(A,true)
else
call UnitRemoveAbility(A,'Amrf')
call SetUnitFlyHeight(A,0,0.00)
endif
endif
call EnableSelect(true,true)
call EnableDragSelect(true,true)
call EnablePreSelect(true,true)
call EnableMinimapFilterButtons(false,false)
call UnitSetUsesAltIcon(A,true)
endfunction
----------------------------
2~如何切换物品
设置物品显示/隐藏
native SetItemVisible takes item whichItem, boolean show returns nothing
----------------------------
3~如何切换可破坏物
方法:
1~隐藏或者杀死可破坏物,删除可破坏物,然后创建之。
---------------------------
切换地形装饰物
2~将单位的模型更换为地形装饰物
然后使用隐藏单位的方法隐藏之
call HideShowUnit()
---------------
4~如何切换技能魔法效果(即不同位面技能相互不影响,且不可见)
如果你实现了请指教我:[email protected]
---------------
5~如何切换地形类型
SetTerrainType函数
native SetTerrainType takes real x, real y, integer terrainType, integer variation, integer area, integer shape returns nothing
改变坐标(x,y)处的地形纹理为terrainType,使用样式variation,范围area,形状shape
======================================================================================
隐藏的条件怎么设置?
例:
设有:单位A,单位B,单位C
地图中每个单位,物品,可破坏物,地形装饰物
(可破坏物和地形装饰物为单位)
设为:
D1~~Dn为单位
W1~~Wn为物品
K1~~Kn为可破坏
设
有条件CA,CB,CC
⒈当CA时,D1~~Dn显示,W1~~Wn隐藏,K1~~Kn显示
当CB时,W1~~Wn显示。。。。。。。。。。。。
当CC时,。。。。。。。。。。。。。。。。。
那么当A接近B一定距离时,且满足条件CA时,设置A关闭碰撞,B隐藏。
当A远离B时,且满足条件CA时,设置A开启碰撞,B显示。
(由于锁定了视角,远离一定距离之后B是不可能被A单位看到的)
比如CA=完成任务A时,B=某NPC
意思就是:当A接近某NPC时,又完成了A任务时,那么隐藏某NPC(按照我的方法,某NPC实际上已经在5000米的高空!)
于是,动态世界单机版或者多玩家同进程版就简单完成了。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
上面说得太锤子了,连我自己都没看懂。要想懂得整点实际的测试一下吧。
-----------------------------------------------------------------------------------------------------------------------------------
可能用到的函数说明:
CreateNUnitsAtLoc//创建单位(面向角度)
CreateCorpseLocBJ//创建尸体
KillUnit//杀死单位
RemoveUnit//删除单位
ExplodeUnitBJ//爆炸单位
ShowUnit//显示/隐藏单位
SetUnitColor//改变队伍颜色
UnitShareVision//共享视野 (采用视野为0的办法?)
SetUnitPosition//移动单位(立即)(指定坐标) (2个世界的办法)
SetUnitX//设置单位X坐标
SetUnitPathing//设置碰撞开关
UnitRemoveBuffNT//删除指定魔法效果(或许在位面切换时防技能干扰有用?)
UnitAddAbility//为单位添加技能
UnitRemoveAbility//删除技能
UnitAddType//添加类别(为单位添加某种位面切换时需要的状态)
UnitPoolAddUnitType//添加单位类型
DestroyUnitPool//删除单位池(批量隐藏?)
CreateUbersplatBJ//创建一个地面纹理变化在某某
SetTerrainType//改变地形类型(指定坐标)
SetTerrainPathable//设置地形通行状态(指定坐标) (和单位碰撞开关配合用)
CreateDestructableLoc//创建可破坏物
KillDestructable//杀死可破坏物
ShowDestructable//显示/隐藏(隐藏的可破坏物不被显示,但仍影响通行和视线)
AttachSoundToUnitBJ//将3D音效绑定到单位(位面声音切换?)
SetSoundDistanceCutoff//声音的截断距离(同上)
SetItemVisible//显示/隐藏物品
EnableSelect//允许/禁用选择(A位面的单位应该禁止被B位面的单位选择吧?)
EnableDragSelect//允许/禁用框选
EnablePreSelect//允许/禁用预选(禁止位面错乱,生命槽物体信息)
UnitSetUsesAltIcon//关闭某单位小地图标志
EnableMinimapFilterButtons//是否禁用联盟颜色按钮和中立生物显示按钮
SetPlayerAlliance//设置联盟状态(或许这个可以用于位面切换时使技能不影响另一位面)
[/codes] |
|