- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:
我是一名高中计算机科学教师,我想拿出一份有趣的作业来测试我学生的编程知识。我很少有用SpriteKit编写iOS游戏的经验,但我认为在竞争环境中集成许多课程概念是一种有趣的方式。
游戏:
每个学生将在一场正面交锋中互相扮演,他们将被要求对一艘太空船的人工智能进行编程,该飞船可以向他们的敌人移动和发射导弹。每个玩家从20分开始,每次被导弹击中,他们的总数减少1分,直到玩家击中0分,游戏结束。每个玩家只能得到10枚导弹,所以他们必须明智地使用它们。如果导弹超出视界或击中另一个对手,它们就会补充。
问题是:
我已经连续几年做这项工作了,每年都只做些小改动。然而,今年在测试期间,一旦游戏开始,游戏的帧速率就会下降到9fps左右。显然,这会带走游戏的大部分乐趣,并且由于延迟而使调试变得很痛苦。
代码结构
节点
只有几个SKLabelNodes用来显示玩家的名字和分数。
太空船都是节点,每一个节点都包含一个由10枚导弹组成的阵列,这些导弹也是节点。宇宙飞船和导弹都有各自的类别来定义它们的特性和行为。
还使用了背景图像。
总共,只有24个对象被添加到游戏场景中,这一点永远不会改变。
班级
初始视图控制器(PlayerPickerViewController)-这允许用户选择谁是玩家1和玩家2。然后它选择要使用的(学生)类的名称以及他们的宇宙飞船的图像。
每个宇宙飞船都有一个静态对象的结构,这样就可以在不同的类中访问它们。
游戏的视图控制器(Game View Controller)-这将获取游戏场景并使其显示在此视图控制器中
游戏场景(gamescope)-处理游戏的所有初始设置,包括创建变量和向视图添加节点。
宇宙飞船和导弹类-这些类处理定义宇宙飞船和导弹行为(即运动、射击、大小等)的方法和属性。学生不得修改此代码,以便在相同的游戏条件下工作。
学生班(“他们的姓”。swift)在这个班里,学生必须编写两个函数(一个用于player1,一个用于player2)。这是学生定义移动和射击策略的地方。每一帧,都会调用相应的函数来移动播放器。
当玩家在PlayerPickerViewController中被选中时,游戏会理解每个帧需要调用哪个学生类(基于他们的名称和名称完全相同的类的名称)。
当我在我的个人MacBookPro上构建和测试游戏时,游戏会按预期运行(没有延迟)。但是,每个学生都在使用以下规格的Mac:
iMac(21.5英寸,2013年末)
处理器2.9GHz英特尔酷睿i5
内存8 GB 1600 MHz DDR3
图形NVIDIA GeForce GT 750M 1024 MB
在我看来,尽管计算机已经老了一点,但它们仍然能够处理这个只有20多个节点的简单游戏。
改变模拟器会有什么不同吗(即iPad Pro 12.9英寸第三代到第六代iPad)?
我很感激你能帮我解决这个滞后问题。
谢谢您。
如果您对代码和类之间的交互方式感兴趣,这里有一个游戏的链接。The GAME
这不是最新的版本,但它与学生目前使用的非常相似。
最佳答案
从在设备上运行游戏开始,缩小问题的范围,并确保问题与模拟器有关。
使用其中一个imac上的乐器来分析您的游戏。这会让你看到是什么导致帧速率如此之低。
在Xcode中选择Product>Profile以在Instruments中分析项目。从模板列表中选择时间分析器工具。以下文章介绍如何使用时间剖面仪:
Finding the Slow Spots in Your Code with the Time Profiler Instrument
因为你的学生必须在他们的Mac上测试游戏,另一种选择是制作Mac版本的游戏。与iOS模拟器相比,这款游戏在Mac上运行起来会更好。在Mac和iOS上,SpriteKit代码是相同的。主要区别在于在Mac上处理鼠标事件,而不是在iOS上处理触摸事件。Xcode有一个跨平台的游戏项目模板,可以让你制作一个同时在Mac和iOS上运行的游戏。
关于ios - Spritekit游戏在iPad模拟器上出现严重滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55325101/
我正在尝试构建一个 SpriteKit 游戏,但它因错误而失败:“无法将模块“SpriteKit”加载为“Spritekit”” 我使用的是 Xcode 版本 6.3.2 (6D2105)。 最佳答案
如何在 spritekit swift 中更改碰撞时的 spritekit。 else if collidedBird.birdType == 6 { if U
我刚刚创建了一个新的 SpriteKit 项目,就遇到了砰!问题。我运行该项目时没有触及任何内容,并且应该如此,默认的 hello world 项目出现了。这方面一切都很好。现在,我创建了一个新的 C
当我使用 SpriteKit 创建视频对象时 let background = SKVideoNode(videoFileNamed: "Video.mov") 我只使用了一次命令: backgrou
出于某种原因,我无法将节点放置在屏幕的顶部或底部。我曾经能够使用 self.frame.height/2 很好地做到这一点,但现在我在景观中工作,这行代码不起作用。注意:我的 anchor 是 0.5
在场景中“缩小”的正确方法是什么。 我有一个物体,我施加一个冲动将它发射到屏幕上。例如,它会发射大约 100 像素,这按预期工作 - 增加它飞行的力量,增加它飞行的密度更少等等。 我遇到的问题是缩放,
是否可以更改粒子发射的频率。例如,如果我发射一个粒子,我可以让它每 5 秒或 10 秒发射一次吗? 我搜索了文档,但找不到任何内容。有解决方法吗?我想做这样的事情: emitter.partic
有谁知道一些开箱即用的库,它们可能会为 SKNode 提供诸如相机抖动之类的效果。 ? 如果没有,是否有一种简单的方法可以使用 Action 来实现相机抖动? 谢谢 最佳答案 我找到了一种使用 SKA
我目前一直在使用委托(delegate)和 SKView 自定义类来监视我的 OS X SpriteKit 游戏中的按键。我需要为我的键盘监控类雇用多个代表,我知道这是不可能的,但可以通过使用观察者来
我从事 SpriteKit 游戏已经有一段时间了,但我有一个无法摆脱的恼人问题。我不想过多介绍这款游戏,但它非常简单。我每秒生成一些对象(SKSpriteNodes),这些对象使用 SpriteKit
我正在制作基于SpriteKit的多级游戏。 一切正常,除了一件事:当用户玩很长时间、改变很多关卡等时......然后 SpriteKit 开始丢失纹理。 我的意思是,没有像图像加载失败时那样的大红叉
我正在尝试将 SKSprite Particle Emitter 与 Swift 一起使用。 但我想在我的发射器中使用许多不同的纹理。 是否有可能:拥有许多图像,并且让发射器随机使用图像,而不是仅使用
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
我正在用SpriteKit构建我的第一个项目,但我无法弄清楚这部分。 我的项目包括飞入屏幕的敌方直升机。每个敌人播放大约14秒长的声音文件。这不是循环。它包括敌人进入屏幕之前接近的声音,以及在屏幕上移
我试图在代码中到处搜索:解释文档在进入后台时会做什么,或者甚至有时会暂停,但无济于事-有人可以指导我在进入后台时建议做什么到启用 Sprite 套件的游戏中的背景吗? 我应该调用scene.pause
我是 SpriteKit 新手。我需要通过 UIImageView 或 SpriteNode 显示图像(它是游戏的背景图像)。但是,我需要用户能够放大背景并平移。我在不使用 SpriteKit 的情况
在我的游戏中,我正在创建一些受重力影响的球。当游戏开始时,他们会从屏幕外掉下来,并在底部找到自己的位置。没有其他力施加在他们身上。 问题是我正在用精确的坐标、精确的物理属性创建这些球,但结果不一样。它
我想让我的宇宙飞船有一条跟随它的粒子轨迹。我该怎么做? 这是我的宇宙飞船的代码: override func didMove(to view: SKView) { spaceS.positio
我正在尝试制作一个动画角色,可以在不移动他的躯干的情况下伸手去拿屏幕上的东西。 如果他够不到,他的手应该朝这个方向移动最大量,然后被他的静态躯干的物理限制所抵消。 所以在我的代码中,绿色矩形( han
我的场景上有player对象,并试图对其施加一些力。您可以看到我正在对update:文件上的MyScene.h方法施加作用力。但是,我的player根本没有动。发生了什么? 下面是Player SKS
我是一名优秀的程序员,十分优秀!