Воскресенье, 05 Мая 2024, 11:34

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Форум игроделов » Записи участника » Dva_Kota [522]
Результаты поиска
Dva_KotaДата: Среда, 22 Декабря 2010, 10:48 | Сообщение # 441 | Тема: Как сделать инвентарь в игре?
заслуженный участник
Сейчас нет на сайте
Ты немного напутал с координатами опять, и у тебя не везде правильно отображалось количество предметов (не в том месте где нужно). Такое ощущение что ты даже не проверяешь что сделал... Вот, я исправил (и сделал чтобы нормально отображались имена объектов):

End step:

Code
x=view_xview[0]+476;
y=view_yview[0]+40;

if (mouse_x >x-16 and mouse_x < x+16 and mouse_y > y-16 and mouse_y <y+16) {
drag_item(0)
name_item(0,1)}
if (mouse_x >x+16 and mouse_x < x+48 and mouse_y > y-16 and mouse_y <y+16) {
drag_item(1)
name_item(1,2)}
if (mouse_x >x+48 and mouse_x < x+80 and mouse_y > y-16 and mouse_y <y+16) {
drag_item(2)
name_item(2,3)}

if (mouse_x >x+80 and mouse_x < x+112 and mouse_y > y-16 and mouse_y <y+16) {
drag_item(3)
name_item(3,4)}

if (mouse_x >x+112 and mouse_x < x+144 and mouse_y > y-16 and mouse_y <y+16) {
drag_item(4)
name_item(4,5)}

Draw:

Code
draw_sprite(s_inv,-1,view_xview[0]+476,view_yview[0]+40)      

if slot[0,0] >0 {                 
draw_sprite(slot[0,4],-1,view_xview[0]+476,view_yview[0]+40)    
draw_text(view_xview[0]+476+6,view_yview[0]+40+6,slot[0,1])}    

if slot[1,0] >0 {                
draw_sprite(slot[1,4],-1,view_xview[0]+476+32,view_yview[0]+40)   
draw_text(view_xview[0]+476+38,view_yview[0]+40+6,slot[1,1])}    

if slot[2,0] >0 {               
draw_sprite(slot[2,4],-1,view_xview[0]+476+64,view_yview[0]+40)    
draw_text(view_xview[0]+476+70,view_yview[0]+40+6,slot[2,1])}    

if slot[3,0] >0 {  
draw_sprite(slot[3,4],-1,view_xview[0]+476+96,view_yview[0]+40)  
draw_text(view_xview[0]+476+102,view_yview[0]+40+6,slot[3,1])}

if slot[4,0] >0 {  
draw_sprite(slot[4,4],-1,view_xview[0]+476+128,view_yview[0]+40)  
draw_text(view_xview[0]+476+134,view_yview[0]+40+6,slot[4,1])}

if slot[5,0] >0 {  
draw_sprite(slot[5,4],-1,view_xview[0]+476+164,view_yview[0]+40)  
draw_text(view_xview[0]+476+166,view_yview[0]+40+6,slot[5,1])}

if txt == 1 {               
draw_text(mouse_x,mouse_y-30,slot[0,3]) }   
if txt == 2 {              
draw_text(mouse_x,mouse_y-30,slot[1,3]) }   
if txt == 3 {              
draw_text(mouse_x,mouse_y-30,slot[2,3]) }   
if txt == 4 {  
draw_text(mouse_x,mouse_y-30,slot[3,3]) }

if txt == 5 {  
draw_text(mouse_x,mouse_y-30,slot[4,3]) }

if draw == true {
draw_text(320,240,text)}

if drag == true {        
draw_sprite(temp_slot[0,4],-1,mouse_x,mouse_y) }  

Там у тебя еще некоторых строк не хватало, я добавил (уже не помню какие).

Ты просто внимательнее смотри код и что откуда берется, тогда все получится.


Новый пример инвентаря! /20.06.2012/

Energy Wars


Сообщение отредактировал Dva_Kota - Среда, 22 Декабря 2010, 10:50
Dva_KotaДата: Среда, 22 Декабря 2010, 09:15 | Сообщение # 442 | Тема: Мои вопросы по моей игре
заслуженный участник
Сейчас нет на сайте
Ты, наверное, глобальное нажатие поставил.

