Присоедините плитки в SDK Corona в одно слово для сетки игр Breakout?
У меня есть игровой проект для повторной реализации Breakout. Я хочу показать два слова, каждое слово на линии. К ним присоединяется блок кирпичей. Внутри верхняя строка - это первое имя, выровненное влево. Нижняя строка - это фамилия, выровненная справа. Они вводятся из текстовых полей и отображаются как показано:
![As described above]()
Каждая секунда, которая проходит, на экране будет добавляться настраиваемое количество кирпичей в сетку (например, пять кирпичей в секунду), пока два слова не будут заполнены. Я отобразил букву алфавита, которая создается из матрицы (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
Ответы
Ответ 1
В интересах ответа на вопрос:
Я не уверен на 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
Вы сохраняете буквы в таблице поиска, а затем копируете их по частям на данные уровня. Здесь я заменил числа точками и знаками числа, чтобы сделать его более красивым в командной строке.
В качестве альтернативы вы также можете "визуализировать" слова в подготовленном буфере, а затем вставлять их в данные уровня, используя ту же логику.