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

screen не пашет

Вопрос

В общем вопрос опять адресован к ECS.

Вот у нас уже есть наша перменная в нашей функций, но screen.drawRectangle ничего не делает. Вообще. Оно может только пожаловаться что ожидалась цифра а получило шыш.

Уже весь код, это бтблтотека:

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

function toend.draw(where,x,y,what)
  toendobject = where:addChild(gui.object(x,y,what.width,what.heigth))
  toendobject.what = what
  toendobject.draw = function(toendobject)
    local what = toendobject.what
    local screen = require('screen')
    for i = 1,#what do
      require('component').gpu.set(1,1,tostring(i))
      print(what[i])
      if what[i].type == 'line' then
        print('draw line')
        screen.drawLine(what[i].x,what[i].y,what[i].x1,what[i].y1,what[i].color,0x0,' ')
      elseif what[i].type == 'square' then
        print('draw square',what[i].x,what[i].y,what[i].x1,what[i].y1,what[i].color)
        screen.drawRectangle(what[i].x,what[i].y,what[i].x1,what[i].y1,what[i].color,0xFFFFFF,'R')
      elseif what[i].type == 'cucle?' then
        print('draw cucle?')
        screen.drawEllipse(what[i].x-what[i].r,what[i].y-what[i].r,what[i].r,what[i].r,what[i].color,' ')
      end
    end
  end
  return toendobject,where
end

 

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

Да оно правильное.

Да оно определяет тип фигуры.

Код "активаций":

...
wk = gui.workspace(160,50)
_,wk = lib.draw(wk,1,1,a)
...

а - содержит в себе там все эти х, у и тому подобные. Упакованы они правильно.

Изменено пользователем Oleshe

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


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

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

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

gui.workspace(160,50)

Workspace создается за пределами экрана, первые два параметра - это x и y. Подробнее в доке

  

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

a = vector.new(10,10)

a = vector.add(a,1,1,'square',10,10,0xFFFFFF)

a = vector.add(a,1,1,'line',10,10,0xFFFFFF)

Переменная "a" переопределена, из-за чего теряется объект, созданный в vector.new(). Т.е. каждая новая фигура добавляется не в родительский object, а в предыдущую фигуру

 

Фиксим, радуемся:

 

image.png.338abc2f440624c0bf1a3f0b73c3e734.png

 

Это что касалось логики. Теперь по коду: осмелюсь прогнать его через Lua Beautifier, оформить ООП и дать человеческие названия переменным, т.к. "a", "what" или "toendobject" имеют сомнительную информативность. Использовать его или нет - дело, офк, твоё

 

Приложение:

 

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

local vector = require("vectorImage")
local gui = require("gui")

-----------------------------------------------------

local workspace = gui.workspace()

-- Создаем фоновую панель для заливки цветом
workspace:addChild(gui.panel(1, 1, workspace.width, workspace.height, 0x262626))

-- Создаем холст, на котором будут располагаться фигуры
local canvas = workspace:addChild(vector.newCanvas(3, 2, 20, 10))

-- Добавляем фигуры на холст
canvas:addShape(1, 1, "rectangle", 20, 10, 0x444444)
canvas:addShape(3, 2, "line", 18, 9, 0xFF0000)
canvas:addShape(10, 5, "ellipse", 6, 3, 0xFFFFFF)

-----------------------------------------------------

workspace:draw()
workspace:start()

 

 

Либа:

 

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

local gui = require("gui")
local screen = require("screen")
local fs = require("filesystem")
local compress = require("compressor")

-----------------------------------------------------

local vectorImage = {}

local function unpack(type)
  return compress.unpack(type, "/Temporary/lib")
end

local function pack(type)
  return compress.pack("/Temporary/lib", type)
end

function vectorImage.new(width, heigth)
  return {width = width, heigth = heigth}
end

function vectorImage.load(path)
  if fs.exists(path) then
    unpack(path)
    
    return fs.readTable("/Temporary/lib")
  else
    return nil, "File does not exists"
  end
end

function vectorImage.save(type, path)
  fs.writeTable(type, "/Temporary/lib")
  
  return pack(path)
end

local function canvasAddShape(canvas, x, y, type, ...)
  local args = {...}
  
  if type == "line" then
    table.insert(canvas.shapes, {
      type = type,
      x = x,
      y = y,
      x1 = args[1],
      y1 = args[2],
      color = args[3]
    })
  elseif type == "rectangle" then
    table.insert(canvas.shapes, {
      type = type,
      x = x,
      y = y,
      width = args[1],
      height = args[2],
      color = args[3]
    })
  elseif type == "ellipse" then
    table.insert(canvas.shapes, {
      type = type,
      x = x,
      y = y,
      radiusX = args[1],
      radiusY = args[2],
      color = args[3]
    })
  end
  
  return canvas
end

