有人能举例说明如何使用Apple的Sprite Kit逐步模糊SKSpriteNode的图像吗?例如,假设用户触摸屏幕上的按钮,然后触发背景以缓慢(即逐渐)模糊,直到达到特定阈值.理想情况下,我也想颠倒这个过程(例如,允许用户通过触摸相同的按钮来取消图像).
我注意到在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中翻转坐标系?
我对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) 我有一个带有动态物理体的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
我正在使用XCode 6,Sprite Kit和Swift,我有一个带有此声明的节点:
var red = SKSpriteNode(imageNamed: "Rectangle")
Run Code Online (Sandbox Code Playgroud)
我想改变节点的不透明度,但我没有找到,除了使用像FadeIn,FadeOut等SKAction ...
我尝试更改red.colorBlendFactor,但它只更改节点上新颜色的不透明度,而不是节点的不透明度...
每次我移动到我的SpriteKit游戏中的特定场景时,我在控制台中收到以下错误:
没有bundleID的包:( null)
可能是什么原因?..为什么总是在那个特定的场景?谢谢
我检查了我的旧游戏,我想在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) 我遇到了一个问题理解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
我有2个SKSpriteNode:
我需要随时检查另一个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],该方法是关于节点而不是帧,那么为什么它不起作用?
我想创建一个比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) skspritenode ×10
sprite-kit ×10
swift ×5
objective-c ×4
ios ×2
game-physics ×1
opacity ×1
sknode ×1
subclass ×1
swift2 ×1
transitions ×1
uitouch ×1