标签: skspritenode

如何使用Sprite Kit逐步模糊SKSpriteNode的图像?

有人能举例说明如何使用Apple的Sprite Kit逐步模糊SKSpriteNode的图像吗?例如,假设用户触摸屏幕上的按钮,然后触发背景以缓慢(即逐渐)模糊,直到达到特定阈值.理想情况下,我也想颠倒这个过程(例如,允许用户通过触摸相同的按钮来取消图像).

objective-c transitions sprite-kit skspritenode

7
推荐指数
1
解决办法
2904
查看次数

为什么精灵工具包中的坐标系翻转,我可以全局更改吗?

我注意到在Sprite Kit中,坐标系被翻转.

例如,这是一个SKSpriteNode:

SKSpriteNode *car = [SKSpriteNode spriteNodeWithImageNamed:@"car"];
car.position = CGPointMake(0, 0);
[road addChild:car];
Run Code Online (Sandbox Code Playgroud)

汽车位于它的父母的中心.

当我设定位置时:

car.position = CGPointMake(-50, 0);
Run Code Online (Sandbox Code Playgroud)

然后它位于左侧.但是当我想把它向下移动并增加Y时,它会向上移动!

car.position = CGPointMake(-50, 20);
Run Code Online (Sandbox Code Playgroud)

在UIKit中,增加Y总是意味着向下移动.这对我来说更合乎逻辑.有没有办法在Sprite Kit中翻转坐标系?

sprite-kit skspritenode

7
推荐指数
1
解决办法
3172
查看次数

无法点击SKSpriteNode - 没有触摸检测到的ios

我对iOS,Objective C和使用Xcode都很陌生.我只做了一个简单的新闻类型的应用程序,但现在我想创建一个我在另一个平台上发布的游戏.

基本上,我有一个对象随机出现然后淡出,目的是点击对象使其消失.

然而,即使我设置,我似乎无法点击该对象 mySKSpriteNode.userInteractionEnabled = YES;

这是我的touchesBegan方法中的内容:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */
    NSLog(@"Something was touched");
    UITouch *touch = [touches anyObject];
    NSLog(@"%@", touch);
    CGPoint location = [touch locationInNode:self];
    SKNode *node = [self nodeAtPoint:location];
    if(node == mySKSpriteNode)
    [node runAction:[SKAction fadeOutWithDuration:0]];

}
Run Code Online (Sandbox Code Playgroud)

在我的日志中,当我点击屏幕时(不是我有对象的地方),我得到了这个:

2014-02-17 23:18:30.870 BubbleChallenge[48541:70b] Something was touched
2014-02-17 23:18:30.875 BubbleChallenge[48541:70b] <UITouch: 0x1130ea530> phase: Began tap count: 1 window: <UIWindow: 0x109c2ab60; frame = (0 0; 320 568); autoresize = W+H; gestureRecognizers = …
Run Code Online (Sandbox Code Playgroud)

objective-c ios sprite-kit skspritenode sknode

7
推荐指数
2
解决办法
6946
查看次数

用物理SKSpriteNode子项暂停SpriteKit游戏

我有一个带有动态物理体的SKSpriteNode SKNode *_fgLayer.

现在,当我暂停或取消暂停游戏时,我希望SKSpriteNode保持原位而不是旋转或跌落.如果我只是使用_fgLayer.paused = YES;SKSpriteNode不会留在原地,而是旋转和跌倒.如果我physicsBody.dynamic = NO;在暂停physicsBody.dynamic = YES;时设置,当取消暂停 时它可以工作.

但是,经过几次尝试后,我总是遇到以下崩溃:

"Assertion failed: (typeA == b2_dynamicBody || typeB == b2_dynamicBody), function SolveTOI, file /SourceCache/PhysicsKit/PhysicsKit-4.6/PhysicsKit/Box2D/Dynamics/b2World.cpp, line 670."

所以,我猜设置physicsBody.dynamic = NO;和返回不起作用.

当游戏暂停时,有没有人知道
如何暂停动态物理机构保持原位?

objective-c game-physics sprite-kit skspritenode skphysicsworld

