XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
GetSpellTargetX\Y странность
Делая спел столкнулся с одной странностью при вызове функции, которая берет x y
координаты GetSpellTargetX\Y не беруться сразу почему?
» 1вариант_нерабочий
void Cast(unit u,real x,real y) {}

void A() { 
unit u=GetTriggerUnit()
Cast(u, GetSpellTargetX(), GetSpellTargetY()) }
» 2вариант_рабочий_но_с_локалками
void Cast(unit u,real x,real y) {}

void A() { 
unit u=GetTriggerUnit()
real x = GetSpellTargetX()
real y = GetSpellTargetY()
Cast(u, x, y) }

Отредактировано AlexKARASb, 30.06.2010 в 00:50.
Старый 30.06.2010, 00:10
agentex

offline
Опыт: 34,834
Активность:
мб конфликт аргументов и имен переменных? хатя я в сижассе нешарю, хз как там устроено. в джасе парсер выдал бы ошибку.
а, всмысле во 2 варианте работает? у тебя непонятно написано, поясни
Старый 30.06.2010, 00:12
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
agentex, во втором варианте работает
просто делал и в игре постоянно спел летел в центр не мог понять почему, оказалось передает 0.00
Старый 30.06.2010, 00:19
XOR

offline
Опыт: 38,159
Активность:
void Cast(unit u,real x,real y) {}
{ Cast(u, GetSpellTargetX(), GetSpellTargetY()) }
а нафига 3 параметра?
вызывать саму себя - это круто
XimikS добавил:
как всегда абстрактное нечто непонятное никому, включая автора
Старый 30.06.2010, 00:34
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
а нафига 3 параметра?
юнит и две коорды =\
вызывать саму себя - это круто
с учетом того что GetSpellTargetX() != GetUnitX(u) то хз мб и круто -.-
Старый 30.06.2010, 00:39
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
AlexKARASb, просто код совсем не правильный. Совсем не правильный. Если он у тебя копмпилируется в таком виде, то это ужс.
Старый 30.06.2010, 00:45
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Hellfim, в смысле, укажи что именно, хотя кажется это впечатление сложено потому что я взял кусок из своего кода; обновил, мб так понятнее будет
Старый 30.06.2010, 00:48
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Ну, для начала, мне совершенно непонятно как ты определил что не будет работать.
Старый 30.06.2010, 00:50
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Hellfim, не смешно, если честно. Я думал это не важно, ведь узнать хотел сабж и оставил его как лавное дабы не сбивать лишними строками форум, ладно буду делать полностью =\, неожидал.
Определить легко, дебаг как я уже писал выдает нули по этим коордам в вызванной функции
Старый 30.06.2010, 00:52
XOR

offline
Опыт: 38,159
Активность:
выложи полной нерабочий и рабочий код.
Старый 30.06.2010, 00:56
agentex

