Объедините плитки в Corona SDK одним словом для игровой сетки Breakout?

У меня есть игровой проект, который нужно повторно реализовать Breakout. Я хочу отобразить два слова, каждое слово в строке. Они соединены кирпичным блоком. Внутри верхняя строка - это имя, выровненное по левому краю. Нижняя строка - фамилия, выровненная по правому краю. Они вводятся из текстовых полей и отображаются, как показано:

Как описано выше

Каждую прошедшую секунду экран будет добавлять в сетку настраиваемое количество кирпичей (например, пять кирпичей в секунду), пока два слова не появятся законченными. Я отобразил букву алфавита, созданную из матрицы (0,1).

... Но я не знаю, как соединить их в одно слово. Как я могу присоединиться к этим письмам?

Вот что я получил до сих пор:

Bricks.lua

local Bricks = display.newGroup() -- static object
local Events = require("Events")
local Levels = require("Levels")
local sound = require("Sound")
local physics = require("physics")
local Sprites = require("Sprites")
local Func = require("Func")


local brickSpriteData = 
{
    {
        name = "brick",
        frames = {Sprites.brick}
    },

    {
        name = "brick2",
        frames = {Sprites.brick2}
    },

    {
        name = "brick3",
        frames = {Sprites.brick3}
    },

}

-- animation table
local brickAnimations = {}

Sprites:CreateAnimationTable
{
    spriteData = brickSpriteData,
    animationTable = brickAnimations
}

-- get size from temp object for later use
local tempBrick = display.newImage('red_apple_20.png',300,500)
--local tempBrick = display.newImage('cheryGreen2.png',300,500)
local brickSize =
{
    width = tempBrick.width, 
    height = tempBrick.height
}
--tempBrick:removeSelf( )


----------------
-- Rubble -- needs to be moved to its own file
----------------

local rubbleSpriteData =
{
    {
        name = "rubble1",
        frames = {Sprites.rubble1}
    },

    {
        name = "rubble2",
        frames = {Sprites.rubble2}
    },

    {
        name = "rubble3",
        frames = {Sprites.rubble3}
    },

    {
        name = "rubble4",
        frames = {Sprites.rubble4}
    },

    {
        name = "rubble5",
        frames = {Sprites.rubble5}
    },

}

local rubbleAnimations = {}
Sprites:CreateAnimationTable
{
    spriteData = rubbleSpriteData,
    animationTable = rubbleAnimations
}

local totalBricksBroken = 0 -- used to track when level is complete
local totalBricksAtStart = 0

-- contains all brick objects
local bricks = {}


local function CreateBrick(data)

    -- random brick sprite
    local obj = display.newImage('red_apple_20.png')
    local objGreen = display.newImage('cheryGreen2.png')
    obj.name = "brick"
    obj.x = data.x --or display.contentCenterX
    obj.y = data.y --or 1000
    obj.brickType = data.brickType or 1
    obj.index = data.index

    function obj:Break()

        totalBricksBroken =  totalBricksBroken + 1
        bricks[self.index] = nil
        obj:removeSelf( )
        sound.play(sound.breakBrick)

    end

    function obj:Update()
        if(self == nil) then
            return
        end 

        if(self.y > display.contentHeight - 20) then
            obj:Break()
        end 
    end 
    if(obj.brickType ==1) then
        physics.addBody( obj, "static", {friction=0.5, bounce=0.5 } )
    elseif(obj.brickType == 2) then
        physics.addBody( objGreen,"static",{friction=0.2, bounce=0.5, density = 1 } )
    end 

    return obj
end