7
推荐指数
1
解决办法
1612
查看次数

如何更改spritenode不透明度

我正在使用XCode 6,Sprite Kit和Swift,我有一个带有此声明的节点:

var red = SKSpriteNode(imageNamed: "Rectangle")
Run Code Online (Sandbox Code Playgroud)

我想改变节点的不透明度,但我没有找到,除了使用像FadeIn,FadeOut等SKAction ...

我尝试更改red.colorBlendFactor,但它只更改节点上新颜色的不透明度,而不是节点的不透明度...

opacity sprite-kit skspritenode swift

7
推荐指数
1
解决办法
5457
查看次数

没有bundleID for bundleID,SpriteKit

每次我移动到我的SpriteKit游戏中的特定场景时,我在控制台中收到以下错误:

没有bundleID的包:( null)

可能是什么原因?..为什么总是在那个特定的场景?谢谢

objective-c sprite-kit skspritenode

7
推荐指数
1
解决办法
1580
查看次数

Swift 2:'Set <UITouch>'类型的值没有成员'anyObject'

我检查了我的旧游戏,我想在Swift 2.0中更新它.当我试图修复它时,Xcode发现了一个错误.错误是类型'Set'的值在此代码行中没有成员'anyObject':

var touch:UITouch = touches.anyObject() as! UITouch
Run Code Online (Sandbox Code Playgroud)

功能:

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {

    self.runAction(SKAction.playSoundFileNamed("torpedo.mp3", waitForCompletion: false))

    var touch:UITouch = touches.anyObject() as! UITouch //<-- Here is Error
    var location:CGPoint = touch.locationInNode(self)

    var torpedo:SKSpriteNode = SKSpriteNode(imageNamed: "torpedo")
    torpedo.position = player.position

    torpedo.physicsBody = SKPhysicsBody(circleOfRadius: torpedo.size.width/2)
    torpedo.physicsBody!.dynamic = true
    torpedo.physicsBody!.categoryBitMask = photonTorpedoCategory
    torpedo.physicsBody!.contactTestBitMask = alienCategory
    torpedo.physicsBody!.collisionBitMask = 0
    torpedo.physicsBody!.usesPreciseCollisionDetection = true

    var offset:CGPoint = vecSub(location, b: torpedo.position)

    if (offset.y < 0){
        return

    self.addChild(torpedo)

    var direction:CGPoint = …
Run Code Online (Sandbox Code Playgroud)

uitouch sprite-kit skspritenode swift swift2

7
推荐指数
1
解决办法
4376
查看次数

处理多个GestureRecognizers

我遇到了一个问题理解UIGestureRecognizers.我现在的目标是让一组GestureRecognizers执行不同的任务,例如:

override func viewDidLoad() {
    mainScene = GameScene(size: self.view.bounds.size)
    main = view as! SKView

    mainScene.panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(shiftView(recognizer:)))
    main.addGestureRecognizer(mainScene.panRecognizer)

    mainScene.tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(testTap(recognizer:)))
    main.addGestureRecognizer(mainScene.tapRecognizer)

    mainScene.pinchRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(zoomView(recognizer:)))
    main.addGestureRecognizer(mainScene.pinchRecognizer)
Run Code Online (Sandbox Code Playgroud)

这是我的游戏View Controller,我可以处理诸如在地图上平移,缩放和点击地图图块等操作.但是我也希望能够移动精灵,UITapGestureRecognizer所以我也在我的创建中GameScene:

