Четверг, 14 Ноября 2024, 18:48

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос - Ответ (Game Maker)
ReanДата: Понедельник, 05 Декабря 2016, 00:59 | Сообщение # 5861
участник
Сейчас нет на сайте
ProsstoBRO, здесь не всё так однозначно. Наиболее очевидны два варианта: написать свою UI-систему, которая будет обрабатывать нажатия, выводить в DrawGUI все необходимые элементы, в общем, полностью функционирующий интерфейс.
Плюсы: Удобная, гибкая, понятная (разработчику) система UI
Минусы: Сам процесс написания такой системы

Менее грандиозный вариант: использовать для реализации простой объект (например, "кнопка"). Чтобы кнопка реагировала на мышь и отображалась в том же месте - необходимо её перемещать вместе с активным View. Ну и конечно, не забывать засовывать в Depth пониже, чтобы отрисовывалась поверх других объектов, потому как рисоваться она будет в простом Draw.
Плюсы: Удобно при нечастом использовании, при относительной простоте организации интерфейса, лёгкость реализации
Минусы: Некоторые сложности при большом количестве кнопок, возможны проблемы масштабирования под разные размеры окна/экрана

Добавлено (05 декабря 2016, 00:59)
---------------------------------------------
И забыл третий вариант: воспользоваться бесплатным ассетом из Marketplace. Например, ZUI Engine. Плюсов и минусов не знаю - не пользовался, но почему бы нет?

Сообщение отредактировал Rean - Понедельник, 05 Декабря 2016, 00:52
dildo_bomberДата: Понедельник, 05 Декабря 2016, 14:03 | Сообщение # 5862
частый гость
Сейчас нет на сайте
delete

Добавлено (05 декабря 2016, 14:03)
---------------------------------------------
всем привет. у меня есть один вопрос по поводу сохранений внешних.
у меня это реализовано так:
загрузка: в контроллере в create

if file_exists('save.sav' ;)
{
load=file_text_open_read('save.sav' ;) ;
level = file_text_read_real(load)
money = file_text_read_real(load)
file_text_close(load)
}

там же в step

if file_exists('save.sav' ;) {}
else
{
save=file_text_open_write('save.sav' ;) ;
file_text_close(save)
}
save=file_text_open_write('save.sav' ;) ;
file_text_write_real(save, level)
file_text_write_real(save, money)
file_text_close(save)

и сам вопрос: как можно зашифровать данные, хоть как то, при данной реализации?

EDIT: я понятия не имею почему вставляются эти смайлики. даже если я отключаю смайлы при отправке сообщения, эти точки с запятой перед скобкой всеравно вставляются.


Сообщение отредактировал dildo_bomber - Понедельник, 05 Декабря 2016, 14:05
ReanДата: Понедельник, 05 Декабря 2016, 14:18 | Сообщение # 5863
участник
Сейчас нет на сайте
dildo_bomber, как-то читал подобную темку на reddit'. Там была интересная мысль о том, что если это синглплеер, то не стоит замарачиваться - если игрок захочет, он так или иначе изменит данные. В этом есть зерно правды. Для онлайн игры же, данный метод практически непригоден.
Но если всё же хочется каким-то образом усложнить себе жизнь, то можно использовать самый простой алгоритм шифрования с использованием кодового слова, шифровальных таблиц и т.д. Посмотри: шифр Цезаря, шифр Атбаш и т.д. Если кратко: замена символов исходного алфавита на символы алфавита шифрования (составленный заранее, либо работающий по определённому алгоритму - шифр Цезаря, например). Но это едва ли убережёт данные от более-менее пытливого ума.

P.S. Иногда помогает отделять скобки пробелами, чтобы избавиться от смайликов.


Сообщение отредактировал Rean - Понедельник, 05 Декабря 2016, 14:19
dildo_bomberДата: Понедельник, 05 Декабря 2016, 14:34 | Сообщение # 5864
частый гость
Сейчас нет на сайте
да, понимаю, что не поможет. просто хочется, ради интереса. алгоритмы найти то можно, но я не понимаю, как их тут реализовывать, в такой конструкции.
самое простое, что получилось это просто умножить на какое либо число. т.е.
при сохранении
file_text_write_real(save, level*534)
при загрузке
level = file_text_read_real(load) / 534