local function canvasDraw(canvas)
  local x, y = canvas.x, canvas.y
  local shapes = canvas.shapes
  local shape

  for i = 1, #shapes do
    shape = shapes[i]

    if shape.type == "line" then
      screen.drawLine(
        x + shape.x - 1,
        y + shape.y - 1,
        x + shape.x1 - 1,
        y + shape.y1 - 1,
        shape.color,
        0x0,
        " "
      )
    elseif shape.type == "rectangle" then
      screen.drawRectangle(
        x + shape.x - 1,
        y + shape.y - 1,
        shape.width,
        shape.height,
        shape.color,
        0xFFFFFF,
        " "
      )
    elseif shape.type == "ellipse" then
      screen.drawEllipse(
        x + shape.x - 1,
        y + shape.y - 1,
        shape.radiusX,
        shape.radiusY,
        shape.color,
        0xFFFFFF,
        " "
      )
    end
  end
end

function vectorImage.newCanvas(x, y, width, height)
  local canvas = gui.object(x, y, width, height)
  
  canvas.shapes = {}

  canvas.draw = canvasDraw
  canvas.addShape = canvasAddShape

  return canvas
end

return vectorImage

 

 

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


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

Исходники не полные, инфы о создании элементов фигур в what нет, поэтому чёрт его знает. На текущий момент в глаза бросается лишь использование глобальных экранных координат вместо локальных координат объекта в методе отрисовки. Все методы либы screen работают с экраном, а не с объектом toendobject, у которого есть свои собственные координаты. Поэтому для корректной отрисовки фигур нужно будет юзать конструкцию вида

screen.drawRectangle(
  toendobject.x + what[i].x,
  toendobject.y + what[i].y,
  toendobject.x + what[i].x1,
  toendobject.y + what[i].y1,
  what[i].color,
  0xFFFFFF,
  'R'
)

Ещё мб ты не вызываешь метод workspace:draw() после добавления всех элементов в него, поэтому никаких новых данных на экране и не появляется

 

И напоследок, вполне может быть, что x/y/x1/y1 не округлены, что выливается в ошибки экранной либы. Но опять же, без полных сырцов что-либо дельное сказать сложно

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


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

Исходники не полные, инфы о создании элементов фигур в what нет

Либа:

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

local gui = require('gui')
local screen = require('screen')
local toend = {}
local fs = require('filesystem')
local compress = require('compressor')
local function unpack(what)
  return compress.unpack(what,'/Temporary/lib')
end
local function pack(what)
  return compress.pack('/Temporary/lib',what)
end
function toend.new(width,heigth)
  return {width=width,heigth=heigth}
end
function toend.add(where,x,y,what,...)
  local args = {...}
  if what == 'line' or what == 'square' then
    table.insert(where,{x=x,y=y,type=what,x1=args[1],y1=args[2],color=args[3]})
  end
  if what == 'cucle?' then
    table.insert(where,{x=x,y=y,type=what,r=args[1],color=args[2]})
  end
  return where
end
function toend.load(path)
  if fs.exists(path) then
  unpack(path)
  return fs.readTable('/Temporary/lib') 
  else
  return nil,'File does not exists'
  end
end
function toend.save(what,path)
  fs.writeTable(what,'/Temporary/lib')
  return pack(path)
end
function toend.draw(where,x,y,what)
  toendobject = where:addChild(gui.object(x,y,what.width,what.heigth))
  toendobject.what = what
  toendobject.draw = function(toendobject)
    local what = toendobject.what
    local screen = require('screen')
    for i = 1,#what do
      require('component').gpu.set(1,1,tostring(i))
      print(what[i])
      if what[i].type == 'line' then
        print('draw line')
        screen.drawLine(what[i].x,what[i].y,what[i].x1,what[i].y1,what[i].color,0x0,' ')
      elseif what[i].type == 'square' then
        print('draw square',what[i].x,what[i].y,what[i].x1,what[i].y1,what[i].color)
        screen.drawRectangle(what[i].x,what[i].y,what[i].x1,what[i].y1,what[i].color,0xFFFFFF,'R')
      elseif what[i].type == 'cucle?' then
        print('draw cucle?')
        screen.drawEllipse(what[i].x-what[i].r,what[i].y-what[i].r,what[i].r,what[i].r,what[i].color,' ')
      end
    end
  end
  return toendobject,where
end
return toend

 

Запуск:

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

local vector = require('vectorImage')
local gui = require('gui')
a = vector.new(10,10)
a = vector.add(a,1,1,'square',10,10,0xFFFFFF)
a = vector.add(a,1,1,'line',10,10,0xFFFFFF)
wk = gui.workspace(160,50)
_,wk=vector.draw(wk,1,1,a)
wk:draw() -- Всё чётко как видете
wk:start()

 

Ну типа. Удачи разобраться :)

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


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

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

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

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

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

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

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

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

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


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