Пятница, 29 Марта 2024, 18:41

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Инициатива (Да- да , снова я с этим вопросом...)
Инициатива
KrososДата: Пятница, 23 Августа 2013, 16:12 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
В общем ,я задолбался =(
Главный объект должен посчитать всем инициативу(мгновенно) и определить кто будет ходить.
По началу все идет хорошо , но иногда настает момент - когда кто-то зацикливает код , потому что не может занести свое число O в очередь.
Вот код:

if global.Sunit.O=0 or global.Phase1=1{ //Если Sunit не избран или идет первая фаза
while global.Phase3=0{ //Цикл пока не будет фаза 3
with KleymoOfEnemy{ //Для всех врагов
with target{
if UnitSpeed>=100{global.Phase3=1}}} //Если готовность юнита равна 100 , то фаза 3 равна 1
with KleymoOfAlied{ //Для союзников
with target{
if UnitSpeed>=100{global.Phase3=1}}} //Если готовность юнита равна 100 , то фаза 3 равна 1
if global.Phase3=1 {break} //Если фаза 3 равна 1 , то сломать цикл
with KleymoOfEnemy{ //Для врагов
with target{
{UnitSpeed+=global.IN[O] scr_effects()}}} //Прибавить к готовности личное число инициативы , и проделать некий скрпит
with KleymoOfAlied{
with target{
{UnitSpeed+=global.IN[O] scr_effects()}}}} //Прибавить к готовности личное число инициативы , и проделать некий скрпит

while global.Phase3=1{ //Цикл если фаза 3 равна 1
with KleymoOfEnemy{ //Для врагов
with target{
if UnitSpeed>=100{ds_queue_enqueue(global.turn,O)}}} //Если готовность больше 100 , то занести этому объекту свое число в очередь
with KleymoOfAlied{ //Для союзников
with target{
if UnitSpeed>=100{ds_queue_enqueue(global.turn,O)}}} //Если готовность больше 100 , то занести этому объекту свое число в очередь
if !ds_queue_head(global.turn)=0 {global.Phase3=0} //Если на первом месте в очереди не число 0 , то фаза 3 равна 0
}

global.Phase1=0 //Фаза 1 равна нулю

with KleymoOfEnemy{ //Для врагов
with target{
if UnitSpeed>=100{if O=ds_queue_head(global.turn){ //Если число юнита совпало с тем , что в списке то этот юнит выбирает ,как дальше будет ходить
if object_get_parent(object_index)=AI_Warrior {scr_Phase2E()}
if object_get_parent(object_index)=AI_Wizard {scr_Phase2EW()}
if object_get_parent(object_index)=AI_Ranger {scr_Phase2ER()}
if object_get_parent(object_index)=AI_Flayer {scr_Phase2EF()}}
}}}
with KleymoOfAlied{ //Для союзников тоже самое
with target{
if UnitSpeed>=100{if O=ds_queue_head(global.turn) {scr_Phase2A()}}}}
}


Конец хода выглядит примерно так:
UnitSpeed-=100
ds_queue_clear(global.turn)
global.Sunit=0

А все коды фазы 2(scr_Phase2E, например) начинаются вот так:
global.Sunit=id





Мой проект


Сообщение отредактировал Krosos - Пятница, 23 Августа 2013, 18:21
BrightSpotДата: Четверг, 29 Августа 2013, 18:45 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
объясни на пальцах зачем нужна инициатива... очередь динамическая?(каждый раз может меняться)
или забивается изначально перед боем??
если динама то не вижу причин что бы не цыклило иногда...
если же забивается перед боем то не вжу смысла в коде...



Более мощный компьютер глючит быстрее и точнее.
KrososДата: Четверг, 29 Августа 2013, 18:57 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
BrightSpot, инициатива динамическая , то есть ,есть: дэбафы , бафы , урон по готовности и прочее...

Что у нас есть:
1.Очки готовности - сумма набранных очков инициативы
2.Инициатива
3.Номера юнитов (1,2,3,4 и так далее до 32000)

Что нам нужно:
Определить того , кто должен ходить.

Как это должно быть:
Один объект должен посчитать очки инициативы до 100.Сумма этих очков - это готовность
Например , у нас есть 2 юнита.
1 юнит имеет 5 инициативы , а 2 10.
Главный объект при помощи циклов складывает очки инициативы до того момента ,пока кто-то не наберет 100 или больше 100 , то есть, когда будет момент для хода , 1 юнит будет иметь у себя 50 очков готовности , а 2 100.

Об инициативе и готовности:
1.Инициатива
Инициативу можно уменьшить или увеличить (Бафы или дэбафы).
Например , 50 очков мы набрали с инициативой 5 , а потом мы начали набирать с инициативой 3 , в итоге: 2 юнит начал свой ход со 100 инициативой , когда 2 юнит набрал только 80 очков.
2.Готовность.
Есть магия или умения которые наносят урон готовности.
Например, вот-вот должен был начаться ход первого юнита , но коварный второй нанес урон по его готовности на 200 очков , в итоге: у первого юнита осталось -120 очков готовности и походит он еще очень не скоро..





Мой проект


Сообщение отредактировал Krosos - Четверг, 29 Августа 2013, 19:00
BrightSpotДата: Четверг, 29 Августа 2013, 21:57 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
тогда забей у юнита 2 переменные : количество очков и скорость набора
и когда она полная то просто делай юнита активным или вноси в очередь активных, а дальше просто глобалкой проверяй очередь и все...



Более мощный компьютер глючит быстрее и точнее.
KrososДата: Четверг, 29 Августа 2013, 21:58 | Сообщение # 5
постоянный участник
Сейчас нет на сайте
BrightSpot, до этого так и было , но я думаю , лучше всего сделать так, чтобы счет был мгновенным при помощи циклов.




Мой проект


Сообщение отредактировал Krosos - Четверг, 29 Августа 2013, 21:58
BrightSpotДата: Четверг, 29 Августа 2013, 23:33 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
если досидишь до 3-ех ночи по киеву(я с работы вернусь) то могу попробовать решить проблему на примерах... т.к сейчас под руками нет ГМ-а да и некогда... иначе могу помочь в суботу(даже скорее в воскресенье) на выходном...


Более мощный компьютер глючит быстрее и точнее.
KrososДата: Среда, 04 Сентября 2013, 15:59 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
BrightSpot, я с этой проблемой пока особо не спешу.

Добавлено (04.09.2013, 15:59)
---------------------------------------------
if global.Sunit.O=0 or global.Phase1=1{

while ds_queue_size(global.turn)=0{

with KleymoOfEnemy {
with target{
if UnitSpeed>=100{global.Phase3=1}}}
with KleymoOfAlied{
with target{
if UnitSpeed>=100{global.Phase3=1}}}

with KleymoOfEnemy{
with target{
if UnitSpeed>=100 and !O=0 {ds_queue_enqueue(global.turn,O)}}}

with KleymoOfAlied{
with target{
if UnitSpeed>=100 and !O=0 {ds_queue_enqueue(global.turn,O)}}}

if global.Phase3=1 {break}

with KleymoOfEnemy{
with target{
{UnitSpeed+=global.IN[O] scr_effects()}}}
with KleymoOfAlied{
with target{
{UnitSpeed+=global.IN[O] scr_effects()}}}

}

global.Phase1=0

with KleymoOfEnemy{
with target{
if UnitSpeed>=100{
if O=ds_queue_head(global.turn){
if object_get_parent(object_index)=AI_Warrior {scr_Phase2E()}
if object_get_parent(object_index)=AI_Wizard {scr_Phase2EW()}
if object_get_parent(object_index)=AI_Ranger {scr_Phase2ER()}
if object_get_parent(object_index)=AI_Flayer {scr_Phase2EF()}}
}
}
}
with KleymoOfAlied{
with target{
if UnitSpeed>=100{if O=ds_queue_head(global.turn) {
if Alied=1{scr_Phase2AAI()}else{scr_Phase2A()}
}}}}
}


Решено...
Цикл больше не зависает.





Мой проект
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Инициатива (Да- да , снова я с этим вопросом...)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг