SpriteKit网络物理(各种设备)

时间:2015-07-31 04:09:45

标签: ios objective-c macos sprite-kit skphysicsbody

我正在开发一个可联网的SpriteKit游戏。我遇到的问题是,不同的设备和屏幕尺寸,iPhone 5s,iPhone 6 +,iPad Mini 2 Retina,iPad 2,MBP 17和Air 11的物理特性各不相同。

玩家在由此定义的场景上进行游戏:自我SKScene,gameScene.m。

出于各种原因,我使用以下内容制作了gameScene.sks大小414x414和createSceneContents:

self.scaleMode = SKSceneScaleModeAspectFit;
self.anchorPoint = CGPointMake(0.5,0.5);
self.size = CGSizeMake(self.size.width*4, self.size.height*4);

我执行* 4因为我要将缩放添加到1x 2x 4x。

开始的基础是两个面对的生物。 我使用以下方法设置质量和密度:

char.physicsBody.density = 1.0;
char.physicsBody.mass = 1.0;

我读过更改它们会修复不同的设备/屏幕问题(错误)。

当一个人在另一个移动时,当他们碰撞时我会得到混合的结果。 在Mac上撞击另一个(iOS)生物时,Mac生物会停止并且无法让另一个生物移动。 iOS char可以撞击Mac生物并推动他四处游荡。

我进去并改变了质量和密度,基于:

场景在设备中间占据一个正方形,因此边界宽度是设备的宽度。为了使iOS设备与Mac设备相同,我需要付出多少金色数字。

// CGFloat result = [[UIScreen mainScreen] bounds].size.width //maybe later :)
CGFloat ratio = 414/3000;

char.physicsBody.density = 1.0*ratio;
char.physicsBody.mass = 1.0*ratio;

这只是我开始时的基本出发点。原因是我相信SpriteKit正在使对象在屏幕之间成比例(界限到边界,设备到设备)。但它主要是Mac到iOS。 Mac到Mac甚至在竞争激烈的竞争中,我不需要改变质量/密度。

代码在我的Xcode.project文件中,它们共享源代码,并从中进行编译。

这个块用于来回走动:

#ifdef IOS_BLOCK
    CGFloat ratio1 = (414.0/3000);
    CGFloat ratio2 = 1;
    _playerChar.physicsBody.mass = _playerChar.physicsBody.mass*ratio1;
    _playerChar.mainThrust = 160*ratio1;
    _playerChar.reverseThrust = 80*ratio1;
    _playerChar.lateralThrust = 0.4*ratio1;

    _opposeChar.physicsBody.mass = _opposeChar.physicsBody.mass*ratio2;
    _opposeChar.mainThrust = 160*ratio2;
    _opposeChar.reverseThrust = 80*ratio2;
    _opposeChar.lateralThrust = 0.4*ratio2;
#else
    CGFloat ratio1 = 1;
    CGFloat ratio2 = (414.0/3000);
    _playerChar.physicsBody.mass = _playerChar.physicsBody.mass*ratio1;
    _playerChar.mainThrust = 160*ratio1;
    _playerChar.reverseThrust = 80*ratio1;
    _playerChar.lateralThrust = 0.4*ratio1;

    _opposeChar.physicsBody.mass = _opposeChar.physicsBody.mass*ratio2;
    _opposeChar.mainThrust = 160*ratio2;
    _opposeChar.reverseThrust = 80*ratio2;
    _opposeChar.lateralThrust = 0.4*ratio2;
#endif

注意:我在Mac vs Mac或iOS vs iOS中将其更改为1:1

这个3000的值似乎在使用操纵杆与键盘与UIButtons等的头部对接比赛中占据优势。

但我的问题是这个比例是什么"体重"基于? 414/3000我的意思是它可能是500 / 3000,1 / 6,这也会使事情相当接近。

但是这个比例需要什么呢?为什么iOS与iOS和Mac与Mac的比例为1:1时,iOS到Mac的比例是6:1?我必须除以比率。

我希望使用SpriteKit让所有设备上的所有设备均衡。 顺便说一下Sprite Sizes是: 102/204/306(iOS) 和 120/240(Mac) 提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

一切都是关于物理低点! 您必须注意,当您更改设备屏幕大小时,物理点视图中的某些内容会发生变化。 例如:

假设你想对一个半径为20且密度为1的球施加100次冲击。

你在5s模拟器球看到比6s或iPad模拟器更快。 为什么呢?

原因物理!

让我们看看:

在物理低点中,冲动的关系是

  

p = mv

哪个p是动量,m是质量,v是速度。

现在让我们进行一些简单的物理计算:

  

密度= m / A(m:质量,A:面积)

我们假设密度= 1那么

  

m = A = pi *(r)^ 2(r:radius)

我们提到了动力:

  

p = mv => v = p / m => v = p /(pi *(r)^ 2)

你施加了100次冲动

  

(p = 100)=> v = 100 /(pi *(r)^ 2)

我再次提醒,v是速度,r是半径。 你看

  

v~1 /(r ^ 2)

这意味着v增长为1 /(r ^ 2)

这意味着如果你增加你的球物理身体半径与屏幕尺寸恒定动量速度减少!

恒定半径怎么样?

例如,您将球的physicsBody半径设置为20,它永远不会随屏幕大小而变化。

所以:

  

v = 100 /(pi *(20)^ 2)

想象一下速度是50(它只是假设不是真的!)

意味着你的球以每秒50点的速度进入5s手机,并且由于5s的宽度是568点,所以球的速度大约是每秒5秒(5sWidth)* 1/10。

对于iPad Air宽度为1024,所以速度相同的球(iPadAirWidth)*每秒1/20。

其中,意味着速度降低。

你看,难题解决了!

因此,在spriteKit中使用物理时,必须符合物理属性和屏幕大小。

答案 1 :(得分:0)

答案是Apple的文档说明:在真实硬件和具有不同特征的设备上测试您的游戏。在许多情况下,每个Mac或iOS设备上的CPU资源和GPU资源的平衡是不同的。在多个设备上进行测试可帮助您确定您的游戏是否在大多数设备上运行良好。

我认为精灵套件在各种设备上都是统一的,而且有点差异,但有一些细微的变化。