如何用Sprite Kit制作《太空入侵者》

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用Sprite Kit制作《太空入侵者》相关的知识,希望对你有一定的参考价值。

参考技术A 作者:Joel Shapiro 注:这是作为ios 7 Feast的组成部分而发布的全新Sprite Kit教程。 在第1部分中,你创造了游戏的基础。到目前为止你已经在游戏中添加了侵略者,舰船和平视显示器(HUD)。你还编写了逻辑代码让侵略者可以自动移动并在倾斜设备时移动舰船。 在第2部分也是最后一部分中,你将为舰船和外星人添加能力让它们相互开火!你同样也将添加音效和真实图像去替代彩色的矩形(游戏邦注:即用于代表侵略者和舰船)而优化游戏 现在让我们真正开始吧。 让你的舰船发射激光炮 首先,你需要思考自己想要的发射舰船激光炮的场景。你决定使用单发快射去发射大炮。但是你该如何检测这些单发快射? 你拥有两个选择: 1.UITapGestureRecognizer—-创造一个并将其附加到场景视图中。 2.touchesEnded:withEvent:—-你的场景是UIResponder的子类;因此你可以使用它直接检测碰触。 在这种情况下(touchesEnded:withEvent:),第二种方法是最佳选择。当你需要基于游戏中不同场景节点检测并处理碰触时,第一种方法会较为棘手,因为你只能够在场景视图中为UITapGestureRecognizer制定一个回调函数选择器。而其它方法则不适合放在这一例子中。 因为所有的SKNode节点(包括SKScene)都能通过touchesEnded:withEvent:直接处理碰触,第二种选择能够更自然地处理针对于节点的碰触—-当你开发的游戏带有更复杂发射处理时它将更有效。 既然你将在场景的touchesEnded:withEvent:方法中检测用户的发射,你该在这方法中做些什么? 发射可以在游戏过程中的任何一个点发生。与之相反的是你的场景将发生改变—-源自update:方法的独立间隔。所以在touchesEnded:withEvent:中任何时候你将如何储存快射检测,并在之后,也就是当被Sprite Kit游戏循环援用时对其进行加工。 答案是一个队列!你将使用一个简单的NSMutableArray在FIFO(先进先出)队列中储存你的快射。 在GameScene.m添加如下属性到类扩展中: @property (strong) NSMutableArray* tapQueue; 现在将如下内容添加到didMoveToView:中,也就是在[self.motionManager startAccelerometerUpdates];后面: self.tapQueue = [NSMutableArray array]; self.userInteractionEnabled = YES; 上述代码将快射队列初始化为一个空白数组,并确保用户互动适用于场景中,从而让它能够接收快射事件。 现在在#pragma mark – User Tap Helpers之后添加如下代码: -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event // Intentional no-op -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event // Intentional no-op -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event // Intentional no-op -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event UITouch* touch = [touches anyObject]; if (touch.tapCount == 1) [self.tapQueue addObject:@1]; 前三个问题只是无意义的存根;之所以会添加它们是因为当你没有调用super而推翻touchesEnded:withEvent:时,苹果会建议你这么做。 touchesEnded:withEvent:方法本身非常简单。它只添加了一个条目到队列中。你不需要定制类在队列中储存快射,因为你所需要做的便是明确快射的出现。因此,你可以使用任何早旧的对象。在此,你可以将整数1作为当一快射的记忆(@1是全新的对象-文字语言,即将把文字1转变为一个NSNumber对象)。 因为你知道侵略者最终将向你的舰船发射子弹,所以在文件最上方的Custom Type

Sprite-kit 主要角色选择器

【中文标题】Sprite-kit 主要角色选择器【英文标题】:Sprite-kit Main Character Picker 【发布时间】:2016-08-30 15:47:11 【问题描述】:

我正在使用 swift 2 和 sprite-kit。我想知道如何制作一个选择角色场景让我的玩家选择一个角色在游戏中玩,我已经设置了场景,但我不知道如何整合多个角色,可以选择一个玩?任何参考或示例代码将不胜感激。

在 GameScene() 中我有

    //plane = SKSpriteNode(imageNamed: "plane")
    plane.size = CGSize(width: 80, height: 80)
    plane.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 4)
    plane.physicsBody = SKPhysicsBody(circleOfRadius: plane.frame.height / 2)
    //plane.physicsBody = SKPhysicsBody(texture: plane.texture!, size: plane.size)
    plane.physicsBody?.affectedByGravity = true
    plane.physicsBody?.dynamic = true
    plane.zPosition = 2
    self.addChild(plane)'

在 settings() 我有

    func mainScene()

    mainSceenButton = SKSpriteNode(imageNamed: "mainMenu")
    mainSceenButton.size = CGSizeMake(200, 100)
    mainSceenButton.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2 + self.frame.height / 3)
    self.addChild(mainSceenButton)

    plane = SKSpriteNode(imageNamed: "plane")
    plane.size = CGSizeMake(50, 50)
    plane.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2 + 100 )
    self.addChild(plane)

    plane1 = SKSpriteNode(imageNamed: "plane1")
    plane1.size = CGSizeMake(50, 50)
    plane1.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2 )
    self.addChild(plane1)

    plane2 = SKSpriteNode(imageNamed: "plane2")
    plane2.size = CGSizeMake(50, 50)
    plane2.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2 - 100 )
    self.addChild(plane2)





override func didMoveToView(view: SKView) 
    mainScene()


override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 

    let mainMenuScene = StartScene(fileNamed: "StartScene")

    for touch in touches
        let location = touch.locationInNode(self)
        if mainSceenButton.containsPoint(location)
            self.scene?.view?.presentScene(mainMenuScene!, transition: SKTransition.fadeWithDuration(1.0))
        
        if plane1.containsPoint(location)
            GameScene().plane = SKSpriteNode(imageNamed: "plane1")
         else 
            GameScene().plane = SKSpriteNode(imageNamed: "plane")
        
    
'

【问题讨论】:

您自己尝试过什么吗?这个网站并不是为了让我们仅仅为您编写示例代码或提出意见建议。 我更新了我的问题@ZGski 【参考方案1】:

这个问题确实太宽泛了,但这是我过去看到的(和我自己做过的)的方式

    创建一个 SKSpriteNode 的子类来制作您的自定义播放器类。 初始化时,根据节点选择的内容更改节点的纹理。

【讨论】:

好的,所以我更新了我的帖子,我试图在一个视图中做的是点击一个平面,然后让该平面成为另一个视图中的图像,但它不起作用 @ShaneReichenfeld 看起来您可能需要更多地了解 OOP 和 Swift...您不应该通过执行 GameScene().plane 来初始化新场景...我实际上非常对你在做什么感到困惑。您应该发布整个班级。我看不出你在哪里展示场景或任何东西。 @Kendel OP 需要知道,当创建新的 GameScene 时,所有字段都将初始化为空/默认值。 OP 似乎认为GameScene().plane = SKSpriteNode(imageNamed: "plane1") 将飞机永久设置在 GameScene 上。【参考方案2】:

您可以尝试使用 NSUserDefaults 在 Settings touchesBegan 中保存用户选择。

let defaults = NSUserDefaults.standardUserDefaults()

if plane.containsPoint(location) 
    defaults.setObject("plane", forKey: "userPlane")
 else if plane1.containsPoint(location) 
    defaults.setObject("plane1", forKey: "userPlane")
 else if plane2.containsPoint(location) 
    defaults.setObject("plane2", forKey: "userPlane")

然后在 GameScene 中,在创建平面时检索选择。

let defaults = NSUserDefaults.standardUserDefaults()
if let userPlane = defaults.stringForKey("userPlane") 
    plane = SKSpriteNode(imageNamed: userPlane)

在您的代码中,您尝试在 GameScene 的新实例上设置飞机,但是一旦您退出设置场景,该选择就会丢失。

【讨论】:

以上是关于如何用Sprite Kit制作《太空入侵者》的主要内容,如果未能解决你的问题,请参考以下文章

如何更改太空入侵者计划中的图像?

html 太空入侵者

用于太空入侵者 RL (Keras) 的 LSTM 网络

如何在 xcode spritekit 中快速保持太空游戏中入侵者的节点数稳定?

太空侵略者项目

JFrame 和 JInternalFrame 有啥区别?