А вообще лучше сделать как (_Meloman_) сказал - Left Released. Объясню в чем тут плюс. Можно, если использовать Left Released, сделать анимацию нажатия на предмет. Хотя бы 3 кадра (просто предмет, предмет при наведении указателя мыши, предмет при нажатии). Если использовать Left Released, ты сможешь увидеть анимацию "при нажатии клавиши мыши", если сделаешь Left Pressed - анимацию ты не увидишь (а если сделать чтобы анимация была привязана к Left Released, а действие к Left Pressed анимацию ты увидишь, но будет выглядеть тупо). По такому принципу сделаны, например, кнопки в Windows.


Новый пример инвентаря! /20.06.2012/

Energy Wars


Сообщение отредактировал Dva_Kota - Среда, 22 Декабря 2010, 09:23
Dva_KotaДата: Вторник, 21 Декабря 2010, 18:44 | Сообщение # 443 | Тема: Как сделать инвентарь в игре?
заслуженный участник
Сейчас нет на сайте
Да, есть. Посмотри какие там числа добавляются к х. Это же элементарно - все время добавляешь по 32. Это же ширина ячейки.

Новый пример инвентаря! /20.06.2012/

Energy Wars


Сообщение отредактировал Dva_Kota - Вторник, 21 Декабря 2010, 18:44
Dva_KotaДата: Вторник, 21 Декабря 2010, 18:41 | Сообщение # 444 | Тема: Художник пытается освоить GML
заслуженный участник
Сейчас нет на сайте
Скачай отсюда нормальную русскую справку и будет тебе счастье. biggrin

Справка на русском


Новый пример инвентаря! /20.06.2012/

Energy Wars
Dva_KotaДата: Вторник, 21 Декабря 2010, 18:37 | Сообщение # 445 | Тема: Как сделать инвентарь в игре?
заслуженный участник
Сейчас нет на сайте
Ты все координаты одинаковые зачем поставил? sad
Я же тебе русским языком написал:
Quote (Dva_Kota)
(вместо x ставь view_xview[0]+476, вместо y view_yview[0]+40)
то есть вместо
Code
draw_sprite(slot[1,4],-1,x+32,y)

у тебя будет
Code
draw_sprite(slot[1,4],-1,view_xview[0]+476+32,view_yview[0]+40)

и т.д.


Все числа, которые прибавлялись к x и y нужно было оставить на своих местах и заменить только x и y.
Переделывай еще раз и сбрасывай ссылку. А я пока подумаю как добавить еще ячейки.

Добавлено (21.12.2010, 18:37)
---------------------------------------------
Добавление ячеек:

В End Step в конец добавляешь что-то похожее на

Code
if (mouse_x >x+80 and mouse_x < x+112 and mouse_y > y-16 and mouse_y <y+16) {
drag_item(3)
name_item(3,3)}

В Draw добавляешь :

Code
if slot[3,0] >0 {
draw_sprite(slot[3,4],-1,x+96,y)
draw_text(x+106,y+6,slot[3,1])}

и ниже

Code
if txt == 4 {
draw_text(mouse_x,mouse_y-30,slot[3,3]) }

Думаю там разберешься куда именно в Draw пихать.

(все это у объекта - инвентароь).
Только координаты подправь (я в этих кодах уже правильные числа поставил, только x y замени).


Новый пример инвентаря! /20.06.2012/

Energy Wars
Dva_KotaДата: Вторник, 21 Декабря 2010, 18:29 | Сообщение # 446 | Тема: Художник пытается освоить GML
заслуженный участник
Сейчас нет на сайте
Ferrumel, ты этот текст откуда взял? Перевел переводчиком или это русская справка у тебя такая?

Quote (Из справки)
string_format(val,tot,dec) Переводит вещественное число val в строку, используя ваш собственный формат числа: аргумент tot отвечает за полное количество цифр в числе, а dec за количество цифр после десятичной точки.