local currentLevel = testLevel
-- create level from bricks defined in an object
-- this allows for levels to be designed
local function CreateBricksFromTable(level)

    totalBricksAtStart = 0
    local activeBricksCount = 0
    for yi=1, #level.bricks do
        for xi=1, #level.bricks[yi] do
            -- create brick?
            if(level.bricks[yi][xi] > 0) then
                local xPos
                local yPos
                if(level.align == "center") then
                    --1100-((99*16)*0.5)
                    xPos = display.contentCenterX- ((level.columns * brickSize.width) * 0.5/3) + ((xi-1) * level.xSpace)--display.contentCenterX 
                    --xPos = 300 +(xi * level.xSpace)
                    yPos = 100 + (yi * level.ySpace)--100
                else
                    xPos = level.xStart + (xi * level.xSpace)
                    yPos = level.yStart + (yi * level.ySpace)
                end

                local brickData = 
                {
                    x = xPos,
                    y = yPos,
                    brickType = level.bricks[yi][xi],
                    index = activeBricksCount+1
                }
                bricks[activeBricksCount+1] = CreateBrick(brickData)

                activeBricksCount = activeBricksCount + 1

            end

        end 

    end

    totalBricks = activeBricksCount
    totalBricksAtStart = activeBricksCount


end

-- create bricks for level --> set from above functions, change function to change brick build type
local CreateAllBricks = CreateBricksFromTable
-- called by a timer so I can pass arguments to CreateAllBricks
local function CreateAllBricksTimerCall()
    CreateAllBricks(Levels.currentLevel)
end 
-- remove all brick objects from memory
local function ClearBricks()

    for i=1, #bricks do
        bricks[i] = nil
    end

end
-- stuff run on enterFrame event
function Bricks:Update()

-- update individual bricks
    if(totalBricksAtStart > 0) then
        for i=1, totalBricksAtStart do
            -- brick exists?
            if(bricks[i]) then
                bricks[i]:Update()
            end 
        end 
    end
    -- is level over?
    if(totalBricksBroken == totalBricks) then
        Events.allBricksBroken:Dispatch()
    end

end
----------------
-- Events
----------------
function Bricks:allBricksBroken(event)
    -- cleanup bricks
    ClearBricks()
    local t = timer.performWithDelay( 1000, CreateAllBricksTimerCall)
    --CreateAllBricks()
    totalBricksBroken = 0       

    -- play happy sound for player to enjoy
    sound.play(sound.win)

    print("You Win!")
end
Events.allBricksBroken:AddObject(Bricks)
CreateAllBricks(Levels.currentLevel)
return Bricks

Levels.lua

local Events = require("Events")
local Levels = {}
local function MakeLevel(data)
    local level = {}
    level.xStart = data.xStart or 100
    level.yStart = data.yStart or 100
    level.xSpace = data.xSpace or 23
    level.ySpace = data.ySpace or 23
    level.align = data.align or "center"
    level.columns = data.columns or #data.bricks[1]
    level.bricks = data.bricks --> required
    return level
end
Levels.test4 = MakeLevel
{
    bricks =
    {
        {0,2,0,0,2,0,0,2,0},
        {0,0,2,0,2,0,2,0,0},
        {0,0,0,0,2,0,0,0,0},
        {1,1,2,1,1,1,2,1,1},
        {0,0,0,0,1,0,0,0,0},
        {0,0,0,0,1,0,0,0,0},
        {0,0,0,0,1,0,0,0,0},
    }
}

