找回密码
 点一下
查看: 3790|回复: 39

J的坐标点怎么造?

  [复制链接]
发表于 2008-9-2 17:32:10 | 显示全部楼层 |阅读模式
[codes=jass]function H2I takes handle h returns integer
      return h
      return 0
endfunction

function I2U takes integer i returns unit
      return i
      return null
endfunction

function Move_LOOP takes nothing returns nothing
      local timer t = GetExpiredTimer()
      local integer i = 0
      local unit orderUnit=I2U(GetStoredInteger(udg_GC,I2S(H2I(t)),"orderUnit"))
      local real UnitLocX = GetStoredReal(udg_GC,I2S(H2I(t)),"X")
      local real UnitLocY = GetStoredReal(udg_GC,I2S(H2I(t)),"Y")
      local real tempLocX   
      local real tempLocY   
      local real angle = GetStoredReal(udg_GC,I2S(H2I(t)),"angle")
      local real dis = GetStoredReal(udg_GC,I2S(H2I(t)),"distance")
      local integer steps= GetStoredInteger(udg_GC,I2S(H2I(t)),"steps")
      local integer Max= GetStoredInteger(udg_GC,I2S(H2I(t)),"Max")
      if steps>0   then      
         set steps=steps-1
         call StoreInteger(udg_GC,I2S(H2I(t)),"steps",steps)               
         set tempLocX = UnitLocX + dis*Cos(angle*bj_DEGTORAD)*(Max-steps)
         set tempLocY = UnitLocY + dis*Sin(angle*bj_DEGTORAD)*(Max-steps)      
         if tempLocX > udg_Map_X_Max then
             set tempLocX = udg_Map_X_Max
         endif
         if tempLocX < udg_Map_X_Min then
             set tempLocX = udg_Map_X_Min
         endif
         if tempLocY > udg_Map_Y_Max then
             set tempLocY = udg_Map_Y_Max
         endif
         if tempLocY < udg_Map_Y_Min then
             set tempLocY = udg_Map_Y_Min
         endif                        
         call SetUnitX(orderUnit,tempLocX)
         call SetUnitY(orderUnit,tempLocY)      
      else
            set i=0         
            call FlushStoredMission(udg_GC,I2S(H2I(t)))
            call DestroyTimer(t)            
      endif
      set orderUnit=null
endfunction

function UnitMove takes unit orderUnit,real lasttime,real interval,real dis,real angle returns nothing
      local real UnitLocX = GetUnitX(orderUnit)
      local real UnitLocY = GetUnitY(orderUnit)   
      local timer t=CreateTimer()
      local integer steps=R2I(lasttime/interval)
      call StoreReal(udg_GC,I2S(H2I(t)),"X",UnitLocX)
      call StoreReal(udg_GC,I2S(H2I(t)),"Y",UnitLocY)
      call StoreInteger(udg_GC,I2S(H2I(t)),"steps",steps)
      call StoreInteger(udg_GC,I2S(H2I(t)),"Max",steps)
      call StoreReal(udg_GC,I2S(H2I(t)),"angle",angle)
      call StoreReal(udg_GC,I2S(H2I(t)),"distance",dis)
      call StoreInteger(udg_GC,I2S(H2I(t)),"orderUnit",H2I(orderUnit))
      call TimerStart(t,interval,true,function Move_LOOP)
      set t=null
endfunction[/codes]

比如:我想单位向前移动700距离(即CH牛头30大技),怎么写?下面2句的算法怎么理解?
set tempLocX = UnitLocX + dis*Cos(angle*bj_DEGTORAD)*(Max-steps)
set tempLocY = UnitLocY + dis*Sin(angle*bj_DEGTORAD)*(Max-steps)
发表于 2008-9-2 17:48:32 | 显示全部楼层
lz如果对数学上的坐标和极坐标有点了解的话,这个应该很容易理解

从(x,y)点开始距离为r方向为θ的点的坐标为(x+r*cosθ,y+r*sinθ)
回复

使用道具 举报

 楼主| 发表于 2008-9-2 17:59:52 | 显示全部楼层
完全不理解.下面的又不知道是什么呢.... θ 是什么意思?
[codes=jass]if tempLocX > udg_Map_X_Max then
                   set tempLocX = udg_Map_X_Max
             endif
             if tempLocX < udg_Map_X_Min then
                   set tempLocX = udg_Map_X_Min
             endif
             if tempLocY > udg_Map_Y_Max then
                   set tempLocY = udg_Map_Y_Max
             endif
             if tempLocY < udg_Map_Y_Min then
                   set tempLocY = udg_Map_Y_Min
             endif [/codes]
