|
Dva_Kota
|
 |
« Ответ #225 : Сентябрь 19, 2012, 16:31:06 » |
|
act_on[] и act_off[] содержат не по одной строчке, по этому загрузка будет не удачной (загружается ведь все по одной строчке). По этому лучше было бы записывать в файл готовый код и потом выполнять его с помощью execute_file() С остальным попробую позже разобраться. Добавлено: Сентябрь 19, 2012, 18:10:13 Разобрался с проблемой. На самом деле проблема не только со спрайтами, но и с объектами (аналогичная проблема). Дело в том что в массивы записываются индексы (числа) спрайтов и объектов (которые должны создаваться если выбросить предмет из инвентаря). По этому сохранять name_obj[] нужно через object_get_name (по аналогии со спрайтами). т.е. мы переводим индексы в текст. При загрузке нужно сделать обратную процедуру. Делается это через execute_string(). for (slot_x=0; slot_x<obj_inv.inv_width_x; slot_x+=1) { for (slot_y=0; slot_y<obj_inv.inv_height_y; slot_y+=1) { file_text_write_string(file,obj_inv.txt[slot_x,slot_y]); file_text_writeln(file); file_text_write_real(file,obj_inv.item[slot_x,slot_y]); file_text_writeln(file); file_text_write_real(file,obj_inv.max_number[slot_x,slot_y]); file_text_writeln(file); file_text_write_string(file,sprite_get_name(obj_inv.spr[slot_x,slot_y])); file_text_writeln(file); file_text_write_string(file,object_get_name(obj_inv.name_obj[slot_x,slot_y])); file_text_writeln(file); file_text_write_string(file,obj_inv.act_on[slot_x,slot_y]); file_text_writeln(file); file_text_write_string(file,obj_inv.act_off[slot_x,slot_y]); file_text_writeln(file); file_text_write_string(file,obj_inv.item_tyte[slot_x,slot_y]); file_text_writeln(file); } } for (slot_x=0; slot_x<obj_inv.inv_width_x; slot_x+=1) { for (slot_y=0; slot_y<obj_inv.inv_height_y; slot_y+=1) { obj_inv.txt[slot_x,slot_y]=file_text_read_string(file); file_text_readln(file); obj_inv.item[slot_x,slot_y]=file_text_read_real(file); file_text_readln(file); obj_inv.max_number[slot_x,slot_y]=file_text_read_real(file); file_text_readln(file); execute_string('obj_inv.spr[slot_x,slot_y]= ' + file_text_read_string(file)); file_text_readln(file); execute_string('obj_inv.name_obj[slot_x,slot_y]= ' + file_text_read_string(file)); file_text_readln(file); obj_inv.act_on[slot_x,slot_y]=file_text_read_string(file); file_text_readln(file); obj_inv.act_off[slot_x,slot_y]=file_text_read_string(file); file_text_readln(file); obj_inv.item_type[slot_x,slot_y]=file_text_read_string(file); file_text_readln(file); } } Но проблема с act_on[] и act_off[], в которых несколько строк, осталась. Чтобы не переделывать весь код загрузки можно код, записанный в эти переменные, записывать одной строкой, а не несколькими, как у меня в примере.
|
|
|
|
|
Записан
|
|
|
|
ALT
Посетитель

Репутация: 0
Offline
API: GameMaker Studio
Сообщений: 30
|
 |