Levels.test5 = MakeLevel
{
    bricks =
    {       
                    {0,0,0,1,0,0,0,0},
                     {0,0,1,0,1,0,0,0},
                     {0,0,1,0,1,0,0,0},
                     {0,1,0,0,0,1,0,0},
                     {0,1,1,1,1,1,0,0},
                     {1,0,0,0,0,0,1,0},
                     {1,0,0,0,0,0,1,0},
                     {1,0,0,0,0,0,1,0},
                     {1,0,0,0,0,0,1,0}
    }
}
-- Levels.test6 = MakeLevel2
-- {
--  bricks =
--  {
----A         "a" = {{0,0,0,1,0,0,0,0},
--                   {0,0,1,0,1,0,0,0},
--                   {0,0,1,0,1,0,0,0},
--                   {0,1,0,0,0,1,0,0},
--                   {0,1,1,1,1,1,0,0},
--                   {1,0,0,0,0,0,1,0},
--                   {1,0,0,0,0,0,1,0},
--                   {1,0,0,0,0,0,1,0},
--                   {1,0,0,0,0,0,1,0}},
----B
--            "b" = {{1,1,1,1,0,0,0},
--                   {1,0,0,0,1,0,0},
--                   {1,0,0,0,1,0,0},
--                   {1,0,0,0,1,0,0},
--                   {1,1,1,1,0,0,0},
--                   {1,0,0,0,1,0,0},
--                   {1,0,0,0,0,1,0},
--                   {1,0,0,0,0,1,0},
--                   {1,1,1,1,1,0,0}},
--...........
--.......
--...
-- --Z
--             "z"= {{1,1,1,1,1,1,1,0},
--                   {0,0,0,0,0,1,0,0},
--                   {0,0,0,0,1,0,0,0},
--                   {0,0,0,0,1,0,0,0},
--                   {0,0,0,1,0,0,0,0},
--                   {0,0,1,0,0,0,0,0},
--                   {0,0,1,0,0,0,0,0},
--                   {0,1,0,0,0,0,0,0},
--                   {1,1,1,1,1,1,1,0}} 
--  }
-- }
-- stores all levels in ordered table so that one can be selected randomly by index
Levels.levels = 
{
    --Levels.test4,
     Levels.test5
    -- Levels.test6,
}
function Levels:GetRandomLevel()
    return self.levels[math.random(#Levels.levels)]
end
Levels.notPlayedYet = {}
Levels.currentLevel = Levels:GetRandomLevel()
-- Events
function Levels:allBricksBroken(event)
    self.currentLevel = Levels:GetRandomLevel()
end
Events.allBricksBroken:AddObject(Levels)
return Levels

Работа, которую я проделал до сих пор (такая же, как и выше), в виде внешней загрузки: http://www.mediafire.com/download/1t89ftkbznkn184/Breakout2.rar


person nguyentrungkien    schedule 20.07.2016    source источник
comment
К вашему сведению, вы случайно сломали переполнение стека ...   -  person kirbyfan64sos    schedule 21.07.2016
comment
Google сказал мне, что на этой странице было найдено сообщение «Включи приятный звук, чтобы игрок мог наслаждаться», так что я здесь, чтобы посмотреть - где же 20000 пробелов?   -  person techolic    schedule 21.07.2016
comment
@techolic Они были удалены: stackoverflow.com/posts/38484433/revisions   -  person ernest    schedule 21.07.2016
comment
Этот вопрос будет очень горячим: p   -  person Matt Kocaj    schedule 21.07.2016
comment
Если вы пришли сюда из Google, то, вероятно, вы после мета-сообщения meta.stackoverflow.com/questions/328376/   -  person Grant Holliday    schedule 21.07.2016
comment
Я очень удивлен, что на это только ~ 3000 просмотров ... лолз ...   -  person alvas    schedule 21.07.2016
comment
Расскажите, пожалуйста, как вы получили 20000 пробелов в сообщении на StackOverflow!   -  person rubik    schedule 21.07.2016


Ответы (2)


В интересах фактического ответа на вопрос:

Я не на 100% уверен, что вы имеете в виду, говоря «Как я могу присоединиться к этим письмам», но, просматривая код, я догадываюсь, поэтому, пожалуйста, поясните, является ли он точным, или я ошибаюсь в том, что вы хотели.

Сценарий 1

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

В этом случае вам нужно лучше понимать, что делает ваш код. Функция CreateBricksFromTable принимает объект Level, который создается функцией MakeLevel из таблицы со свойством bricks, которая представляет собой таблицу таблиц, представляющих строки со столбцами в них, показывая, какой тип кирпича должен быть в каждой позиции. На закомментированном уровне вы создали таблицу, в которой поле bricks содержит поле для каждой буквы, но функция MakeLevel по-прежнему ожидает поле bricks, которое непосредственно содержит сетку блоков. Вам придется - как кажется, вы пытались - создать функцию MakeWordLevel (или что-то подобное), которая берет этот список букв и слово для каждой строки и создает большую сетку, копируя в нее соответствующие буквы.

StackOverflow - не ваш наставник по программированию, и вопрос SO - не подходящий форум для того, чтобы люди писали для вас код или подробно рассказывали, как это сделать, но я оставлю вам базовую схему. Ваша функция будет выглядеть примерно так:

local function MakeWordLevel(data, line1, line2)
    local level = {}
    ...
    return level
end

А потом пришлось бы:

  • Заполните все те же свойства, что и MakeLevel
  • Посчитайте, насколько широким (level.columns) уровнем должен быть уровень со всеми буквами.
  • Создайте таблицу в том же формате, что и свойства bricks, но достаточно большую, чтобы вместить все буквы.
  • Просмотрите входные строки (line1 и line2), найдите правильные буквенные данные из того, что сейчас является массивом test6, и скопируйте эти данные в большую таблицу.
  • Назначьте эту таблицу как level.bricks

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

Сценарий 2:

Это было мое первоначальное предположение, но после рассмотрения и прочтения прошлых правок я сомневаюсь, что это ответ на правильный вопрос

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

В этом случае главное, что вам нужно сделать, - это отслеживать, какие пробелы занимают именные блоки. Есть много способов сделать это, но я бы начал с матрицы, чтобы отслеживать это - размером с конечное игровое поле - заполненное нулями. Затем, когда вы добавляете кубики для имени, установите 1 в позиции x, y в этой матрице в соответствии с координатой этого блока.

Если вы хотите заполнить фон, каждый раз, когда вы добавляете блок в координату, проверяйте эту взятую матрицу, прежде чем пытаться добавить блок - если она занята (1), просто пропустите ее и перейдите к следующей координате.

Это работает, если вы заполняете фоновые блоки последовательно (например, слева направо, сверху вниз) или если вы хотите добавить их случайным образом. При использовании random вы также захотите продолжать обновлять взятую матрицу, чтобы не пытаться добавить блок дважды.

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

person cincodenada    schedule 21.07.2016

Я действительно не понимаю (или не читаю, если на то пошло) ваш код, но, судя по тому, что я вижу, легко объединить их в полные слова. У вас есть две возможности.

Вы можете «визуализировать» их прямо в данные вашего уровня / дисплея, просто скопируйте их в соответствующие места, например:

-- The level data.
local level = {}

-- Create the level data.
for row = 1, 25, 1 do
    local rowData = {}

    for column = 1, 80, 1 do
        rowData[column] = "."
    end

    level[row] = rowData
end

-- Now let us setup the letters.
local letters = {
    A = {
        {".",".",".","#",".",".",".","."},
        {".",".","#",".","#",".",".","."},
        {".",".","#",".","#",".",".","."},
        {".","#",".",".",".","#",".","."},
        {".","#","#","#","#","#",".","."},
        {"#",".",".",".",".",".","#","."},
        {"#",".",".",".",".",".","#","."},
        {"#",".",".",".",".",".","#","."},
        {"#",".",".",".",".",".","#","."}
    },
    B = {
        {"#","#","#","#",".",".","."},
        {"#",".",".",".","#",".","."},
        {"#",".",".",".","#",".","."},
        {"#",".",".",".","#",".","."},
        {"#","#","#","#",".",".","."},
        {"#",".",".",".","#",".","."},
        {"#",".",".",".",".","#","."},
        {"#",".",".",".",".","#","."},
        {"#","#","#","#","#",".","."}
    }
}

-- The string to print.
local text = "ABBA"

-- Let us insert the data into the level data.
for index = 1, #text, 1 do
    local char = string.sub(text, index, index)
    local charData = letters[char]

    local offset = index * 7

    for row = 1, 9, 1 do
        local rowData = charData[row]

        for column = 1, 7, 1 do
            level[row][offset + column] = rowData[column]
        end
    end
end

-- Print everything
for row = 1, 25, 1 do
    local rowData = level[row]

    for column = 1, 80, 1 do
        io.write(rowData[column])
    end
    print()

end

Вы сохраняете свои буквы в поисковой таблице, а затем копируете их по частям в данные уровня. Здесь я заменил числа точками и числовыми знаками, чтобы было красивее в командной строке.

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

person Bobby    schedule 21.07.2016