Новый пример инвентаря! /20.06.2012/

Energy Wars


Сообщение отредактировал Dva_Kota - Вторник, 21 Декабря 2010, 18:31
Dva_KotaДата: Вторник, 21 Декабря 2010, 18:12 | Сообщение # 447 | Тема: Как сделать инвентарь в игре?
заслуженный участник
Сейчас нет на сайте
а что именно теперь не работает?
У меня вообще никаких проблем нет с перемещением предмета в третий слот.


Новый пример инвентаря! /20.06.2012/

Energy Wars


Сообщение отредактировал Dva_Kota - Вторник, 21 Декабря 2010, 18:13
Dva_KotaДата: Вторник, 21 Декабря 2010, 18:04 | Сообщение # 448 | Тема: Как сделать инвентарь в игре?
заслуженный участник
Сейчас нет на сайте
Именно в 3?
Еще такая же шибка у меня была если кликнуть по первому слоту когда он пустой.
Ошибка из-за того что ты присваиваешь не существующий индекс спрайта (или пустое значение). Это нужно больше в код вникать. А цифра у тебя не следует за объектом по тому что ты не написал чтобы она рисовалась smile . Последняя строка в Draw у твоего инвентаря отображает спрайт при перетаскивании. Добавь туда рисование текста по аналогии. Только перед "}".


Новый пример инвентаря! /20.06.2012/

Energy Wars
Dva_KotaДата: Вторник, 21 Декабря 2010, 17:52 | Сообщение # 449 | Тема: Как сделать инвентарь в игре?
заслуженный участник
Сейчас нет на сайте
lol
Ты скобку после draw_text не поставил...

Да, так для каждого.


Новый пример инвентаря! /20.06.2012/

Energy Wars


Сообщение отредактировал Dva_Kota - Вторник, 21 Декабря 2010, 17:53
Dva_KotaДата: Вторник, 21 Декабря 2010, 17:32 | Сообщение # 450 | Тема: Как сделать инвентарь в игре?
заслуженный участник
Сейчас нет на сайте
координаты я только для первой поменял. Аналогично для остальных поменяй (вместо x ставь view_xview[0]+476, вместо y view_yview[0]+40)
то есть вместо
Code
draw_sprite(slot[1,4],-1,x+32,y)

у тебя будет
Code
draw_sprite(slot[1,4],-1,view_xview[0]+476+32,view_yview[0]+40)

и т.д.


Новый пример инвентаря! /20.06.2012/

Energy Wars
Dva_KotaДата: Вторник, 21 Декабря 2010, 17:18 | Сообщение # 451 | Тема: Как сделать инвентарь в игре?
заслуженный участник
Сейчас нет на сайте
Как так получается что у меня работает нормально, а тебе не помогло? wacko

http://rghost.ru/3696598


Новый пример инвентаря! /20.06.2012/

Energy Wars
Dva_KotaДата: Вторник, 21 Декабря 2010, 16:30 | Сообщение # 452 | Тема: Как сделать инвентарь в игре?
заслуженный участник
Сейчас нет на сайте
Я весь код несколько раз просмотрел, все скрипты, всю процедуру "доставания элемента из инвентаря" в голове прокрутил...
У тебя, когда берешь любой предмет из инвентаря, отображается спрайт s_player. Причем он отображается даже если его переименовать! но вот если его удалить появляется ошибка (попытка нарисовать не существующий спрайт в draw у объекта o_inv). Вообще, если писать кодом ссылку на спрайт, а потом этот спрайт переименовать, работать не будет. Но у тебя там только код, а при переименовании спрайта все равно работает... И вот, наконец-то я нашел в чем ошибка! Скорее всего это даже не ошибка, а опечатка. Или из-за невнимательности ты не то число написал...
Последняя строчка кода в событии draw у объекта o_inv
Code
draw_sprite(temp_slot[0,3],-1,mouse_x,mouse_y)

ты рисуешь спрайт temp_slot[0,3]. А что же у нес хранится в переменной temp_slot[0,3]? Смотрим событие "создание" у объекта o_inv. А там написано:
Code
slot[0,3] = 0       //Имя
slot[0,4] = 0       //Спрайт

