Четверг, 28 Марта 2024, 17:36

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Не работает проверка массива в координатах курсора.
Не работает проверка массива в координатах курсора.
ИнтернетДата: Пятница, 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)
---------------------------------------------
Или ошибка новая выскакивает?

Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Game Maker » Не работает проверка массива в координатах курсора.
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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