Corona SDK のタイルを 1 つの単語に結合して、Breakout ゲーム グリッドを作成しますか? 質問する

Corona SDK のタイルを 1 つの単語に結合して、Breakout ゲーム グリッドを作成しますか? 質問する

再実装するゲームプロジェクトがあります起こる2 つの単語を 1 行に表示します。単語は bricks ブロックで結合されます。内部では、上の行は名で、左揃えになっています。下の行は姓で、右揃えになっています。これらはテキスト ボックスから入力され、次のように表示されます。

上記のように

1 秒ごとに、画面には設定可能な数のレンガがグリッドに追加され (たとえば、1 秒あたり 5 個のレンガ)、2 つの単語が完成するまで続きます。マトリックス (0,1) から作成されたアルファベットの文字を表示しました。

...しかし、それらを 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

ベストアンサー1

実際に質問に答えるために:

「これらの文字を結合するにはどうすればよいか」が何を意味するのか、100% はわかりませんが、コードを調べたところ推測はできました。したがって、それが正確かどうか、または私が望んでいることが間違っているかどうかを明確にしてください。

シナリオ1

スクリーンショットに示されているイメージをうまく実現できていません。1 つの文字は描くことができましたが、複数の文字を描くことはできません。

この場合、コードが何をしているかをよりよく理解する必要があります。関数は、プロパティを持つテーブルから関数CreateBricksFromTableによって作成された Level オブジェクトを受け取ります。このプロパティは、各位置にどのタイプのブロックを配置するかを示す列を含む行を表すテーブルのテーブルです。コメントアウトされたレベルでは、フィールドに各文字のフィールドが含まれるテーブルを作成しましたが、関数は依然としてブロックのグリッドを直接含むフィールドを想定しています。あなたが試みたように、この文字リストと各行の単語を受け取り、適切な文字をコピーしてより大きなグリッドを構築する関数 (または同様のもの) を作成する必要があります。MakeLevelbricksbricksMakeLevelbricksMakeWordLevel

StackOverflow はプログラミングの先生ではありませんし、SO の質問は、誰かにコードを書いてもらったり、やり方をステップごとに詳しく教えてもらうのに適したフォーラムではありませんが、基本的な概要は残しておきます。関数は次のようになります。

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

そして、次のことを行う必要があります。

  • MakeLevel同じプロパティをすべて入力します
  • level.columnsすべての文字を使って、レベルの幅( )を計算します。
  • プロパティと同じ形式でbricks、すべての文字を収容できる大きさのテーブルを作成します。
  • 入力文字列(line1およびline2)を調べて、現在のtest6配列から正しい文字データを見つけ、そのデータを大きなテーブルにコピーします。
  • そのテーブルを次のように割り当てますlevel.bricks

この質問はすでに少し外れているStackOverflowの目的それはどのように機能を実装する小さな特定のプログラミングタスクを達成するのではなく、それ以上のフォローアップはチャットルームで行う必要があります。こんにちは世界部屋があると助かります。

シナリオ2:

これは私の当初の推測でしたが、過去の編集を検討して読んだ後、これが正しい質問に答えているかどうか疑問に思いました。

たとえば、赤いブロックで文字を囲み、フィールドを「壁」にして、名前を別の色にするなど、単色の「背景」が必要になる場合があります。また、これらのブロックを一度に少しずつゆっくりと表示したい場合もあります。

その場合、主に行う必要があるのは、名前のブロックがどのスペースを「占有」しているかを追跡することです。これを行うには多くの方法がありますが、私は、最終的なプレイフィールドと同じ大きさの 0 でいっぱいのマトリックスを使用して、それを追跡することから始めます。次に、名前のブロックを追加するときに、そのブロックの座標に従って、そのマトリックスの x、y の位置に 1 を設定します。

背景を塗りつぶしたい場合、座標にブロックを追加するたびに、ブロックを追加する前に「使用済み」マトリックスを確認します。使用済みの場合 (1)、それをスキップして次の座標に移動します。

これは、背景ブロックを順番に(たとえば、左から右、上から下へ)埋めていく場合、またはランダムに追加する場合に機能します。ランダムの場合は、ブロックを 2 回追加しないように、「取得」マトリックスを更新し続けることも必要です。

しかし、ランダムに埋め込むと、それ自体に問題が生じます。つまり、埋め込むのに時間がかかるようになります。なぜなら、より多くの「使用済み」ブロックが見つかり、新しいブロックを選択しなければならないからです。もちろん、これには解決策がありますが、それが本当に必要なのかどうかわからないので、その方法はあまり進めません。

おすすめ記事