@Ensiouel

Как правильно работать с Canvas в Love2D?

Начал свое знакомство с Canvas, и возник вопрос, правильно ли так делать, у меня есть карта тайлов, которую я рисую один раз через
canvas:renderTo(function()
--и тут я рисую много тайлов по вертикали и горизонтали
)

и после всего этого рисую в love.draw() этот Canvas, и не совсем понятно, хорошо ли так делать, просто до этого я рисовал циклом тайлы в love.draw(), не используя Canvas, и по этому мог узнать, какие тайлы попадают в экран, а какие нет
  • Вопрос задан
  • 193 просмотра
Пригласить эксперта
Ответы на вопрос 1
@dj--alex
Canvas можно узнать что содержит сделав скриншот канваса.

GAMEWINDOWCANVAS:newImageData():encode('png', realpath..levelname.. 'x2.png');
подставляете имя своей функции вместо gamewindow. в какой то из версий love newImageData переименована учтите.

я бы привел свой код целиком. но он слишком страшный. привел сокращенную версию примера со всеми ключевыми командами.
поэтому опишу те крупицы что выучил сам.
У меня 2 канваса.
1-й атлас. в нем содержится все рисунки что есть в игре.
2-й канвас это игровое поле, в нем "рисуется" поле кусочками 1-го канваса. квадами.

пример как создать атлас.
function create_atlas ()
ATLAS = love.graphics.newCanvas(8192, basetexturesize) -- это создание пустой картинки для наполнения ее картой спрайтов.
nonetexture="1empty.png";
IMAGES = {};
IMAGES[0]=objs[0+1][3]; -- у меня здесь обращение к таблице со списком ВСЕХ используемых картинок.
for a0=1,170,1 do -- максимум временно 170 (6800 пикс), для 1 байтового режима - 256.
IMAGES[a0]=objs[a0][3]; -- загружаем список имён из таблицы обьектов.
end

love.graphics.setCanvas(ATLAS)
for i = 0, #IMAGES - 1 do
local img = love.graphics.newImage("Textures/"..IMAGES[i + 1]);
if (img==nil) then love.graphics.newImage("Textures/"..nonetexture); end;
love.graphics.draw(img, i * basetexturesize)
IMAGES[i + 1] = love.graphics.newQuad(i * basetexturesize, 0, basetexturesize, basetexturesize, 8192, basetexturesize)
end
love.graphics.setCanvas()
end

дальше можно просто рисовать тем массивом который сгенерировали в images
GAMEWINDOWCANVAS = love.graphics.newCanvas(xxxx, yyyy) -- x,y, это создание пустой картинки для наполнения ее картой спрайтов.
nonetexture="1empty.png";
IMAGESX = {};
love.graphics.setCanvas(GAMEWINDOWCANVAS);
for yy=1,0+visual_mapsize_vertical,1 do -- этот цикл делает рендеринг, он же должен сделать активную копию карты. --5*editor+maximumvertical
for xx=1,0+visual_mapsize_horizontal,1 do
IMAGESX[object_to_rendering]=IMAGES[objectcodenow + 1];
OBJECTPRINTNOW_IMAGESX=IMAGESX[object_to_rendering];
postobjectX=xx*rozmiarznak;
postobjectY=yy*rozmiarznak;
love.graphics.draw(ATLAS,OBJECTPRINTNOW_IMAGESX,postobjectX, postobjectY,0,scaling,scaling);
-- вот именно эта строчка выше и рисует всё что вы захотите на игровом поле.
end;
a=a+1;

end;
a=a+mapsize_horizontal-visual_mapsize_horizontal;
end;
end

love.graphics.setCanvas() -- эта строчка возвращает рендерер в игровое поле. обязательная.

пример не совсем правильный т.к. я не дошёл до того чтобы в 2-3 строки расположиь картинки
я говорю у самого опыта пока мало.
видеокарты не поддерживают ширину канвас более 8000 пикселей .если что.

И ещё. Канвас надо формировать только если на поле что то меняется.
Если игрок стоит на месте и не шевелится и его враги тоже - - его перерисовывать не надо.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы