zoukankan      html  css  js  c++  java
  • 如何应用SPRITEKIT的CAMERA实现游戏中的ENDLESS无限循环背景

    A Tutorial For How To Use SpriteKit Camera Making Endless Background

    效果
    Player运用Camera节点向前移动的效果


    向前舞动


    命为SpriteNode为player


    player的Custom Class 为自定义Node


    拖动Camera 进场景中


    命名为mainCamera,相机Camera的Position(0,0) ,Zposition为1


    设置Scene的Camera为mainCamera


    camera的节点移动到2048(self.size.width)的时候,把红色框内的节点移动到最右边( node.position.x += self.size.width * SCENE_NUMBERS)

    
     /// 查找所有命名为ground的精灵节点
            enumerateChildNodes(withName: "//ground") { (node, _ ) in
                /// 如果当前的节点 + scene.size.with <  则移动节点
                if node.position.x + self.size.width < camera.position.x {
                    node.position.x += self.size.width * SCENE_NUMBERS /// 更新节点的位置
                }
            }
    

    完整的代码如下:

    
    //
    //  GameScene.swift
    //  CameraEndless
    //
    //  Created by www.iFIERO.com.
    //  Copyright © 2018 iFiero. All rights reserved.
    //
    
    import SpriteKit
    import GameplayKit
    
    public let CAMERA_MOVE_XPOS:CGFloat   = 12  /// 相机X-Axis移动的尺寸;
    public let SCENE_NUMBERS:CGFloat = 2.0      /// 有几个场景scene
    
    class GameScene: SKScene {
        
        private var player = PlayerClass()  /// 初始化自定义节点
        private var mainCamera:SKCameraNode!
        private var ground:SKSpriteNode! /// 地板
        private var bg:SKSpriteNode!    /// 背景
        private var cloud:SKSpriteNode! /// 云 cloud
        
        override func didMove(to view: SKView) {
            
            initUI()     /// 初始化Scene里的各个精灵节点
            initCamera() /// 初始化相机节点;
        }
        
        func initUI(){
            /// player名称为GameScene.sks 上自行命名的名称
            player = childNode(withName: "player") as! PlayerClass
            player.initPlayer() /// 开始Wobbing
            ground = childNode(withName: "ground") as! SKSpriteNode
            bg     = childNode(withName: "bg") as! SKSpriteNode
            cloud  = childNode(withName: "cloud") as! SKSpriteNode
        }
        
        func initCamera(){
            mainCamera = childNode(withName: "mainCamera") as! SKCameraNode
        }
        
        /// 移动节点
        func moveSprites(camera:SKCameraNode){
            /// 查找所有命名为ground的精灵节点
            enumerateChildNodes(withName: "//ground") { (node, _ ) in
                /// 如果当前的节点 + scene.size.with <  则移动节点
                if node.position.x + self.size.width < camera.position.x {
                    node.position.x += self.size.width * SCENE_NUMBERS /// 更新节点的位置
                }
            }
            /// 查找bg
            enumerateChildNodes(withName: "//bg") { (node, _) in
                if node.position.x + self.size.width < camera.position.x {
                    node.position.x += self.size.width * SCENE_NUMBERS
                }
            }
            ///查找所有云
            enumerateChildNodes(withName: "cloud") { (node, _) in
                if node.position.x + self.size.width < camera.position.x {
                    node.position.x += self.size.width * SCENE_NUMBERS 
                }
            }
        }
        
        override func update(_ currentTime: TimeInterval) {
            mainCamera.position.x += CAMERA_MOVE_XPOS /// 向前移动;
            player.position.x += CAMERA_MOVE_XPOS     /// player向右移动的速度和camera的速度一致
            moveSprites(camera: mainCamera)           /// 传入相机节点
        }
    }
    
    

    更多教程:http://www.ifiero.com/

    源代码传送门:http://www.ifiero.com/uploads/CameraEndlessWithSpriteKitTutorial.zip

    GitHub传送门:https://github.com/apiapia/CameraEndlessWithSpriteKitTutorial

  • 相关阅读:
    javascript_数组
    Javascript_函数
    JavaScript思维导图
    django 中session的存储和获取
    使用 PyCharm 在centos 部署代码
    mac下使用async-profiler
    Mac系统如何清理mysql
    Java-多线程
    Java内部类
    WinForm使用发布方式进行安装的安装目录
  • 原文地址:https://www.cnblogs.com/apiapia/p/9257937.html
Copyright © 2011-2022 走看看