Об’єднати плитки в Corona SDK одним словом для сітки гри Breakout?


77

У мене є ігровий проект для повторної реалізації Breakout . Я хочу відобразити два слова, кожне слово в рядку. Їх з’єднує цегляний блок. Усередині верхній рядок - це ім’я, вирівняне ліворуч. Нижній рядок - це прізвище, вирівняне праворуч. Вони вводяться з текстових полів і відображаються, як показано:

Як описано вище

Кожну секунду, що проходить, екран додаватиме до сітки конфігурується кількість цеглин (наприклад, п’ять цеглин за секунду), поки ці два слова не з’являться завершеними. Я показав букву алфавіту, яка створена з матриці (0,1).

... Але я не знаю, як об’єднати їх в одне слово. Як я можу приєднатись до цих листів?

Це те, що я отримав дотепер:

Цегла.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

Рівні.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


122

11
Google сказав мені, що на цій сторінці знайдено "грати веселий звук, щоб гравець насолоджувався", тому я тут, щоб подивитися - де 20000 пробілів?
techolic

6
@techolic Їх було видалено: stackoverflow.com/posts/38484433/revisions
Ернест


4
Розкажіть, будь ласка, як ви отримали 20000 пробілів у дописі StackOverflow!
rubik

Відповіді:


4

З метою фактичної відповіді на запитання:

Я не на 100% впевнений, що ви маєте на увазі під словом "Як я можу приєднатись до цих листів", але, перебираючи код, я здогадуюсь, тож, будь ласка, уточніть, чи точний він, чи я не правий щодо того, що ви хотіли.

Сценарій 1

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

У цьому випадку вам потрібно буде краще зрозуміти, що робить ваш код. CreateBricksFromTableФункція приймає об'єкт рівня, який створюється з допомогою 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:

Це було моє початкове припущення, але, обміркувавши та прочитавши минулі редагування, я сумніваюся, що це відповідає на правильне питання

Можливо, вам потрібен суцільний "фон", скажімо, червоних блоків, який оточує ваші букви і робить поле суцільною "стіною", з назвою іншого кольору. І ви можете захотіти, щоб ці цеглини повільно з’являлися по кілька разів.

У такому випадку головне, що вам потрібно зробити, - це відстежувати, які простори «зайняті» іменем цегли. Є багато способів зробити це, але я б почав з матриці, щоб відстежувати це - таке велике, як остаточне ігрове поле - заповнене 0. Потім, коли ви додаєте цеглини до імені, встановіть 1 у місці x, y в цій матриці відповідно до координати цього блоку.

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

Це працює, якщо ви заповнюєте фонові блоки послідовно (скажімо, зліва направо, зверху вниз) або якщо ви хочете додати їх випадковим чином. У випадковому режимі ви також хочете продовжувати оновлювати "взяту" матрицю, щоб не намагатися додати блок двічі.

Однак випадкове заповнення представляє власну проблему - заповнення заповнюватиметься довше, оскільки буде знаходити все більше "взятих" блоків і доведеться вибирати новий. Звичайно, є рішення для цього, але я не піду занадто далеко цією дорогою, коли не знаю, чи це навіть те, що ти хочеш.


2

Я насправді не розумію (чи читаю, з цього приводу) ваш код, але з того, що я бачу, об’єднати їх у цілі слова легко. У вас є дві можливості.

Ви можете "візуалізувати" їх безпосередньо у своїх даних рівня / відображення, просто скопіюйте у відповідні місця, наприклад:

-- 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

Ви зберігаєте свої листи в таблиці пошуку, а потім копіюєте їх поштучно до даних рівня. Тут я замінив цифри крапками та цифровими знаками, щоб зробити його гарнішим у командному рядку.

Крім того, ви також можете "відтворити" слова у підготовленому буфері, а потім вставити їх у дані рівня за допомогою тієї ж логіки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.