找回密码
 点一下
查看: 1080|回复: 13

求助高手如何用T表达这jass地形镜头算法?

[复制链接]
发表于 2012-11-27 14:24:59 | 显示全部楼层 |阅读模式
本帖最后由 dx89 于 2012-11-27 20:10 编辑

    private function Camera_Actions takes nothing returns nothing
        local integer i = 0
        local real Z1
        local real Z2
        local real Angle1
        local real Angle2
        loop
            exitwhen i >=  COUNT_OF_PLAYERS
            if (Units != null) and (ApplyCam) then
                call MoveLocation(l,GetUnitX(Units),GetUnitY(Units))
                set Z1 = GetLocationZ(l)                                
                call MoveLocation(l,GetUnitX(Units)-angle*Cos(GetUnitFacing(Units)*bj_DEGTORAD),GetUnitY(Units)-angle*Sin(GetUnitFacing(Units)*bj_DEGTORAD))
                set Z2 = GetLocationZ(l)
                if(Z1+100>=Z2)then
                    set offset=GetCameraField(CAMERA_FIELD_ZOFFSET)+GetUnitFlyHeight(Units)+240+Z1-GetCameraEyePositionZ()
                    set Angle1 = -10
                else
                    set offset=R2I(GetCameraField(CAMERA_FIELD_ZOFFSET))+240+GetUnitFlyHeight(Units)+Z2-R2I(GetCameraEyePositionZ())
                    set Angle1 = -65
                endif
                set Angle2 = GetUnitFacing(Units)
                if (Down)and(not Up)and(Arround)then
                    set Angle2 = Angle2 + 180
                endif
                if(GetLocalPlayer()==Player(i))then
                    call SetCameraField(CAMERA_FIELD_ZOFFSET,offset,0.25)
                    call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE,distance,0.25)
                    call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK,Angle1,0.25)
                    call SetCameraField(CAMERA_FIELD_FIELD_OF_VIEW,150,0.1)
                    call SetCameraField(CAMERA_FIELD_FARZ,bj_CAMERA_DEFAULT_FARZ,0.25)                    
                    call SetCameraField(CAMERA_FIELD_ROTATION,Angle2,0.25)
                endif               
             endif
          set i = i + 1
        endloop
    endfunction


看不懂 用JASS翻译出来很糟糕.  完整的在附件里头
Demonic Paradise_fxd_again.w3x (6.83 MB, 下载次数: 23)    望高手指教 最好有个演示

来张效果图        镜头不会随地形Z高度偏离角色~~!
1.jpg




