Перейти к содержимому
  • 0
Oleshe

nil value MineOs

Вопрос

Я устал, оно не может найти значение на ровном списке, в переменной images хранятся исправные картинки, остальные это библиотеки, они заранее объявлены:

Скрытый текст

todraw = {[1]={['time'] = 30,['arrows'] = {['right'] = true, ['left'] = true},[1] = 1}} -- по умолчаний ставится в другом скрипте, хранит данные о стрелках на определённую милисекунду + "сторону" на которой стрелка и время (пиксель)
-- (картинки 10 на 5)
-- wrk созданный на несовсем правом верхнем углу объект workspace с достаточным размером (проверялось), и потомучто это не "окно", оно сбрасывает дисплей поэтому оно будет видно и не надо ничего удалять. Но идёт ущерб графической производительности (сделан "разгон" на CallBuget в конфиге)
exit = false -- по умолчаний ставится в другом скрипте, но для тестов оно тут
--thread.create(function()
while exit == false do
  event.sleep(0)
  b = 0
  while b < #todraw do
    b = b + 1
   if todraw[b] then
      tmptime = todraw[b]['time'] -- обход ошибки
      print(todraw[b]['arrows'].right)
      if not tmptime then -- вот тут
         tmptime = 50
      end
      tmparrows = todraw[b]['arrows']
      if tmparrows.right == true then
        wrk:addChild(gui.image(34,todraw[b].time,images.right))
      end
      if todraw[b]['arrows'].up then
        wrk:addChild(gui.image(23,todraw[b].time,images.up))
      end
      if todraw[b]['arrows'].down then
        wrk:addChild(gui.image(12,todraw[b].time,images.down))
      end
      if todraw[b]['arrows'].left then
        wrk:addChild(gui.image(1,todraw[b].time,images.left))
      end
      todraw[b]['time'] = todraw[b].time - 1
      if todraw[b]['time'] == -6 then -- если вышла за экран удаляем в общем
        todraw[b] = nil
      end
    end
   end
end --end)

 

 

Изменено пользователем Oleshe
Исправлена грамматика (пропущена буква)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

6 часов назад, Oleshe сказал:

Не, это сторонний список в котором всё подгружается нормально

Понял, пардон

 

6 часов назад, Oleshe сказал:

if tmparrows.right == true then -- ошибка тут, не видит элемента в списке или списка, не знаю 🥶

Для отладки ты всегда можешь заюзать блокирующее окно, чтобы выяснить, какие значения имеют переменные на текущий момент:

GUI.alert(b, todraw[b], todraw)

