Не факт, что стандартный мультиплеер будет работать напрямую, лучше через программу hamachi попробовать, это эмулятор локальной сети.. через него почти наверняка будет работать с TCP/IP...
Maxaon, на обоих компах. Почитай в инетернете, там есть описание как работать с программой, ничего особо сложного. Запускаешь на обоих компах, один создает в программе сеть, второй подключается к этой сети. Программа выдает свои IP и по этим IP уже подключаетесь друг к другу в игре.
LunarPixel, хах, не) фишка в том, что играя первым игроком или вторым игроком противник имеет такой же спрайт как и у тя. вроде все просто, объяснит сложновато)) Кароч, создаю я игру, затем снова открываю игру и подключаюсь и виже такую картину: в первом окне(у первого игрока) видишь противника как и положено его видеть, но когда смотришь во второе окно(у второго игрока) видишь, что у него отображается такойже спрайт как и у первого игрока... А если еще короче, то спрайты меняютс :D. Фуух, объяснил как смог
LunarPixel, я делал то же самое только спрайты местами не менял в obj_vrag, ведь это не логично! Сейчас попробывал поменять и все заработало нормально. Либ я чет непонял либ гамак не может понять столь умные мысли
Урок шестой. Получение цветового кода спрайта и воспроизведение спрайта по этому коду:
Вот и новый урок. Без лишних слов, приступим к созданию. Создаем новый проект в Game Maker и добавляем туда два спрайта. sprite0 - это тот самый спрайт, код которого мы будем получать. Загрузите в него какое нибудь небольшое изображение, размером не более 100х100 пикселей. sprite1 - этот спрайт будет показывать что идет процесс получение цветового кода. Я сделал этот спрайт в виде текста "Идет запись".
Теперь создадим три объекта: obj_orig, obj_copy, obj_text Для obj_orig назначаем спрайт sprite0, объекту obj_text задаем sprite1, а объект obj_copy оставляем без спрайта. Теперь приступаем к программированию. У объекта obj_orig, в событии Create напишем следующий код:
Code
f=0 // переменная будет хранить в себе идентификатор файла, в который мы запишем цветовой код.
// следующие переменные отвечают за хранение цветового кода red=0 green=0 blue=0
Далее создадим в том же объекте событие Key Press <Enter>, в котором напишем две строки кода:
Code
instance_create(80,16,obj_text) alarm[0]=10
instance_create(80,16,obj_text) - этой строкой мы создаем наш объект с текстом, чтобы обозначить, что идет запись. После этого командой alarm[0]=10 мы запускаем таймер, по истечению которого начнется запись.
И, наконец, создадим событие Alarm 0, это будет основное событие, содержащее в себе следующие строки кода:
Code
f=file_text_open_write('data.ini')
for (i=0; i<sprite_width; i+=1) for (j=0; j<sprite_height; j+=1) {
red=string(color_get_red(draw_getpixel(x+i,y+j)))
if string_length(red)=1 red='00'+red; if string_length(red)=2 red='0'+red;
green=string(color_get_green(draw_getpixel(x+i,y+j))) if string_length(green)=1 green='00'+green; if string_length(green)=2 green='0'+green;
blue=string(color_get_blue(draw_getpixel(x+i,y+j))) if string_length(blue)=1 blue='00'+blue; if string_length(blue)=2 blue='0'+blue;
Разберем все по порядку. Первым делом мы открываем файл, в который будет записан цветовой код file_text_open_write('data.ini') Спрайт представляет собой прямоугольник, чтобы записать его цветовой код, нам нужно считать цвета с каждого пикселя изображения. Для этого запускаем два цикла, один вложен в другой. for (i=0; i<sprite_width; i+=1) for (j=0; j<sprite_height; j+=1) Ограничение на повторение цикла - это размеры спрайта, т.е. цикл будет повторяться пока не пройдет по всему спрайту.
Теперь начинаем считывание цветов. red=string(color_get_red(draw_getpixel(x+i,y+j))) записывает в переменную red красную составляющую цвета. draw_getpixel(x+i,y+j) определяет цвет пикселя, color_get_red выделяет из этого цвета красную составляющую, а string переводит полученный результат в строковый тип данных, чтобы можно было объединить все составляющие цвета и записать это значение в файл.
Для более удобной записи нужно сделать так, чтобы каждая составляющая цвета состояла из трех чисел. Если же она состоит из двух или из одного символа, то допишем перед этим значением нули. Для этого используем следующий код:
Code
if string_length(red)=1 // если количество символов равно 1 red='00'+red; // то дописываем два нуля if string_length(red)=2 red='0'+red;
Аналогично делаем с остальными составляющими цвета, т.е. с green и blue
После того как все три составляющие одного пикселя будут получены, то записываем из в наш файл: file_text_write_string(f,red+green+blue) После чего записываем в файл переход на новую строку, чтобы код следующего пикселя был записан с новой строки. file_text_writeln(f)
После того как цикл завершиться, нужно закрыть наш файл для записи: file_text_close(f)
И удалить объект obj_text with obj_tex tinstance_destroy() Это даст нам понять, что запись в файл закончена.
С записью мы разобрались. Создайте комнату и поместите туда объект obj_orig. Можем запустить программу, нажать на Enter и увидеть результат, открыв файл data.ini
Теперь сделаем считывание из файла и воспроизведение спрайта. Для этого будет работать с объектом obj_copy.
Создадим в нем событие Create и запишем туда следующий код:
Code
f=0 // переменная будет хранить в себе идентификатор файла, в который мы записали цветовой код. text='' // в эту переменную будут заноситься считываемые из файла строки start=0 // эта переменная будет означать начало воспроизведения
//Следующие переменные будут хранить в себе составляющие цвета, считанные из файла red=0 green=0 blue=0
Создадим событие Key Press <Space> и напишем туда одну строку: start=1 - это означает начало процесса воспроизведения спрайта.
Теперь создадим событие Draw и напишем туда ещё немного кода:
Code
if start=1 { f=file_text_open_read('data.ini')
for (i=0; i<obj_orig.sprite_width; i+=1) for (j=0; j<obj_orig.sprite_height; j+=1) { text=file_text_read_string(f) red=real(string_copy(text,1,3)) green=real(string_copy(text,4,3)) blue=real(string_copy(text,7,3) ) draw_point_color(x+i,y+j,make_color_rgb(red,green,blue)) file_text_readln(f) } file_text_close(f) }
Итак, первая строка if start=1 означает условие, при котором будет начато воспроизведение. f=file_text_open_read('data.ini') - записываем в переменную f идентификатор файла, в котором храниться код спрайта.
Для воспроизведения нам так же как и для записи потребуется перебирать все пиксели изображения. Для этого запустим аналогичные два цикла: for (i=0; i<obj_orig.sprite_width; i+=1) for (j=0; j<obj_orig.sprite_height; j+=1) Обратите внимание, что предел берется исходя из размеров спрайта объекта obj_orig.
В цикле начинается считывание и воспроизведение: text=file_text_read_string(f) - записываем в переменную цветовой код первого символа. Далее разбиваем этот код на составляющие по цветам: red=real(string_copy(text,1,3)) green=real(string_copy(text,4,3)) blue=real(string_copy(text,7,3))
string_copy(text,n,m) - вырезает из текста text, m символов, начиная с позиции n. Таким образом мы выделяем три группы по три сомвола, каждая группа соответствует цветовой составляющей пикселя.
Функция real переводит полученное текстовое значение, в число.
Получив все три составляющие цвета, мы можем воспроизвести пиксель. Для этого используем функцию draw_point_color, которая рисует пиксель определенного цвета в заданных координатах. draw_point_color(x+i,y+j,make_color_rgb(red,green,blue)) Функция make_color_rgb определяет цвет исходя из трех его составляющих, которые хранятся у нас в соответствующих переменных.
Далее переходим на новую строку file_text_readln(f) и цикл повторяется по новой. Когда цикл закончится необходимо закрыть наш файл file_text_close(f)
Теперь поместите obj_copy в комнату, на достаточном расстоянии от obj_orig и запустите программу. Если файл data.ini пустой, то нажмите сначала Ентер, и по окончанию записи Пробел. Если же файл уже заполнен кодом, то сразу жмите Пробел и наслаждайтесь результатом.
Вот и всё, спасибо за внимание. Как обычно, исходники по примеру:
Сообщение отредактировал LunarPixel - Суббота, 18 Июня 2011, 11:43
аТнОтХоАн, благодарю написал, как и обещал Спасибо за идею Придумал уже следующий урок, в ближайшие дни появится
Добавлено (31.07.2011, 19:37) --------------------------------------------- Урок седьмой. Работа с поверхностями (surface)
Наконец нашел время написать ещё один небольшой урок. На этот раз он посвящен поверхностям или сурфейсам (surface). Рассмотрим работу с поверхностями на основе разрушения и воссоздания ландшафта.
Внимание! Данный урок не несет в себе цели научить вас создавать разрушаемый ландшафт, потому способ описанный ниже весьма не оптимизированный. Цель урока – разобраться в работе с сурфейсами.
Итак, приступим. Для начала создадим все необходимые нам спрайта: 1. spr_gr – спрайт земли. Размер его будет равен размеру комнаты, в моем случае это 640х480. В нижней части располагается прямоугольник коричневого цвета, который обозначает землю, остальная часть спрайта прозрачная. 2. spr_del – синий круг произвольного размера. 3. spr_add – круг такого же цвета как земля на спрайте spr_gr, так же произвольного размера. (целесообразно сделать его такого же размера как и spr_del) 4. spr_ball – круг произвольного цвета размером 16х16, будет использоваться для тестирования создаваемой нами земли.
Теперь займемся непосредственной разработкой. Создадим первый объект и назовем его obj_gr, установим для него созданный нами спрайт spr_gr. Так же сделаем этот объект твердым (solid), поставив соответствующую галочку в настройках. Для этого объекта создадим событие create в котором запишем следующий код:
Этот код, является основой создания поверхности. Разберем его по строкам. sur=surface_create(room_width,room_height) создает нашу поверхность-сурфейс. Чтобы можно было работать с этой поверхностью в дальнейшем, мы записываем её индекс в переменную sur. В параметрах функции surface_create указываем размер поверхности, в данном случае она по ширине и высоте равна комнате.
surface_set_target(sur) обозначает, что все дальнейшее рисование будет происходить на указанной поверхности, т.е. на поверхности хранящейся в переменной sur.
На этой поверхности мы рисует наш спрайт земли, при помощи функции: draw_sprite(spr_gr,0,x,y)
Таким образом, наша поверхность теперь хранит в себе изображение спрайта spr_gr, нарисованного в комнате, в позиции x и y.
Наконец функция surface_reset_target() вновь возвращает рисование с поверхности на экран. Т.е. все, что будет рисоваться после использования этой функции, не будет сохраняться на поверхности, а просто будет отображаться на экране.
Всё в том же объекте создадим событие draw и запишем в него одну единственную строку:
Code
draw_surface(sur,0,0)
Эта функция, как понятно из названия, рисует поверхность в указанной позиции, в данном случае по позиции 0:0.
Итак, поместим obj_gr в комнату, в позицию 0:0 (чтобы спрайт данного объекта охватывал всю комнату, ведь он равен ей по размеру) и запустим то, что у нас получилось. Ничего необычного вы не увидите, спрайт spr_gr будет отображаться в комнате, как и положено. Однако рисоваться он будет уже с поверхности и если изменить координаты вывода в событии draw, то поверхность сместиться, а вместе с ней и изображение.
Теперь проверим нашу землю на прочность. Создадим новый объект и назовем его obj_ball. Назначим ему спрайт spr_ball. У этого объекта в событии step пропишем следующее:
Code
gravity=1 gravity_direction=270
Эти строки устанавливают силу и направление гравитации соответственно.
Для этого же объекта добавим событие столкновения с объектом obj_gr и пропишем там:
Code
if vspeed>0 and !place_free(x,y+vspeed) move_contact(270) vspeed=0
Этот код не позволит нашему шару проходить сквозь землю и будет строго опускать его на уровень поверхности.
Теперь можем поместить один такой шар в комнату, и посмотреть, как он упадет на землю.
Наконец, перейдем к самому интересному, научимся удалять кусочки земли. Для этого создадим новый объект и назовем его obj_del, применим к нему соответствующий спрайт и в событии create напишем:
Это всё, что требуется. Разберем этот код по строкам. surface_set_target(obj_gr.sur), как и в первом случае, дает понять что теперь всё рисование будет происходить на поверхности, т.е. на сурфейсе.
На функцию draw_set_blend_mode_ext нужно обратить особое внимание, это, так называемый, режим смешивания. Он позволяет манипулировать с цветами и прозрачностью. Подробнее о нем можно почитать в справке. В данном же случае режим настроен таким образом, что прозрачная область спрайта станет такой же, как цвет фона, а закрашенная часть, станет прозрачной.
Все эти настройки применятся к следующей функции рисования: draw_sprite(sprite_index,0,x,y)
Она рисует спрайт объекта obj_del в координатах, в которых этот объект в данный момент находится.
Чтобы вернуть нормальный режим смешивания, используется следующая строка: draw_set_blend_mode(bm_normal)
Объясню эту часть на пальцах. На нашем сурфейсе, в котором храниться земля, будет рисоваться спрайт объекта obj_del, т.е. круг. Но круг этот рисуется в определенном режиме смешивания, который, вместо самого спрайта, будет рисовать прозрачную окружность, т.е. стирать часть земли.
Далее, чтобы с новой землей можно было взаимодействовать, её необходимо превратить в спрайт. Для этого нужна следующая строка:
Она устанавливает для объекта obj_gr спрайт из сурфейса, с указанными размерами 0,0,640,480.
Таким образом, всё изображение которое хранилось в нашей поверхности sur, становится спрайтом.
Далее мы опять возвращаем рисование на экран. surface_reset_target()
И удаляем наш объект obj_del, ведь как объект он нам больше не нужен. instance_destroy()
Вернемся в объект obj_gr, создадим событие Glob Left Pressed и напишем там:
Code
instance_create(mouse_x,mouse_y,obj_del)
Эта функция будет создавать объект obj_del, по нажатию клавиши мыши в координатах курсора. Одним словом, там, где мы кликнем мышкой, там создастся объект obj_del и удалится кусок земли.
Аналогично можно сделать и создание земли. Попробуйте сделать это самостоятельно. Ничего сложного тут нет. Создайте объект obj_add с соответствующим спрайтом и в событии создания пропишите код аналогичный коду из объекта obj_del, только уберите две строки связанные с режимом смешивания.
Так же настройте создание объекта obj_add по нажатию на правую клавишу мыши.
Вот и всё, создание и удаление земной поверхности создано. И попутно освоены азы работы с сурфейсами.
Чтобы добавить ещё немного интереса, допишите в step у объекта obj_ball следующий код:
Code
if collision_ellipse(x-10,y-10,x+10,y+10,obj_gr,0,0) { if position_empty(x-4,y+10) and !position_empty(x+4,y+10) hspeed=-1
if position_empty(x+4,y+10) and !position_empty(x-4,y+10) hspeed=1 }
Этот код заставит наш шарик скатываться по склонам, если у него по бокам не окажется земли. Код этот весьма не стабильный и не доработанный, добавьте его, чтобы проверить удаление части земли.
На этом урок закончен. Новые уроки ожидайте после середины августа, когда я вернусь домой. Удачи в игрострое.
аТнОтХоАн, Спасибо. Просто и правда много тем подобных появилось, после моей, и моя как то утонула, пока я тут в разъездах. Решил апнуть. В августе, как домой вернусь, много уроков будет новых.