回复

使用道具 举报

发表于 2008-9-2 18:03:09 | 显示全部楼层
………………
θ只是代表一个角度而已,lz的数学貌似不行啊

下面这段代码是为了不让坐标越过地图边界
回复

使用道具 举报

 楼主| 发表于 2008-9-2 18:14:57 | 显示全部楼层
那个θ是高中的数学吗?

(x+r*cosθ,y+r*sinθ)这个怎么计?
回复

使用道具 举报

发表于 2008-9-2 18:16:07 | 显示全部楼层
这个貌似不一定需要高中数学知识,至少我在高中前肯定知道
θ只是一个符号,和角A角B这种没两样的

这个公式已经很清楚了吧,还要怎么说………………
回复

使用道具 举报

 楼主| 发表于 2008-9-2 18:36:00 | 显示全部楼层
还是不懂,唉....我造J又要去抄的了.

我去试造个(牛头的30大技).
回复

使用道具 举报

发表于 2008-9-2 18:45:44 | 显示全部楼层
………………………………
触发里有一个极坐标,BJ函数名是PolarProjectionBJ,作用差不多就是这个,lz可以看下
回复

使用道具 举报

 楼主| 发表于 2008-9-2 18:53:36 | 显示全部楼层
哦,我去转BJ看看.谢谢喽.另外我想问下,当 8/7 除不进时,WE会怎么样?
回复

使用道具 举报

发表于 2008-9-2 18:55:07 | 显示全部楼层
如果是整数的话 就是1
如果是实数的话 就保留小数
回复

使用道具 举报

 楼主| 发表于 2008-9-2 20:07:36 | 显示全部楼层
问下,我曾经做过这样1个T设置.如下:

设置shishu=(触发单位)的位置到(技能施放点)的位置 的面向角度.然后用这个shishu去做技能,之后出现了"角度"偏离的BUG,如果我想记录单位的angle,向缓存里存会不会出现错误的?[codes=jass]call StoreReal(udg_GC,I2S(H2I(t)),"angle",angle)[/codes]
回复

使用道具 举报

 楼主| 发表于 2008-9-2 21:52:15 | 显示全部楼层
Map_X_Max = 3000
Map_X_Min = -3000
Map_Y_Max = 3000
Map_Y_Min = -3000
3000是设置范围么?
  local integer steps=R2I(lasttime/interval)这句什么意思?
回复

使用道具 举报

发表于 2008-9-2 21:55:34 | 显示全部楼层
inteval是间隔时间,lasttime是持续时间,相除就是执行次数
回复

使用道具 举报

 楼主| 发表于 2008-9-2 22:24:09 | 显示全部楼层
call StoreInteger(udg_GC,I2S(H2I(t)),"Max",steps)
里面的Max指什么?
回复

使用道具 举报

发表于 2008-9-2 22:31:45 | 显示全部楼层
………………只不过是一个key而已………………
回复

使用道具 举报

发表于 2008-9-2 22:42:40 | 显示全部楼层
插一句.......这个移动没考虑单位死亡,没考虑地形,没考虑可破坏物,总之bug很多
回复

使用道具 举报

 楼主| 发表于 2008-9-2 23:20:24 | 显示全部楼层
引用第15楼actboy168于2008-09-02 22:42发表的  :
插一句.......这个移动没考虑单位死亡,没考虑地形,没考虑可破坏物,总之bug很多

知道怎么用坐标就可以了...



             set tempLocX = UnitLocX + dis*Cos(angle*bj_DEGTORAD)*(Max-steps)
             set tempLocY = UnitLocY + dis*Sin(angle*bj_DEGTORAD)*(Max-steps)      

,就是上面的我不知道怎么计出来,怎么知道上面的东西是直线向前?

bj_DEGTORAD是什么意思?
回复

使用道具 举报

发表于 2008-9-2 23:21:46 | 显示全部楼层
就是π/180,角度制转为弧度制

话说这个你去查下代码不就好了
回复

使用道具 举报

 楼主| 发表于 2008-9-2 23:23:18 | 显示全部楼层
去哪查?
回复

使用道具 举报

发表于 2008-9-2 23:24:50 | 显示全部楼层
common.j、blizzard.j,还有就是jasscraft和jassshop等程序都可以的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 00:05 , Processed in 0.116557 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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