ngu*_*ien 76 lua matrix breakout coronasdk
我有一个游戏项目来重新实现Breakout.我想在一行上显示两个单词,每个单词.它们由砖块连接在一起.在里面,顶行是第一个名称,左对齐.底线是姓氏,右对齐.它们是从文本框输入的,如下所示呈现:
通过的每一秒,屏幕将向网格添加可配置数量的砖块(例如,每秒五块砖块),直到两个单词看起来完整.我显示了一个由矩阵(0,1)创建的字母表.
......但我不知道如何将它们合并为一个词.我该如何加入这些信件?
这是我到目前为止所得到的:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
到目前为止我所做的工作(与上面相同)作为外部下载:http://www.mediafire.com/download/1t89ftkbznkn184/Breakout2.rar
为了实际回答这个问题:
我不是 100% 确定你所说的“我怎样才能加入这些字母”是什么意思,但是通过浏览代码我有一个猜测,所以请澄清它是否准确,或者我是否对你想要的内容有误。
您尚未成功获得屏幕截图中所示的图像 - 您只能绘制一个字母,但不能绘制多个字母。
在这种情况下,您需要更好地了解代码的用途。该CreateBricksFromTable
函数接受一个 Level 对象,该对象是由该MakeLevel
函数从具有属性的表创建的bricks
,该表是一个表组成的表,表示行和列,显示每个位置应该是什么类型的砖块。在注释掉的级别中,您创建了一个表,其中字段bricks
包含每个字母的字段,但该MakeLevel
函数仍然需要一个bricks
直接包含块网格的字段。您将必须 - 就像您尝试的那样 - 创建一个MakeWordLevel
函数(或类似的函数),该函数接受这个字母列表和每行一个单词,并通过将适当的字母复制到其中来构造一个更大的网格。
StackOverflow 不是你的编程导师,SO 问题也不是让人们为你编写代码或详细了解如何执行此操作的正确论坛,但我会给你留下一个基本的轮廓。你的函数看起来像这样:
local function MakeWordLevel(data, line1, line2)
local level = {}
...
return level
end
Run Code Online (Sandbox Code Playgroud)
然后必须:
MakeLevel
填充所有相同的属性level.columns
计算所有字母的水平面应有多宽 ( )bricks
,但足够大以容纳所有字母line1
和line2
),从现在的test6
数组中找到正确的字母数据,并将该数据复制到大表中level.bricks
这个问题已经有点超出了StackOverflow 的目的,因为它询问如何实现一个功能,而不是实现一个小的、特定的编程任务,因此任何进一步的后续操作都应该在聊天室中进行 - 也许Hello World房间会乐于助人。
这是我最初的猜测,但在考虑和阅读过去的编辑之后,我怀疑这是否回答了正确的问题
您可能需要一个坚实的“背景”,例如红色块,围绕您的字母并使该字段成为坚实的“墙”,名称采用不同的颜色。您可能希望这些砖块一次慢慢地出现一些。
在这种情况下,您需要做的主要事情是跟踪名称砖“占据”了哪些空间。有很多方法可以做到这一点,但我会从一个矩阵开始来跟踪它 - 与最终的比赛场地一样大 - 充满了 0。然后,当您添加名称的砖块时,根据该砖块的坐标在该矩阵中的 x,y 位置设置 1。
当您想要填充背景时,每次在某个坐标处添加块时,请在尝试添加块之前检查“已采取”矩阵 - 如果已采取(1),则跳过它并移至下一个协调。
如果您按顺序填充背景块(例如,从左到右,从上到下),或者如果您想随机添加它们,则此方法有效。对于随机,您还需要不断更新“采取的”矩阵,这样您就不会尝试两次添加块。
然而,随机填充也存在其自身的问题——随着填充的进行,它会花费更长的时间来填充,因为它会发现越来越多的“被占用”块,并且必须选择一个新的块。当然,有一些解决方案,但当我不知道这是否是您想要的时,我不会在这条路上走得太远。
归档时间: |
|
查看次数: |
7928 次 |
最近记录: |