if startGame == true{
            self.startGame()
            for node in (self.tempGameBoard.landShipLayer.children as? Array<landship>)! {

                node.landShipInteraction = UITapGestureRecognizer(target: self, action: #selector(handleTap(recognizer:)))
                parentViewController.view.addGestureRecognizer(node.landShipInteraction)
            }
        }
Run Code Online (Sandbox Code Playgroud)

landShip这种情况下代表屏幕上的精灵,我想通过手势识别与交互的.

我的问题是,如果我添加第二组识别器,则攻丝动作变得完全没有响应.我仍然可以缩放和平移,但我不希望在地图图块上出现我所期望的点击行为.我觉得好像缺少对手势识别器如何工作的理解.

有任何想法吗?

谢谢!

uigesturerecognizer uitapgesturerecognizer sprite-kit skspritenode swift

7
推荐指数
1
解决办法
3552
查看次数

检测CGPoint是否在正方形(菱形)内的麻烦

我有2个SKSpriteNode:

  • 一个简单的方块(A)
  • 相同的方形旋转(-45°)(B)

我需要随时检查另一个SKSpriteNode(一个球)的中心是否位于其中一个方格内.球和方块具有相同的父级(主场景).

override func update(_ currentTime: TimeInterval) {

    let spriteArray = self.nodes(at: ball.position)

    let arr = spriteArray.filter {$0.name == "square"}

    for square in arr {
        print(square.letter)

        if(square.contains(self.puck.position)) {
             print("INSIDE")
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

使用简单的方形(A),我的代码可以正常工作.数据是对的.我知道,在任何时候,如果CGPoint中心位于广场内部或外部.

但是对于具有旋转(B)的正方形,数据不是所希望的.CGPoint在包含钻石形状的正方形中被检测到.

演示

SKSpriteNode方块通过关卡编辑器创建.

如何才能获得钻石形状的正确结果?

编辑1

运用

view.showsPhysics = true
Run Code Online (Sandbox Code Playgroud)

我可以看到所有SKSpriteNode与physicsBody的界限.我的钻石方形的边界是菱形方形而不是灰色方形区域.

 square.frame.size -> return the grey area
 square.size -> return the diamond-square
Run Code Online (Sandbox Code Playgroud)

在Apple文档中,func节点(在p:CGPoint) - > [SKNode],该方法是关于节点而不是帧,那么为什么它不起作用?

collision-detection ios sprite-kit skspritenode swift

6
推荐指数
1
解决办法
420
查看次数

绕过子类中的Initialization:Swift和SpriteKit

我想创建一个比SpriteNode的touchesBe更高级别的SKShapeNode,所以当我想从这个sprite上的touchesBegun事件将SKShapeNode添加到屏幕时,形状已经存在,我只是从内部将它添加到屏幕touchesBegan覆盖.

TL; DR,在我的SKSpriteNode中,我正在尝试预先构建SKShapeNode,当触摸Sprite时,该SKShapeNode将用作动画环.

我想用变量/常量创建SKShapeNode,这样我就可以轻松编辑它的值了......

因此,在子类的根目录中,我有颜色,大小和线宽的变量,可以在创建SKShapeNode时使用...

class Balls: SKSpriteNode {

    var ringSize: CGFloat = 64
    var ringColor: SKColor = SKColor.white
    var ringWidth: CGFloat = 16

....
Run Code Online (Sandbox Code Playgroud)

再往下,但仍然是班级的根,我创建我的戒指:

 let ring = SKShapeNode(circleOfRadius: ringSize)
Run Code Online (Sandbox Code Playgroud)

我立即受到了深情的怀疑:

无法在属性初始化程序中使用实例成员'ringSize',属性初始化程序在'self'可用之前运行.

精细.好.我知道了.您希望在将值分配给self之前,应该在创建属性时对类进行函数调用.无论是在这里还是在那里,我认为我变得狡猾,并且可以通过将所有内容包装在函数中来解决这个问题:

class Balls: SKSpriteNode {

        var ringSize: CGFloat = 64
        var ringColor: SKColor = SKColor.white
        var ringWidth: CGFloat = 16

        var myRing = SKShapeNode()    

    func createRing() -> SKShapeNode{
            let ring = SKShapeNode(circleOfRadius: ringSize)
                ring.strokeColor = ringColor
                ring.lineWidth = ringWidth
            return ring
        }
Run Code Online (Sandbox Code Playgroud)

这不会产生任何错误,我的兴奋也会增加.

所以我添加另一行,创建实际的戒指:....

 myRing = createRing() …
Run Code Online (Sandbox Code Playgroud)

initialization subclass sprite-kit skspritenode swift

6
推荐指数
1
解决办法
130
查看次数