我在SpriteKit游戏中遇到纹理问题:
在touchesBegan
我做:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
SKNode *node = [self nodeAtPoint:location];
if ([node.name isEqualToString:@"worm"]) {
[node removeAllActions];
SKAction *change = [SKAction setTexture:[SKTexture textureWithImageNamed:@"worm2"]];
[node runAction:change];
此代码有效,但新纹理" worm2"按比例缩放,你会看到与它应该如何相比不好。
应该有方法:setTexture:resize:
但是你可以从我放的图片中看到,这种方法不存在..
我缺少什么?
谢谢大家
答案 0 :(得分:2)
我认为[SKAction setTexture:resize:]
仅适用于iOS 7.1。看看API Differences。
如果您运行的是旧版本,可能会将Xcode更新到最新版本(5.1)。
答案 1 :(得分:1)
此代码:
SKAction *change = [SKAction setTexture:[SKTexture textureWithImageNamed:@"worm2"]];
[node runAction:change];
相当于直接更改纹理:
SKSpriteNode* sprite = (SKSpriteNode*)node;
sprite.texture = [SKTexture textureWithImageNamed:@"worm2"];
// optional: update sprite size to match texture size
sprite.size = sprite.texture.size;
除非你想延迟纹理变化,否则不需要(也效率较低)使用动作来改变纹理。
答案 2 :(得分:0)
来自@ user867635的建议[SKAction setTexture:resize:]
可从7.1开始提供..所以我找到了解决此问题的另一种方法:
初始化场景时:
_texture = [SKTexture textureWithImageNamed:@"worm2"];
[_texture preloadWithCompletionHandler:^{}];
并在touchesBegan
之后调用此纹理,preloadWithCompletionHandler
解决了我的问题