Не работает проверка массива в координатах курсора.
| |
Интернет | Дата: Пятница, 02 Октября 2015, 20:41 | Сообщение # 1 |
постоянный участник
Сейчас нет на сайте
| Почему при нажатии только на первую ячейку (если в ней есть предмет) происходит необходимое действие с этим предметом, при нажатии на другие (если там есть предмет) нужного действия не происходит. При нажатии на ячейку //// mousx=floor((mouse_x-x)/sprite_height){// вычисляем координаты курсора по х и записываем их в переменную mousy=floor((mouse_y-y)/sprite_width){// вычисляем координаты курсора по у и записываем их в переменную if naimen_ob[mousx,mousy]!=''{//если в координатах курсора массив пустой то stak_ob[mousx,mousy]-=1// отнимаем 1 единицу от стака объектов только в этой ячейки массива и т.д }} if stak_ob[mousx,mousy]=0{//если стак в координатах пустой то naimen_ob[mousx,mousy]=''}//ячейка в этих координатах пуста } //////////// При поподании объекта в инвентарь for(ix=0;ix<ini_x;ix+=1){ for(iy=0;iy<ini_y;iy+=1){ naimen_ob[ix,iy]=name//масив получает имя этого объекта и т.д там много кода ////////////////// Вот ещё отрисовка ячейки for(ix=0;ix<ini_x;ix+=1){ for(iy=0;iy<ini_y;iy+=1){ draw_sprite(sprite_index,image_index,x+ix*sprite_height,y+iy*sprite_width)}} /////
|
|
| |
Quad69 | Дата: Пятница, 02 Октября 2015, 22:08 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| В каком событии этот код?
|
|
| |
Интернет | Дата: Пятница, 02 Октября 2015, 22:16 | Сообщение # 3 |
постоянный участник
Сейчас нет на сайте
| Цитата maksim1221232 ( ) В каком событии этот код? При нажатии левой кнопки мыши mousx=floor((mouse_x-x)/sprite_height){// вычисляем координаты курсора по х и записываем их в переменную mousy=floor((mouse_y-y)/sprite_width){// вычисляем координаты курсора по у и записываем их в переменную if naimen_ob[mousx,mousy]!=''{//если в координатах курсора массив пустой то stak_ob[mousx,mousy]-=1// отнимаем 1 единицу от стака объектов только в этой ячейки массива ///////// В столкновении с игроком for(ix=0;ix<ini_x;ix+=1){ for(iy=0;iy<ini_y;iy+=1){ naimen_ob[ix,iy]=name//масив получает имя этого объекта и т.д там много кода Вот ссылка на Исходник
Сообщение отредактировал Интернет - Пятница, 02 Октября 2015, 22:24 |
|
| |
Quad69 | Дата: Пятница, 02 Октября 2015, 23:26 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Пробуй поставить событие глобальное нажатие левой кнопки мыши.
|
|
| |
Интернет | Дата: Суббота, 03 Октября 2015, 15:35 | Сообщение # 5 |
постоянный участник
Сейчас нет на сайте
| Это работает но при нажатии мимо инвентаря происходит ошибка
|
|
| |
Quad69 | Дата: Суббота, 03 Октября 2015, 18:17 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| Цитата Интернет ( ) происходит ошибка Какая? Кидай её сюда.
|
|
| |
Интернет | Дата: Суббота, 03 Октября 2015, 21:56 | Сообщение # 7 |
постоянный участник
Сейчас нет на сайте
| Нажимаю мимо инвенторя Посмотри мой исходник если можешь помочь ___________________________________________ ############################################################################################ FATAL ERROR in action number 1 of Mouse Event for Glob Left Pressed for object o_ini:
Push :: Execution Error - Variable Index [5,2] out of range [5,-1] - -1.naimen_ob(100004,160002) at gml_Object_o_ini_GlobalLeftButtonPressed_1 (line 3) - if naimen_ob[mousx,mousy]!=''{ ############################################################################################ Просто если ставишь обычное нажатие то вычисляется только 1 ячейка массива, а если глобальня то все но если нажимаешь вне эконок то массив не определяется вот это я и не могу исправить.
Сообщение отредактировал Интернет - Суббота, 03 Октября 2015, 22:04 |
|
| |
Quad69 | Дата: Суббота, 03 Октября 2015, 22:47 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| Поставь проверку, если мышка в месте где находится инвентарь, то выполняется нужный код, иначе нет. Вот примерный код. Код if (mouse_x>0 && mouse_x<32 && mouse_y>0 && mouse_y<32)
|
|
| |
Интернет | Дата: Суббота, 03 Октября 2015, 23:15 | Сообщение # 9 |
постоянный участник
Сейчас нет на сайте
| Цитата maksim1221232 ( ) if (mouse_x>0 && mouse_x<32 && mouse_y>0 && mouse_y<32) Не помогло =(
|
|
| |
Quad69 | Дата: Суббота, 03 Октября 2015, 23:51 | Сообщение # 10 |
заслуженный участник
Сейчас нет на сайте
| Цитата Интернет ( ) Push :: Execution Error - Variable Index [5,2] out of range [5,-1] - -1.naimen_ob(100004,160002) at gml_Object_o_ini_GlobalLeftButtonPressed_1 (line 3) - if naimen_ob[mousx,mousy]!=''{ Вроде бы тут ты пытаешься обратится к к массиву которого нету(или с индексом что то не так) Цитата Интернет ( ) if naimen_ob[mousx,mousy]!=
Проверь свой код, если ошибок не найдёшь, то кинь его сюда(вдруг что нибуть найду)
|
|
| |
Интернет | Дата: Воскресенье, 04 Октября 2015, 13:11 | Сообщение # 11 |
постоянный участник
Сейчас нет на сайте
| В Step ячейки if (visible){ mousx=floor((mouse_x-x)/sprite_height){// вычисляем координаты курсора по х и записываем их в переменную mousy=floor((mouse_y-y)/sprite_width){// вычисляем координаты курсора по y и записываем их в переменную }}} if mouse_check_button_pressed(mb_left){ if (naimen_ob[mousx,mousy]!=''){//если в координатах курсора массив не пустой то stak_ob[mousx,mousy]-=1// отнимаем 1 единицу от стака объектов только в этой ячейки массива if (stak_ob[mousx,mousy]=0){ naimen_ob[mousx,mousy]=''} }} При нажатии на объект который хотим подобрать with(o_ini){ //обращаемся к объекту инвенторя for(ix=0;ix<ini_x;ix+=1){ // проверяем ячейки for(iy=0;iy<ini_y;iy+=1){ with(other){ // обращаемся к данному предмету if other.naimen_ob[other.ix,other.iy]='' and other.max_ob[other.ix,other.iy]<maxnam{ // если в ячейках нет его имени и макс колличество меньше положенного то other.naimen_ob[other.ix,other.iy]=naimen // даём предмету имя указанное в переменной other.spr_ob[other.ix,other.iy]=sprite_index // присваеваем масиву спрайт объекта other.stak_ob[other.ix,other.iy]+=1// к стаку добовляем ещё одну единицу other.max_ob[other.ix,other.iy]+=1 // добовляем 1 единицу к колличеству объектов other.ob_index[other.ix,other.iy]=object_index//к масиву добовляем индекс объекта instance_destroy()//удаляем объект exit//заканчиваем цикл } else{// если же if other.naimen_ob[other.ix,other.iy]=naimen and other.max_ob[other.ix,other.iy]<maxnam{//если в ячейках есть имя и макс колличество меньше положенного то other.naimen_ob[other.ix,other.iy]=naimen// даём предмету имя указанное в переменной other.spr_ob[other.ix,other.iy]=sprite_index// присваеваем масиву спрайт объекта other.stak_ob[other.ix,other.iy]+=1// к стаку добовляем ещё одну единицу other.max_ob[other.ix,other.iy]+=1// добовляем 1 единицу к колличеству объектов other.ob_index[other.ix,other.iy]=object_index//к масиву добовляем индекс объекта instance_destroy() exit}}}}} with(o_ini){//обращаемся к объекту инвенторя for(ix=0;ix<ini_x;ix+=1){//проверяем ячейки for(iy=0;iy<ini_y;iy+=1){ if naimen_ob[ix,iy]='' and max_ob[ix,iy]<other.maxnam{ naimen_ob[ix,iy]=other.naimen spr_ob[ix,iy]=other.sprite_index ob_index[ix,iy]=other.object_index stak_ob[ix,iy]+=1 max_ob[ix,iy]+=1 with(other){ instance_destroy()} exit}}}} } В Draw ячейки x=view_xview[0]//x равен виду y=view_yview[0]//y равен виду for(ix=0;ix<ini_x;ix+=1){//запускаем цикл for(iy=0;iy<ini_y;iy+=1){ draw_sprite(sprite_index,image_index,x+ix*sprite_height,y+iy*sprite_width)//отрисовываем ячеку взависимости от ix и iy if (naimen_ob[ix,iy]!='') and (stak_ob[ix,iy]>0){//если ячейка не занята и стак >0 то draw_sprite(spr_ob[ix,iy],image_index,x+ix*sprite_height,y+iy*sprite_width) //отрисовываем спрайт предмета в ячейки }}} for(ix=0;ix<ini_x;ix+=1){//проверяем ячейки for(iy=0;iy<ini_y;iy+=1){ if stak_ob[ix,iy]>0{//если стак >0 то draw_text(x+ix*sprite_height,y+iy*sprite_width,stak_ob[ix,iy])// отрисовываем колличество предметов }}}Добавлено (04 октября 2015, 13:11) ---------------------------------------------
Цитата maksim1221232 ( ) Вроде бы тут ты пытаешься обратится к к массиву которого нету(или с индексом что то не так) Это наверное из-за переменных mousy и mousх ведь они равны только тогда когда курсор над ячейкой массива но даже если написать if (visible){ mousx=floor((mouse_x-x)/sprite_height){// вычисляем координаты курсора по х и записываем их в переменную mousy=floor((mouse_y-y)/sprite_width){// вычисляем координаты курсора по y и записываем их в переменную else{ mousx=0 mousy=0}} тоже не помогает
Сообщение отредактировал Интернет - Воскресенье, 04 Октября 2015, 11:38 |
|
| |
Quad69 | Дата: Воскресенье, 04 Октября 2015, 14:24 | Сообщение # 12 |
заслуженный участник
Сейчас нет на сайте
| Глянь ка сюда, у тебя где !=" одна ковычка, добавь вторую и проверь. Цитата Интернет ( ) if naimen_ob[mousx,mousy]!=''
|
|
| |
Интернет | Дата: Воскресенье, 04 Октября 2015, 16:49 | Сообщение # 13 |
постоянный участник
Сейчас нет на сайте
| Вот посмотри
|
|
| |
Quad69 | Дата: Воскресенье, 04 Октября 2015, 17:37 | Сообщение # 14 |
заслуженный участник
Сейчас нет на сайте
| Ошибку в o_ini В Нажатии мыши исправил. Вот код: Код with(other) { mousx=floor((mouse_x-x)/sprite_height);// вычисляем координаты курсора по х и записываем их в переменную mousy=floor((mouse_y-y)/sprite_width);// вычисляем координаты курсора по y и записываем их в переменную if mousx>array_length_2d(naimen_ob,mousx) or mousy>array_length_2d(naimen_ob,mousy) {exit;} { if (naimen_ob[mousx,mousy]!='')//если в координатах курсора массив пустой то { stak_ob[mousx,mousy]-=1// отнимаем 1 единицу от стака объектов только в этой ячейки массива if (stak_ob[mousx,mousy]=0){ naimen_ob[mousx,mousy]=''} }}}
|
|
| |
Интернет | Дата: Воскресенье, 04 Октября 2015, 18:38 | Сообщение # 15 |
постоянный участник
Сейчас нет на сайте
| Ок лови + только за что отвечает сторчка if mousx>array_length_2d(naimen_ob,mousx) or mousy>array_length_2d(naimen_ob,mousy) не встречал никогда.
|
|
| |
Quad69 | Дата: Воскресенье, 04 Октября 2015, 19:07 | Сообщение # 16 |
заслуженный участник
Сейчас нет на сайте
| Цитата Интернет ( ) только за что отвечает сторчка if mousx>array_length_2d(naimen_ob,mousx) or mousy>array_length_2d(naimen_ob,mousy) Код mousx=floor((mouse_x-x)/sprite_height); mousy=floor((mouse_y-y)/sprite_width); Твой код выше без проверки. Даже если мышка будет внизу экрана, оно вернёт значение, а так как такого значения в массиве нет, выдаёт ошибку. Функция array_length_2d вроде бы возвращает кол-во индексов в массиве, если хочешь узнать по подробнее, глянь справку.
Сообщение отредактировал maksim1221232 - Воскресенье, 04 Октября 2015, 19:07 |
|
| |
Интернет | Дата: Воскресенье, 04 Октября 2015, 19:39 | Сообщение # 17 |
постоянный участник
Сейчас нет на сайте
| Цитата maksim1221232 ( ) Инвентарь шириной 3 клетки и высотой 2. А да кстать у меня инвентарь шириной 5 клеток и высотой 2 получается что работает только в диапазоне 3 на 2 как изменить?
Сообщение отредактировал Интернет - Воскресенье, 04 Октября 2015, 19:39 |
|
| |
Quad69 | Дата: Воскресенье, 04 Октября 2015, 19:44 | Сообщение # 18 |
заслуженный участник
Сейчас нет на сайте
| Просто добавляешь эти новые клетки в массив и array_length_2d вернёт другое значение.
|
|
| |
Интернет | Дата: Воскресенье, 04 Октября 2015, 19:56 | Сообщение # 19 |
постоянный участник
Сейчас нет на сайте
| И последнее у меня в этом инветоре ещё проблема с предметами при извлечении их из инвенторя второй раз предмет в эту же ячейку не встаёт хотя стоит if (stak_ob[mousx,mousy]=0){ naimen_ob[mousx,mousy]=''}
|
|
| |
Quad69 | Дата: Воскресенье, 04 Октября 2015, 22:04 | Сообщение # 20 |
заслуженный участник
Сейчас нет на сайте
| Проверь как ложится предмет. Должно быть примерно так: Если (в нужной ячейке значение равно ''), то....Добавлено (04 октября 2015, 22:04) --------------------------------------------- Или ошибка новая выскакивает?
|
|
| |
|