Elite Games - Свобода среди звезд!
.
ВНИМАНИЕ!
Наша конференция посвящена космической тематике и компьютерным играм.
Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!

  » Game Maker вопросница |
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Search | Conference rules | Album | Register | Pilots list | Profile | Log in to check your private messages | Log in

   Page 1 of 1
 
Поиск в этой теме:
Канал Игры Мечты: «Game Maker вопросница»
Else
 140 EGP


Рейтинг канала: 1(4)
: 29
Posts: 313
Location: Тверская обл.
Joined: 08 Nov 2007
В этом разделе есть много тем, объеденёных общим смыслом - Помогите разработать игру. Давайте в этой теме поможем друг-другу разобраться в хорошой (на мой взгляд) среде програмирования игр Game Maker.

Для начала я хотел задать такой вопрос: Как в этой среде нормально организовать текстовые сообщения. т.е. вывод текстовых сообщений, запрос какой-либо информации (текстовой).

И немного FAQ
Как организовать начальные данные в игре
В играх есть много данных значения которых необходимо учитывать с самого начала, допустим есть классы кораблей: Легкий истребитель, Средний истребитель и т.д. с жестко заданными характеристиками, можно конечно в теле программы при запуске сделать код типа
Code:
Name[1]='Легкий истребитель'
speed[1]=100
cargo[1]=40
Name[2]='Средний истребитель'
speed[2]=80
cargo[2]=65
...


это один, но не самый лучший путь, на мой взгляд лучше применять ini файлы, для этого в папке с игрой создаем файл с расширением ini, например tipship.ini, в блокноте открываем и заносим в него.
Code:
[n_ship]
n=2

[ship1]
name=Легкий истребитель
speed=100
cargo=40

[ship2]
name=Средний истребитель
speed=80
cargo=65


где переменная n - количество описанных кораблей

в самой программе делаем код
Code:

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 в файле на кол-во доступных кораблей и внести информацию по ним по установленому образцу в файл.
Данные операторы хорошо использовать для организации сэйвов игры, записи текущих настроек и много другого.
_________________
Интересно, а пить водку в полночь, считается после работы или до?

Last edited by Else on 16:02 10-01-2008; edited 2 times in total
    Posted: 14:08 10-01-2008   
Kalembas
 1335 EGP


Няшка
Рейтинг канала: 2(24)
: 263
Posts: 18999
Location: Санкт-Петербург
Joined: 21 Mar 2003
Else wrote:
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.
_________________
Делаешь – не бойся, боишься – не делай, а сделал – не сожалей...
    Posted: 15:34 10-01-2008   
Else
 140 EGP


Рейтинг канала: 1(4)
: 29
Posts: 313
Location: Тверская обл.
Joined: 08 Nov 2007
Сорри, опечатка вышла.
Исправил
_________________
Интересно, а пить водку в полночь, считается после работы или до?

Last edited by Else on 16:15 10-01-2008; edited 1 time in total
    Posted: 15:45 10-01-2008   
Kalembas
 1335 EGP


Няшка
Рейтинг канала: 2(24)
: 263
Posts: 18999
Location: Санкт-Петербург
Joined: 21 Mar 2003
Да нет. Это не опечатка, это явно смысловая ошибка, так что:
Kalembas wrote:
будь внимательнее с этим

_________________
Делаешь – не бойся, боишься – не делай, а сделал – не сожалей...
    Posted: 15:47 10-01-2008   
Варсик
 546 EGP


Рейтинг канала: 4(81)
: 117
Posts: 4041
Location: Москва
Joined: 22 Dec 2002
Кальмарик, не пинай его... Он пытается помочь!

Кстати, а ты случаем не КальМарик? (Щютка)
_________________
WARNING: By reading this post you accept that this post is genius.

Last edited by Варсик on 22:49 10-01-2008; edited 1 time in total
    Posted: 22:49 10-01-2008   
Kalembas
 1335 EGP


Няшка
Рейтинг канала: 2(24)
: 263
Posts: 18999
Location: Санкт-Петербург
Joined: 21 Mar 2003
Варстоун, с твоего позволения: Калем или Калембас.
Никто никого не пинает. Наоборот, я помогаю человеку не запутаться в своих же ошибках. Одно дело если просто опечатка, другое дело, если идет недопонимание процесса.
В будущем это освободит от лишних часов дебага в поисках неотлавливаемой компилятором смысловой ошибки.
Внимательность, внимательность и еще раз... что?... верно Улыбка
_________________
Делаешь – не бойся, боишься – не делай, а сделал – не сожалей...
    Posted: 00:06 11-01-2008   
