如何应用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/uploads/CameraEndlessWithSpriteKitTutorial.zip
GitHub传送门:https://github.com/apiapia/CameraEndlessWithSpriteKitTutorial
如何应用SPRITEKIT的CAMERA实现游戏中的ENDLESS无限循环背景的更多相关文章
- iFIERO - (二)宇宙大战 Space Battle -- SpriteKit 无限循环背景Endless、SpriteKit物理碰撞、CoreMotion加速计
本节主要讲解如何创建无限循环Endless的星空背景(如下图).玩家飞船发射子弹,监测子弹击外星敌机的SpriteKit物理碰撞并消灭敌机,以及应用iOS的CoreMotion加速计移动飞船躲避外星敌 ...
- vue中路由拦截无限循环的情况
router.beforeEach(async (to, from, next) => { if (token) { if (whiteList.indexOf(to.path) != -1) ...
- C语言写猜拳游戏中遇到的函数循环小问题
各位可能在初学C语言的时候都有写过猜拳游戏.但在写猜拳的函数时,避免不了会使用循环. 当函数被套在一个循环中的时候,你的计分变量可能就会被重置为函数体里的初始值.那么怎么解决这个问题? 其实很简单,你 ...
- iOS开发实战-基于SpriteKit的FlappyBird小游戏
写在前面 最近一直在忙自己的维P恩的事情 公司项目也是一团乱 于是...随手找了个游戏项目改了改就上线了,就当充数了. SpriteKit简介 SpriteKit是iOS 7之后苹果推出的2D游戏框架 ...
- [Unity]制作游戏中名字板的过程记录
先大概说一下需求: 1 每个模型上都要有名字板:人.怪.npc等等. 2 名字板上会显示:名字(文字).血条(图片)等 3 因为是透视相机,名字板离得太近会变得超大,且主角移动,名字板的位置相对于相机 ...
- Unity优化方向——优化Unity游戏中的脚本(译)
原文地址:https://unity3d.com/cn/learn/tutorials/topics/performance-optimization/optimizing-scripts-unity ...
- 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了
地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图
- FPS中受伤UI在VR游戏中的实现思路
FPS中受伤UI在VR游戏中的实现思路 希望实现的效果 这几天一直在尝试各种解决方案,现在算是不完美的解决啦,记录一下心路历程,思路有了算法都比较简单. V_1 玩家胶囊体指向的方向作为正方向,计算出 ...
- 游戏中的人工智能——初探AI
一.游戏中的人工智能 让游戏具有挑战性: 让游戏好玩的关键因素是为之找到合适的难度等级: 人工智能在游戏中的作用是通过提供富有挑战性的竞争对象来让游戏更好玩,而在游戏中行动逼真的非玩家角色(NPC), ...
随机推荐
- csharp:.net 3.5 using System.Runtime.Serialization.Json read json
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 主动驱动事件执行--createEvent
1. createEvent(eventType)参数:eventType 共5种类型: Events :包括所有的事件. HTMLEvents:包括 'abort', 'b ...
- Shared Project
从VS2015开始支持Shared Project,挺好的,省去了单独引用的麻烦.
- 解决MFC对话框类不能建立成功的方法(出现unable to open the files XX for class XX)
原文:http://blog.163.com/wangqi1973_off/blog/static/131034571201011885546230 为新加的对话框资源添加新类,类名取做CColorV ...
- Windows下Python2与Python3两个版本共存的方法详解
来源:http://www.jb51.net/article/105311.htm 这篇文章主要介绍了Windows下Python2与Python3两个版本共存的方法,文中介绍的很详细,对大家具有一定 ...
- idea 安装findBugs 和 checkStyle
1.fiindBugs是一款 静态分析工具,检查程序潜在bug,在bug报告中快速定位到问题的代码上.在idea下面安装很简单可以参考 http://zhongmin2012.iteye.com/bl ...
- Redis添加访问密码
进入Redis的安装目录,找到redis.conf文件. 1.修改密码:使用vi命令打开redis.conf文件,先使用字符匹配查找到requirepass foobared对应的位置, 然后修改fo ...
- February 19 2017 Week 8 Sunday
We accept the love we think we deserve. 我们接受自己认为配得上的爱. A few months ago, I tried to date with a girl ...
- BUG Review:关于getting 'android:xxx' attribute: attribute is not a string value的问题及解决方法
我们在使用Android Studio开发完应用程序后,都要将打好的apk安装包上传到各大应用市场,但是有时候上传时应用市场会出现提交的安装包不能通过应用市场的aapt解析而被打回的情况. 他们使用a ...
- LaTeX-手动安装宏包(package)以及生成帮助文档的整套流程
我使用的是ctex套装,本来已经自带了许多package,但是有时候还是需要使用一些没有预装的宏包,这时就需要自己安装package了.下载package可以从CTAN(Comprehensive T ...