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

如何应用SPRITEKIT的CAMERA实现游戏中的ENDLESS无限循环背景的更多相关文章

  1. iFIERO - (二)宇宙大战 Space Battle -- SpriteKit 无限循环背景Endless、SpriteKit物理碰撞、CoreMotion加速计

    本节主要讲解如何创建无限循环Endless的星空背景(如下图).玩家飞船发射子弹,监测子弹击外星敌机的SpriteKit物理碰撞并消灭敌机,以及应用iOS的CoreMotion加速计移动飞船躲避外星敌 ...

  2. vue中路由拦截无限循环的情况

    router.beforeEach(async (to, from, next) => { if (token) { if (whiteList.indexOf(to.path) != -1) ...

  3. C语言写猜拳游戏中遇到的函数循环小问题

    各位可能在初学C语言的时候都有写过猜拳游戏.但在写猜拳的函数时,避免不了会使用循环. 当函数被套在一个循环中的时候,你的计分变量可能就会被重置为函数体里的初始值.那么怎么解决这个问题? 其实很简单,你 ...

  4. iOS开发实战-基于SpriteKit的FlappyBird小游戏

    写在前面 最近一直在忙自己的维P恩的事情 公司项目也是一团乱 于是...随手找了个游戏项目改了改就上线了,就当充数了. SpriteKit简介 SpriteKit是iOS 7之后苹果推出的2D游戏框架 ...

  5. [Unity]制作游戏中名字板的过程记录

    先大概说一下需求: 1 每个模型上都要有名字板:人.怪.npc等等. 2 名字板上会显示:名字(文字).血条(图片)等 3 因为是透视相机,名字板离得太近会变得超大,且主角移动,名字板的位置相对于相机 ...

  6. Unity优化方向——优化Unity游戏中的脚本(译)

    原文地址:https://unity3d.com/cn/learn/tutorials/topics/performance-optimization/optimizing-scripts-unity ...

  7. 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了

    地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图

  8. FPS中受伤UI在VR游戏中的实现思路

    FPS中受伤UI在VR游戏中的实现思路 希望实现的效果 这几天一直在尝试各种解决方案,现在算是不完美的解决啦,记录一下心路历程,思路有了算法都比较简单. V_1 玩家胶囊体指向的方向作为正方向,计算出 ...

  9. 游戏中的人工智能——初探AI

    一.游戏中的人工智能 让游戏具有挑战性: 让游戏好玩的关键因素是为之找到合适的难度等级: 人工智能在游戏中的作用是通过提供富有挑战性的竞争对象来让游戏更好玩,而在游戏中行动逼真的非玩家角色(NPC), ...

随机推荐

  1. java.util.concurrent.CountDownLatch 使用

    1. 概述 CountDownLatch是java的一个并发工具(java.util.concurrent.CountDownLatch), 闭锁. 主要功能是阻塞调用其await()方法的线程,直到 ...

  2. 【转】OkHttp使用进阶 译自OkHttp Github官方教程

    作者:GavinCT 出处:http://www.cnblogs.com/ct2011/ 英文版原版地址 Recipes · square/okhttp Wiki 同步get 下载一个文件,打印他的响 ...

  3. vue-router 的使用

    vue-router 是 vue  的  一个特色. 下面介绍vue-router 的使用: 一.先将vue-router作为vue 的一个插件使用 import Vue from 'vue' imp ...

  4. Intellij IDEA快捷键大全汇总

    Alt+回车 导入包,自动修正 Ctrl+N   查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L  格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt+Insert 生成代码 ...

  5. Java设计模式—原型模式

    原型设计模式是一种比较简单的设计模式,在项目中使用的场景非常多. 个人理解: 原型模式实现了对Java中某个对象的克隆功能,即该对象的类必须implements实现Cloneable接口来标识为可被克 ...

  6. OpenLayers介绍和第一个例子(转载)

    什么是OpenLayers? 作者:田念明出处:http://www.cnblogs.com/nianming/本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位 ...

  7. $.each遍历JSON字符串和 Uncaught TypeError: Cannot use 'in' operator to search for '156错误

    现在页面和后端交互都流行使用json了  自己记录一下解析字符串的方法,要不老是忘记!!!! success: function (data) { //data是后台传过来的字符串 $.each(JS ...

  8. 斐波那契数列(C++ 和 Python 实现)

    (说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 1. 写一个函数,输入 n, 求斐波那契(Fibonacci ...

  9. Netty入门3之----Decoder和Encoder

    ​ Netty强大的地方,是他能方便的实现自定义协议的网络传输.在上一篇文章中,通过使用Netty封装好的工具类,实现了简单的http服务器.在接下来的文章中,我们看看怎么使用他来搭建自定义协议的服务 ...

  10. SQL Server ->> 间接实现COUNT(DISTINCT XXX) OVER(PARTITION BY YYY)

    SQL Server 2005版本开始支持了窗口函数(Windowing Function)和OVER字句.SQL Server 2012版本开始支持了窗口函数的ORDER BY字句实现连续/累计聚合 ...