Без исходников со всеми ресурсами или как минимум скрина со стектрейсом больше сказать проблематично

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Без полного сырца с ресурсами черт ногу сломит. Стектрейс ошибки хоть приложи или конкретную строку(

 

С ходу могу лишь сказать, что объекты gui.image создаются некорректно, т.к. 3 аргументом должен идти путь до изображения, а ты прокидываешь булево значение:

-- Неверно
if images.right then
  wrk:addChild(gui.image(34, todraw[b].time, images.right))
end

-- Верно
if images.right then
  wrk:addChild(gui.image(34, todraw[b].time, "/path/to/image.pic"))
end

Также удаление элементов из todraw идет без смещения индексов, из-за чего в таблице остаются пустоты. К ошибке вряд ли приведет, но память все же не резиновая:

local b = 1

while b < #todraw do
  if todraw[b]['time'] == -6 then
    table.remove(todraw, b)
    b = b - 1
  else
    b = b + 1
  end
end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, ECS сказал:

Без полного сырца с ресурсами черт ногу сломит. Стектрейс ошибки хоть приложи или конкретную строку( 

 

С ходу могу лишь сказать, что объекты gui.image создаются некорректно, т.к. 3 аргументом должен идти путь до изображения, а ты прокидываешь булево значение:

...

Не, это сторонний список в котором всё подгружается нормально

Скрытый текст

images = {}
images.down = image.load(path..'/Images/down.pic')
images.up = image.load(path..'/Images/up.pic')
images.left = image.load(path..'/Images/left.pic')
images.right = image.load(path..'/Images/right.pic')
images.downd = image.load(path..'/Images/downd.pic') -- с префиксом d - deactivated, когда стрелка не нажата
images.upd = image.load(path..'/Images/upd.pic')
images.leftd = image.load(path..'/Images/rightd.pic')
images.rightd = image.load(path..'/Images/leftd.pic')
return images

 Оно загружает через loadfile и сразу запускает, path как ни страно хранит корневую папку приложения '/Mounts/bb8...82e/test.app'

За это спасибо ;3

  if todraw[b]['time'] == -6 then
    table.remove(todraw, b)
    b = b - 1
  else
    b = b + 1
  end
...
if todraw[b] then
      tmptime = todraw[b]['time'] -- та же шляпа была и тут, но тут она хотябы 1-на
      print(todraw[b]['arrows'].right)
      if not tmptime then
         tmptime = 50
      end
      tmparrows = todraw[b]['arrows'] -- попытка обойти, по этому и решил обратиться к мастерам потамучто каждую секунду создавать 4 переменные для 1 сравнения того не наверное стоит
      if tmparrows.right == true then -- ошибка тут, не видит элемента в списке или списка, не знаю 🥶
        wrk:addChild(gui.image(34,todraw[b].time,images.right))
      end
...

 

 

 

Изменено пользователем Oleshe
Грамотей 😎

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 19.11.2022 в 20:28, ECS сказал:

 


GUI.alert(b, todraw[b], todraw)

 

image.png.b17c848819613ca22f0d93464be6ab82.png

--- не знаю это ли подразумевается под стектрейс

image.thumb.png.d4dd9f24557bb6c5f953bc62cc946d8b.png

 

Всё приложение, нужна только библиотека Thread, но её можно зачеркнуть она пока не используется

Движ за файлы:

/Main.lua -- Инициализация, формирование базовых вещей для работы и кривой обработчик ошибок

/Bin/test.lua -- Основной исполняемый файл, пока подгружает другие файлы а потом выступает как отрисовка стрелок нажатий

/Event things/Arrows Tracing.lua -- Создаёт event.addHandler на стрелки и wasd и Backspace для того что-бы выйти в общем (пока-что)

/Event things/Arrows Draw.lua -- Отрисовка стрелок которые "на ленте", целевой скрипт

/Event things/Arrows Spawn.lua -- Исходя из пробного файла на определённую милисек. достаём стрелки и пихаем их в Draw, его пока не трогаем он сам работает не работает не знаю

/Images/arrows.xml -- Загрузка картинок стрелок, потом будет создан "словарь" на одну тему и это будет заниматься рассортировкой пикселей

/Images/x.pic -- x - название одной из стрелок, как не странно хранит это самую стрелку

/Songs and sounds/test.Xml -- список который и хранит расположение стрелок на милисек. я знаю что он хранит пустые скобки и открыт вопрос на то как это исправить

Test.app.rar -- оно

SEB.rar -- работающий на супер коленке редактор стрелок (Song Editor Beta), для его правильной работы нужно указать полный путь к файлу /Images/arrows.Xml, оно загрузит всё что можно, еще в переменной path поставить путь к корню приложения без / (/Usres/Exemple), оно само добавит

(сжато для экономий место на пользователе форума)
УРЯЯЯ оно заработало, кстати небольшой отзыв на MineCode IDE, с снапшота 1.8.0 оно при стираний последнего символа в строке выкидывает в java.outOfBounds или типо того, страшна, и оно не работало потому-что он запускался в нём, а не через "оболочку", но я всё же был бы очень* признателен если-бы вы помогли доделать мою программу в прекрасный вид как и задумывается 

Изменено пользователем Oleshe
😎 + оно работает, вопрос темы решён

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
7 часов назад, Oleshe сказал:

Test.app.rar -- оно

Ничего не понял, т.к. исходники из архива работают без ошибок. Судя по скрину, проблема была в том, что b на каком-то этапе становилась nil - вполне вероятно, из-за того, что она глобальна для нескольких файлов приложения, и возникал конфликт

 

7 часов назад, Oleshe сказал:

MineCode IDE, с снапшота 1.8.0 оно при стираний последнего символа в строке выкидывает в java.outOfBounds

Ошибка в либе unicode, иссую на гите создал, должны пофиксить. Вообще, если уж играешь на снапшотах, то стабильности ждать не приходится - на то они и снапшоты

 

7 часов назад, Oleshe сказал:

но я всё же был бы очень* признателен если-бы вы помогли доделать мою программу в прекрасный вид как и задумывается 

Доделать - не, слишком сложно и непонятно, а немного инфы по системе дать могу:

 

1) При работе с UI и workspace не стоит злоупотреблять слушателями нажатий на клавиши через event.addHandler, т.к. это низкоуровневая фича, предназначенная для обработки событий вне интерфейса. К примеру, для библиотеки keyboard и реализации метода isKeyDown она вполне пригодна, а вот в случае с интерфейсом она дарует лишь попоболь, заставляя вручную вызывать event.removeHandler при любых ошибках или при закрытии приложения.

 

Поэтому, если ты разрабатываешь оконное приложение, интегрирующееся в системный workspace (тот самый, где располагаются ярлыки на раб. столе), следует использовать концепцию "перегрузки" обработчика событий для окна приложения. После закрытия окна все обработчики автоматически удалятся вместе с окном.

 

А если ты создаешь полноэкранное приложение с кастомным workspace (существующее вне рабочего стола ОС), проще всего использовать назначить обработчик событий для всего рабочего пространства. После выхода из приложения все обработчики также будут удалены.

 

2) Юишка в майноси построена по принципу Single Thread Application с 1 общим бесконечным циклом на всё рабочее пространство. При возникновении события каждый визуальный элемент на экране получит возможность как-то отреагировать на него через eventHandler. Если тебе нужно параллельно работать в интерфейсе и делать что-то, скажем, раз в 5 сек, то:

local workspace = GUI.workspace()

local interval = 5
local deadline = uptime + interval

-- Добавляем в рабочее пространство кнопки, картинки и т.п.
...

-- Назначаем глобальный обработчий событий для всего рабочего пространства
workspace.eventHandler = function(_, _, e1)
  if computer.uptime() > deadline then
    -- Осуществляем желаемое действие раз в 5 сек
    	
    deadline = computer.uptime() + interval
  end
end

-- Пуллим события с максимально возможной скоростью и нулевой задержкой
workspace:start(0)

Это я к тому, что не следует создавать вложенных бесконечных циклов, работающих параллельно через имитацию многопоточности, т.к. это масло масляное и против самой концепции STA в рамках однопоточных опенкомпов

 

3) Если прям уж СИЛЬНО хочется работать с потоковыми библиотеками, то хозяин - барин. Но в этом случае как минимум не следует использовать глобальные переменные типа b, wrk, todraw, которые гарантированно приведут к конфликтам имён и засорят пространство

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...