我是iOS编程的新手,我正在尝试学习使用Sprite Kit快速创建游戏。
我想要实现的是在屏幕上创建并向右移动的块不断流动。
我首先创建一个包含所有初始块的集合,然后是一个动作"持续运动"被添加到每个,这使它们向右缓慢移动。我遇到的问题是在屏幕上添加新块。
最后一列的块有一个" isLast" boolean设置为true,当它超过某个阈值时,它应该切换为false并向该组添加一个新的块列,该列现在具有" isLast"设为true。
集合中的每个块都有" constantMovement"添加的动作使它们向右缓慢移动,新的块也添加了它,但它们不像原始块一样工作。
不是所有的举动,即使是我打印" hasActions()"它说它们会这样做,当它们到达屏幕中间时,移动的那些停止这样做。我不知道为什么会这样,有人有经验可以给我一个提示吗?
这是更新功能:
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
let constantMovement = SKAction.moveByX(-1, y: 0, duration: 10);
background.runAction(SKAction.repeatActionForever(constantMovement));
let removeBlock = SKAction.removeFromParent();
let frame = self.frame;
var currentBlockSprite:SKSpriteNode;
var newBlock: Block;
for block in blocks {
currentBlockSprite = block.sprite!;
currentBlockSprite.runAction(constantMovement);
if(block.column == NumColumns - 1) {
block.isLast = true;
}
if(block.isNew) {
println("position \(currentBlockSprite.position.x) has actions \(currentBlockSprite.hasActions())");
}
if(block.isLast && currentBlockSprite.position.x < frame.maxX - 50) {
println("the block that hits is " + block.description);
println("HITS AT \(currentBlockSprite.position.x)");
block.isLast = false;
for row in 0..<NumRows {
newBlock = Block(column: NumColumns - 1, row: row, blockType: BlockType.random(), isLast: true, isNew: true);
blocks.addElement(newBlock);
addBlockSprite(newBlock);
println("new block: " + newBlock.description + "position \(newBlock.sprite?.position.x)");
}
}
if(currentBlockSprite.position.x < frame.minX) {
currentBlockSprite.runAction(removeBlock);
blocks.removeElement(block);
}
}
}
我的整个项目都在这里:https://github.com/thanniaB/JumpingGame/tree/master/Experimenting 但请记住,因为我对此不熟悉,所以可能充满了令人讨厌的坏习惯。
答案 0 :(得分:1)
我会从更新功能中删除任何SKAction代码,因为这是一个坏主意。相反,当你将块精灵添加到场景时,我只会应用SKAction,就像这样。
private void button1_Click(object sender, EventArgs e)
{
panel1.Controls.Add(new Button() { Top = panel1.Controls.Count * 30 });
}
private void button2_Click(object sender, EventArgs e)
{
if (panel1.Controls.Count > 0)
panel1.Controls.RemoveAt(panel1.Controls.Count - 1);
panel1.Refresh();
}
然后,只要您认为合适,就可以添加一个新块,并在添加时执行相应的操作。
我已经使用512作为iPhone 5屏幕的大小,但您可以将其换成另一个屏幕尺寸,或者更好的是动态反映屏幕尺寸的变量。