如何使任何模拟器/设备的 SKSpriteNode 位置相同?
Posted
技术标签:
【中文标题】如何使任何模拟器/设备的 SKSpriteNode 位置相同?【英文标题】:How can I make SKSpriteNode positions the same for any simulator/device? 【发布时间】:2016-06-01 19:25:29 【问题描述】:在我的游戏中,当我在虚拟模拟器和真实设备(我的 iPad)上运行应用程序时,我的 SKNode 的位置略有变化。
这里是我所说的图片。
This is the virtual simulator
This is my Ipad
很难看到,但我的 iPad 上的两个红框比模拟器中的略高
这是我如何声明红框和绿网的大小和位置: 以下代码位于我的 GameScene.swift 文件中
func loadAppearance_Rim1()
Rim1 = SKSpriteNode(color: UIColor.redColor(), size: CGSizeMake((frame.size.width) / 40, (frame.size.width) / 40))
Rim1.position = CGPointMake(((frame.size.width) / 2.23), ((frame.size.height) / 1.33))
Rim1.zPosition = 1
addChild(Rim1)
func loadAppearance_Rim2()
Rim2 = SKSpriteNode(color: UIColor.redColor(), size: CGSizeMake((frame.size.width) / 40, (frame.size.width) / 40))
Rim2.position = CGPoint(x: ((frame.size.width) / 1.8), y: ((frame.size.height) / 1.33))
Rim2.zPosition = 1
addChild(Rim2)
func loadAppearance_RimNet()
RimNet = SKSpriteNode(color: UIColor.greenColor(), size: CGSizeMake((frame.size.width) / 7.5, (frame.size.width) / 150))
RimNet.position = CGPointMake(frame.size.width / 1.99, frame.size.height / 1.33)
RimNet.zPosition = 1
addChild(RimNet)
func addBackground()
//background
background = SKSpriteNode(imageNamed: "Background")
background.zPosition = 0
background.size = self.frame.size
background.position = CGPoint(x: self.size.width / 2, y: self.size.height / 2)
self.addChild(background)
另外我的 GameViewController.swift 看起来像这样
import UIKit
import SpriteKit
class GameViewController: UIViewController
var scene: GameScene!
override func viewDidLoad()
super.viewDidLoad()
//Configure the view
let skView = view as! SKView
//If finger is on iphone, you cant tap again
skView.multipleTouchEnabled = false
//Create and configure the scene
//create scene within size of skview
scene = GameScene(size: skView.bounds.size)
scene.scaleMode = .AspectFill
scene.size = skView.bounds.size
//scene.anchorPoint = CGPointZero
//present the scene
skView.presentScene(scene)
override func shouldAutorotate() -> Bool
return true
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask
if UIDevice.currentDevice().userInterfaceIdiom == .Phone
return .Landscape
else
return .All
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
override func prefersStatusBarHidden() -> Bool
return true
如何使每个模拟器/物理设备的节点位置相同?
【问题讨论】:
@Darvydas 这个问题与您在此堆栈溢出帖子“***.com/questions/33787770/…”中回答的问题非常相似,请您指出正确的方向吗? 也许这个问题与我设置背景的方式有关? 【参考方案1】:您应该通过调用 (int)round(float) 将这些浮点值舍入为整数,以便这些值捕捉到整个像素。任何使用 CGPoint 或 CGSize 的地方都应该使用整个像素,而不是浮点值。
【讨论】:
如果我使用整数值而不是浮点数,节点的定位是否不会像我需要的那样精确?我也不确定如何在我的代码中实现这一点。有没有办法在我声明位置的同一行中舍入浮点值? @MoDJ 请花点时间了解像素以及点如何映射到 ios 和 SpriteKit 中的像素:math.hws.edu/graphicsbook/c2/s1.html 在花了一些时间了解后,我认为我需要为每个 SKSpriteNode @MoDJ 实现锚点 这并不能解决问题。如果我使用整数作为 CGPoint(40, 40) 的参数,SKNode 在我的 iPad vs 模拟器上仍然不在同一位置【参考方案2】:如果您正在制作通用应用程序,您需要使用整数值声明场景的大小。这是一个例子:
scene = GameScene(size:CGSize(width: 2048, height: 1536))
然后,当您使用 CGPoint 和 CGSize 初始化节点的位置和大小时,使它们依赖于 SKScene 大小。这是一个例子:
node.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2)
如果您像这样声明通用应用的场景大小:
scene.size = skView.bounds.size
那么你的 SKSpriteNode 位置就会一团糟。您可能还需要将 scaleMode 更改为 .ResizeFill。这对我有用。
【讨论】:
以上是关于如何使任何模拟器/设备的 SKSpriteNode 位置相同?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SpriteKit 中的不同设备上使 SKSpriteNode 的速度相同?
SKSpriteNode加了一次,但是出现了莫名其妙,加了六次