Sprite kit SpriteKit局部纹理映射

Sprite kit SpriteKit局部纹理映射,sprite-kit,skspritenode,Sprite Kit,Skspritenode,是否可以创建仅显示纹理一部分的SKSpriteNode 例如,我可以创建一个大小100x100的正方形,显示大小720x720的纹理的特定区域,如从x1=300到x2=400和y1=600到y2=700? 谢谢你的帮助。试试这样的方法: import SpriteKit import GameplayKit class GameScene: SKScene { let visibleArea = SKSpriteNode(color: .black, size: CGSize(widt

是否可以创建仅显示纹理一部分的
SKSpriteNode

例如,我可以创建一个大小100x100的正方形,显示大小720x720的纹理的特定区域,如从
x1=300
x2=400
y1=600
y2=700


谢谢你的帮助。

试试这样的方法:

import SpriteKit
import GameplayKit

class GameScene: SKScene {

   let visibleArea = SKSpriteNode(color: .black, size: CGSize(width:100,height:100))

   let parentNode = SKSpriteNode(color: .white, size: CGSize(width:200, height:200))

    override func didMove(to view: SKView) {

        let cropNode = SKCropNode()

        let texture = SKSpriteNode(imageNamed: "Spaceship")

        visibleArea.position = CGPoint(x: 0, y: 100)
        cropNode.maskNode = visibleArea

        cropNode.addChild(texture)

        addChild(cropNode)


    }


    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first {

            let location = touch.location(in: self)

            let previousPosition = touch.previousLocation(in: self)

                let translation = CGPoint(x: location.x - previousPosition.x , y: location.y - previousPosition.y )

                visibleArea.position = CGPoint(x: visibleArea.position.x + translation.x , y: visibleArea.position.y + translation.y)
        }
    }
}
导入SpriteKit
导入游戏工具包
类游戏场景:SKScene{
让visibleArea=SKSpriteNode(颜色:黑色,尺寸:CGSize(宽度:100,高度:100))
让parentNode=SKSpriteNode(颜色:。白色,大小:CGSize(宽度:200,高度:200))
覆盖func didMove(到视图:SKView){
设cropNode=SKCropNode()
让纹理=SKSpriteNode(图像名为:“太空船”)
visibleArea.position=CGPoint(x:0,y:100)
cropNode.maskNode=可视区域
cropNode.addChild(纹理)
addChild(cropNode)
}
覆盖功能触摸移动(touchs:Set,带有事件:UIEvent?){
如果让触摸=先触摸{
让位置=触摸。位置(in:self)
让previousPosition=touch.previousLocation(in:self)
让translation=CGPoint(x:location.x-previousPosition.x,y:location.y-previousPosition.y)
visibleArea.position=CGPoint(x:visibleArea.position.x+translation.x,y:visibleArea.position.y+translation.y)
}
}
}
重写的touchesMoved方法之所以存在,只是因为有更好的示例。我在这里做的是:

  • 创建SKCropNode
  • 添加了一个将被遮罩的纹理
  • 定义了可视区域,即SKSpriteNode,并将其指定给裁剪节点的“遮罩”属性,该属性实际上起到了神奇的作用
结果如下:


如果您想将纹理分解成更小的纹理块用作拼图块,那么您需要使用
SKTexture(rect:in-texture:)

下面是一个如何使用它的示例:

let texture = SKTexture(...)  //How ever you plan on getting main texture
let subTextureRect = CGRect(x:0,y:0.width:10,height:10) // The actual location and size of where you want to grab the sub texture from main texture
let subTexture = SKTexture(rect:subTextureRect, in:texture);

现在,您有一块子纹理可用于其他节点。

您可以使用SKCropNode执行此操作:您希望整个精灵身体显示完整纹理,还是希望具有完整纹理的精灵只显示精灵身体的一部分?我正在尝试的是一个益智游戏;获取一个纹理并从该纹理创建正方形,每个正方形显示纹理的不同部分。好的,我会给你一个答案。我知道我必须避免这样的命令,但我必须说出来;非常感谢!我试过了,但没能成功。不过还是要谢谢你,因为我在测试时学会了裁剪。非常感谢。它也可以实现为一个通用的滚动视图。谢谢!修改rect值后,它工作得很好。这些帖子也有帮助。