думал, например, сделать так:
в файле всё храниться в строчку разделённую пробелом. (12 43 0 0 200)
хотел при сохранении перемещивать символы настоящие с добавочными через один т.е. (1327 4930 04 05 210400)
а при загрузке считывать через один символ, но я не понимаю, по крайней мере щас сразу не представил, как такое провернуть.
получается, что каждое число надо представлять в виде массива, потом сохранять. при загрузке - загонять в массив, где каждая цифра - элемент массива, и с этим уже дальше работать.
но я опять таки, не знаю, как это в моей конструкции впихнуть.

EDIT:

сумел загнать переменную в массив. если кому интересно:

exp_plane_new = string(exp_plane) //переводим число в строку
max_chars = string_length(exp_plane_new) //получаем количество символов в строке
for (i = 1; i <= max_chars; i += 1) //количество строк в массиве
{
char[i] = string_char_at(exp_plane_new,i)//создаём массив с символами исходного числа
exp_plane_new += real(string(char[i]))//натыкиваем символы подряд в строчкук
}
exp_plane_save = real(exp_plane_new)//переводим строчку обратно в число

но пока я извращался, у меня встал вопрос
получается, моими махинациями я буду так для каждой переменной прописывать. а как можно при открытии самого файла сразу весь файл получить как строку? т.е. еще перед тем как уже буду обращаться к записанным там данным, возможно ли раскодировать/закодировать сам файл при открытии/закрытии?


Сообщение отредактировал dildo_bomber - Понедельник, 05 Декабря 2016, 18:35
arthur33Дата: Понедельник, 05 Декабря 2016, 20:13 | Сообщение # 5865
участник
Сейчас нет на сайте
Доброго времени суток игроделам.
Возник вопрос (жутко глупый, но я почему-то еще тупее) :
Как, при столкновении объекта с другим, увеличить счетчик на 1.
Допустим есть круг (спрайтом) и в случае когда на него попадает квадратик (к примеру),то счетчик один раз увеличивается на 1.
Написав этот код
Код
with (obj_square) {if distance_to_object(o_circle)=0 then c4et++}

Счетчик не перестает увеличиваться, т.е при попадании в круг, квадрат беспрерывно продолжает накручивать счетчик, а должен сделать это только один раз.


- Опыт - это то, что получаешь, не получив того, чего хотел.
Новая головоломка


Сообщение отредактировал arthur33 - Понедельник, 05 Декабря 2016, 20:17
ReanДата: Понедельник, 05 Декабря 2016, 20:28 | Сообщение # 5866
участник
Сейчас нет на сайте
dildo_bomber, задача сводится к написанию парсера.
Цитатаdildo_bomber ()
а как можно при открытии самого файла сразу весь файл получить как строку?

Вспоминая старые лабораторные работы по C, где всё сводилось к "ПОКА (Не конец файла) {строка += строка_из_файла}" :) Тоже самое легко реализуется и в условиях GameMaker.
Цитатаdildo_bomber ()
возможно ли раскодировать/закодировать сам файл при открытии/закрытии?

А зачем? Если хочешь сделать своим методом, то просто прочитай весь файл и загони строку в функцию-парсер, которая на выходе даст результат. Вариантов масса.

Но если не хочется себя мучить, то попробуй функции base64_encode и bas64_decode. Для удобства - храни каждое значение в новой строке.
Суть такова:
Открываем файл для записи, берём значение, перегоняем его в string, запуливаем его в base64_encode - полученный результат записываем в отдельную строку в файле. Повторяем до тех пор, пока не запишем все необходимые данные.
Считывание происходит с точностью до наоборот: считываем строку (file_text_readln), обрабатываем её функцией base64_decode, результат кастуем в нужный тип данных и, вуаля, данные восстановлены. Повторяем до конца файла.

Всё, конечно, зависит от необходимости: если алгоритм кодирования - самоцель, то выбираем первый вариант (с самописным парсером). Если же главное это игра - то удобней будет использовать второй.

Добавлено (05 декабря 2016, 20:28)
---------------------------------------------
arthur33, необходимо добавить "флаг" (переменную, описывающую состояния).
Например, добавим кругу флаг "wasCollision = false" при создании экземпляра (событие Create). И далее, твой код будет таким:
Код