发表于 2012-11-27 15:24:39 | 显示全部楼层
  1. private function Camera_Actions takes nothing returns nothing
  2.     local integer i = 0 // 定义局部整数变量i,并赋值0
  3.     local real Z1       //定义实数变量Z1,如下略
  4.     local real Z2
  5.     local real Angle1
  6.     local real Angle2
  7.     // 开始循环
  8.     loop
  9.         exitwhen i >=  COUNT_OF_PLAYERS // 当整数i大于或者等于 COUNT_OF_PLAYERS(自定义全局变量)时跳出循环
  10.         if (Units != null) and (ApplyCam) then  // 判断1:如果Units(自定义全局单位变量,一个单位居然用复数命名,吐槽..)不为空 并且 ApplyCam(自定义的全局布尔值变量或者判断函数)为true时执行如下代码块
  11.             call MoveLocation(l,GetUnitX(Units),GetUnitY(Units)) // 移动点坐标:移动l(自定义全局点变量)点,设置它的X,Y左边分别为单位Units的当前X、Y坐标
  12.             set Z1 = GetLocationZ(l) // 获取l点位置的Z轴偏移高度,并且赋值给Z1
  13.             // 如下也是移动l点的坐标值,数值分别为:
  14.             // X = GetUnitX(Units)-angle*Cos(GetUnitFacing(Units)*bj_DEGTORAD) -- 不解释了吧,直接看公式
  15.             // Y = GetUnitY(Units)-angle*Sin(GetUnitFacing(Units)*bj_DEGTORAD) -- 同上
  16.             call MoveLocation(l,GetUnitX(Units)-angle*Cos(GetUnitFacing(Units)*bj_DEGTORAD),GetUnitY(Units)-angle*Sin(GetUnitFacing(Units)*bj_DEGTORAD))
  17.             set Z2 = GetLocationZ(l) // 获取l点位置的Z轴偏移高度,并且赋值给Z2
  18.             if(Z1+100>=Z2)then // 判断2:如果Z1+100 大于或者等于 Z2,则执行下面代码块
  19.                 // 设置 offset = 当前镜头的( Z轴偏移 ) + 获取单位飞行高度(Units) +  240 + Z1 - 当前镜头源Z坐标
  20.                 set offset=GetCameraField(CAMERA_FIELD_ZOFFSET)+GetUnitFlyHeight(Units)+240+Z1-GetCameraEyePositionZ()
  21.                 // 设置Angle1 = -10
  22.                 set Angle1 = -10
  23.             else    // 判断2:否则执行如下代码块
  24.                 // R2I >> 实数转换为整数()
  25.                 // 设置 offset = R2I(当前镜头的( Z轴偏移 )) + 240 + 获取单位飞行高度(Units) + Z2 - R2I(当前镜头源Z坐标 )
  26.                 set offset=R2I(GetCameraField(CAMERA_FIELD_ZOFFSET))+240+GetUnitFlyHeight(Units)+Z2-R2I(GetCameraEyePositionZ())
  27.                 set Angle1 = -65
  28.             endif // 判断2结束
  29.             set Angle2 = GetUnitFacing(Units) // 设置Angle2 = 获取单位面向角度(Units)
  30.             if (Down)and(not Up)and(Arround)then // 判断3:如果 Down(自定义全局布尔变量或者判断函数)等于true 并且 Up(自定义全局布尔变量或者判断函数)等于false 并且  Arround(同上)等于true
  31.                 set Angle2 = Angle2 + 180 //  变量赋值设定
  32.             endif
  33.             if(GetLocalPlayer()==Player(i))then //判断4: 如果本地玩家等于玩家(ID)则执行下面代码块,此处用T会导致数据不同步而掉线
  34.                 // 如下都是设置镜头属性了: 镜头 - 设置玩家镜头属性(镜头属性,数值,使用时间)
  35.                 // CAMERA_FIELD_ZOFFSET : Z轴偏移
  36.                 call SetCameraField(CAMERA_FIELD_ZOFFSET,offset,0.25)
  37.                 // CAMERA_FIELD_TARGET_DISTANCE : 镜头距离
  38.                 call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE,distance,0.25)
  39.                 // CAMERA_FIELD_ANGLE_OF_ATTACK :X轴旋转角度
  40.                 call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK,Angle1,0.25)
  41.                 // CAMERA_FIELD_FIELD_OF_VIEW :镜头区域
  42.                 call SetCameraField(CAMERA_FIELD_FIELD_OF_VIEW,150,0.1)
  43.                 // CAMERA_FIELD_FARZ : 远景截取距离 ;  bj_CAMERA_DEFAULT_FARZ (war3自带全局变量) = 5000
  44.                 call SetCameraField(CAMERA_FIELD_FARZ,bj_CAMERA_DEFAULT_FARZ,0.25)
  45.                 // CAMERA_FIELD_ROTATION : Z轴旋转角度
  46.                 call SetCameraField(CAMERA_FIELD_ROTATION,Angle2,0.25)
  47.             endif // 判断4结束     
  48.          endif // 判断1结束
  49.       // 设置 i的值为i+1,用于循环递归
  50.       set i = i + 1
  51.     endloop
  52. endfunction
复制代码
回复

使用道具 举报

发表于 2012-11-27 15:28:42 | 显示全部楼层
本帖最后由 lfglvstory 于 2012-11-27 16:57 编辑

ApplyCam 和 Down 、 Up 、 Arround 应该都是布尔值的全局变量(犯了个低级错误···)。上面的代码注释已经很详细了,希望楼主能够明白怎么去转换为T。
if(GetLocalPlayer()==Player(i))then //这句判断是为了实现不同玩家对应设置不同的镜头属性
endif

上面这两句可以使用T的:自定义代码:Jass代码 来实现不掉线。
如: 自定义代码:if(GetLocalPlayer()==Player(i))then
          //...中间就是那些镜头属性的设置了
       自定义代码:endif
回复

使用道具 举报

发表于 2012-11-27 17:18:24 | 显示全部楼层
楼主写代码可以用[code ]或者[ jass]框起来
不然
  1. [i]
复制代码
会变成斜体

点评

小白~  发表于 2012-11-28 18:12
回复

使用道具 举报

发表于 2012-11-27 17:56:06 | 显示全部楼层
本帖最后由 希瓦 于 2012-11-27 18:18 编辑

“镜头不会随地形Z高度偏离角色”表示“镜头高度”等于“单位位置的Z轴高度”
因为:镜头高度 = 目标点Z轴高度 + 镜头Z轴偏移 + 地形高度因子
所以,为了使“镜头高度”=“目标点Z轴高度”
“镜头Z轴偏移”应该等于负“地形高度因子”
所以这样设置就可以了:镜头Z轴偏移(新) = 目标点Z轴高度  + 镜头Z轴偏移(旧) - 镜头高度