Else
 140 EGP


Рейтинг канала: 1(4)
: 29
Posts: 313
Location: Тверская обл.
Joined: 08 Nov 2007
Каюсь, в моей проге была ошибка, часть кода скопировал и не посмотрел.

Поправил, что-б не вводить в заблуждение.

Так-что, не кому тема не интересна?
_________________
Интересно, а пить водку в полночь, считается после работы или до?

Last edited by Else on 13:12 11-01-2008; edited 2 times in total
    Posted: 08:34 11-01-2008   
Jurec
 348 EGP


Ведущий раздела
Рейтинг канала: 4(76)
: 102
Posts: 1441 Заблокирован
Location: Seattle
Joined: 25 Feb 2006
Else wrote:
в моей проге была ошибка


Else wrote:
n=ini_read_real('n_ship','n',1)

Мне кажется, или она осталась?
_________________
MOV topka, C++
    Posted: 12:51 11-01-2008   
Kalembas
 1335 EGP


Няшка
Рейтинг канала: 2(24)
: 263
Posts: 18999
Location: Санкт-Петербург
Joined: 21 Mar 2003
Юрец, не зацикливайся на этом. Все нормально.

Else wrote:
Так-что, не кому тема не интересна?

Отчего же? Если никто не ответил сразу, это не говорит что тема не интересна.
_________________
Делаешь – не бойся, боишься – не делай, а сделал – не сожалей...
    Posted: 14:01 11-01-2008   
SEMIONE
 70 EGP


Рейтинг канала: 1(6)
: 10
Posts: 58
Location: Москва
Joined: 03 Feb 2006
Ой, наверное опять чушь скажу...
Зачем добавлять корабль в массив, если можно средствами GM делать объект, который будет знать свои тип и запрашивать свои ТТХ, хранящиеся в объекте инициализаторе? С точки зрения GM на мой взгляд это будет рациональнее, чем использование GML для этих целей.
_________________
Бойся красивых интерфейсов!
    Posted: 13:45 12-01-2008   
Else
 140 EGP


Рейтинг канала: 1(4)
: 29
Posts: 313
Location: Тверская обл.
Joined: 08 Nov 2007
SEMIONE, если можно поподробнее, что имеешь ввиду
_________________
Интересно, а пить водку в полночь, считается после работы или до?
    Posted: 08:24 14-01-2008   
SEMIONE
 70 EGP


Рейтинг канала: 1(6)
: 10
Posts: 58
Location: Москва
Joined: 03 Feb 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 - элемент = первая строка, второй элемент = вторая строка ну иногда и подсортировывай почуть-чуть Улыбка
Вот зачем придумали в играх тексты и менюшки? И так моно на глаз догадаться, что на клаве жать и что произошло...
_________________
Бойся красивых интерфейсов!

Last edited by SEMIONE on 12:23 17-01-2008; edited 1 time in total
    Posted: 12:15 17-01-2008   
Else
 140 EGP


Рейтинг канала: 1(4)
: 29
Posts: 313
Location: Тверская обл.
Joined: 08 Nov 2007
Semione, неплохая идея, тенькс, буду юзать. Улыбка
_________________
Интересно, а пить водку в полночь, считается после работы или до?
    Posted: 16:36 17-01-2008   
Else
 140 EGP


Рейтинг канала: 1(4)
: 29
Posts: 313
Location: Тверская обл.
Joined: 08 Nov 2007
Организация кнопок

При программировании у меня возникла такая интересная проблема: Надо было сделать несколько кнопок, например "Новая игра", "Продолжить", "Выход" и сделать обработку событий на каждую кнопку. Делать отдельные объекты?, можно и так, но мы легких путей не ищем и врезультате все кнопки обрабатываются одним объектом. Для этого делаем комнату, делаем обьект кнопку и ставим несколько экземпляров объектов в комнате, вниз экрана, при наведении на объект пишится его ID номер, в событиях мыши объекта создаем событие например "no button", те событие происходит когда над объектом проходит мышь, пишем код:
Code:
switch (id)
{ case 100001: room_caption="Новая игра"; break;
  case 100002: room_caption="Продолжить игру"; break
  case 100003: room_caption="Конец игры"; break;}