« Ответ #226 : Сентябрь 19, 2012, 18:14:02 » |
|
Ну у меня проект под Андроид, в Studio разрабатываю, так что о такой роскоши как execute_string приходится забыть. В act_on у меня несколько иное написано, поэтому одной строчки вполне хватает. А насчет сохранения картинок, одна идейка все же есть. В общем полные картинки предметов я только в магазине, да в некоторых комнатах использую, так что ассоциируем спрайты с этими объектами и забудем про них. А вот то что в инвентаре отображается можно в принципе в один спрайт все картинки записать и выводить на экран только его, сохраняя в массиве лишь номер кадра с необходимой картинкой. Точно так же и сохранять все в файл. То есть в массиве spr хранить не спрайты, а порядковые номера картинок в спрайте ассоциированные с этими предметами.Ну в общем для obj_inv строка вывода спрайта хранящегося в инвентаре будет выглядеть так draw_sprite(spr_mini,spr[slot_x,slot_y],x+slot_x*slot_width_x,y+slot_y*slot_height_y);//рисуем спрайт предмета, находящегося в этой ячейке инвентаря (в своих координатах) Где spr_mini как раз и есть тот самый спрайт в котором содержатся картинки предметов. Вроде работает как надо и сохраняет и загружает
|
|
|
|
|
Записан
|
|
|
|
|
Dva_Kota
|
 |
« Ответ #227 : Сентябрь 19, 2012, 18:17:53 » |
|
Ну, если без execute_string то попробую что-то другое придумать. Проблему с индексом объекта все равно нужно будет решать, она аналогичная, но без ее решения нельзя будет выбрасывать предметы.
|
|
|
|
|
Записан
|
|
|
|
ALT
Посетитель

Репутация: 0
Offline
API: GameMaker Studio
Сообщений: 30
|
 |
« Ответ #228 : Сентябрь 19, 2012, 18:56:46 » |
|
А без execute_string обошелся примерно так. В act_on и act_off что-то типа "hp10" или "str-5" писал. Потом в событии нажатия левой клавиши в нужных местах Switch ставил и там уже описывал то что нужно. Предметов у меня не слишком много. Так что вроде нормально все обрабатывается. Падения FPS не заметно. Можно конечно было по названию предмета все парсить, но у меня есть разного типа предметы, но с одинаковыми свойствами, так что такая запись короче получается.
Добавлено: Сентябрь 19, 2012, 19:01:28 Единственное над чем голову ломаю, как действия двух кнопок мыши на одну повесить. На тач скрине правой клавиши мыши по определению нет, так что надо что-то придумывать с длинными, короткими, двойными или тапами с удержанием придумывать. Хотя пока мыслей нет никаких. Через alarm чтоли мутить или фиг его знает как
|
|
|
|
|
Записан
|
|
|
|
|
Dva_Kota
|
 |
« Ответ #229 : Сентябрь 19, 2012, 19:27:16 » |
|
Использование предметов делать при отпускании клавиши (если отпущена над той же ячейкой над которой нажата). этой же клавишей и перетаскивание предметов между ячейками и выбрасывание.
|
|
|
|
|
Записан
|
|
|
|
ALT
Посетитель

Репутация: 0
Offline
API: GameMaker Studio
Сообщений: 30
|
 |
« Ответ #230 : Сентябрь 19, 2012, 21:04:56 » |
|
 Хорошая идея. Попробую. Что-то сразу до этого не додумался
|
|
|
|
|
Записан
|
|
|
|
|
Dva_Kota
|
 |