дальше ище идет взаимодействие со скриптами add_item и drag_item про них я скажу лишь то, что в add_item нужно поменять местами комментарии "имя" и "вес" (не все строки, а именно комментарии), чтобы не было путаницы, они там наоборот стоят.
Так вот в чем главная ошибка была: ты рисовал спрайт с индексом temp_slot[0,3], а это не индекс спрайта с бутылкой, а индекс самого первого созданного спрайта. Там у тебя (в переменной) записана строка, а она воспринимается как ноль. С этим я до конца не разобрался, но логически получается что так оно и есть.
чтобы все это исправить замени
Code
draw_sprite(temp_slot[0,3],-1,mouse_x,mouse_y)

на
Code
draw_sprite(temp_slot[0,4],-1,mouse_x,mouse_y)


Новый пример инвентаря! /20.06.2012/

Energy Wars
Dva_KotaДата: Вторник, 21 Декабря 2010, 15:52 | Сообщение # 453 | Тема: Художник пытается освоить GML
заслуженный участник
Сейчас нет на сайте
Я и не говорю что нужно отказываться от текста. Сурфейсы рулят. smile
Просто привожу сравнеие двух способов.


Новый пример инвентаря! /20.06.2012/

Energy Wars
Dva_KotaДата: Вторник, 21 Декабря 2010, 15:47 | Сообщение # 454 | Тема: Художник пытается освоить GML
заслуженный участник
Сейчас нет на сайте
Quote (Фил)
В ГМ текстовые операции относятся к графическим. И они одинаковы медленны.

Да, я про это и говорю. Но, при рисовании текста каждый символ рисуется отдельно (на сколько я знаю), при рисовании спрайта, на котором сразу весь нужный текст - он рисуется сразу целиком и это быстрее (проверено мной лично). Конечно, если каждый символ рисовать отдельным спрайтом то это, наверное не будет быстрее (я такое делать не побывал и не знаю будет ли это так же как рисование текста или медленнее (я думаю что медленнее)).

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


Новый пример инвентаря! /20.06.2012/

Energy Wars


Сообщение отредактировал Dva_Kota - Вторник, 21 Декабря 2010, 15:51
Dva_KotaДата: Вторник, 21 Декабря 2010, 15:08 | Сообщение # 455 | Тема: Художник пытается освоить GML
заслуженный участник
Сейчас нет на сайте
Вообще, отображение текста не очень быстрая операция, по этому, если ты не будешь считывать потом эти символы как текст, тебе лучше сделать это картинкой. А вообще ты можешь добавить шрифт, где есть такие символы, и использовать его. (сам я не пробовал, но в теории должно работать)

Новый пример инвентаря! /20.06.2012/

Energy Wars
Dva_KotaДата: Вторник, 21 Декабря 2010, 14:49 | Сообщение # 456 | Тема: Художник пытается освоить GML
заслуженный участник
Сейчас нет на сайте
Quote (Ferrumel)
Народ, подскажите коды ASCI я нашел только табличку ASCII там некоторые вещи не проходят.
это относится к функциям chr(val), ord(val) и некоторым другим.

А для чего именно теле нужно? Можно узнать с помощью ord(str). Например пишешь ord('A') - это будет для A


Новый пример инвентаря! /20.06.2012/

Energy Wars
Dva_KotaДата: Вторник, 21 Декабря 2010, 14:12 | Сообщение # 457 | Тема: Мини пример Prince of Persia
заслуженный участник
Сейчас нет на сайте
Любой пример платформера возьми.

Новый пример инвентаря! /20.06.2012/

Energy Wars


Сообщение отредактировал Dva_Kota - Вторник, 21 Декабря 2010, 14:12
Dva_KotaДата: Вторник, 21 Декабря 2010, 14:01 | Сообщение # 458 | Тема: Как сделать инвентарь в игре?
заслуженный участник
Сейчас нет на сайте
Значит так. первая ошибка:
В драв у инвентаря первая строка:

