Задать вопрос
Разрабатываю следующие вещи
M2k - простая 2d retro-игра для Linux i Android,
dbscript4 - редактор для коллективной работы с базой данных с поддержкой гиперссылок на конкретные ячейки и строки таблицы. (можно отправлять даже по почте)
линукс "для дома" с встроенной поддержкой DXVK (DX11) из коробки.
для облегчения базовой установки опытным, и для упрощения знакомства неопытным пользователям.

Наибольший вклад в теги

Все теги (1)

Лучшие ответы пользователя

Все ответы (6)
  • Как правильно работать с Canvas в Love2D?

    @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 пикселей .если что.

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