|
国际惯例,开头废话
感谢社会,感谢人民,感谢政府.
低智商生物蛐蛐终于脱离了J盲,进化为Jass新手阶段,特此纪念下.
回报社会,回报人民,回报政府. 因为初学J,所以代码有待优化
这个系统用T也可以做,不过效率没那么高
代码简单,不过总之自我感觉操作很流畅
1.前or后 左or右 不冲突,后按的键优先,释放则返回
2.自动调节Z旋转和Z偏移,解决上下坡'透视'的尴尬局面
如:上坡时'抬头',下坡时'低头',幅度根据地形坡度
3.移动速度无限制,暂时设置为100~1000
4.暂时只加入边界、水面已经地形装饰物的障碍判断
若需要单位、可破坏物体判断请自己添加
5.移植时只要复制代码、触发以及相应全局变量即可
[蟋有的蟀]舒适的键盘移动+镜头系统(高仿3D).w3x
(82 KB, 下载次数: 1248)
[jass]
//===========================================================================
// 移动函数
function Move takes nothing returns nothing
local integer i = 1
local unit u
local real array r
loop
exitwhen i > 10
if ( not ( udg_O_b[( i + 70 )] != false ) ) then //为then时禁止移动/转身,如果不需要可以不移植此项
set u = udg_Hero_u
set r[0] = RMinBJ(RMaxBJ(udg_O_r, 100.00), 1000.00) //移动速度
set r[1] = GetUnitFacing(u) //面向角度
set r[2] = udg_O_r[( i + 10 )] //转身速度
if ( not ( udg_O_b[( i + 60 )] != true ) ) then //左转or右转
if ( not ( udg_O_b[( i + 30 )] != true ) ) then
set r[1] = ( r[1] + r[2] )
else
if ( not ( udg_O_b[( i + 40 )] != true ) ) then
set r[1] = ( r[1] - r[2] )
else
endif
endif
else
if ( not ( udg_O_b[( i + 40 )] != true ) ) then
set r[1] = ( r[1] - r[2] )
else
if ( not ( udg_O_b[( i + 30 )] != true ) ) then
set r[1] = ( r[1] + r[2] )
else
endif
endif
endif
call SetUnitFacing( u, r[1] ) //转身
if ( not ( udg_O_b[( i + 50 )] != true ) ) then //前进or后退
if ( not ( udg_O_b[( i + 10 )] != true ) ) then
set r[3] = ( r[0] / 20.00 ) //位移距离
set r[4] = ( 0.50 + ( r[0] / 800.00 ) ) //动画速度
else
if ( not ( udg_O_b[( i + 20 )] != true ) ) then
set r[3] = ( 0.00 - ( r[0] / 40.00 ) ) //后退距离为负数
set r[4] = ( 0.00 - ( 0.20 + ( r[0] / 1600.00 ) ) ) //后退动画速度为负数
else
endif
endif
else
if ( not ( udg_O_b[( i + 20 )] != true ) ) then
set r[3] = ( 0.00 - ( r[0] / 40.00 ) )
set r[4] = ( 0.00 - ( 0.20 + ( r[0] / 1600.00 ) ) )
else
if ( not ( udg_O_b[( i + 10 )] != true ) ) then
set r[3] = ( r[0] / 20.00 )
set r[4] = ( 0.50 + ( r[0] / 800.00 ) )
else
endif
endif
endif
set r[5] = ( GetUnitX(u) + ( r[3] * Cos(( GetUnitFacing(u) * bj_DEGTORAD )) ) ) //位移目标点x坐标
set r[6] = ( GetUnitY(u) + ( r[3] * Sin(( GetUnitFacing(u) * bj_DEGTORAD )) ) ) //位移目标点y坐标
if ( not ( IsTerrainPathable(r[5], r[6], PATHING_TYPE_WALKABILITY) == true ) ) then
if ( not ( udg_O_b[( i + 10 )] != true ) ) then
call SetUnitX( u, r[5] ) //移动单位x坐标
call SetUnitY( u, r[6] ) //移动单位y坐标
call SetUnitAnimationByIndex( u, R2I(udg_O_r[( i + 20 )]) ) //指定序列播放单位动画
call SetUnitTimeScale( u, r[4] ) //动画播放速度
else
if ( not ( udg_O_b[( i + 20 )] != true ) ) then
call SetUnitX( u, r[5] )
call SetUnitY( u, r[6] )
call SetUnitAnimationByIndex( u, R2I(udg_O_r[( i + 20 )]) )
call SetUnitTimeScale( u, r[4] )
else
endif
endif
else
endif
else
endif
set i = i + 1
endloop
endfunction
//===========================================================================
// 镜头函数
// 以下数值可根据自己地图的地形需要进行修改
function Aov takes nothing returns nothing
local integer i = 1
local location array p
loop
exitwhen i > 10
if ( not ( udg_Aov_i != 0 ) ) then //停止镜头锁定,如果不需要可以不移植此项
call ResetToGameCameraForPlayer( ConvertedPlayer(i), 0 )
else
if ( not ( udg_Aov_i != 1 ) ) then //锁定镜头
set p[0] = GetUnitLoc(udg_Hero_u)
set p[1] = PolarProjectionBJ(p[0], -80.00, GetUnitFacing(udg_Hero_u))
call SetCameraFieldForPlayer( ConvertedPlayer(i), CAMERA_FIELD_TARGET_DISTANCE, 600.00, 0 ) //镜头距离,如果需要,可以用全局变量记录方便传递
call SetCameraTargetControllerNoZForPlayer( ConvertedPlayer(i), udg_Hero_u, 0, 0, false ) //锁定镜头
call SetCameraFieldForPlayer( ConvertedPlayer(i), CAMERA_FIELD_ANGLE_OF_ATTACK, ( 355.00 + ( ( GetLocationZ(p[0]) - GetLocationZ(p[1]) ) * 0.70 ) ), 0.80 ) //X旋转角度,随单位所在地形坡度改变
call SetCameraFieldForPlayer( ConvertedPlayer(i), CAMERA_FIELD_ZOFFSET, ( 50.00 + ( GetLocationZ(p[0]) / 3.50 ) ), 0.00 ) //Z轴偏移,值越高镜头越高
call SetCameraFieldForPlayer( ConvertedPlayer(i), CAMERA_FIELD_ROTATION, GetUnitFacing(udg_Hero_u), 0.20 ) //Z轴旋转角度
call RemoveLocation( p[0] )
call RemoveLocation( p[1] )
else
endif
endif
set i = i + 1
endloop
endfunction
//===========================================================================
function Circulation takes nothing returns nothing
local timer tm = CreateTimer()
local timer tm2 = CreateTimer()
call TimerStart(tm,0.05,true,function Move)
call TimerStart(tm2,0.05,true,function Aov)
set tm = null
set tm2 = null
endfunction
[/jass] |
评分
-
查看全部评分
|