offline
Опыт: 34,834
Активность:
есть мысль что в 1 варианте эти функции выполняются вне тригерного потока, а значит возвратят нули. почему так происходит - хз
Старый 30.06.2010, 11:05
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
agentex, ясно
в принципе можно закрыть тк способ альтернативный есть. Просто хотелось узнать почему
люботная я ворона :)
Старый 30.06.2010, 11:08
ScorpioT1000
Работаем
online
Опыт: отключен
ноль передаёт потому что у тебя эвент не на точку, а на юнита например или без цели, вот и точки нет. ошибка не в том что ты вверху сравниваешь
Старый 30.06.2010, 13:18
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
ScorpioT1002, ошибаешься, в точку
Старый 30.06.2010, 13:39
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Думаю я знаю почему.
Ты отправляешь аргументами GetSpellTargetX() и GetSpellTargetY(), а они присваиваются переменным уже в другой функции, в которой они равны 0/неопределенному значению.
Старый 30.06.2010, 17:34
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
Hellfim, хм тогда ясно, спасибо за объяснение
Старый 30.06.2010, 17:37
ScorpioT1000
Работаем
online
Опыт: отключен
покажи что в war3map.j получается
ScorpioT1002 добавил:
я подозреваю, что это не вар, так что открыто)
Старый 30.06.2010, 20:30
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
ScorpioT1002, я не знаю че такое war3map.j :)
ну вот скомпилированный код, мб ты о нем говорил, хз просто
» скомпилированый
// scope LaserRay1 begins
function LaserRay1__DestroyDestr takes nothing returns nothing
call KillDestructable(GetEnumDestructable())
endfunction
struct LaserRay1__Data
static LaserRay1__Data array d
static integer count=0
static timer t=CreateTimer()
real x
real y
real r
real r2
real a
unit u
effect e
lightning l
static method Cast takes unit u,real x1,real y1,real x2,real y2 returns nothing
local real x=GetUnitX(u)
local real y=GetUnitY(u)
local LaserRay1__Data Dt=LaserRay1__Data.allocate()
set Dt.u=u
set Dt.a=Atan2(y2-y1,x2-x1)
set Dt.x=x1
set Dt.y=y1
set Dt.l=AddLightningEx("CLPB",true,x,y,150.00,x1,y1,0.00)
set Dt.r=0.00
set Dt.r2=SquareRoot((y2-y1)*(y2-y1)+(x2-x1)*(x2-x1))
set Dt.e=null
if             .count==0 then
call TimerStart(.t,0.035,true,function LaserRay1__Data.Timer)
endif
set .d[.count]=Dt
set .count=.count+1
endmethod
endstruct
function LaserRay1__Act takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u=GetTriggerUnit()
if             GetSpellAbilityId()==0x41303032 then
call SaveReal(H,GetHandleId(t),0,GetSpellTargetX())
call SaveReal(H,GetHandleId(t),1,GetSpellTargetY())
call UnitAddAbility(u,0x41303035)
if             GetLocalPlayer()==GetOwningPlayer(u)then
call TriggerSleepAction(0.01)
call ForceUIKey("R")
endif
else
call UnitRemoveAbility(u,0x41303035)
call LaserRay1__Data.Cast(u,LoadReal(H,GetHandleId(t),0),LoadReal(H,GetHandleId(t),1),GetSpellTargetX(),G​etSpellTargetY())
call FlushChildHashtable(H,GetHandleId(t))
endif
set t=null
set u=null
endfunction
function LaserRay1__Cond takes nothing returns boolean
return         GetSpellAbilityId()==0x41303032 or GetSpellAbilityId()==0x41303035
endfunction
function LaserRay1__Init takes nothing returns nothing
local trigger t=CreateTrigger()
call TriggerRegisterPlayerUnitEvent(t,Player(0),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
call TriggerRegisterPlayerUnitEvent(t,Player(1),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
call TriggerRegisterPlayerUnitEvent(t,Player(2),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
call TriggerRegisterPlayerUnitEvent(t,Player(3),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
call TriggerRegisterPlayerUnitEvent(t,Player(4),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
call TriggerRegisterPlayerUnitEvent(t,Player(5),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
call TriggerRegisterPlayerUnitEvent(t,Player(6),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
call TriggerRegisterPlayerUnitEvent(t,Player(7),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
call TriggerRegisterPlayerUnitEvent(t,Player(8),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
call TriggerRegisterPlayerUnitEvent(t,Player(9),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
call TriggerAddAction(t,function LaserRay1__Act)
call TriggerAddCondition(t,Condition(function LaserRay1__Cond))
call Preload("Abilities\\Weapons\\Bolt\\BoltImpact.mdl")
call PreloadEnd(.50)
set LaserRay1__bx=Condition(function LaserRay1__Data.GroupEnum)
set LaserRay1__temp_r=Rect(GetRectCenterX(bj_mapInitialPlayableArea)-100.00,GetRectCenterY(bj_mapInitial​PlayableArea)-100.00,GetRectCenterX(bj_mapInitialPlayableArea)+100.00,GetRectCenterY(bj_mapInitialPl​ayableArea)+100.00)
set t=null
endfunction
// scope LaserRay1 ends
Старый 30.06.2010, 20:37
ScorpioT1000
Работаем
online
Опыт: отключен
открой карту готовую через mpq архиватор и вынь файл war3map.j в нем найди эти функции и покажи
Старый 30.06.2010, 20:47
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
вот
как без пробелов и абзацов стремно код видеть
Прикрепленные файлы
Тип файла: txt j.txt (8.7 Кбайт, 28 просмотров )
Старый 30.06.2010, 21:04
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 18:17.