« Ответ #231 : Сентябрь 20, 2012, 10:39:30 » |
|
Проблема решена. Индексы спрайтов и объектов, хранящиеся в переменных нужно сохранять в виде чисел. Код file_text_write_string(file,obj_inv.name_obj[slot_x,slot_y]); сохранит пустую строку, Код file_text_write_string(file,object_get_name(obj_inv.name_obj[slot_x,slot_y])); сохранит имя ресурса-бъекта, а вот код file_text_write_string(file,string(obj_inv.name_obj[slot_x,slot_y])); сохранит число, хранящееся в переменной как строку. Это именно то что нам нужно. Теперь загрузка. При загрузке кодом obj_inv.name_obj[slot_x,slot_y]=file_text_read_string(file); в obj_inv.name_obj[slot_x,slot_y] будет записана строка (не зависимо от того как и что записано в файл сохранения - хоть число, хоть строка - все равно это будет строкой). Для правильной загрузки числа как числа нам нужна такой код: obj_inv.name_obj[slot_x,slot_y]=real(file_text_read_string(file)); Со спрайтами аналогично. Полный код сохранения и загрузки: for (slot_x=0; slot_x<obj_inv.inv_width_x; slot_x+=1) { for (slot_y=0; slot_y<obj_inv.inv_height_y; slot_y+=1) { file_text_write_string(file,obj_inv.txt[slot_x,slot_y]); file_text_writeln(file); file_text_write_real(file,obj_inv.item[slot_x,slot_y]); file_text_writeln(file); file_text_write_real(file,obj_inv.max_number[slot_x,slot_y]); file_text_writeln(file); file_text_write_string(file,string(obj_inv.spr[slot_x,slot_y])); file_text_writeln(file); file_text_write_string(file,string(obj_inv.name_obj[slot_x,slot_y])); file_text_writeln(file); file_text_write_string(file,obj_inv.act_on[slot_x,slot_y]); file_text_writeln(file); file_text_write_string(file,obj_inv.act_off[slot_x,slot_y]); file_text_writeln(file); file_text_write_string(file,obj_inv.item_tyte[slot_x,slot_y]); file_text_writeln(file); } } for (slot_x=0; slot_x<obj_inv.inv_width_x; slot_x+=1) { for (slot_y=0; slot_y<obj_inv.inv_height_y; slot_y+=1) { obj_inv.txt[slot_x,slot_y]=file_text_read_string(file); file_text_readln(file); obj_inv.item[slot_x,slot_y]=file_text_read_real(file); file_text_readln(file); obj_inv.max_number[slot_x,slot_y]=file_text_read_real(file); file_text_readln(file); obj_inv.spr[slot_x,slot_y]= real(file_text_read_string(file)); file_text_readln(file); obj_inv.name_obj[slot_x,slot_y]=real(file_text_read_string(file)); file_text_readln(file); obj_inv.act_on[slot_x,slot_y]=file_text_read_string(file); file_text_readln(file); obj_inv.act_off[slot_x,slot_y]=file_text_read_string(file); file_text_readln(file); obj_inv.item_type[slot_x,slot_y]=file_text_read_string(file); file_text_readln(file); } }
|
|
|
|
|
Записан
|
|
|
|
ALT
Посетитель

Репутация: 0
Offline
API: GameMaker Studio
Сообщений: 30
|
 |
« Ответ #232 : Сентябрь 20, 2012, 12:41:43 » |
|
Про string() real() не думал даже. Так и file_text_write_string и file_text_write_real для спрайтов и объектов в любом случае пустую строку выдавали. Надо попробовать будет твой способ. Заодно и посмотреть, что это за индексы объектов такие, которые и не цифрой и не текстом не являются
Добавлено: Сентябрь 20, 2012, 12:53:54 Еще вопрос такой из разряда придирок, но все же спрошу. Почему массив item_type текстового типа? Там же все равно только цифры хранятся. Или я немного не правильно понимаю строку в событии create obj_inv: item_type[x,y]='' ?('' - это ж пустая строка вроде, хотя все вроде работает и так, поэтому не критично, но немного понимание затрудняет)
|
|
|
|
|
Записан
|
|
|
|
|
Dva_Kota
|
 |
« Ответ #233 : Сентябрь 20, 2012, 12:59:30 » |
|
1. Я уже пробовал, перед написанием поста - все работает. 2. Копировал часть кода выше и не поменял тип. Нужно было 0 поставить, я просто об этом забыл. (там даже в названии переменной опечатка).
|
|
|
|
|
Записан
|
|
|
|
ALT
Посетитель

Репутация: 0
Offline
API: GameMaker Studio
Сообщений: 30
|
 |
