如何应用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), ...
随机推荐
- js小数转分数-近似递归
精度为小数两位,提高精度可把 toFixed(2)和100同时修改: function decimalsToFractional(decimals){ const formatDecimals = d ...
- org.springframework.beans.factory.NoSuchBeanDefinitionException
1. 问题描述 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'xxxx ...
- oracle数据库基本命令
数据库字符集: SQL> select * from nls_database_parameters where parameter='NLS_CHARACTERSET'; PARAMETER ...
- CentOS 7运维管理笔记(12)----PHP页面失去焦点后变成空白的解决方法
昨天搭建好了LAMP服务器,可以正常看到PHP页面了.后来发现每当把鼠标从浏览器中移开而点击其他地方时,PHP页面就变成一片空白.即PHP页面失去焦点后就变空白,不知为何. 今天网上搜索解决方案,终于 ...
- Office - Word 2013
1. 使用 Quick Parts 向Word中添加自定义属性: 2.
- tpcc-mysql安装测试与使用生成对比图
1:下载tpcc-mysql的压缩包,从下面的网站进行下载 https://github.com/Percona-Lab/tpcc-mysql 也可直接从叶总博客直接下载: http://imysql ...
- Lua的协同程序初探
Content: 前两天把Lua的协同程序概念看了一下,不是很懂,只能说<Programming In Lua>中把它解释成线程让人很好的理解起来,但是真正去看的时候,收获并不是很大.第一 ...
- Redis设计与实现读后感
看了一下时间,现在是2018年8月22日14:28,看完最后一页内容之后,我简短的停留了一下,任思绪翻飞. redis设计与实现大概看了有12天左右,12天前,我的心里很乱,整个人都处于一种焦虑不安的 ...
- Exchange 2016 体系结构简介
一.Exchange 2016简介 现在,CPU计算能力的成本显著降低,不再成为约束因素.随着此约束因素的消失,Exchange2016的主要设计目标是简化扩展.提高硬件利用率和实现故障隔离:在Exc ...
- 「bzoj 3944: Sum」
题目 杜教筛板子了 #include<iostream> #include<cstring> #include<cstdio> #include<cmath& ...