with (obj_square)
{
    if distance_to_object(o_circle) == 0
    {    
        if (wasCollision == false) // Если коллизии до этого не было, то...
        {
            c4et++;                    // то выполняем инкрементацию и
            wasCollision = true;    // запоминаем, что коллизия была
         }
     }
     else
        wasCollision = false;      // Если столкновения нет, то устанавливаем флаг "не_было_коллизии"
}


Добавлено: кстати, почему для проверки коллизии используешь distance_to_object? У такого способа проверки коллизии есть один существенный недостаток - если проверять коллизию двух объектов неправильной формы (с впадинами и выпуклостями), то несмотря на то, что спрайты не пересекаются, коллизия всё равно будет обрабатываться (потому как просчёт идёт по грубому bounding box'у). Если мы используем спрайты с точной маской, то лучше использовать функцию place_meeting.


Сообщение отредактировал Rean - Понедельник, 05 Декабря 2016, 20:42
arthur33Дата: Понедельник, 05 Декабря 2016, 21:40 | Сообщение # 5867
участник
Сейчас нет на сайте
Rean, Как-то неправильно у меня все работает. Понять бы что именно.

- Опыт - это то, что получаешь, не получив того, чего хотел.
Новая головоломка
ReanДата: Понедельник, 05 Декабря 2016, 21:43 | Сообщение # 5868
участник
Сейчас нет на сайте
arthur33, ну так вряд ли кто-то сможет помочь - нужна информация: что не так, что не работает и т.д.
Начнём с начала. В каком событии какого объекта происходит проверка на коллизию?
arthur33Дата: Понедельник, 05 Декабря 2016, 21:47 | Сообщение # 5869
участник
Сейчас нет на сайте
Rean, В степе круга. он обращается к квадратику и если этот квадрат рядом, то счетчик увеличивается на 1.
И все бы вроде хорошо, но если на расстоянии создается еще один квадрат, то "wasCollision = true" и счетчик бежит вперед. Я в лс обращусь, чтобы не засорять тему.


- Опыт - это то, что получаешь, не получив того, чего хотел.
Новая головоломка
ProsstoBROДата: Понедельник, 05 Декабря 2016, 22:25 | Сообщение # 5870
был не раз
Сейчас нет на сайте
ЦитатаRean ()
использовать для реализации простой объект (например, "кнопка"). Чтобы кнопка реагировала на мышь и отображалась в том же месте - необходимо её перемещать вместе с активным View.

Я так и делаю, но так как у меня типо карта большая, поэтому сделал управление камерой с помощью мыши, но проблема в том что кнопка начинает, я даже не знаю как объяснить, как бы плавает, отделяться от view когда я его двигаю
даже не знаю как это исправить, может кто подскажет?




Сообщение отредактировал ProsstoBRO - Понедельник, 05 Декабря 2016, 22:30
ReanДата: Понедельник, 05 Декабря 2016, 22:35 | Сообщение # 5871
участник
Сейчас нет на сайте
ProsstoBRO,
ЦитатаProsstoBRO ()
как бы плавать отделять от view когда я его двигаю

Было бы неплохо это увидеть, чтобы понять что не так.
По-хорошему, стоит передвигать вид и кнопку в одном событии, тогда не должно быть каких-то заминок.
ProsstoBROДата: Понедельник, 05 Декабря 2016, 22:43 | Сообщение # 5872
был не раз
Сейчас нет на сайте
Ох, великолепно, спасибо teehee teehee , я просто передвигал камеру в объекте mouseControll, кнопку передвигал у кнопки в степе, переписал что бы в одном все менялось и всё стало как надо, спасибо))))
Теперь буду думать как лучше организовать управление камерой мышью и что бы еще вместе с камерой как-то GUI обновлялось




Сообщение отредактировал ProsstoBRO - Понедельник, 05 Декабря 2016, 22:44
ReanДата: Понедельник, 05 Декабря 2016, 23:19 | Сообщение # 5873
участник
Сейчас нет на сайте
ProsstoBRO, как вариант, можно создать объект, например, с названием obj_ui. И все элементы управления (кнопки, лэйблы и т.д.) наследовал бы от этого объекта. В степе родительского объекта написал бы примерно следующий алгоритм:
Код

// Двигаем вид каким нам необходимо образом
...
// Далее, для простоты использования объявлю две временны переменные
var camX = view_xview[0]; // Допустим у нас 0-вой вид отвечает за камеру
var camY = view_yview[0];

with (obj_ui)
{
    x = offsetX + camX;
    y = offsetY + camY;
}

