ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Game Maker вопросница | страница 1 |
 |
Страница 1 из 1 |
|
|
|
Канал Игры Мечты: «Game Maker вопросница» |
|
|
Else
140 EGP
  Рейтинг канала: 1(4) Репутация: 29 Сообщения: 313 Откуда: Тверская обл. Зарегистрирован: 08.11.2007
 |
|
В этом разделе есть много тем, объеденёных общим смыслом - Помогите разработать игру. Давайте в этой теме поможем друг-другу разобраться в хорошой (на мой взгляд) среде програмирования игр Game Maker.
Для начала я хотел задать такой вопрос: Как в этой среде нормально организовать текстовые сообщения. т.е. вывод текстовых сообщений, запрос какой-либо информации (текстовой).
И немного FAQ
Как организовать начальные данные в игре
В играх есть много данных значения которых необходимо учитывать с самого начала, допустим есть классы кораблей: Легкий истребитель, Средний истребитель и т.д. с жестко заданными характеристиками, можно конечно в теле программы при запуске сделать код типа
Код: |
Name[1]='Легкий истребитель'
speed[1]=100
cargo[1]=40
Name[2]='Средний истребитель'
speed[2]=80
cargo[2]=65
... |
это один, но не самый лучший путь, на мой взгляд лучше применять ini файлы, для этого в папке с игрой создаем файл с расширением ini, например tipship.ini, в блокноте открываем и заносим в него.
Код: |
[n_ship]
n=2
[ship1]
name=Легкий истребитель
speed=100
cargo=40
[ship2]
name=Средний истребитель
speed=80
cargo=65
|
где переменная n - количество описанных кораблей
в самой программе делаем код
Код: |
ini_open('tipship.ini');
n=ini_read_real('n_ship','n',1)
for (i=1;i<=n;i+=1)
{ShSect='Ship'+string(i);
//Создание массива кораблей
global.ShName[i]=ini_read_string(ShSect,'Name','Инкогнито');
global.ShSpeed[i]=ini_read_real(ShSect,'Speed',1);
global.ShCargo[i]=ini_read_real(ShSect,'Cargo',1);
} |
Этим мы добьемся создания массивов с нужными нам параметров из файла
Преимущества такого метода заключается в том
1)Мы не загружаем код игры лишними кодами,
2)Параметры легкодоступны, даже если не открыта среда разработки, легко добавить новые параметры (надо лишь изменить число n в файле на кол-во доступных кораблей и внести информацию по ним по установленому образцу в файл.
Данные операторы хорошо использовать для организации сэйвов игры, записи текущих настроек и много другого.
_________________ Интересно, а пить водку в полночь, считается после работы или до?
Последний раз редактировалось: Else (16:02 10-01-2008), всего редактировалось 2 раз(а) |
|
|
Kalembas
1335 EGP
     Рейтинг канала: 2(24) Репутация: 263 Сообщения: 18999 Откуда: Санкт-Петербург Зарегистрирован: 21.03.2003
 |
|
Else : |
n=ini_read_real('n_ship','n',0)
for (i=1;i<=n;i+=1)
|
Я в глаза не видел Game Maker и не знаю какие в нем предусмотрены договоренности.
Но если я правильно понимаю смысл строки:
n=ini_read_real('n_ship','n',0) - то n будет равно 'n' из инишки, или, если n там не определена (равна NULL), то 0 - по дефолту, согласно последнему аргументу функции ini_read_real.
Так вот, при n = 0 в обычной IDE условие твоего цикла:
for (i=1;i<=n;i+=1) в лучшем случае, приведет к "вечному" циклу, поскольку условие остановки не будет выполнено никогда. Что собственно приведет к крашу твоей программы.
Возможно в языке Game Maker - все иначе, но все таки будь внимательнее с этим. В данном конкретном случае, тебе необходимо в качетсве дефолтного значения ставить "1", поскольку, судя по логике, в твоем массиве всегда будет как минимум один корабль: а именно с именем "Инкогнито" и ТТХ: 1,1.
_________________ Делаешь – не бойся, боишься – не делай, а сделал – не сожалей... |
|
|
Else
140 EGP
  Рейтинг канала: 1(4) Репутация: 29 Сообщения: 313 Откуда: Тверская обл. Зарегистрирован: 08.11.2007
 |
|
Сорри, опечатка вышла.
Исправил
_________________ Интересно, а пить водку в полночь, считается после работы или до?
Последний раз редактировалось: Else (16:15 10-01-2008), всего редактировалось 1 раз |
|
|
Kalembas
1335 EGP
     Рейтинг канала: 2(24) Репутация: 263 Сообщения: 18999 Откуда: Санкт-Петербург Зарегистрирован: 21.03.2003
 |
|
Да нет. Это не опечатка, это явно смысловая ошибка, так что:
Kalembas : |
будь внимательнее с этим
|
_________________ Делаешь – не бойся, боишься – не делай, а сделал – не сожалей... |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Кальмарик, не пинай его... Он пытается помочь!
Кстати, а ты случаем не КальМарик? (Щютка)
_________________ WARNING: By reading this post you accept that this post is genius.
Последний раз редактировалось: Варсик (22:49 10-01-2008), всего редактировалось 1 раз |
|
|
Kalembas
1335 EGP
     Рейтинг канала: 2(24) Репутация: 263 Сообщения: 18999 Откуда: Санкт-Петербург Зарегистрирован: 21.03.2003
 |
|
Варстоун, с твоего позволения: Калем или Калембас.
Никто никого не пинает. Наоборот, я помогаю человеку не запутаться в своих же ошибках. Одно дело если просто опечатка, другое дело, если идет недопонимание процесса.
В будущем это освободит от лишних часов дебага в поисках неотлавливаемой компилятором смысловой ошибки.
Внимательность, внимательность и еще раз... что?... верно
_________________ Делаешь – не бойся, боишься – не делай, а сделал – не сожалей... |
|
|
Else
140 EGP
  Рейтинг канала: 1(4) Репутация: 29 Сообщения: 313 Откуда: Тверская обл. Зарегистрирован: 08.11.2007
 |
|
Каюсь, в моей проге была ошибка, часть кода скопировал и не посмотрел.
Поправил, что-б не вводить в заблуждение.
Так-что, не кому тема не интересна?
_________________ Интересно, а пить водку в полночь, считается после работы или до?
Последний раз редактировалось: Else (13:12 11-01-2008), всего редактировалось 2 раз(а) |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Else : |
в моей проге была ошибка
|
Else : |
n=ini_read_real('n_ship','n',1)
|
Мне кажется, или она осталась?
_________________ MOV topka, C++ |
|
|
Kalembas
1335 EGP
     Рейтинг канала: 2(24) Репутация: 263 Сообщения: 18999 Откуда: Санкт-Петербург Зарегистрирован: 21.03.2003
 |
|
Юрец, не зацикливайся на этом. Все нормально.
Else : |
Так-что, не кому тема не интересна?
|
Отчего же? Если никто не ответил сразу, это не говорит что тема не интересна.
_________________ Делаешь – не бойся, боишься – не делай, а сделал – не сожалей... |
|
|
SEMIONE
70 EGP
  Рейтинг канала: 1(6) Репутация: 10 Сообщения: 58 Откуда: Москва Зарегистрирован: 03.02.2006
 |
|
Ой, наверное опять чушь скажу...
Зачем добавлять корабль в массив, если можно средствами GM делать объект, который будет знать свои тип и запрашивать свои ТТХ, хранящиеся в объекте инициализаторе? С точки зрения GM на мой взгляд это будет рациональнее, чем использование GML для этих целей.
_________________ Бойся красивых интерфейсов! |
|
|
Else
140 EGP
  Рейтинг канала: 1(4) Репутация: 29 Сообщения: 313 Откуда: Тверская обл. Зарегистрирован: 08.11.2007
 |
|
SEMIONE, если можно поподробнее, что имеешь ввиду
_________________ Интересно, а пить водку в полночь, считается после работы или до? |
|
|
SEMIONE
70 EGP
  Рейтинг канала: 1(6) Репутация: 10 Сообщения: 58 Откуда: Москва Зарегистрирован: 03.02.2006
 |
|
В гейммеикер как я помню входил не токо GML, но и понятие конструктора обьектов. Создай невидимый обьект(назови его Info) и запихай его в Roomу, если не ошибаюсь в event "Create" заноси переменные типа таких: Lightfighter_speed, Freighter_armor, Capital1_cargo.
Вот, стартовые значения есть.
Если это типа стратеии то создай "цветочницу", то есть в Create обьекта Unit запихай переменную ShipType. Как юнит отсроился(предположим) сообщай ему значение на ShipType его типа.
Осталось самое простое, реализовать разветвление( ) через конструктор обьектов или тотже GML. Тоесть, если ТИП карабля Freighter, то за своим карго и скоростью обращяеться так - info.Freighter_speed и info.Freighter_cargo. Всо с учётом регистра.
P.S. Если опять всо перемешал я и ничо непонятно, то мона в личке спросить.
Ммм... Про тексть... Ох криво у него с этим. Создай обьект какойнить, который перемещаетья вместе с экраном, ну и пусть рисует текст те с масива. 1 - элемент = первая строка, второй элемент = вторая строка ну иногда и подсортировывай почуть-чуть
Вот зачем придумали в играх тексты и менюшки? И так моно на глаз догадаться, что на клаве жать и что произошло...
_________________ Бойся красивых интерфейсов!
Последний раз редактировалось: SEMIONE (12:23 17-01-2008), всего редактировалось 1 раз |
|
|
Else
140 EGP
  Рейтинг канала: 1(4) Репутация: 29 Сообщения: 313 Откуда: Тверская обл. Зарегистрирован: 08.11.2007
 |
|
Semione, неплохая идея, тенькс, буду юзать.
_________________ Интересно, а пить водку в полночь, считается после работы или до? |
|
|
Else
140 EGP
  Рейтинг канала: 1(4) Репутация: 29 Сообщения: 313 Откуда: Тверская обл. Зарегистрирован: 08.11.2007
 |
|
Организация кнопок
При программировании у меня возникла такая интересная проблема: Надо было сделать несколько кнопок, например "Новая игра", "Продолжить", "Выход" и сделать обработку событий на каждую кнопку. Делать отдельные объекты?, можно и так, но мы легких путей не ищем и врезультате все кнопки обрабатываются одним объектом. Для этого делаем комнату, делаем обьект кнопку и ставим несколько экземпляров объектов в комнате, вниз экрана, при наведении на объект пишится его ID номер, в событиях мыши объекта создаем событие например "no button", те событие происходит когда над объектом проходит мышь, пишем код:
Код: |
switch (id)
{ case 100001: room_caption="Новая игра"; break;
case 100002: room_caption="Продолжить игру"; break
case 100003: room_caption="Конец игры"; break;} |
и в результате наведении мыши нна кнопку мы получаем надпись в заглавии окна, таким - же образом можно организовать обработку нажатий на каждую отдельную кнопку.
Вопрос: как сделать так, чтоб при наведении на кнопку спрайт менялся, например для того чтоб надпись или рисунок на кнопке делался ярче или менял цвет с красного на зеленый.
_________________ Интересно, а пить водку в полночь, считается после работы или до? |
|
|
SEMIONE
70 EGP
  Рейтинг канала: 1(6) Репутация: 10 Сообщения: 58 Откуда: Москва Зарегистрирован: 03.02.2006
 |
|
евент у обьекта MouseOver или както так, деиствие ChangeSprite и на спраит, можно юзать Изменение цвета спраита, но мне эти функции по изменению вида спраитов что-то не гуд, да и зделай лучше обьектами, а то глюков мона набрать много, можно ищо добавить анимацию того как она становиться ярче, тоесть в Шаге субимажу прировнять к переменной какойнить, а потом при маус овер увеличить на 1, а сбавлять её в шаге умножением на 0.95, вообщем играться можно зачотно с числами
_________________ Бойся красивых интерфейсов! |
|
|
ZEUStiger
67 EGP
 Рейтинг канала: 1(3) Репутация: 12 Сообщения: 112 Откуда: Украина - Ужгород Зарегистрирован: 08.06.2006
 |
|
Даже и не заметил, что темка появилась...
Во-первых, я б очень порекомендовал при движении экрана интерфейс (кнопки, меню, текст и т.д.) делать не объектами со спрайтами, а отрисовывать спрайты ДРАВингом. Проблема в том, что движение экрана судя по всему обрабатывается уже после перемещения объектов, и в результате будет, что спрайты отстают от экрана. С рисованием такого не будет.
Тепер про организацию кнопок. Много спрайтов маздай. . Если кнопка не анимирована, то можно закинуть несколько вариантов кнопки в один спрайт, как анимацию. Сама анимация останавливается image_speed=0. Плюс ко всему есть переменная image_blend отвечающая за цвет спрайта. При c_white - он нормального цвета, при c_black - чёрный. Другие цвета будут менять цвет спрайта. Сам спрайт можно менять переменной sprite_index, получать название спрайта - sprite_get_name(sprite_index)
Else, у тебя в коде один большой глюк. id указывает на id объекта, с которого оно (ид) вызивается, никак не ид объекта под курсором. Объект под курсором вызивается функцией instance_position(...) или instance_place(...)
Ну и напоследок, рекомендую создать скрипт с названием например mouse_inside_region и там прописать такое:
Код: |
if(mouse_x>=argument0&&mouse_x<=argument1&&mouse_y>=argument2&&mouse_y<=argument3){return true}else{return false} |
Потом вызивать так:
Код: |
if(mouse_inside_region(x-16,y,x+256,y+32)){...} |
добавлено спустя 29 минут:
А вот кстати вариант решения кнопок меню:
В create:
Код: |
text[0]='New Game';action[0]='room_goto(RoomGame)'
text[1]='Load Game';action[1]='room_goto(RoomLoad)'
text[2]='Options';action[2]='room_goto(RoomOpt)'
text[3]='Exit';action[3]='game_end()'
btn_w=128
btn_h=32
btn_selected=-1
btn_max=3 |
В step:
Код: |
for(i=1;i<=btn_max;i+=1){if(mouse_inside_region(x,y+(i-1)*btn_h,x+btn_w,y+(i)*btn_h)&&mouse_button=mb_left){execute_string(action[i])}} |
B draw:
Код: |
for(i=1;i<=btn_max;i+=1){draw_text(x,y+(i-1)*btn_h,text[i])} |
Надеюсь понятно, что весь прикол в том, что действие при нажатии мы записываем в значение переменной, а потом выполняем то, что там написано
_________________ Что бы учёные не делали, всегда найдутся люди которые превратят любое изобретение в оружие.
Последний раз редактировалось: ZEUStiger (20:37 24-01-2008), всего редактировалось 1 раз |
|
|
Else
140 EGP
  Рейтинг канала: 1(4) Репутация: 29 Сообщения: 313 Откуда: Тверская обл. Зарегистрирован: 08.11.2007
 |
|
ZEUStiger : |
Else, у тебя в коде один большой глюк. id указывает на id объекта, с которого оно (ид) вызивается, никак не ид объекта под курсором. Объект под курсором вызивается функцией instance_position(...) или instance_place(...)
|
ZEUStiger, а в чём конкретно может проявляется глюк? Есть объект "кнопка", в игре присутствуют несколько таких обьектов, событие мыши "No buttom" принадлежит объекту, соответственно обрабатывается ID объекта, а switch выбирает какой конкретно объект вызвал событие. Такая конструкция работает, проверял. Или есть что-то, что было не учтено? И что может вызвать глюк.
Код: |
switch(instance_position(mouse_x,mouse_y,menubutton)) |
Ага, попробую так.
_________________ Интересно, а пить водку в полночь, считается после работы или до?
Последний раз редактировалось: Else (09:58 25-01-2008), всего редактировалось 1 раз |
|
|
ZEUStiger
67 EGP
 Рейтинг канала: 1(3) Репутация: 12 Сообщения: 112 Откуда: Украина - Ужгород Зарегистрирован: 08.06.2006
 |
|
id - это id объекта, с которого он вызивается. То есть, если ты вызываеш его из под к примеру obj_mouse, то он и введёт значение ид этого obj_mouse.
пиши так:
Код: |
switch(instance_position(mouse_x,mouse_y,menubutton)) |
Создай объект menubutton и поставь всем кнопкам parent: на него.
_________________ Что бы учёные не делали, всегда найдутся люди которые превратят любое изобретение в оружие. |
|
|
|
|
|
Канал Игры Мечты: «Game Maker вопросница» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Мы так не договаривались нифига! Тока я, панимаишь, в образ вошла и фсе такое, а мне тут заявляют, что кина не будет! (возмущается Nadin)
|
» Game Maker вопросница | страница 1 |
|