如何使任何模拟器/设备的 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加了一次,但是出现了莫名其妙,加了六次

真实设备如何将位置信息推送到API?

SKSpriteNode对象初始化在iPhone 6 plus中显示不正确的分析及解决

使 SKSpriteNode 透明

使运动范围 SKSpriteNode