Что такое оффсет и где его взять. Ответ простой - генерируем их при создании объекта (если объекты расположены у нас в комнате), либо можно задать необходимое нам значение (если хотим генерировать элементы интерфейса динамически).
Событие Create объекта ui_button, к примеру:
Код

offsetX = x - view_xview[0];
offsetY = y - view_yview[0];

Есть один нюанс. Если, например, объект ui_button наследуется от obj_ui, и у него не переопределено событие Step, то код выше (где мы двигаем камеру и все объекты ui) может выполнятся несколько раз (соответственно, для самого obj_ui и у всех его потомков). Этого можно избежать переопределив у каждого потомка событие Step (скорее всего, оно и так будет переопределено, хотя не факт), либо введя проверку в Step у объекта obj_ui (тот код, который выше) является ли текущий объект потомком или нет, либо (наиболее простой вариант) - все действия по перемещению (весь код из Step объект obj_ui) убрать в отдельный объект, например, Manager, который будет отвечать за состояние игры (пауза/игра/меню), обработка input-ов (клавиатура, мышь, геймпад и т.д.), перемещение камеры, отрисовка UI и т.д.

Я понимаю, что "слёту" может быть сложно вникнуть во всю эту ООП-ную парадигму, но в данном случае это даёт нам некоторую степень удобства, как то, например, что нам не придётся передвигать отдельно каждый элементы интерфейса (в менеджере мы просто будем перемещать все объекты, которые наследуются от UI вместе с камерой), а также нам не составит труда добавить новые элементы или удалить/изменить старые.


Сообщение отредактировал Rean - Понедельник, 05 Декабря 2016, 23:21
olololoscinДата: Среда, 07 Декабря 2016, 16:57 | Сообщение # 5874
был не раз
Сейчас нет на сайте
помогите пж когда пытаюсь запустить игру мне пишет error creating stand-alone cannot find valid runner data что делать ?
KostayFireДата: Среда, 07 Декабря 2016, 19:27 | Сообщение # 5875
был не раз
Сейчас нет на сайте
Помогите кто может, нужно реализировать стрельбу танк туда куда смотрит курсор :'( , кто поможет +

Добавлено (07 декабря 2016, 19:27)
---------------------------------------------

Цитатаolololoscin ()
помогите пж когда пытаюсь запустить игру мне пишет error creating stand-alone cannot find valid runner data что делать ?

Скинь ссылку на игру, а то непонятно


BattleTanks [Beta] -Битвы танков
valera_zaДата: Среда, 07 Декабря 2016, 20:06 | Сообщение # 5876
участник
Сейчас нет на сайте
olololoscin, почитай может поможет проблема то твоя описана:


Сообщение отредактировал valera_za - Среда, 07 Декабря 2016, 20:17
ReanДата: Четверг, 08 Декабря 2016, 04:12 | Сообщение # 5877
участник
Сейчас нет на сайте
KostayFire, а в чём, собственно, проблема? Что не получается?

Добавлено (08 декабря 2016, 04:12)
---------------------------------------------
KostayFire, набросал пример: TankSimulator.gmz
Ничего сложного, но всё равно код на всякий случай прокомментировал. В основном, всё тебя интересующее должно находится в объекте tank_turret. Разбирайся.

Кто не любит скачивать неизвестное - ниже gif-ка.
Внимание! GIF-ка весит около 2.5 МБ
Ссылка на imgur


Сообщение отредактировал Rean - Четверг, 08 Декабря 2016, 12:26
olololoscinДата: Четверг, 08 Декабря 2016, 21:20 | Сообщение # 5878
был не раз
Сейчас нет на сайте
помогите пж когда пытаюсь запустить игру мне пишет error creating stand-alone cannot find valid runner data что делать ?

Добавлено (08 декабря 2016, 21:20)
---------------------------------------------
помогите пж когда пытаюсь запустить игру мне пишет error creating stand-alone cannot find valid runner data что делать ?

valera_zaДата: Четверг, 08 Декабря 2016, 21:24 | Сообщение # 5879
участник
Сейчас нет на сайте
olololoscin, не понимаю, тебе та инфа не помогла? fear
ReanДата: Четверг, 08 Декабря 2016, 21:30 | Сообщение # 5880
участник
Сейчас нет на сайте
olololoscin, какой GameMaker? Какая версия? Все нужные библиотеки стоят?
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг