В этой теме я не буду писать пошаговых уроков создания тди и т.д, а просто буду выкладывать труды своего мозга...
урок 1 простецкий радар(без скриптов)
подготовка: создаем спрайт радара(круглый) и спайты пометок на радаре(ГГ , мобы, цели и т.д) создаем обьект o_radar и назначаем ему наш заготовленый спрайт: в draw:
Code
x=view_xview+???//крепим к виду y=view_yview+??? draw_sprite_ext(sprite_index,-1,x,y,1,1,0,c_white,1)// отрисовываем
дальше создаем обьект o_radar_hero и назначаем ему заготовленый спрайт(у меня стрелочка) Step:
Code
{ x=o_hero.x//крепим к ГГ y=o_hero.y depth=o_radar.depth-1//глубину ставим что бы не терялась метка под радаром }
дальше создаем o_radar_mob или что нужно и у него пишем: Create:
Code
mob_id=0//ставим переменную мобы_носителя a=1000//меняя эти переменные можно контролировать дистанцию восприятия радара b=13//но формулы их просчета я не вывел поэтому все методом тыка
Step:
Code
x=mob_id.x//крепим к мобу_носителю y=mob_id.y depth=o_radar.depth-1//глубина
Draw:
Code
if distance_to point(o_hero.x,o_hero.y)<=a//проверяем попадает ли моб в зону радара { draw_sprite(sprite_index,-1,o_radar.x-(o_hero.x-x)/b,o_radar.y-(o_hero.y-y)/b)//если да - отрисовываем }
что бы метка держалась на определенном мобе то у него в Create:
сам TextBox готов, а что бы что нибудь вывести достаточно в событии(когда нужно выводить) вставить:
Code
textbox.t=1;textbox.text="я ваш дом труба шатал"
вот и все=))
урок 3:инвентарь
дальше я взялся за создание инвентаря(основу взял из этой на нашем форуме и немного усовершенствовал) распишу лучше с 0: создаем обьект o_case(слоты инвентаря) и o_inv(сам инвентарь) у последнего в событии Create:
Code
width = 4;//количество клеток по высоте height = 5;//количество клеток по ширине for(i = 0; i < width; i += 1;)//просчитывает цикл { for(j = 0; j < height; j += 1;)//еще раз для двойного массива { cell[i,j] = instance_create((i*32),( j*32), o_case)//создает слоты инвентаря }}
дальше идем в Create o_case:
Code
v_item=0//предмет в ячейке(0=пусто) v_kolvo=0//количество предметов v_cur=0//Нужна для отображения надписи при наведении на ячейку v_text=''//текст надписи xport=x//нужна для удобной привязки инвентаря к виду yport=y//аналогичная предыдущей
дальше идем в Step:
Code
x=view_xview[0]+xport//Привязка к виду y=view_yview[0]+yport if v_item=0{v_text=''}//Тест в зависимости от предмета if v_item=1{v_text='Яблоко('+string(v_kolvo)+'):Востанавливает 15 здоровья'} if v_item=2{v_text='Древняя монета('+string(v_kolvo)+'):Можно продать'}
дальше в Draw:
Code
draw_set_font(f0)//настраиваем шрифт if v_item=0{draw_sprite_ext(s_inv_pustoy_slot,-1,view_xview[0]+xport,view_yview[0]+yport,1,1,0,c_white,0.5)}//рисуем спрайт в зависимости от обьекта if v_item=1{draw_sprite_ext(s_inv_item1_test,-1,view_xview[0]+xport,view_yview[0]+yport,1,1,0,c_white,0.5)} if v_item=2{draw_sprite_ext(s_inv_item2_test,-1,view_xview[0]+xport,view_yview[0]+yport,1,1,0,c_white,0.5)} draw_sprite(sprite_index,-1,view_xview[0]+xport,view_yview[0]+yport)//рисуем спрайт самого слота if v_cur=1{draw_text(300,50,v_text)}//если v_cur=1 то выводим текст
следуем в mouse_enter:
Code
v_cur=1//переменная для вывода текста(вкл)
следуем в mouse_leave:
Code
v_cur=0//переменная для вывода текста(выкл)
дальше создаем обьект, например, o_item для него лучше всего написать скрипт(что бы не копиравать кучу кода для каждого нового обьекта), он будет лежать в событии подбора предмета, например столкновение) назовем скрипт s_item. В нем:
Code
a=1//предохранительная переменная for(j = 0; j < o_inv.height; j += 1;) { //просматриваем ячейки инвентаря for(i = 0; i < o_inv.width; i += 1;) { if o_inv.cell[i,j].v_item=argument0 // усли находит ячейку с таким самым предмето(argument0-это номер предмета и ставится в самом предмете) if o_inv.cell[i,j].v_kolvo<argument1//и если количество предметов ниже максимального { { instance_destroy()//уничтожает предмет o_inv.cell[i,j].v_kolvo+=1//и увеличивает количество предметов в инвентаре a=0//эта переменка нужна т.к происходил странный баг с 0-вым колвом предметов) exit } } } } if a=1//если таких самых предметов нету в инвентаре { for(j = 0; j < o_inv.height; j += 1;)//снова просматрваем каждую ячейку { for(i = 0; i < o_inv.width; i += 1;) { if o_inv.cell[i,j].v_item=0// и когда находим пустую { o_inv.cell[i,j].v_item = argument0;//добавляем предмет o_inv.cell[i,j].v_kolvo= 1;//количесво ставим 1(или 100500) instance_destroy();//уничтожаем предмет exit; } } } }
единственным отличием моего инвентаря от примера на который ссылка выше - это вывод текста и возможность складировать по несколько вещей...Поэтому я ввел этот пункт только ради общей составляющей=))
сам инвентарь готов, но, для большей удобности, нужно иметь возможность перемещать предметы в инвентаре по собственному желанию... этим сейчас и займемся=)
для начала идем в Create объекта инвентаря(по статье o_inv) там добавляем несколько переменных:
Code
v_mouse=0//предмет который перетаскиваем v_item=0//эта переменка нужна для правильной замены предмета v_kolvo=0//Количество предмета(у меня все сразу перетаскивается) v_kol=0//также дополнительная переменка для правильной замены(что бы не потерять что то=)
дальше идем в событие Left Pressed(или Right Pressed если так удобнее)и пишем:
Code
if o_inv.v_mouse=0 and !(v_item=0)//проверяем на соответствие поднятого ничего нету\в слоте что то лежит { o_inv.v_mouse=v_item// поднимаем предмет o_inv.v_kolvo=v_kolvo//устанавливаем количество поднятого v_item=0//опустошаем слот exit//обрываем функцию } if v_item=0 and !(o_inv.v_mouse=0)//проверка пустой слот\на мышке что то висит { v_item=o_inv.v_mouse//ложим предмет в слот v_kolvo=o_inv.v_kolvo//устанавливаем ему количество o_inv.v_mouse=0// опустошаем мышку exit//обрыв ф-ции } if !(o_inv.v_mouse=0) and !(v_item=0) and !(o_inv.v_mouse=v_item)//проверка мышка с предметов\слот не пустой\предмет на мышке и в слоте разные { o_inv.v_item=v_item//бросаем предмет в доп. переменную o_inv.v_kol=v_kolvo//количество тоже в доп. переменную v_item=o_inv.v_mouse//ложим в слот предмет с мышки v_kolvo=o_inv.v_kolvo//устанавливаем кол-во предметов o_inv.v_mouse=o_inv.v_item//ложим предмет из доп. переменной на мышку o_inv.v_kolvo=o_inv.v_kol// так же и количество o_inv.v_item=0//очищаем доп. переменные o_inv.v_kol=0 exit//обрываем } if v_item=o_inv.v_mouse//проверка предмет на мышке такой же как в слоте { o_inv.v_mouse=0//чистим мышку v_kolvo+=o_inv.v_kolvo//увеличеваем кол-во предметов за счет кол-ва на мышке o_inv.v_kolvo=0//очищаем количество на мышке exit//обрываем }
в принципе уже все работает, но все операции проходят незаметно(не видно что на мышке висит) поэтому идем в Draw объекта o_inv(инвентарь) и пишем:
Code
if v_mouse=1{draw_sprite(s_inv_item1_test,-1,mouse_x,mouse_y)}//смотрит на "ид" предмета и взависимости от значения рисует спрайт который висит на мышке
теперь можно создать еще несколько предметов и как угодно их перемещать по инвентарю=))
урок 4: перемотка списка пушек(если пушки можно подбирать)
в собитии колесо мыши вверх:
Code
if weapon=0 //это переманная типа пушки в руках { if weap1=1{weapon=1;break}//weap1=1 - это проверка есть ли у ГГ пушка 1 и если есть берем ее в руки. else {if weap2=1{weapon=2;break}// если пушки 1 нету проверяем пушку 2 и т.д } if weapon=1//снова повторяем все теже проверки только на следующей пушке { if weap2=1{weapon=2;break} else {weapon=0;break}//если пушек нету или это последняя в списке то ставим стандартную пушку(кулаки, нож и т.д) break }
что бы зделать обратный ход просто начинайте просчет с зада на перед+))
урок 5: точный поиск пути
многие(если не каждый) парились тем что, mp_potential_step(x,y,sp,0) работает только на небольших препятствиях(иначе как придурков по углам таскает) так вот система очень простая и построена на сетке(хоть это и не очень быстро, но те кто делают "огромные" игры и сами придумают себе поиск пути) И так начнем: создаем обьект o_grid в нем:
Code
Create:grid=mp_grid_create(0,0,room_width/16,room_height/16,16,16)//создаем сетку,(16 - это размер ячейки)
дальше обьекте бота/ГГ(или кто там будет двигаться) create:
Code
path=path_add()// создаем путь по которому будет следовать обьект(если создать стандартный путь то обьекты будут повторять движения за одним из ботов)
step:
Code
mp_grid_add_instances(o_grid.grid,o_block,1)// добавляем o_block как преграду(желательно зделать его родителем всех преград) mp_grid_path(o_grid.grid,path,x,y,o_target.x,o_target.y,1)//просчитываем путь по сетке, оминая ранее обозначеные препячтвия path_start(path,1,0,0)//запускаем путь
вот и все, запустив игру, бот будет идти к o_target даже если построить крутой лабиринт...
урок 6:создание обьекта(не мобы, а блоки, стены и пр.) на стороне сервера(39dll_gex)
и так, после моей последней пробы с ммо хочу добавить пару фишек которые я оттуда вынес=)) как создать обьект на сервере что бы он появился у всех игроков: примечание(я не буду расписывать как связать клиент-сервер и все в этом духе..таких примеров тьма) в событии create обьекта(на сервере):
Code
dll39_buffer_clear(0) dll39_write_byte(0,0) dll39_write_byte(12,0)//кейс на этот обьект dll39_write_short(x,0) dll39_write_short(y,0) for(i=1;i<=16;i+=1){ if(o_con.gh[i]>0){ dll39_message_send(o_con.gh[i].client,0,0,0);//отправка всем играющим игрокам }} //этот код нужен если хотите добавлять предметы прямо во время игры..
дальше в степ:
Code
if(o_con.client > 0)//проверка на нового игрока(должна быть уже готова) { dll39_buffer_clear(0) dll39_write_byte(0,0) dll39_write_byte(12,0) dll39_write_short(x,0) dll39_write_short(y,0) dll39_message_send(o_con.client,0,0,0);(отправка новичку) } //этот код отправляет команду на создание уже созданных обьектов..
теперь идем в клиент туда где принимаем кейсы:
Code
case 12://если пришел кейс 12 block=instance_create(0,0,o_stars)//создаем обьект block.x=dll39_read_short(0)//ловим его координаты... block.y=dll39_read_short(0) break;
впринципе все... вроде как мелочь, но я в свое время на ней голову сломал=))
урок 7(теория) как зделать защиту от хака на скорость передвижения на стороне клиента.
все до банальности просто... на стороне сервера добавляем в персе переменки(xpr=x,ypr=x) а дальше в степе делаем проверку на расстояние между xpr и x + проверка ypr и y и и если выше положеного то (бан, кик и т.д) а на следующей строчке уравниваем коорды=)) вот и все=)
сейчас времени мало, но когда появится выложу и другие уроки... Более мощный компьютер глючит быстрее и точнее.
Сообщение отредактировал BrightSpot - Четверг, 24 Ноября 2011, 19:07
Добавлено (21.11.2011, 15:01) --------------------------------------------- возможно для многих последний урок будет бредом, но для меня это было неплохим озарением вчера... в общем урок выложен на суд и помощь=))
конечно( прост у меня все препятствия на одном родителе(и двиг. и нет) поетому как то не подумал.. + если проводить оптимизацию то лучше каждому боту через определенное время создавать сетку(в намного меньших размерах) и искать путь...
Добавлено (24.11.2011, 18:39) --------------------------------------------- сделать бы поиск пути как в варике3... там ведь даже телепорты при поиске умудряются учитывать=))
Можно два родителя сделать: для не двигающихся объектов выполнять в создании, для остальных - в степе или в аларме раз в несколько шагов
Если нужно можно создать еще один родительских объект для этих двух (если нужно делать проверку столкновений то так будет удобнее). Новый пример инвентаря! /20.06.2012/
Можно два родителя сделать: для не двигающихся объектов выполнять в создании, для остальных - в степе или в аларме раз в несколько шагов
Если нужно можно создать еще один родительских объект для этих двух (если нужно делать проверку столкновений то так будет удобнее).
каждый затачивать должен под себя сам... я ж не буду все возможные варианты расписывать...(а если сам, принявший на вооружение урок, такие мелочи не додумает то справка ему в руки) Более мощный компьютер глючит быстрее и точнее.
я делал поиск пути с учетом телепортов, правда там не было препятствий и расстояние считалось по прямой, но если вычислить длину пути, то по такой же формуле можно легко просчитать какой путь короче: через телепорт или просто так.
Нужно вычислить: (расстояние до телепорта1) + (расстояние от телепорта2 до точки назначение). если меньше чем расстояние до точки назначения без использования телепорта то идти к телепорту1, если нет, то проверить телепорты наоборот (может мы ведь не знаем какой из телепортов ближе): (расстояние до телепорта2) + (расстояние от телепорта1 до точки назначение). Если получится меньше чем расстояние до точки назначения без использования телепорта то идти к телепорту2, если нет, идем к точке назначения без использования телепортов. Новый пример инвентаря! /20.06.2012/
тогда идет пересчет 3 путей(от начала до точки)+ (от начала до тп1) + (от тп2 до точки) если добавить припятствия и расчет длинны то 2 моба(образно) загрузят всю игру...
Добавлено (24.11.2011, 19:12) --------------------------------------------- кста добавил пару уроков(хотя даже стыдно их так называть)