сразу замечу, чтоб не возникало лишних вопросов что у меня не совсем инвентарь как в понимание в РПГ "рюкзак" и при переходе в мое подобие инвентаря у меня грузится отдельная комната
для реализации задачки у меня имеется 3 объекта item_1, item_2, item_3 которые представляют собой предметы инвентаря есть также объект родитель для последних item в котором содержатся следующий код
в событие creat image_speed = 0 image_index = 0 select = 0 // не обращать внимания
в событие step if(image_index=1) { x = mouse_x y = mouse_y} // если объект выделен( 0 спрайт -нет, 1 - да), то он двигается за мышкой
в событие pressed mouse на объект item
if(image_index = 1) // я опеделяю выделен ли объект { n = (mouse_y-64) div 68 // k = (mouse_x-32) div 68 //определяю ячейку(есть массив, хранящий инфу о расположение итемов в инвентаре тут не стоит заострять внимания ибо проблема не в этом image_index = 0 // оповещаю, что объект больше не выделен(положен в ячейку) x = k*68+32 y = n*68+64 //не обращать внимания - позиционирую объект относительно ячейки item_0.jaika[n,k] = select // не обращать внимания select = 0 // ибо тут манипуляции с массивом, не влияющим на данную задачку mouse_clear(1) // подстраховываюсь очищая действие мыши
} else {
if(image_index = 0) // если объект не выделен { image_index = 1 // знач его выделяем mouse_clear(1) }
}
В принципе код работает - я нажимаю на предмет - он выделяется и далее движется за мышой, аналогично я его могу положить, заменить. Вот тут-то беда, часто замена проходит гладко, но иногда оба предмета вдруг цепляются за мышь. я нарошно в коде mose pressed код написал в 1 действие через else. но каким то образом программка иногда это препятствие обходит. Прошу высказывать у кого какие есть предположения, даж самые абсурдные, ибо изучая этот движок методом тыка я убедился что частенько абсурдные ошибки и получаются
http://farchive.jino.ru/
Сообщение отредактировал vsDaTavs - Четверг, 13 Января 2011, 16:35
Есть вариант: разбей код на две части: клади предмет при нажатии клавиши, а бери - при отпускании.
Добавлено (13.01.2011, 16:57) --------------------------------------------- ну не совсем так... это работать тоже будет не правильно, но, возможно, с этим можно что-то придумать...
Запасной план у меня есть всегда. Так например добавить в посторонний объект переменную-контроллер, которая не будет допускать 2 выделенных объекта(image_index=1) и хранить значения 0 и 1. + объект временной памяти, который будет отвечать за заменяемый объект. а каждый шаг будет проверка контроллера и через преме памяти смена кадра для второго объекта.
Так я ж бьюсь чтоб код был короче
Добавлено (13.01.2011, 17:27) --------------------------------------------- а в вашем случа я бы не советовал так делать т.к. может возникнуть много багов, например при перетаскивание нажатой кнопке. ну и код проверок получится объемным
http://farchive.jino.ru/
Сообщение отредактировал vsDaTavs - Четверг, 13 Января 2011, 17:27
Так например добавить в посторонний объект переменную-контроллер, которая не будет допускать 2 выделенных объекта(image_index=1) и хранить значения 0 и 1. + объект временной памяти, который будет отвечать за заменяемый объект. а каждый шаг будет проверка контроллера и через преме памяти смена кадра для второго объекта.
я все равно не собираюсь идти на попятную. мне надо разобраться почему глючит написанный мной код
Добавлено (13.01.2011, 18:57) --------------------------------------------- у меня другого объяснения не находится кроме как:
if(image_index = 1) {...image_index =0....} и затем этот же объект выполняет часть кода помле else мол потому что image_index уже равен нулю. Хотя я думал что при выполнении первого условия оператор завершается несмотря на вторую проверку что нах-ся в варианте else
И забавно что это происходит не всегда. в большинстве же своем как я уже сказал код работает как я и планировал
Добавлено (13.01.2011, 22:56) --------------------------------------------- в общем я сам нашел недочет
http://farchive.jino.ru/
Сообщение отредактировал vsDaTavs - Четверг, 13 Января 2011, 18:59
шаг step. мало того что у меня объект держался углом за мышку(ну я там с коорд подправил на всяк случай)., так еще использовал стандартный шаг в условии. кароч зачастую объект не успевал бежать за мышкой и когда я нажимал на объект нах-ся в ячейке, объект прикрепленный к мыше был проигнорирован. потому и оказывалось что в итоге оба выделены.
В этом случае надо использовать только начальный шаг и никаких проблем не будет Теперь мой инвентарь полностью работает исправно.
http://farchive.jino.ru/
Сообщение отредактировал vsDaTavs - Пятница, 14 Января 2011, 13:49
кстати описанный ранее код затрагивал в основном визуальный эффект инвентаря. если интересно вот полный код, и если вдуматься он достаточно прост объект item -родитель, содержит код манипуляций с предметами в инвентаре объект item_0 - содержит инфу о инвентаре.(массив отвечающий за наличие объектов и их раскладку, при старте комнаты создает соответствующие элементам массива объекты - итемы в инвентаре) и объекты - предметы item_1, item_2, item_3 ..... - дочерние к item-у Item
событие create image_speed = 0 image_index = 0 select = 0 понятно что при старте комнаты данный объект восозздается вновь( но только в том случае если в установках комнаты не стоит галочка "постоянный" В моем случае комната не постоянна - это знач при переходи аз комн в комн данные принимают изначально заданное положение и все вышеописанный значения также при старте комнаты обнуляются для предметов в инвентаре Я просто далее использую массив, хранящий инфу о предметах и их расположение. ТАк сделано, чтобы я мог использовать характеристики некоторых предметов и в основной комнате, а так же эту же комнату использовать и для магазинамне же ненужно чтобы магазин сохраниля в моем инвентаре:D)
событие Begin Step(начальный шаг) if(image_index=1) { x = mouse_x-32 y = mouse_y-32}
событие Left Pressed(обязательно pressed на ето у меня рассчитан остальной код. в случае с button код повторится множество раз и итем не сдвинется с места. в случае с released конкретный итем не успеет присвоить значение select см дальше) if(x>32)and(x<300)and(y>64)and(y<662)//определяем что мышка находится в рамке с ячейками n = (mouse_y-64) div 68 // k = (mouse_x-32) div 68 //определяю ячейку if(image_index == 1) // если объект выделен - код положить объект { if(item_0.jaika[n,k]==0){item_0.cel =0} // если ячейка пуста, знач переменная, хранящая инфу выделен ли какой либо объект обнуляется(потому что мы ложим объект и выделенных объектов теперь не должно быть) image_index = 0 x = k*68+32 y = n*68+64 item_0.jaika[n,k] = select // данной ячейке присваеваем значение item_p.select(item_p -итем в котором задействован данный код) select = 0 // только теперь(не ранее) следует обнулить select данного объекта
} else {
if(image_index == 0) // если объект не выделен - код поднять объект { if(item_0.cel == 0) {item_0.cel = 1 item_0.jaika[n,k]=0 } // если перем item_0.cel ноль, знач до этого объект не был выделен(то есть это не замена а только лишь берем предмет, сл-но естественно мы указываем что объект поднят(item_0.cel =1) и обнуляем ячейку) image_index = 1
} }
объект item_0
create cel = 0 // при старте комнаты ни один объект не выделен
jaika[8,0] = 0 jaika[8,1] = 0 jaika[8,2] = 0 jaika[8,3] = 0 // задал массив сразу на 36 ячеек. почему не задал с 1 ячейко ведь можно увеличить. далее в коде room start я понял что массив в ГМЛ беден и манипулировать с элементами можно только писав огромные коды(нет функций таких к массиву), а в случае если ложить итем через 1 ячейку( заполн - пустая - заполн - пустая) в зависимости от того какой код я писал ошибка массива либо он после первого нуля не считал эл-ты либо ошибка вылета массива за свои пределы. так что я думаю данный способ менее трудоемкий. количество ячеек ведь можно определять при помощи отдельно взятой переменной, и при старте комнаты если ячеек больше чем базовое 36 то просто добавить еще эл-ты массива
Room Start items = 36 n = 0 k = 0 while ( items > 0 ) {
left button if(image_index = 1) {item.select = item_1} // означает что когда объект выделен он записывает в запасную переменную свое значение. (нарошно сделано иначе могут быть баги если 1 объект меняешь на другой - гарантирую)
+ также во избежание багов в объекте выходе из комнаты-инвентаря написать следующее в событие любого нажатия кнопки if(item_0.cel ==0){room_goto(нужная комната)}
следует также добавить что при переходе с 1 комнаты в другую негглобальные данные использовать неполучится. поэтому в данном примере можно пойти 2 путями. Либо массив jaika[n,k] сделать глобальным: везде в коде заменить на global.jaika[n,k] либо не делать его глобальным но при переходе использовать списки для перепеси данных из массива.(а в новой комнате лучше записать из списка в нов массив и удалить список). хотя последний олее емкий(списки сами по себе глобальны+ доп код. но у меня так и сделано по особой причине) аналогично делается магазин
http://farchive.jino.ru/
Сообщение отредактировал vsDaTavs - Пятница, 14 Января 2011, 15:10