Сейчас 21:23:35 Воскресенье, 24 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Struct + MUI
[SeKtOR]Дата: Воскресенье, 17 Ноября 2013, 19:11:08 | Сообщение # 1
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
Код
scope BladeDance

private struct Spell
      unit array blades[8]
      player owner
      real dmg
      real lifetime
      unit caster

static method create takes unit caster, real dps returns thistype
      local thistype this = thistype.allocate()
      local integer i = 0
      local real x = GetWidgetX(caster)
      local real y = GetWidgetY(caster)
      local real angle
      set this.caster = caster
      set this.owner=GetOwningPlayer(caster)
      set this.dmg=dps
      loop
      exitwhen i == 8
      set angle = 45*i
      set this.blades[i] = CreateUnit(this.owner, 'e000', PolarX(x, 100., angle), PolarY(y, 100., angle), angle)
      set i = i + 1
      endloop
      return this
endmethod
endstruct

globals
         private Spell array Instance
         private integer Total = 0
      private timer t = CreateTimer()
endglobals

private function Move takes nothing returns nothing
      local integer i = 0
      local integer i2 = 0
      local Spell s
      local real angle
      local real x
      local real y
         loop
      exitwhen i == Total
      set s = Instance[i]
      if (s.lifetime >= 10.) then
      loop
      exitwhen i2 == 8
      call KillUnit(s.blades[i2])
      set s.blades[i2] = null
      set i2 = i2 + 1
      endloop
      set s.caster = null
      set s.owner = null
      call s.destroy()
      set Instance[i] = Instance[Total-1]
      set Total = Total - 1
      else
      set x = GetWidgetX(s.caster)
      set y = GetWidgetY(s.caster)
      loop
      exitwhen i2 == 8
      set angle = GetUnitFacing(s.blades[i2]) + 25.
      call SetUnitPosition(s.blades[i2], PolarX(x, 100., angle), PolarY(y, 100., angle))
      call SetUnitFacing(s.blades[i2], angle)
      set i2 = i2 + 1
      endloop
      set s.lifetime = s.lifetime + .05
      endif
      set i = i + 1
         endloop
         if (Total == 0) then
      call PauseTimer(t)
         endif
endfunction

function onCast_BladeDance takes nothing returns nothing
      local unit u = GetTriggerUnit()
      local integer lvl = GetUnitAbilityLevel(u, 'A002')
      local Spell s = Spell.create(u, lvl*100, lvl*.10)
      if(Total == 0) then
      call TimerStart(t, .05, true, function Move)
      endif
      set Total = Total + 1
      set Instance[Total-1] = s
      set u = null
endfunction
endscope

Сабж. Имеется следующий код который создаёт 8 даммиков и кружит их вокруг кастера 10 сек. Проблема в том, что если кастануть больше одного раза то копия будет стоять пока не докрутится первая, а когда докрутится копия, игру заедает намертво(Attemping to destroy null struct...). По коду вроде всё ок, что не так?




Сообщение отредактировал [SeKtOR] - Воскресенье, 17 Ноября 2013, 19:16:58
 

SirNikolasДата: Воскресенье, 17 Ноября 2013, 23:30:52 | Сообщение # 2
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Цитата [SeKtOR] ()
По коду вроде всё ок, что не так?
Если происходит такое, то код явно не ok, не думаешь?)

Занеси обнуление i2 внутрь первого цикла и замени i == Total на i >= Total.


 

[SeKtOR]Дата: Понедельник, 18 Ноября 2013, 13:24:57 | Сообщение # 3
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
Помогло avtoradolf
Спасибо сэр! trollface


 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz