Пятница, 10.01.2025, 21:24
Главная Регистрация RSS
Приветствую Вас, Гость
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Общие вопросы по Game Maker 6/7/8/Studio
никитаДата: Суббота, 29.11.2014, 12:56 | Сообщение # 586
Мастер
Группа: Модераторы
Сообщений: 532
Награды: 0
Репутация: 51
Статус: Offline
А, кажется, разобрался...

Код
rpower=1
near=instance_nearest(x,y,object1)
if near.rpower=1
   {
   instance_destroy()
   }


ВАСЕЧКА - Попугай

Сообщение отредактировал никита - Суббота, 29.11.2014, 12:57
 
никитаДата: Суббота, 29.11.2014, 19:39 | Сообщение # 587
Мастер
Группа: Модераторы
Сообщений: 532
Награды: 0
Репутация: 51
Статус: Offline
А, нет, все же не до конца я понял. Помогите. Нужно проверить, есть ли в 32 пикселях от объекта любой другой объект с переменно rpower, равняющийся единице.

ВАСЕЧКА - Попугай
 
fdk123Дата: Суббота, 29.11.2014, 22:38 | Сообщение # 588
Олдфаг-Программист
Группа: Постоянный
Сообщений: 214
Награды: 0
Репутация: 28
Статус: Offline
никита, ну тебе нужно сравнивать иксы и игрики и по ним определять ( то-есть по сетке) объекты а потом проверять каково именно их значение переменной. этот код точно в степе будет. могу написать что то похожее, но только на VB. Можешь перевести в GML и должно работать, хотя BRESS явно лучше сделает, я в GML и здешних принципах оптимизации не силён. По-этому тупо копировать код - плохая идея. ЭТО НЕ GML. Это Visual Basic!
в step'e или в create объектов в зависимости двигаются или нет:

Код
x1=x '//x первого объекта
y1=y '//y первого объекта
и это каждому проверяемому, каждый раз новый номер
в step'e проверяющего:
Код
xx=x '//координаты твоего объекта которому нужно знать про рядом находящиеся объекты
yy=y '//координаты твоего объекта которому нужно знать про рядом находящиеся объекты
For i = -32 To 32
For j = -32 To 32
If xx+i = x1 And yy+j =  y1 Then
'instance_destroy() - в VB нет такой функции, потому пишу её в коммент.тут главно разрушить другой объект, а не этот
End If
If xx+i = x2 And yy+j =  y2 Then
'instance_destroy() - в VB нет такой функции, потому пишу её в коммент.тут главно разрушить другой объект, а не этот
End If
Next
Next

Ну вот и всё. Это один цикл вложенный в другой. И проверка значения на соответствие. Если смогу и успею скину GML код. x2 и y2 это проверка второго объекта. ну дальше контрл ц контрл в, ты знаешь это.

Добавлено (29.11.2014, 22:38)
---------------------------------------------
никита, вот код GML. Его можно сразу скатывать.
в step'e или в create объектов в зависимости двигаются или нет:

Код
global.x1=x //x первого объекта  
  global.y1=y //y первого объекта

Код
global.x2=x //x второго объекта  
  global.y2=y //y второго объекта
ну дальше контрл ц контрл в, ты знаешь это.

в step'e проверяющего:

Код
var i,j {
xx1=x
yy1=y
for (i=-32;i<=32;i+=1) {
for (j=-32;j<=32;j+=1) {
if xx1+i=global.x1 {
if yy1+j=global.y1 {
instance_destroy()
}
if xx1+i=global.x2 {
if yy1+j=global.y2 {
instance_destroy()
}
}
}  
}  
}
}

Вот код проверки и удаления чисто это копировать и вставлять. вместо global.x2 и global.y2 нужно ставить координаты следующих объектов, инстанс дестрой нужного объекта тоже сам настроишь, в принципе всё это можно менять местами, если надо объясню как но так удобнее потому что только один раз всё обрабатывается, а не по кол-ву объектов.

Код
if xx1+i=global.x2 {
if yy1+j=global.y2 {
instance_destroy()
}
}


Run To Life
Visual Basic — пишу свободно
Visual C++ — пишу свободно
Visual C# — пишу свободно(изредка в книжку гляжу)
GML — без гайдов ни строчки


Сообщение отредактировал fdk123 - Суббота, 29.11.2014, 21:52
 
BRESSДата: Воскресенье, 30.11.2014, 09:04 | Сообщение # 589
Мастер-ломастер
Группа: Администраторы
Сообщений: 3120
Награды: 1
Репутация: 224
Статус: Offline
Цитата никита ()
Нужно проверить, есть ли в 32 пикселях от объекта любой другой объект с переменно rpower, равняющийся единице.
Поленился прочесть пост fdk123, если честно. Уж слишком велика у него тяга к письму smile А так, в принципе, делается всё относительно просто.

//Оперируем с группой объектов, у которых отслеживается переменная (вроде бы, можно просто написать other)
with <объект, у которого отслеживаем переменную> {

//Если дистанция до нашего основного объекта <33 и переменная rpower=1, выполняем условие
if (distance_to_object(other)<33) and (rpower=1) {

//Переключаемся на основной объект
with other {
//действия для нашего объекта
}

}

}


Код не оптимизирован под большое количество объектов, то бишь, если пихать его в каждый шаг, то могут быть притормаживания.


Для ваших вопросов по Game Maker есть специально созданный форум. Оставьте в покое мою личку. Спасибо за внимание!
 
никитаДата: Воскресенье, 30.11.2014, 15:28 | Сообщение # 590
Мастер
Группа: Модераторы
Сообщений: 532
Награды: 0
Репутация: 51
Статус: Offline
Цитата BRESS ()
А так, в принципе, делается всё относительно просто.

Вроде все правильно написал, по твоей инструкции... Не работает. Скорее, работает, но наполовину.
Код
with lever_obj
{
if (distance_to_object(other)<32) && (rpower=1)
{
with other
{
rpower=1
}
}   
else
{
rpower=0
}
}
if rpower=1
{
image_index=1
}
else
{
image_index=0
}

Проблема в том, что image_index=1 срабатывает, а image_index=0 не срабатывает.

==================================================

Не, не, разобрался smile Я просто раньше никогда with не пользовался.


ВАСЕЧКА - Попугай

Сообщение отредактировал никита - Воскресенье, 30.11.2014, 15:32
 
никитаДата: Воскресенье, 30.11.2014, 15:47 | Сообщение # 591
Мастер
Группа: Модераторы
Сообщений: 532
Награды: 0
Репутация: 51
Статус: Offline
Однако, опять прошу помощи. Вот такой значит код.
Код
with lever_obj
{
if (distance_to_object(other)<32) && (rpower=1)
{
with other
{
rpower=1
}
}  
else  
{
with other
{
rpower=0
}
}
}
if rpower=1
{
image_index=1
}
else
{
image_index=0
}

Чтобы было проще, хочу сказать, что делаю что-то вроде редстоуна в майне. У меня есть два объекта, которые могут давать редстоун-сигнал - это lever_obj (рычаг) и cable_obj (редстоун-кабель). Мне нужно, чтобы при выдаче редстоун-сигнала в радиусе 32 пикселей от объекта cable_obj, этот объект сам начинал испускать сигнал, т.е. переменная rpower равнялась единице. Вкратце: мне нужно, чтобы значение переменной rpower у объекта cable_obj становилось единицей, при обнаружении любого объекта вокруг с переменной rpower равняющейся единице.


ВАСЕЧКА - Попугай
 
BRESSДата: Понедельник, 01.12.2014, 10:13 | Сообщение # 592
Мастер-ломастер
Группа: Администраторы
Сообщений: 3120
Награды: 1
Репутация: 224
Статус: Offline
Помню, когда делал и FeDo и Last такие же проблемы были ) В общем, в чем соль: звено цепи дизактивируется, но ее тут же активирует другое, рядом стоящее звено. Вот и не погасает твой редстоун. Чтобы у тебя всё получилось, нужно написать нечто типа алгоритма поиска пути.

Ну а можно схитрить и при подаче сигнала просто выпускать невидимый объект, который будет двигаться вдоль цепи. То бишь, положительный сигнал: выпускается объект, при соприкосновении с которым редстоун загорается. Отрицательный сигнал: выпускается объект, при соприкосновении с котором редстоун тухнет. Код движения достаточно тривиальный и легко пишется со справкой на руках (я уже забыл нужные функции).


Для ваших вопросов по Game Maker есть специально созданный форум. Оставьте в покое мою личку. Спасибо за внимание!
 
никитаДата: Понедельник, 01.12.2014, 18:55 | Сообщение # 593
Мастер
Группа: Модераторы
Сообщений: 532
Награды: 0
Репутация: 51
Статус: Offline
Цитата BRESS ()
Помню, когда делал и FeDo и Last такие же проблемы были

