Проблемы с оптимизацией игры Xonix - PullRequest
0 голосов

Я играю в Xonix на Corona SDK.В качестве игрового поля я решил использовать сетку квадратов.Ширина 44, Высота 71. В результате я получил ряд, состоящий из 3124 (44 * 71) квадратов, по которым движется игрок.Но у меня проблемы с оптимизацией.Двигатель не справляется с таким количеством квадратов на экране одновременно.Из-за этого FPS на смартфоне не больше 12. Помогите найти лучшее решение.Все, что касается полигонов и сеток, я не силен в геометрии ((((*

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

Заранее спасибо!

-- Creating a playing field
M.create_pole = function()
    -- init
    local image = display.newImage
    local rect = display.newRect
    local rrect = display.newRoundedRect
    local floor = math.floor

    M.GR_ZONE = display.newGroup()
    M.POLE = {}

    -- bg
    M.POLE.bg = rrect(0,0,150,150,5)
    M.POLE.bg.width = M.width_pole
    M.POLE.bg.height = M.height_pole
    M.POLE.bg.x = _W/2
    M.POLE.bg.y = _H/2
    M.POLE.bg.xScale = _H*.00395
    M.POLE.bg.yScale = _H*.00395
    M.POLE.bg:setFillColor(API.hexToCmyk(M.color.land))
    M.GR:insert(M.POLE.bg)

    M.POLE.img = image(IMAGES..'picture/test.jpg')
    M.POLE.img.width = M.width_pole-M.size_xonix
    M.POLE.img.height = M.height_pole-M.size_xonix
    M.POLE.img.x = _W/2
    M.POLE.img.y = _H/2
    M.POLE.img.xScale = _H*.00395
    M.POLE.img.yScale = _H*.00395
    M.POLE.img.strokeWidth = 1.3
    M.POLE.img:setStrokeColor(API.hexToCmyk(M.color.img))
    M.GR:insert(M.POLE.img)

    -- control player
    M.POLE.bg:addEventListener( 'touch', M.swipe )
    M.POLE.bg:addEventListener( 'tap', function(e)
        M.POLE.player.state = 0
    end )

    -- arr field
    M.arr_pole = {} -- newRect
    local jj = 0
    for i=1,M.delta_height do -- 71 point
        M.arr_pole[i] = {}
        M.GUI.border[i] = {}
        for k=1,M.delta_width do -- 44 point
            jj = jj+1
            M.arr_pole[i][k] = {nm = jj}
            M.GUI.border[i][k] = {}

            local xx = k*M.size_xonix
            local yy = i*M.size_xonix

            local _x = floor(xx-M.size_xonix/2)
            local _y = floor(yy-M.size_xonix/2)

            M.arr_pole[i][k][1] = image(IMAGES..'pole/land.jpg')
            M.arr_pole[i][k][1] .x = _x
            M.arr_pole[i][k][1] .y = _y
            M.GR_ZONE:insert(M.arr_pole[i][k][1])


                        -- water at the edges
                        -- the rest is land
            if (i==1 or i==M.delta_height)
                or (k==1 or k==M.delta_width) then
                M.arr_pole[i][k].type = 0
            else
                M.arr_pole[i][k].type = 2
                M.arr_pole[i][k][1].isVisible = true
            end

        end
    end

    M.GR_ZONE.width = M.POLE.bg.width*M.POLE.bg.xScale
    M.GR_ZONE.height = M.POLE.bg.height*M.POLE.bg.yScale
    M.GR_ZONE.x = M.POLE.bg.x-M.POLE.bg.width*M.POLE.bg.xScale/2
    M.GR_ZONE.y = M.POLE.bg.y-M.POLE.bg.height*M.POLE.bg.yScale/2

    -- player

    local _x = M.arr_pole[1][1][1].x
    local _y = M.arr_pole[1][1][1].y

    M.POLE.player = image(IMAGES..'ui/player.png')
    M.POLE.player.x = _x
    M.POLE.player.y = _y
    M.POLE.player.width = M.size_xonix*1.5
    M.POLE.player.height = M.size_xonix*1.5
    M.POLE.player.state = 0
    M.GR_ZONE:insert(M.POLE.player)

    M.POLE.player:toFront()
end

-- get all free cells
- land
M.get_free = function(_i,_j,_start)
    local _par = pairs
    local _fill = M.filling_arr
    local _arr = M.arr_pole
    local _index = {
        {-1,-1}, {0,-1}, {1,-1},
        {-1, 0},         {1, 0},
        {-1, 1}, {0, 1}, {1, 1},
    }

    -- mark as verified
    _arr[_i][_j].is_check = true
    _fill[#_fill+1] = {_i,_j}

    for k,v in _par(_index) do
        local i = _i+v[1]
        local j = _j+v[2]

        if i>1 and i<M.delta_height
            and j>1 and j<M.delta_width then

            if not _arr[i][j].is_check then

                if _arr[i][j].type==2 then
                    M.get_free(i,j)
                end
            end

        end
    end

    if _start then
        return _fill
    end
end

-- fill(capture)
M.filling = function()
    -- init
    local par = pairs
    local tb_rem = table.remove

    local arr = M.arr_pole
    M.island_arr = {}

    -- check indicator
    for i,ii in par(arr) do
        for j,jj in par(ii) do
            if jj.type==2 then
                jj.is_check = false
            end
        end
    end

    -- we divide land into islands
    for i,ii in par(arr) do
        for j,jj in par(ii) do
            if jj.type==2 and not jj.is_check then
                M.filling_arr = {}
                M.island_arr[#M.island_arr+1] = M.get_free(i,j,true)
            end
        end
    end

    - find a larger island and delete it
    local sel_max = {dir = '', count = 1}
    for k,v in par(M.island_arr) do
        if #v>=sel_max.count then
            sel_max.dir = k
            sel_max.count = #v
        end
    end
    if #M.island_arr>0 then
        tb_rem(M.island_arr,sel_max.dir)
    end

    -- fill
    for k,v in par(M.island_arr) do
        for kk,vv in par(v) do
            local obj = arr[vv[1]][vv[2]]
            obj.type = 0

            obj[1].isVisible = false
        end
    end

    -- turning the edges into water
    for k,v in par(M.bread_crumbs) do
        local arr = arr[v.arr_y][v.arr_x]
        arr.type = 0

        arr[1].isVisible = false
    end

    M.clear_history()
end
...