镜头 - 设置玩家的镜头属性: Z轴偏移 为 ((((坐标((当前镜头目标X坐标), (当前镜头目标Y坐标))) 的Z轴高度) - (当前镜头目标Z坐标)) + (当前镜头的 Z轴偏移)) ,使用时间 0.00 秒
注:由于“当前镜头”需要同步的时间,所以需要先等待同步结束再开始使用
另:由于“当前镜头”需要同步时间,因此此法获取地形高度有一定的延迟,不算是最好的方法;最好的方法貌似是通过某个算法慢慢计算....
回复

使用道具 举报

 楼主| 发表于 2012-11-27 18:00:16 | 显示全部楼层
本帖最后由 dx89 于 2012-11-27 18:02 编辑

为何我用T来写    Z轴高度位移并没用变化多少
X轴水平角度 也并无变化
角色 踏上 隆起的地表就出现透视地表 镜头偏离角色了

对于JASS确实不懂..  正弦(  余弧很少涉及.
研究了几个小时  效果都很差[s:209]
谁有个T演示  [s:209]
回复

使用道具 举报

发表于 2012-11-27 18:13:02 | 显示全部楼层
不是已经解释过原理了嘛
TCA.w3x (11.76 KB, 下载次数: 26)
回复

使用道具 举报

 楼主| 发表于 2012-11-27 18:34:21 | 显示全部楼层
谢谢  你说的原理 网页当时未刷新 没看到
现在明白了  有时间在去慢慢完善
回复

使用道具 举报

发表于 2012-11-27 18:36:17 | 显示全部楼层
需要说明的是,这只是一个简单的演示,没有加入设置镜头角度的功能。
需要加入设置镜头角度的功能时,可能需要通过镜头源和镜头目标位置的高度来计算合适的角度。
回复

使用道具 举报

发表于 2012-11-27 18:40:31 | 显示全部楼层
dx89 发表于 2012-11-27 18:34
谢谢  你说的原理 网页当时未刷新 没看到
现在明白了  有时间在去慢慢完善

嗯嗯,不用谢

另:问题解决后请修改分类为解决

点评

西瓦还是这么的热情呀!呵呵·· 对了,我在外网看到他们很多的JASS写法很类似JAVA,让我感觉很亲切,但是不知道用的是什么编辑器或者插件,西瓦这个知道些不?因为本身是做java编程的,所以可以那样写jass就会很习  详情 回复 发表于 2012-11-27 21:31
回复

使用道具 举报

发表于 2012-11-27 21:31:13 | 显示全部楼层
希瓦 发表于 2012-11-27 18:40
嗯嗯,不用谢

另:问题解决后请修改分类为解决

西瓦还是这么的热情呀!呵呵··
对了,我在外网看到他们很多的JASS写法很类似JAVA,让我感觉很亲切,但是不知道用的是什么编辑器或者插件,西瓦这个知道些不?因为本身是做java编程的,所以可以那样写jass就会很习惯!

点评

那种jass,可以允许在函数实体内添加方法,具备面向对象的编程特点哦,区别还是蛮大的。我搜搜cjass看看。  详情 回复 发表于 2012-11-28 08:36
可能是cjass吧... 其实差不了多少了  发表于 2012-11-28 02:55
回复

使用道具 举报

发表于 2012-11-28 08:36:35 | 显示全部楼层
lfglvstory 发表于 2012-11-27 21:31
西瓦还是这么的热情呀!呵呵··
对了,我在外网看到他们很多的JASS写法很类似JAVA,让我感觉很亲切,但 ...

那种jass,可以允许在函数实体内添加方法,具备面向对象的编程特点哦,区别还是蛮大的。我搜搜cjass看看。
回复

使用道具 举报

发表于 2012-11-28 18:11:46 | 显示全部楼层
lfglvstory 发表于 2012-11-28 08:36
那种jass,可以允许在函数实体内添加方法,具备面向对象的编程特点哦,区别还是蛮大的。我搜搜cjass看看。 ...

也许是Zinc吧。不确定,也许是CJ,VJ也说不定呢
回复

使用道具 举报

发表于 2012-11-28 18:11:51 | 显示全部楼层
lfglvstory 发表于 2012-11-28 08:36
那种jass,可以允许在函数实体内添加方法,具备面向对象的编程特点哦,区别还是蛮大的。我搜搜cjass看看。 ...

也许是Zinc吧。不确定,也许是CJ,VJ也说不定呢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 10:32 , Processed in 0.045086 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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