Все ясно. Это довольно сложно как понять, так и сделать. Думаю, что будет сложно сделать еще и объект. К тому же я не знаю еще многого о ГМ. Например, в for я так и не разобрался.
P.S. Pascal, GML, Python... Они похожи, однако несущественные различия не очень удобны.


ВАСЕЧКА - Попугай
 
никитаДата: Вторник, 06.01.2015, 20:28 | Сообщение # 594
Мастер
Группа: Модераторы
Сообщений: 532
Награды: 0
Репутация: 51
Статус: Offline
У меня есть несколько объектов enemy_obj, и объекту player_obj нужно узнать, какой из объектов enemy_obj появился в комнате первым, и по нему стрелять. Как это сделать?

ВАСЕЧКА - Попугай

Сообщение отредактировал никита - Вторник, 06.01.2015, 20:28
 
BRESSДата: Вторник, 06.01.2015, 21:51 | Сообщение # 595
Мастер-ломастер
Группа: Администраторы
Сообщений: 3120
Награды: 1
Репутация: 224
Статус: Offline
Там по идее счетчик есть. Точно не помню (наверное, полгода уже не сидел в GM O_o)
Но можно сделать по тупому и каждому объекту присваивать свой индекс, ориентируясь на глобальную переменную. К примеру:

global.N+=1;
object_number=global.N;

И далее просто чекать переменную object_number у каждого объекта. Главное не забыть создать преждевременно саму переменную global.N


Для ваших вопросов по Game Maker есть специально созданный форум. Оставьте в покое мою личку. Спасибо за внимание!
 
никитаДата: Среда, 07.01.2015, 16:07 | Сообщение # 596
Мастер
Группа: Модераторы
Сообщений: 532
Награды: 0
Репутация: 51
Статус: Offline
Цитата BRESS ()
Но можно сделать по тупому и каждому объекту присваивать свой индекс, ориентируясь на глобальную переменную.

Самое интересное - я так и делал. Но мне нужно скорее не совсем это. Значит так, player_obj должен знать, в каком порядке стрелять по enemy_obj, а порядок задается по очереди появления в комнате. У меня есть глобальная переменная global.enemynumb и переменная enemynumb, присвоенная объекту enemy_obj. global.enemynumb=1. При появлении enemy_obj в комнате его собственная переменная enemynumb приравнивается к глобальной global.enemynumb, а затем к global.enemynumb прибавляется единица.
Код
enemynumb=global.enemynumb
global.enemynumb+=1

player_obj должен начать стрелять по первому появившемуся в комнате объекту, затем по второму появившемуся в комнате объекту, по третьему и т.д.


ВАСЕЧКА - Попугай
 
никитаДата: Пятница, 09.01.2015, 18:57 | Сообщение # 597
Мастер
Группа: Модераторы
Сообщений: 532
Награды: 0
Репутация: 51
Статус: Offline
Возможно будет легче, если я скажу что делаю Tower Defence?

ВАСЕЧКА - Попугай
 
Gracio001Дата: Пятница, 09.01.2015, 20:44 | Сообщение # 598
*классный титул*
Группа: Администраторы
Сообщений: 1335
Награды: 2
Репутация: 187
Статус: Offline
никита, мб использовать переменные, типа instance_nearest, если тебе нужна стрельба по порядку?

ты никогда не станешь просто девочкой из песни.
 
XomafokДата: Пятница, 09.01.2015, 21:37 | Сообщение # 599
Известен под логином VS games
Группа: Постоянный
Сообщений: 932
Награды: 2
Репутация: 172
Статус: Offline
Насколько я помню, там можно воспользоваться id объектов - то есть у кого из объектов самы меньший id, тот и заспавнился первым.
 
никитаДата: Пятница, 09.01.2015, 21:59 | Сообщение # 600
Мастер
Группа: Модераторы
Сообщений: 532
Награды: 0
Репутация: 51
Статус: Offline
Цитата Gracio001 ()
никита, мб использовать переменные, типа instance_nearest, если тебе нужна стрельба по порядку?
instance_nearest не подойдет: если башенки будут стрелять по ближним врагам, тогда те враги, которые ближе к зоне, которую нужно защищать, не будут находиться под обстрелом. Там что-то другое нужно.
Цитата Xomafok ()
Насколько я помню, там можно воспользоваться id объектов - то есть у кого из объектов самы меньший id, тот и заспавнился первым.
Спасибо, кстати, об id я не подумал. Но проблема в том, что мне нужно стрелять по врагам по порядку - убили первого, перешли на второго и т.д.


ВАСЕЧКА - Попугай
 
Поиск: