找回密码
 点一下
查看: 2857|回复: 7

RPG类伪透视系统

[复制链接]
发表于 2010-1-31 12:53:04 | 显示全部楼层 |阅读模式
这玩意儿应该算是个人原创吧^ ^类似于暗黑啊,等等RPG中人物被遮挡后的处理,不过这里需要利用单位来模拟地形装饰物,因此可能会对地图本身产生一定的压力。不过我在代码上已经加入了几个开关,可以有效的降低多余计算/运行次数。如果需要移植到多人的话,请自己尝试吧^ ^

下面是效果图:




如果你看不懂这段代码的话,个人建议不要乱用= =尽管比较简单。
代码效率或许还有待于优化。

以上。

关键代码:

[jass]
function IsNotHero takes nothing returns boolean
if IsUnitType(GetFilterUnit(),UNIT_TYPE_HERO)==false then
call UnitAddAbility(GetFilterUnit(),’Aloc’)
return true
endif
return false
endfunction

function PerspclreWork takes nothing returns nothing
local real x=GetUnitX(gg_unit_Ewar_0759)
local real y=GetUnitY(gg_unit_Ewar_0759)
local real x1=GetUnitX(GetEnumUnit())
local real y1=GetUnitY(GetEnumUnit())
local real d=SquareRoot((x-x1)*(x-x1)+(y-y1)*(y-y1))
local integer t=R2I(0.255*d)
if t>255 then
set t=255
endif
call SetUnitVertexColor(GetEnumUnit(),255,255,255,t)
endfunction

function PerspclreDone takes nothing returns nothing
call SetUnitVertexColor(GetEnumUnit(),255,255,255,255)
endfunction

function Perspclre takes nothing returns nothing
if IsUnitInRegion(udg_rg,gg_unit_Ewar_0759) then
set udg_b=true
call ForGroup(udg_g,function PerspclreWork)
else
if udg_b then
set udg_b=false
call ForGroup(udg_g,function PerspclreDone)
endif
endif
endfunction

function SystemInit takes nothing returns nothing
local boolexpr b=Condition(function IsNotHero)
call GroupEnumUnitsInRect(udg_g,bj_mapInitialPlayableArea,b)
call DestroyBoolExpr(b)
set b=null
call RegionAddRect(udg_rg,gg_rct_r01)
call RegionAddRect(udg_rg,gg_rct_r02)
call RemoveRect(gg_rct_r01)
call RemoveRect(gg_rct_r02)
call TimerStart(CreateTimer(),0.1,true,function Perspclre)
call DestroyTrigger(GetTriggeringTrigger())
endfunction
[/jass]

Perspclre.w3x

25 KB, 下载次数: 67

W3X地图文档,让你可以直观的看到效果。

评分

参与人数 1威望 +4 收起 理由
血戮魔动冰 + 4

查看全部评分

发表于 2010-1-31 13:03:40 | 显示全部楼层
引用楼主gducn于2010-01-31 12:53发表的 RPG类伪透视系统 :
这玩意儿应该算是个人原创吧^ ^类似于暗黑啊,等等RPG中人物被遮挡后的处理,不过这里需要利用单位来模拟地形装饰物,因此可能会对地图本身产生一定的压力。不过我在代码上已经加入了几个开关,可以有效的降低多余计算/运行次数。如果需要移植到多人的话,请自己尝试吧^ ^

下面是效果图:


.......

的确很好的想法。我虽然有过这样的想法但还是放弃了。LZ这个系统确实很好(效率嘛……这样就算不错了),但有缺点是这个系统1.不支持多人,2.无法通用于一般游戏的视角。
如果要支持多人,也很简单,根据Camera来确定就行了,因为单位本身的透明度是完全可以不同步的。当然了,如果用Camera的话,应该就需要一些数学公式那些了的吧(之前我就是卡在这里)……我也不会。
回复

使用道具 举报

 楼主| 发表于 2010-1-31 13:26:48 | 显示全部楼层
按照目前这样做的话,任何视角都可以不阻挡吧- -当然,这里只是做的是顶部透明,根据这个效果可以衍生出来各种效果,比如树木透明,柱子透明等等。算法上其实并不是非常复杂的东西。
回复

使用道具 举报

发表于 2010-2-1 15:42:51 | 显示全部楼层
这个效果很赞的呀,不过这个对计算机系统的运算还是有一定的压力额...得多次计算,学习了
回复

使用道具 举报

 楼主| 发表于 2010-2-1 17:23:58 | 显示全部楼层
发现少写了个语句,已经在代码上加上去了。不过地图里还没加
回复

使用道具 举报

发表于 2010-2-1 18:20:05 | 显示全部楼层
不知道有啥实际效果,帮顶
回复

使用道具 举报

发表于 2010-2-2 18:15:21 | 显示全部楼层
很好玩的 经常某些地图 视野挡住很讨厌.
回复

使用道具 举报

发表于 2010-2-11 22:12:04 | 显示全部楼层
真的是一个非常先进的系统!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-24 04:16 , Processed in 0.285956 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表