« Ответ #234 : Октябрь 08, 2012, 20:56:44 » |
|
Глупый вопрос наверно, да и инвентаря скорее всего косвенно касается, но все же спрошу. При открытом инвентаре когда клацаешь мышкой по инвентарю иногда срабатывают события кнопок мыши у объектов находящихся под окном инвентаря. Можно ли этого как-то по простому избежать? Если непонятно спросил - поясню. Допустим есть комната. В ней объект дверь. По клику на двери перемещаемся в другую комнату. Открываем инвентарь. Окно инвентаря полностью перекрывает дверь. В инвентаре, допустим, есть зелье. По координатам на экране его местоположение примерно совпадает с координатами двери. При попытке кликнуть на зелье, если не попасть точно в спрайт, происходит клик по двери и перемещение в другую комнату. Как избежать этого кроме как для всех объектов в зоне риска прописывать: if (!obj_inv.visible) { ... Действия по клику мыши для предмета ... } Объектов и комнат много, так что прописывать много придется
|
|
|
|
|
Записан
|
|
|
|
AndrewVideoGames
Главный Модератор
Репутация: 821
Offline
Пол:  Награды: ![За постоянность! [500 дней на форуме] За постоянность! [500 дней на форуме]](http://forum.hellroom.ru/awards/e0371460a203dd46d2dc161571bf6144_hellroomforum_time_gold.gif) ![За лояльность! [+750 репутации] За лояльность! [+750 репутации]](http://forum.hellroom.ru/awards/ba712f70231a68b216c525b7e8eca694_hellroomforum_good_silver.gif)  
API: GameMaker Studio Pro
Деятельность: А я кто? А я руководитель!
Сообщений: 7316
|
 |
« Ответ #235 : Октябрь 08, 2012, 21:12:04 » |
|
В событии нажатия пиши так: if !place_meeting(x,y,объект_окна_инвентаря) { //переход в другую комнату }
Или диактивируй объекты при явлении инвентаря.
|
|
|
|
|
Записан
|
|
|
|
ALT
Посетитель

Репутация: 0
Offline
API: GameMaker Studio
Сообщений: 30
|
 |
« Ответ #236 : Октябрь 08, 2012, 22:27:40 » |
|
Вообще да. С деактивацией объектов как раз такое можно замутить. Спасибо. Что-то сразу об этом не подумал. Лови плюсик
|
|
|
|
|
Записан
|
|
|
|
Reylor
Пользователь
 
Репутация: 1
Offline
Пол: 
API: Game Maker 8.0 Pro
Деятельность: Чём я занимаюсь в игрострое?... хм. да всем с чем приходится работать. Всего по немногу.
Сообщений: 90
|
 |
« Ответ #237 : Октябрь 12, 2012, 18:41:45 » |
|
А как сделать квестовые предметы, где то в этойтеме уже был подобный вопрос подскажите пожалуйста. Немного перефразирую как сделать что бы разная переменная отвечала за щит и за меч. Что бы можно было надеть только один меч и один щит.
|
|
|
|
|
Записан
|
|
|
|
|
Dva_Kota
|
 |
« Ответ #238 : Октябрь 12, 2012, 21:14:30 » |
|
1. Про квестовый предмет вопрос уже был ты хочешь чтобы кто-то за тебя полистал тему и нашел? А вообще все ответы на важные вопросы, которые могут повторяться, я выношу в первый пост темы. Если имеется ввиду предмет, который нельзя выбросить, то ответ на него под последним спойлером.
2. Сделай разные типы слотов для щита и меча (как для всех остальных предметов), убери ту часть кода которая отвечает за выбор руки.
|
|
|
|
|
Записан
|
|
|
|
ALT
Посетитель

Репутация: 0
Offline
API: GameMaker Studio
Сообщений: 30
|
 |
« Ответ #239 : Октябрь 14, 2012, 18:46:04 » |
|
А как сделать квестовые предметы, где то в этойтеме уже был подобный вопрос подскажите пожалуйста.
Так в шапке темы по моему был как раз ответ на этот вопрос
|
|
|
|
|
Записан
|
|
|
|
|