С чего бы вы из-за тени грустите? Найдите нужный шейдер, статью про расчет тени от меша и все это запихай в отдельный класс.
Про достоинства и недостатки этих двух API много говорили, мой совет - если не хотите бегать искать дополнительные библиотки для ввода, звука, сети, используйте DirectX, ибо за графику в нем отвечает только Direct3D, и есть дополнительные библиотеки ввода, звука, прочего, чего нет в OpenGL.
А выучить по-любому придется многое, независимо от API.
Я об этих письмах полгода назад прочитал. Я так ржал, когда получил подробное письмо по мейлу! Представляете, это самое письмо было переведено машинным переводом, думаю, понимаете какие перлы я получил, половина слов так и не была переведена с английского.
Безусловно, конструкторы игр полезны в определенной степени, если в нем можно как-нибудь запрограммировать поведение персонажей, логику игры, это дает опыт людям, которые хотят, но не могут разрабатывать игры из-за упоротого непонимания С++. Но пытаться заработать себе на жизнь такими конструкторами - бред. К примеру, я 3 месяца потратил на Юнити и ничего шикарного в нем не сделал, даже свою FPS. Но я об этом не жалею, так как понял, из чего должна состоять трехмерная игра, что надо реализовать в ней, увидел, как можно взаимодействовать со скриптами. Ничего этого я бы из книг по С++ не узнал. Хотя вру, может быть, узнал бы, но тогда затраченное время превысилось бы вдвое.
Сижу на данный момент на DirectX. Из плюсов ОпенГЛ - та же кроссплаторменность, но писать на всякие андроиды нет желания, а на консоли все равно не пустят. В то время в ДиректИкс за отрисовку отвечает только Direct3D, и есть прочие ништячки для работы со звуком, музыкой, сетью, обработкой ввода (DirectAudio, DirectPlay, DirectInput) Так что для обработки не только графики в ОпенГЛ, надо использовать сторонние библиотеки, которые не всегда поддерживают мультиплатформенность, в итоге опять же ориентация на какую-то платформу. Кодить на ОпенГЛ легче, это да, но плюсы и минусы я расписал. Сомневаетесь, что использовать? Добавьте в свой движок поддержку ОпенГЛ и Директа
Т.е. вы сейчас открыто сказали что ваш проЭкт для школьников которых кормят родители, а не людей которым надо зарабатывать на жизнь самим здесь и сейчас?
Нет, это намек на шанс разбогатеть без работы на дядю.
Да и те же 1000$ вроде приличная сумма, а на самом деле даже на месяц не хватит людям, которым надо зарабатывать здесь и сейчас
Сообщение отредактировал Izaron - Понедельник, 27 Мая 2013, 19:21
Посоветовал бы, конечно, C++, так как этот ЯП более развитый и у него больше плюсов, пардон за тавтологию. К примеру, классов на С нету, есть только структуры Но, как говорится, на вкус и цвет. Я сам начинал с С# После того, как более-менее освоишь С, посмотри различия С от С++, со знанием С выучить С++ легко очень, по ходу дела больше узнаешь нового.
2 И как сделать чтобы при создании в игре ( то есть во время игры ) объектов ( допустим стена 32х32 ) , эти стены не налаживались друг на друга, а располагались рядом как бы по сетке.
Допустим, ты щелкаешь мышью и по щелчку образуется стенка. Тогда пиши в событии щелчка:
Код
instance_create((mouse_x div 32)*32,(mouse_y div 32)*32,obj_wall); // obj_wall - объект стены
Сообщение отредактировал Izaron - Пятница, 18 Января 2013, 15:09
а если я хочу заполнять карту не желтыми и поверх красными спрайтами, а мне нужно заполнять одним движущимся обьектом, в смысле одного типа, но так, чтобы было совершенно рандомно без чисел было количество и дальность спавна, но на каком-то максимальном расстоянии от игрока? как реализовать?
Ну допустим, ты делаешь TDS. Тогда в Create какого-нибудь объекта ставишь такой код:
Код
min_obj=10 // Минимальное кол-во объектов max_obj=20 // Максимальное кол-во объектов min_rad=5 // Минимальная близость от игрока - 5 клеток max_rad=10 // Максимальная близость - 10 клеток max_rad_spawn=15 // Максимальная дальность от игрока - 15 клеток //т.е. за пределы 15 клеток спавниться не будет
karta[0,0]=0 // Допустим, что есть карта размером 100х100 for (n=0; n<100; n+=1) // Внешний цикл {for (m=0; m<100; m+=1) // Внутренний цикл {karta[n,m]=0}}
gamer_x=50, gamer_y=50 // Мы поставили игрока в координату karta[50,50], можете попробовать поставить рандомно karta[gamer_x,gamer_y]=1 // Если в координате есть игрок, координата помечается "1"
while(true) // Поиск начальной клетки. { a=false nn=irandom_range(gamer_x-max_rad_spavn,gamer_x+max_rad_spavn) mm=irandom_range(gamer_y-max_rad_spavn,gamer_y+max_rad_spavn) if nn<gamer_x and nn>gamer-1-max_rad { a=true } if nn>gamer_x and nn<gamer-1+max_rad { a=true } if mm<gamer_y and mm>gamer-1-max_rad { a=true } if mm>gamer_y and mm<gamer-1+max_rad { a=true } if a=false break }
for (r=1;r<obj;r+=1) { karta[nn,mm]=2 // Пометка врага
switch (irandom(3)) {case 0: nn-=1; if nn == gamer_x-max_rad_spavn-1 or nn==gamer_x-max_rad-1 {nn += 1} break; case 1: nn+=1; if nn == gamer_x+max_rad_spavn+1 or nn==gamer_x+max_rad+1 {nn -= 1} break; case 2: mm+=1; if mm == gamer_y+max_rad_spavn+1 or mm==gamer_y+max_rad+1 {mm -=1 } break; case 3: mm-=1; if mm == gamer_y-max_rad_spavn-1 or mm==gamer_y-max_rad-1 {mm +=1 } break;} }
for (n=0; n<100; n+=1) // Внешний цикл {for (m=0; m<100; m+=1) // Внутренный цикл {if karta[n,m]=1 instance_create(n*16,m*16,player) // player - объект игрока if karta[n,m]=2 instance_create(n*16,m*16,object)}} // object - твои спавнившиеся объекты
Здравствуйте, пользователи gcup.ru! За то время, что я изучал GM, я создал немало уроков по GML и решил их сюда выложить. Каждый урок прячется под спойлер. Удачи в изучении GML!
Как сделать электронные часы в реальном времени Некоторые думают, что сделать часы в реальном времени непросто, но на самом деле тут нет ничего сложного. Значит, делаем object0, добавляем Create и пишем туда код
Код
global.hour=current_hour //Нынешний час global.minute=current_minute //Нынешная минута global.second=current_second //Нынешная секунда alarm[0]=30 //Тут можно написать alarm[0]=room_speed
Добавляем alarm[0] и пишем код
Код
global.hour=current_hour global.minute=current_minute global.second=current_second //То же самое, что и в Create alarm[0]=30 //Бесконечный цикл
Теперь самое трудное в этом уроке. Добавляем Draw и пишем код (вариант 1)
Код
Font=font_add_sprite(sprite_font,ord("!"),true,0) //Эта строчка использует шрифт из спрайта, подробнее в справке draw_set_color(c_white); draw_set_font(Font); draw_set_alpha(1);
Draw (вариант 2)
Код
draw_set_font(font1) //Дешево и сердито. Не забудьте выбрать шрифт font1!
Создаем комнату размером 100 на 30, заливаем белым цветом, вставляем object0 в верхнем левом углу. Запускаем... Вот и все! bye_:_
Как сделать электронные часы с указанием времени.
Сейчас сделаем часы с указанием времени, т.е. пользователь сам вводит час, минуту, секунду. Это сделать несколько сложнее, чем в первой статье.
Создаем объект object0 и в Create пишем код:
Код
global.hour=get_integer("Укажите час",0) global.minute=get_integer("Укажите минуту",0) global.second=get_integer("Укажите секунду",0) // Открываются поочередно 3 окошка, где пользователь вводит час, минуту, секунду. show_message("Спасибо! :)") // Начинаем... alarm[0]=30 // Можно написать alarm[0]=room_speed
В alarm[0] пишем код:
Код
global.second+=1 if global.second>59 //Если секунд больше 59, то... {global.second=1;global.minute+=1} if global.minute>59 //Если минут больше 59, то.. {global.minute=1;global.hour+=1} if global.hour>23 //Если часов больше 23, то... {global.hour=0} alarm[0]=30 //Бесконечный цикл
В Draw делаем так, как написано в статье Как сделать электронные часы в реальном времени. :-\Надеюсь, у вас получится. Не забудьте сделать комнату любого размера, годится 100 на 30 пикселей.
Обратный таймер.
Сейчас я научу, как сделать обратный таймер, т.е. часы, где время идет в обратном порядке. Этот пример может пригодится в играх на время.
В Create пишем код:
Код
global.hour=0 // Ну часы убрать можно global.minute=5 global.second=10 alarm[0]=30 // Или alarm[0]=room_speed
В alarm[0] пишем код:
Код
global.second-=1 // -1 секунда каждую секунду if global.second<0 // Если секунд меньше 0, то... {global.second=59;global.minute-=1} if global.minute<0 // Если минут меньше 0, то... {global.minute=59;global.hour-=1} if global.hour<0 // Если часов меньше 0, то... {game_end()} // Конец игры alarm[0]=30 // Бесконечный цикл
Примечание: если у вас миссия, допустим, на 5 минут, то часы писать и не надо. Напишите вместо того кода, что сверху, такой код:
Код
global.second-=1 // -1 секунда каждую секунду if global.second<0 // Если секунд меньше 0, то... {global.second=59;global.minute-=1} if global.minute<0 // Если минут меньше 0, то... {game_end()} // Конец игры alarm[0]=30 // Бесконечный цикл
Теперь осталось только перечитать 1 статью насчет Draw и комнаты У вас все получилось? Поздравляем! Теперь вы знаете, как сделать часы и таймер в игре!
Здравствуйте! Я хочу научить вас, как сделать механические часы, то есть часы с циферблатом и стрелками, указывающими на время. Итак, начинаем.
Для начала… Графическая статья Сначала надо загрузить спрайты стрелок, цифр, фона и кнопки. Одно важное замечание: когда вы загрузите спрайты стрелок, надо в окошке «Origin» в поле «Y» написать высоту, то есть «Height». Если вы это не сделаете, то новая минута будет начинаться не там, где цифра 12, а там, где цифра 6.
Сейчас делаем объекты и вставляем туда все спрайты, которые мы загрузили. Назовите объект с часовой стрелкой «h», с минутной – «m», с секундной – «s».
Немного о кодах: image_angle – угол наклона спрайта объекта. alarm[0…11] – полезное действие, с которым вы можете познакомится на многих уроках, в том числе и в уроке «Как сделать электронные часы (таймер)» current_second (или _minute, _hour, _day, _week и т.д.) – отображает нынешнею секунду(минуту, час, день, неделю и т.д.) get_integer - использует число, которое вводит пользователь программы
Теперь начинается самое ответственное. Создаем комнату размером 200 на 160 (На размер фона. У меня был размер фона 200 на 160 пикселей, вот и комната такого же размера). Ставим цифорки, в середине «кнопку». Ставим нижними частями стрелки на кнопку. Тут важную роль играет глубина объектов. У цифр надо поставить глубину 1, у фона глубину 2. У «кнопки» глубину минус 1. Обставляем комнату, фон ставим в верхнем правом углу, кнопку помещаем в центр, цифры как на часах: цифры 12, 3, 6 и 9 соответственно вверху, справа, внизу и слева. Между ними по две цифры. Элементарно. Если возникнут трудности с постановкой объектов, можно изменить поля Snap X и Snap Y в верхней части редактирования комнаты на 1 (по умолчанию там 16) и ставить объекты куда угодно.
Сделали? Молодцы! Теперь самое интересное! Пишем коды, которые заставят двигаться время!!!
Как сделать механические часы в реальном времени. Открываем объект «h» и в Сreate пишем код:
image_angle=-current_hour*30 alarm[0]=30 //Бесконечный цикл
В объекте «m» в Create пишем код:
Код
image_angle=-current_minute*6 alarm[0]=30
В :gm125:(Alarm[0]) абсолютно то же самое.
В объекте «s» в Create пишем код:
Код
image_angle=-current_second*6 alarm[0]=30
В Alarm[0] тоже этот код.
Как сделать механические часы с указанием времени. В прошлой статье мы делали часы в реальном времени. Сейчас мы сделаем часы с указанием времени, где надо ввести час, минуту, секунду.
В Alarm[0] то же самое, только без верхней строчки.
Теперь надо сделать так, чтобы время регулировалось. Это нетрудно. Вспоминаем предыдущий урок. Вспомнили? А теперь добавим объект «controller» и в Create пишем всего одну строчку:
Код
alarm[0]=30
А в Alarm[0] пишем код из предыдущего урока:
Код
global.second+=1 if global.second>59 {global.second=1;global.minute+=1} if global.minute>59 {global.minute=1;global.hour+=1} if global.hour>12 {global.hour=0} alarm[0]=30
Запускаем и радуемся успехам!
Как создать тир в Game Maker Во избежание путаницы спрайт с патроном называем "patron", а звук выстрела - "vistrel". На этом заканчиваем графическую часть и начинаем программистскую часть. Создаем объект "controller". В Create пишем код:
Код
global.pula=15 // Это кол-во пуль global.ochki=0 // Это кол-во очков alarm[0]=room_speed*2 // через пару секунд наступает нулевой alarm
Еще открываем вкладку "extra", находим картинку с желтым курсором и ставим его в тот же Create. Ставим курсором спрайт с прицелом, во второй строчке ничего не изменяем.
Добавляем alarm[0] и пишем код:
Код
instance_create(random(x),random(y),banka) // banka - это другой объект, поэтому не волнуемся. Про него я тоже расскажу. alarm[0]=room_speed*2
Добавляем Mouse/Global Mouse/Global left pressed (так что должно выглядеть как Glob Left pressed); и пишем код:
Код
global.pula-=1 // При КАЖДОМ нажатии пуль становится на 1 меньше if global.pula=0 // Если пуль нет, то... {show_message("Вы набрали "+string(global.ochki)+" очков (очка)!");game_end()} // Можно поставить и не конец игры, а рестарт игры, или что-то еще, как хотите
Теперь наступила часть рисования очков и пуль! Выбираем новый шрифт для игры и называем его "game_font" Добавляем Draw и пишем код:
Код
draw_set_font(game_font) // Используем этот шрифт draw_set_color(c_white) //Шрифт окрашиваем в белый цвет draw_text(14,4,string(global.pula)) // Рисуем значение пуль draw_text(5,20,"Очки: "+string(global.ochki)) // Рисуем значение очков draw_sprite(patron,1,6,6) // Вот зачем надо было спрайт пули называть "patron"! (Рисуем пулю)
Теперь с "controller" закончено! Добавляем объект и называем его "banka", ставим спрайт банки. И вперед, делать банки для уничтожения!
В Create банки пишем код:
Код
speed=-10 alarm[0]=room_speed*2
В alarm[0] пишем код:
Код
speed=10 alarm[1]=room_speed*2
В alarm[1] пишем код:
Код
speed=-10 alarm[0]=room_speed*2
В Left pressed пишем код:
Код
global.ochki+=1// Получаем балл global.pula+=2 // Таким образом, добавляем пулю sound_play(vistrel) // Играем звук выстрела по банке instance_destroy() // Уничтожаем банку
Вот и покончено с кодами! Оставлось добавить комнату и расположить все правильно.
При тире надо учитывать размер фона. У моего фона размер 60 на 500, поэтому делаем комнату такого же размера и ставим бэкграундом фон, чтобы все подошло. Объект "controller" ставим в нижнем левом углу, чтобы банки образовывались по всей комнате. Вот и все. Мы сделали тир со стрельбой по банкам.
Здравствуйте! Этот урок я сделал для того, чтобы показать, как можно легко и просто работать с массивами и использовать их для генерации карт, их отдельных частей (ручейки, озера, материки), и просто для того, чтобы объяснить юзерам, как использовать массивы.
1. Вступление.
Во многих играх программисты рассматривают задачи, в которых использовалось небольшое количество данных. Для каждого они создают отдельную ячейку памяти с уникальным именем. Однако зачастую приходится работать с большим количеством данных. Для каждого из них требуется отдельная ячейка памяти - это понятно и естественно (два литра воды не поместятся в один стакан). А вот указывать для каждой ячейки отдельное имя - неудобно. Как быть? Один из методов решения - такой: выделим для этих данных область ячеек памяти и назовем всю область данным именем. Для того, чтобы к каждой ячейке можно было обратиться, пронумеруем ячейки по порядку. Таким образом, для обращения к определенной ячейке нужно указать название всей конструкции и номер ячейки в ней.
Массив - совокупность данных, хранящихся в ячейках памяти и имеющих общее имя. Ячейки называются элементами массива. Пример массива:
Код
massive[0]=20 massive[1]=76 massive[2]='Здорово!'
2. Цикл "for".
Чаще всего массивы пишутся с циклом "for". Этот цикл - самый удобный для массивов. Поэтому его нужно выучить. Цикл "for" выглядит так:
Код
for (<выражение>;<проверка>;<выражение>) { <действия> }
Сначала объявляется 1-е выражение, потом проверяется на истинность равенство, записанное в <проверке>, если равенство истинно - дальше выполняются <действия>, потом выполняется 2-е выражение, после чего цикл повторяется. Допустим, есть такой код:
Код
n=10 for (z=1;z<n;z+=1) { <действия> }
Переменную "z" можно и не объявлять, оно уже объявлено в цикле "for". Канва кода такова - пока переменная "z" не будет равна или больше переменной "n", действия будут выполняться. После 1-го выполнения действия "z" равняется уже не 1, а 2; снова идет проверка "z<n". Примечание: Таким образом, как вы уже заметили, действия будут выполняться 10 раз. В некоторых заурядных случаях (создание множества объектов, добавление здоровья) нагружать процессор множеством проверок не надо! Достаточно просто написать:
Код
repeat 10 {<действия>} // действия повторяются 10 раз
Этот оператор - пример простого создания нескольких объектов или выполнения нескольких действий. :whistling:
Таким образом, вы получили представление о массивах и цикле, с которым массив выполняется. Если вы готовы идти дальше - смело читайте следующий раздел!
3. Двумерные массивы
Массивы бывают одномерные, двумерные и трехмерные (это для 3D игр). Во 2 разделе мы рассмотрели одномерные массивы. Это означает, что массивы имеют одно измерение - кол-во элементов. Визуально можно представить себе такие массивы как строку элементов. Однако наш мир не ограничивается одним измерением. В этом разделе мы рассмотрим массивы, которые можно визуально представить как таблицу. Именно с помощью двумерных массивов можно сгенерировать карту, сделать шашки и шахматы и многое другое. Местоположение каждого элемента двумерного массива определяется индексом строки и индексом столбца.
На практике мы создадим матрицу 5х4, задав значения ее элементов с помощью рандома и сделаем простейшую генерацию карты. При этом будем использовать вложенные циклы "for": внешний цикл будет проходить по строкам (х), а внутренний - по столбцам (у).
3.1. Генерация карты
Приступаем к генерации карты с помощью цикла "for" и двумерных массивов. Рисуем желтый квадрат 16х16 пикселей и красный квадрат такого же размера. Называем желтый квадрат spr_yellow, красный - spr_red. Делаем объект obj_karta. У объекта в Create пишем небольшой код:
Код
n=5 // Строки (x) m=4 // Столбцы (y) karta[0,0]=0 for (n=0; n<5; n+=1) // Внешний цикл {for (m=0; m<4; m+=1) // Внутренний цикл {karta[n,m]=0}} // Раскрашиваем пространство желтыми квадратами // Все пространство окрашивается желтым цветом, и только потом клепаем красные "островки"
nn=irandom(n) mm=irandom(m) // Берем случайную точку в пределах карты razmer=10 // Кол-во квадратов, максимальное(!) для красных (половина из всех 20) for (r=1;r<razmer;r+=1) { karta[nn,mm]=1 // Раскрашиваем часть желтого пространства красным.
switch (irandom(3)) // И от этой точки берем случайное расстояние и тоже раскрашиваем другую точку. {case 0: nn-=1; if (nn == -1){nn = 0} break; case 1: nn+=1; if (nn == n+1){nn = n} break; case 2: mm+=1; if (mm == m+1){mm = m} break; case 3: mm-=1; if (mm == -1){mm = 0} break;} }
В Draw пишем:
Код
for (n=0; n<5; n+=1) // Внешний цикл {for (m=0; m<4; m+=1) // Внутренный цикл {if karta[n,m]=0 draw_sprite(spr_yellow,0,n*16,m*16) // Окрашиваем желтым цветом всё. if karta[n,m]=1 draw_sprite(spr_red,0,n*16,m*16)}} // И потом красным цветом все остальное. // n*16 и m*16 написано, потому что размер квадратов - 16х16 пикселей.
Сгенерировать карту просто и легко! Практика: сделайте не 5х4 ячеек, а 20х20 (поменяв вид комнаты). Поэкспериментируйте с переменной "razmer". Создайте воду и другие виды суши (лед, пустыня) вместо красного и желтого пространства. Не забудьте - сначала заливаем все водой, потом создаем сушу так же, как в коде.
Вот и подошел к концу наш урок о массивах. Я надеюсь, что вы все поняли и запомнили.
Сообщение отредактировал Izaron - Четверг, 17 Января 2013, 14:33