и в результате наведении мыши нна кнопку мы получаем надпись в заглавии окна, таким - же образом можно организовать обработку нажатий на каждую отдельную кнопку.
Вопрос: как сделать так, чтоб при наведении на кнопку спрайт менялся, например для того чтоб надпись или рисунок на кнопке делался ярче или менял цвет с красного на зеленый.
_________________
Интересно, а пить водку в полночь, считается после работы или до?
    Posted: 11:02 21-01-2008   
SEMIONE
 70 EGP


Рейтинг канала: 1(6)
: 10
Posts: 58
Location: Москва
Joined: 03 Feb 2006
евент у обьекта MouseOver или както так, деиствие ChangeSprite и на спраит, можно юзать Изменение цвета спраита, но мне эти функции по изменению вида спраитов что-то не гуд, да и зделай лучше обьектами, а то глюков мона набрать много, можно ищо добавить анимацию того как она становиться ярче, тоесть в Шаге субимажу прировнять к переменной какойнить, а потом при маус овер увеличить на 1, а сбавлять её в шаге умножением на 0.95, вообщем играться можно зачотно с числами Улыбка
_________________
Бойся красивых интерфейсов!
    Posted: 11:16 21-01-2008   
ZEUStiger
 67 EGP


Рейтинг канала: 1(3)
: 12
Posts: 112
Location: Украина - Ужгород
Joined: 08 Jun 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 и там прописать такое:
Code:
if(mouse_x>=argument0&&mouse_x<=argument1&&mouse_y>=argument2&&mouse_y<=argument3){return true}else{return false}

Потом вызивать так:
Code:
if(mouse_inside_region(x-16,y,x+256,y+32)){...}


добавлено спустя 29 минут:
А вот кстати вариант решения кнопок меню:
В create:
Code:
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:
Code:
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:
Code:
for(i=1;i<=btn_max;i+=1){draw_text(x,y+(i-1)*btn_h,text[i])}


Надеюсь понятно, что весь прикол в том, что действие при нажатии мы записываем в значение переменной, а потом выполняем то, что там написано Хы...
_________________
Что бы учёные не делали, всегда найдутся люди которые превратят любое изобретение в оружие.

Last edited by ZEUStiger on 20:37 24-01-2008; edited 1 time in total
    Posted: 20:37 24-01-2008   
Else
 140 EGP


Рейтинг канала: 1(4)
: 29
Posts: 313
Location: Тверская обл.
Joined: 08 Nov 2007
ZEUStiger wrote:
Else, у тебя в коде один большой глюк. id указывает на id объекта, с которого оно (ид) вызивается, никак не ид объекта под курсором. Объект под курсором вызивается функцией instance_position(...) или instance_place(...)


ZEUStiger, а в чём конкретно может проявляется глюк? Есть объект "кнопка", в игре присутствуют несколько таких обьектов, событие мыши "No buttom" принадлежит объекту, соответственно обрабатывается ID объекта, а switch выбирает какой конкретно объект вызвал событие. Такая конструкция работает, проверял. Или есть что-то, что было не учтено? И что может вызвать глюк. Подозрение.

Code:
switch(instance_position(mouse_x,mouse_y,menubutton))

Ага, попробую так.
_________________
Интересно, а пить водку в полночь, считается после работы или до?

Last edited by Else on 09:58 25-01-2008; edited 1 time in total
    Posted: 09:38 25-01-2008   
ZEUStiger
 67 EGP


Рейтинг канала: 1(3)
: 12
Posts: 112
Location: Украина - Ужгород
Joined: 08 Jun 2006
id - это id объекта, с которого он вызивается. То есть, если ты вызываеш его из под к примеру obj_mouse, то он и введёт значение ид этого obj_mouse.

пиши так:
Code:
switch(instance_position(mouse_x,mouse_y,menubutton))

Создай объект menubutton и поставь всем кнопкам parent: на него.
_________________
Что бы учёные не делали, всегда найдутся люди которые превратят любое изобретение в оружие.
    Posted: 09:46 25-01-2008   
Канал Игры Мечты: «Game Maker вопросница»
 
  
Display posts from previous: 
View previous topic | View next topic |
К списку каналов | Наверх страницы
Цитата не в тему: После интеграшки — 2600ХТ будетЬ просто таки летать. особенно, если память - GDDR3. ну а если GDDR2, то — таки тоже будетЬ летать, но нызЭнько-нызЭнько. (Ы в ЖК)

  » Game Maker вопросница |
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18