MegaBlax
offline
Опыт:
2,352Активность: |
Моя первая бомба (посмотрите код)
Посмотрите пожалуйста мой код. Принцип действия: игрок берет предмет, по истечению 10 секунд он взрывается.
Скажите что можно было сделать по другому, где я перемудрил.
((кат код cJass
((код jass
scope B initializer InitB {
define {
private sfx="war3mapImported\\SuperBigExplosion.mdx" private H2I(h)=GetHandleId(h) private void=nothing private bool=boolean private int=integer private Fil=GetFilterUnit() private Life=UNIT_STATE_LIFE private Trigger=GetTriggeringTrigger() } private bool MR() {
trigger t=Trigger int i=H2I(t) unit u=LoadUnitHandle(h,i,1) if IsUnitEnemy(Fil,GetOwningPlayer(u)) and IsUnitType(Fil,UNIT_TYPE_STRUCTURE)==false and GetUnitState(Fil,Life)>0{ UnitDamageTarget(u,Fil,1000,false,false,null,null,null) } t=null u=null return false } private bool ME() {
trigger t=Trigger int i=H2I(t),c=LoadInteger(h,i,2) unit u=LoadUnitHandle(h,i,1) triggercondition con=LoadTriggerConditionHandle(h,i,3) group g=CreateGroup() real x=GetUnitX(u),y=GetUnitY(u),r=450. texttag tt=LoadTextTagHandle(h,i,4) effect e item it=LoadItemHandle(h,i,5) if c>0{ DestroyTextTag(tt) c-- tt = CreateTextTagLocBJ("|cFFFF0303"+I2S(c)+"|r",Location(x,y),10.,13.,100,100,100,0) SetTextTagVelocityBJ(tt,64,90) SaveTextTagHandle(h,i,4,tt) SaveInteger(h,i,2,c) }else{ GroupEnumUnitsInRange(g,x,y,r,Condition(function MR)) GroupClear(g) DestroyGroup(g) TriggerRemoveCondition(GetTriggeringTrigger(),con) DestroyTextTag(tt) e=AddSpecialEffect(sfx,x,y) DestroyEffect(e) RemoveItem(it) KillUnit(u) } tt=null t=null u=null con=null g=null return false } private void MW() {
trigger t=CreateTrigger() unit u=GetTriggerUnit() int i=H2I(t),c=10 triggercondition con texttag tt real x=GetUnitX(u),y=GetUnitY(u) item it=GetManipulatedItem() tt=CreateTextTagLocBJ("|cFFFF0303"+I2S(c)+"|r",Location(x,y),10.,13.,100,100,100,0) SetTextTagVelocityBJ(tt,64,90) TriggerRegisterTimerEvent(t,1.,true) con=TriggerAddCondition(t,Condition(function ME)) SaveUnitHandle(h,i,1,u) SaveInteger(h,i,2,c) SaveTriggerConditionHandle(h,i,3,con) SaveTextTagHandle(h,i,4,tt) SaveItemHandle(h,i,5,it) t=null u=null con=null tt=null } private bool MQ() {
if GetItemTypeId(GetManipulatedItem())=='desc' { MW() } return false } private void InitB() {
trigger t=CreateTrigger() Preload(sfx) TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_PICKUP_ITEM) TriggerAddCondition(t,Condition(function MQ)) t=null } }
)) )) ((кат код jass
((код jass
формула вычисления высоты z=(высота * 0.023 / 10)
формуа вычисления скорости текста s=(скорость * 0.071 / 128)
s*Cos(angle*bj_DEGTORAD) s*Sin(angle*bj_DEGTORAD) globals
hashtable gc=InitHashtable() integer item_id='desc' unit Un string sfx="war3mapImported\\SuperBigExplosion.mdx" endglobals function MG takes nothing returns boolean
local unit f=GetFilterUnit() if IsUnitEnemy(f,GetOwningPlayer(Un)) and IsUnitType(f,UNIT_TYPE_STRUCTURE)==false and GetUnitState(f,UNIT_STATE_LIFE)>0 then call UnitDamageTarget(Un,f,1000,false,false,null,null,null) endif set f=null return false endfunction function M5 takes nothing returns nothing
local timer t=GetExpiredTimer() local integer i=GetHandleId(t) local unit u=LoadUnitHandle(gc,i,1) local item it=LoadItemHandle(gc,i,2) local integer c=LoadInteger(gc,i,3) local texttag tt=LoadTextTagHandle(gc,i,4) local real x=GetUnitX(u) local real y=GetUnitY(u) local group g=CreateGroup() local effect e if c>0 then call DestroyTextTag(tt) set c=c-1 call CreateTextTag() call SetTextTagText(tt,"|cFFFF0303"+I2S(c)+"|r",0.0299) call SetTextTagPos(tt,x,y,10) call SetTextTagColor(tt,255,255,255,100) call SetTextTagVelocity(tt,0,0.035) call SaveInteger(gc,i,3,c) call SaveTextTagHandle(gc,i,4,tt) else set Un=u call GroupEnumUnitsInRange(g,x,y,450.,Condition(function MG)) call KillTimer(t) call DestroyTextTag(tt) set e=AddSpecialEffect(sfx,x,y) call DestroyEffect(e) call RemoveItem(it) call UnitDamageTarget(u,u,99999,false,false,null,null,null) set Un=null call FlushChildHashtable(gc,i) endif call GroupClear(g) call DestroyGroup(g) set t=null set u=null set it=null set tt=null set e=null set g=null endfunction function Boom_Con takes nothing returns boolean
local unit u local timer t local integer i local item it local integer c local texttag tt local real x local real y if GetItemTypeId(GetManipulatedItem())==item_id then set u=GetTriggerUnit() set t=CreateTimer() set i=GetHandleId(t) set it=GetManipulatedItem() set c=10 set x=GetUnitX(u) set y=GetUnitY(u) set tt=CreateTextTag() call SetTextTagText(tt,"|cFFFF0303"+I2S(c)+"|r",0.0299) call SetTextTagPos(tt,x,y,10) call SetTextTagColor(tt,255,255,255,100) call SetTextTagVelocity(tt,0,0.035) call SaveUnitHandle(gc,i,1,u) call SaveItemHandle(gc,i,2,it) call SaveInteger(gc,i,3,c) call SaveTextTagHandle(gc,i,4,tt) call TimerStart(t,1.,true,function M5) endif set u=null set t=null set it=null set tt=null return false endfunction function InitTrig_Boom_Jass takes nothing returns nothing
local trigger t=CreateTrigger() call Preload(sfx) call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_PICKUP_ITEM) call TriggerAddCondition(t,Condition(function Boom_Con)) set t=null endfunction )) )) И карта Отредактировано MegaBlax, 02.07.2013 в 07:39. |
30.06.2013, 11:02 | #1
+0/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Nerevar
I'll be back!
offline
Опыт:
18,352Активность: |
ужасный,ужасный код,еще и на сжассе + в функции MW() не обнулил предмет Nerevar добавил: мои глаза( и почему каждый первый сжассовый код так по-извращенски выглядит(особенно в блоке дефайнов и дальше в коде в месте их применения)? еще и автор лезет в него побыстрее,не до конца вкурив о утечках |
30.06.2013, 11:18 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MegaBlax
offline
Опыт:
2,352Активность: |
Nerevar, какие еще утечки кроме не обнуленой функции? |
30.06.2013, 11:27 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Nerevar
I'll be back!
offline
Опыт:
18,352Активность: |
Nerevar:
+использование периодик триггера вместо простого таймера +триггер не дестроится +таблица не чистится |
30.06.2013, 11:30 | #4
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MegaBlax
offline
Опыт:
2,352Активность: |
Ну насчет Location(x,y) понятно. То есть вместо TriggerRegisterTimerEvent(t,1.,true) лучше использовать таймер? |
30.06.2013, 11:32 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Алексей Андреич
.
offline
Опыт:
81,156Активность: |
MegaBlax:
|
30.06.2013, 11:40 | #6
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Goodie
offline
Опыт:
2,825Активность: |
Обязательно |
30.06.2013, 18:17 | #7
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
если вы хотели сделать код нечитаемым у вас получилось, начинать надо с чистого жаса. |
30.06.2013, 19:06 | #8
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Goodie
offline
Опыт:
2,825Активность: |
или же с vJass, синтаксисом он практически не отличается |
30.06.2013, 20:31 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Я, кстати, так не считаю. Это как предлагать начинать изучать программирование с АСМ. По коду - давайте нормальные, развернутые имена переменный и функциям. |
30.06.2013, 23:30 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MegaBlax
offline
Опыт:
2,352Активность: |
Переписал на jass убрал утечки
((кат код
((код jass
формула вычисления высоты z=(высота * 0.023 / 10)
формуа вычисления скорости текста s=(скорость * 0.071 / 128)
s*Cos(angle*bj_DEGTORAD) s*Sin(angle*bj_DEGTORAD) globals
hashtable gc=InitHashtable() integer item_id='desc' unit Un string sfx="war3mapImported\\SuperBigExplosion.mdx" endglobals function MG takes nothing returns boolean
local unit f=GetFilterUnit() if IsUnitEnemy(f,GetOwningPlayer(Un)) and IsUnitType(f,UNIT_TYPE_STRUCTURE)==false and GetUnitState(f,UNIT_STATE_LIFE)>0 then call UnitDamageTarget(Un,f,1000,false,false,null,null,null) endif set f=null return false endfunction function M5 takes nothing returns nothing
local timer t=GetExpiredTimer() local integer i=GetHandleId(t) local unit u=LoadUnitHandle(gc,i,1) local item it=LoadItemHandle(gc,i,2) local integer c=LoadInteger(gc,i,3) local texttag tt=LoadTextTagHandle(gc,i,4) local real x=GetUnitX(u) local real y=GetUnitY(u) local group g=CreateGroup() local effect e if c>0 then call DestroyTextTag(tt) set c=c-1 call CreateTextTag() call SetTextTagText(tt,"|cFFFF0303"+I2S(c)+"|r",0.0299) call SetTextTagPos(tt,x,y,10) call SetTextTagColor(tt,255,255,255,100) call SetTextTagVelocity(tt,0,0.035) call SaveInteger(gc,i,3,c) call SaveTextTagHandle(gc,i,4,tt) else set Un=u call GroupEnumUnitsInRange(g,x,y,450.,Condition(function MG)) call KillTimer(t) call DestroyTextTag(tt) set e=AddSpecialEffect(sfx,x,y) call DestroyEffect(e) call RemoveItem(it) call UnitDamageTarget(u,u,99999,false,false,null,null,null) set Un=null call FlushChildHashtable(gc,i) endif call GroupClear(g) call DestroyGroup(g) set t=null set u=null set it=null set tt=null set e=null set g=null endfunction function Boom_Con takes nothing returns boolean
local unit u local timer t local integer i local item it local integer c local texttag tt local real x local real y if GetItemTypeId(GetManipulatedItem())==item_id then set u=GetTriggerUnit() set t=CreateTimer() set i=GetHandleId(t) set it=GetManipulatedItem() set c=10 set x=GetUnitX(u) set y=GetUnitY(u) set tt=CreateTextTag() call SetTextTagText(tt,"|cFFFF0303"+I2S(c)+"|r",0.0299) call SetTextTagPos(tt,x,y,10) call SetTextTagColor(tt,255,255,255,100) call SetTextTagVelocity(tt,0,0.035) call SaveUnitHandle(gc,i,1,u) call SaveItemHandle(gc,i,2,it) call SaveInteger(gc,i,3,c) call SaveTextTagHandle(gc,i,4,tt) call TimerStart(t,1.,true,function M5) endif set u=null set t=null set it=null set tt=null return false endfunction function InitTrig_Boom_Jass takes nothing returns nothing local trigger t=CreateTrigger() call Preload(sfx) call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_PICKUP_ITEM) call TriggerAddCondition(t,Condition(function Boom_Con)) set t=null endfunction )) )) |
01.07.2013, 10:02 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
Да все нормально...
Не обязательно. Перебор по группе можно было локальный сделать но тоже необязательно.
Есть какая-то конкретная проблема?
Если пишешь на cjass там есть специальная
конструкция. |
01.07.2013, 10:31 | #12
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MegaBlax
offline
Опыт:
2,352Активность: |
((цитата
Есть какая-то конкретная проблема?
)) Не, просто хотел узнать все ли я правильно делаю. Может где-то слишком перемудрил и т.д. ((цитата
Если пишешь на cjass там есть специальная )) Это был мой первый опыт cjass. Я еще много чего не знаю. |
01.07.2013, 10:41 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
Короче все нормально, только имена переменным лучше давать подлиннее, хотя хз наверное в JNGP тяжко их писать каждый раз. |
01.07.2013, 10:46 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MegaBlax
offline
Опыт:
2,352Активность: |
Doc, я привык уже просто |
01.07.2013, 10:55 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
вы считаете неверно и сравниваете жопу с пальцем, начнём с того что все эти надстройки рак который даёт только иллюзию всех этих возможностей, а не сами возможности. |
01.07.2013, 11:56 | #16
+1/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MpW
offline
Опыт:
50,234Активность: |
Для взломщика ваши читаемые коды хорошо, не читаемые плохо) главное самому понять что ль, у меня вот есть чужие коды, не могу разобраться в чужой работе
Steal nerves добавил: так как работу делал автор мне тяжело разобраться в работе кучи триггеров |
01.07.2013, 14:16 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
MegaBlax
offline
Опыт:
2,352Активность: |
Steal_nerves, да там вообще все ясно и понятно. Особнео во втором варианте. |
02.07.2013, 07:40 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
текстаги обнулять не стоит, они не настоящие хендлы, также они не сохраняются в сейв и еще некоторые с ними особенности, лучше их вообще нигде не таскать и делать опциональными.
создавать переменные которые вы используете только один раз рак полный, getTriggeringUnit() статик, для неё переменную делать только если вы хотите длину кода уменьшить, иначе метить к инлайну.
Такие спеллы делаются следующим образом:
эта методика называется карусель, в языках которые разрешают иметь много потоков, а еще в ядре виндоус и многих других местах применяется именно она.
надо будет какнить пример запилить про это. |
02.07.2013, 13:44 | #19
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Да ну, а любые другие языки ведь тоже дают такую-же иллюзию, ведь в любом случае компьютер исполняет машинный код? |
07.07.2013, 01:48 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|