Code
draw_sprite(o_inv,image_index,view_xview[0]+444,view_yview[0]+2)

Это ты рисуешь относительно вида. Все правильно.

Потом у тебя идут строки, которыми ты рисуешь предметы в инвентаре. И вот тут уже не правильно. Тут ты пишешь просто x и y Это координаты относительно самого инвентаря, а он у тебя не двигается. Он у тебя на месте стоит, просто рисует спрайты в разных местах (привязывает их к виду)

Вот я исправил для первого слота. Для остальных исправь аналогично:

Code
if slot[0,0] >0 {               //Если слот 0 заполнен
draw_sprite(slot[0,4],-1,view_xview[0]+444,view_yview[0]+25)   /*То рисуем спрайт в первой клетке
равный указанному в скрипте*/
draw_text(view_xview[0]+444+6,view_yview[0]+25+6,slot[0,1])}   //И пишем кол-во

Теперь у тебя спрайт бутылки будет вверху экрана и будет следовать за видом. Число возле бутылки (это, я так понял количество) тоже будет следовать за видом. Вот только расположен инвентарь у тебя фактически там, где ты его поставил в редакторе, по этому надпись при наведении мыши (и вообще, реакция на мышь) будет как будто он стоит там, а не двигается. Чтобы этого небыло, привяжи сам инвентарь к виду. Для этого в End Step инвентарю добавь строки:

Code
x=view_xview[0]+444;
y=view_yview[0]+25;

Изменяй и смотри что получится. Со спрайтами твоими не правильными чуть позже разберусь.

Добавлено (21.12.2010, 14:01)
---------------------------------------------
Вполне естественно что у тебя инвентарь не совпадает с предметом в инвентаре:
У тебя инвентарь рисуется первой строкойв координатах (view_xview[0]+476,view_yview[0]+40), а предмет в первом слоте ты располагаешь в координатах (view_xview[0]+444,view_yview[0]+25). Видишь разницу? инвентарь рисуешь в одном месте, а предмет - в другом... Координаты инвентаря (у тебя центр спрайта в верхнем левом углу) и координаты первой ячейки должны совпадать. К координатам остальных ячеек добавляй размер ячейки, чтобы рисовалось уже в следующей ячейке (ты, кстати, только для первой изменил, для остальных тоже измени координаты).


Новый пример инвентаря! /20.06.2012/

Energy Wars
Dva_KotaДата: Вторник, 21 Декабря 2010, 12:00 | Сообщение # 459 | Тема: Художник пытается освоить GML
заслуженный участник
Сейчас нет на сайте
Вроде бы "draw_" нужно писать в Draw, а все остальное - куда угодно (хотя, возможно, я про что-то забыл)

Новый пример инвентаря! /20.06.2012/

Energy Wars
Dva_KotaДата: Вторник, 21 Декабря 2010, 10:19 | Сообщение # 460 | Тема: Художник пытается освоить GML
заслуженный участник
Сейчас нет на сайте
Quote (Ferrumel)
А что считает функця median (n1,n2,n3....)

Берутся все числа которые ты записал, находится среднее (Не среднее арифметическое, а именно среднее!).
То есть например у тебя числа: 1; 5; 2; 7; 9; 50; 12. Функция работает примерно так: выстраивает их по порядку, 1; 2; 5; 7; 9; 12; 50. Потом выбирается то число, которое стоит по середине, то есть 7. Если количество чисел будет четным, в середине будут стоять два числа. Из них будет выбрано меньшее.
Например такой ряд чисел: 1; 2; 5; 7; 9; 12; 50; 60. В середине стоят числа 7 и 9. Из них будет выбрано меньшее, то есть 7.

Quote (Ferrumel)
Quote
Потому что draw_text - команда для Draw:

а нигде этого не написано

Да, я тоже не знаю где это написано, но все функции, которые начинаются с "draw_" используются в событии Draw.


Новый пример инвентаря! /20.06.2012/

Energy Wars


Сообщение отредактировал Dva_Kota - Вторник, 21 Декабря 2010, 10:22
Форум игроделов » Записи участника » Dva_Kota [522]
Поиск:

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