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

一个SpriteKit项目在其他设备上运行都无问题(无论是真机或是模拟器),但是在iPhone6 Plus上会出现精灵对象纹理被过度放大的现象:

从上图中大家可以看到无论是主角或是道具球都过大了.

看了一下精灵图片是放在atlas纹理集文件夹中的:

可以看到PowerUp和Player都有对应缩放的版本:Player.png,[email protected]以及[email protected]

在各个图片的属性中检查图片的尺寸也都正确,看不出神马问题…

找到SKSpriteNode对象初始化的代码看看:

let orbNode = SKSpriteNode(imageNamed: "PowerUp")

貌似也没什么问题…突然想到上述图片都放在纹理集中,那么都应该被Xcode做过附加操作以形成额外的整张图片,是不是这里出了问题?

将Player共3张图片放到Assets.xcassets中:

PowerUp也如法炮制,然后再次编译运行代码,这回所有精灵的尺寸都是正确的了,没有发生放大的情况!看来@x后缀只对直接的图片资源有效,因为原来你是将图片放到纹理集中,所以系统处理就会出错.

但如果我只想用纹理集呢?还是有办法!

将SKSpriteNode原初始化代码改为如下:

let atlas = SKTextureAtlas(named: "sprites")
let texture = atlas.textureNamed("PowerUp")
let orbNode = SKSpriteNode(texture: texture)

这回一切都正常了:

为什么只在iPhone6p上有问题?因为6p引入了一个新的3x模式,之前所有的都是2x(包括6),估计在这里绊了脚跟 ;]

PS:如果你在6p中将代码改为如下也是可以的:

let orbNode = SKSpriteNode(imageNamed: "[email protected]")

注意是2x哦!

时间: 2024-10-09 16:51:25

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

Netty中LineBasedFrameDecoder解码器使用与分析:解决TCP粘包问题

[toc] Netty中LineBasedFrameDecoder解码器使用与分析:解决TCP粘包问题 上一篇文章<Netty中TCP粘包问题代码示例与分析>演示了使用了时间服务器的例子演示了TCP的粘包问题,这里使用LineBasedFrameDecoder就是用来解决这个问题的. 不过需要注意的是,LineBasedFrameDecoder见名知其义,可见其是与行相关的,而在前面演示TCP粘包问题时,作者是有意在发送的消息中都加入了换行符,目的也是为了在后面去讲解LineBasedFram

Spring 被初始化两次(Spring-Task定时任务执行两次)分析和解决方法

初始问题: 采用Spring-Task配置定时任务,任务执行两次,该问题在Eclipse调试环境上不出现 分析问题: 第一步:开始怀疑业务逻辑,通过排查和定位排除业务原因(通过日志可以查看多次执行) 1 @Component("collection.car") 2 public class CollectionCarsJob { 3 private static Logger logger = LoggerFactory.getLogger(CollectionCarsJob.clas

Java Web项目中HTML文件中的汉字在浏览器中显示乱码的解决方案

今天在做一个Java Web项目的时候,html中的汉字在浏览器中显示为乱码,分析其可能原因有: (1)html文件属性中有默认的编码方式,如果它的设置与html文档中content charset属性设置有冲突,则显示为乱码. (2)与浏览器有关,如果html的编码方式与浏览器默认的编码方式不同,则会出现乱码. 下面直接上图,看我的实验: (1)html的文件属性和content charset都设置为UTF-8,但是浏览器默认是GBK编码,显示乱码.我用了谷歌Chrome浏览器和搜狗浏览器都

C++中对象初始化

在C++中对象要在使用前初始化,永远在使用对象之前先将它初始化. 1.对于无任何成员的内置类型,必须手工完成此事. 例如: int x=0; double d; std::cin>>d; 2.内置对象以外的东西,初始化责任落在构造函数身上.确保每一个构造函数都将对象的每一个成员初始化. 例如: class Point {......}; class Point3d { public: Point3d(Point pt,int z); private:                   Poi

C#中的自动属性、隐式类型var、对象初始化器与集合初始化器、扩展方法

1.自动属性(Auto-Implemented Properties) //以前的写法 .net2.0 private string _userName; public string UserName { get { return _userName; } set { _userName= value; } } //现在 只适合3.5以上 public string_userName {get;set;} 2.隐式类型var 它是在编译已经能确定变量的类型,是根据后面的值自动推断类型,编译时把推

对象初始化

对象初始化过程 第一步:在创建之前,检查是否加载(检查硬盘上的class文件是否加载到内存中,如果没有加载,就先加载父类的文件) 在加载父类的文件,在加载本类的文件中java使用的加载的策略:懒惰式加载(按需加载)用到的时候,只加载一次. 第二步:分配对象的空间.递归分配所有父类和子类的属性空间,属性会自动初始化为"0"的值 第三步:给属性赋值 第四步:调用父类的构造方法(默认调用父类的无参构造方法) 第五步:调用本类的构造方法

类加载与对象初始化

1. 初始化原因:避免发生空指向异常. 2. 类加载与初始化的顺序: 2.1 类加载时间:          每个类的编译代码都存在于他自己的独立文件中,该文件的加载通常发生在创建类的第一个对象时,或是访问类的static域或static方法时. 2.2 初始化顺序:(先父类后子类,创建对象之前先对类中的域进行初始化)        首先,类加载器主动加载主类(主类的初始化顺序与下面普通类一样),找到main方法,在main方法中根据第一行要创建的对象,加载该类的字节码文件,如果编译器注意到她有

[Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类

目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式在内存中存放对象: (1)为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序时确定,这可以通过将对象置于堆栈或者静态存储区域内来实现.这种方式牺牲了灵活性. (2)在被称为堆的内存池中动态地创建对象.在这种方式,知道运行时才知道对象需要多少对象,它们的生命周期如何,以及它们的具体类型.

Java 对象初始化顺序 执行顺序

先看一道Java面试题: 求这段程序的输出. 解答此题关键在于理解和掌握类的加载过程以及子类继承父类后,重写方法的调用问题: 从程序的执行顺序去解答: 1.编译:当这个类被编译通知后,会在相应的目录下生成两个.class 文件.一个是 Base.class,另外一个就是Base$Sub.class.这个时候类加载器将这两个.class  文件加载到内存 2.Base base= new Sub(): 声明父类变量base对子类的引用,JAVA类加载器将Base,Sub类加载到JVM(Java虚拟