我真的不知道从哪里开始.我有一个圆形图像存储在一个SKSpriteNode
和一个physicsBody
镜像大小创建时.
我使用的SKAction
是缩小图像的大小,而physicsBody的大小保持不变.我怎样才能缩小物理身体?
我的代码:
SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithImageNamed:@"whiteball"];
sprite.size = CGSizeMake(20, 20);
sprite.position = CGPointMake(dx, CGRectGetHeight(self.frame)-dy);
sprite.name = @"ball";
sprite.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:sprite.size.width/2];
[self addChild:sprite];
SKNode *ballNode = [self childNodeWithName:@"ball"];
if (ballNode != Nil){
ballNode.name = nil;
SKAction *delay = [SKAction waitForDuration:3];
SKAction *scale = [SKAction scaleTo:0 duration:1]; // I want this to scale the physicsBody as well as the spriteNode...
SKAction *remove = [SKAction removeFromParent];
//put actions in sequence
SKAction *moveSequence = [SKAction …
Run Code Online (Sandbox Code Playgroud) 我正在开发一款驾驶游戏,SpriteKit
并且在发动机声音效果方面遇到了麻烦.
我想要两种不同的发动机声音.一个用于按下油门按钮,另一个用于未按下油门按钮的按钮.在游戏开始时,两种声音中的一种将持续播放.
什么是最好的方法?我的声音文件是否应该非常短(0.10秒或更短)并且循环还是应该相当长并且只是打开和关闭?我应该SKAction
用来播放声音AVAudioPlayer
还是别的什么?我尝试过使用AVAudioPlayer
但每次暂停和播放播放器(打开或关闭油门)时,游戏的帧速率会暂时下降.任何帮助表示赞赏!
我希望有人能够帮我解决这个问题.我似乎找不到为removeActionWithKey方法为Sprite Kit分配SKAction的方法.我还尝试将操作分配给字典中的键,但程序无法识别键分配,因此返回了nil值.
这是我试图做的:
var textureanimation = SKAction.repeatActionForever(SKAction.animateWithTextures(_walkingframes, timePerFrame: 0.1))
var dictionary = ["animation": textureanimation]
object.runAction(actionForKey("animation"))
var sequence = [SKAction.moveTo(tap_position, duration: time_duration),
SKAction.runBlock{
object.removeActionForKey("animation")}
Run Code Online (Sandbox Code Playgroud) 我试图使用SpriteKit创建一个暂停菜单,以便在玩家继续游戏时在屏幕上进行动画处理(移动)。
我创建了一个SKAction并在开始运行时就这样运行它:
let duration = TimeInterval(0.5)
let moveAction = SKAction.move(to: CGPoint(x: 0, y: 495) , duration:
duration)
pauseScroll?.run(moveAction)
Run Code Online (Sandbox Code Playgroud)
pauseScroll初始化为:
weak var pauseScroll: SKSpriteNode?
override init(size: CGSize) {
...
let pauseScene = SKScene(fileNamed: "PauseMenu")!
pauseScroll = pauseScene.childNode(withName: "PauseScroll") as?
SKSpriteNode
pauseScroll?.position = CGPoint(x: 0, y: 495)
pauseScroll?.zPosition = 1000
pauseScroll?.move(toParent: self)
}
Run Code Online (Sandbox Code Playgroud)
我在这里要做的是将pauseScroll的UI放置在另一个spritekit.scene文件中,作为实际的GameScene,所有这些操作均在代码中完成。然后,我通过调用.move(toParent:self)将其添加到GameScene中。
事情是,我可以很好地引用pauseScroll,可以对其进行修改,例如更改其位置,为其指定物理身体和碰撞蒙版,在pauseScroll中包含的节点上注册水龙头等。看似一切都在其上运行了SKActions。
我同时为其他SKSpriteNode运行SKAction,它们运行良好,当然它们的初始化方式有所不同,因为它们都是在.init中的代码中设置的,例如:
var background: SKSpriteNode!
override init(size: CGSize) {
...
background = SKSpriteNode(imageNamed: "GameBackground")
background.size = size
addChild(background)
}
Run Code Online (Sandbox Code Playgroud)
然后,以与我在触摸中开始的其他任何操作相同的方式为它们设置动画:
let colorAction = SKAction.colorize(withColorBlendFactor: 0.4,
duration: duration)
background?.run(colorAction) …
Run Code Online (Sandbox Code Playgroud) 我SKAction
以这种方式创造了我:
unicornAction = [SKAction followPath:mypath asOffset:NO orientToPath:YES duration:0.1];
Run Code Online (Sandbox Code Playgroud)
并将其添加到我的SKSprite
:
[sprite runAction:[SKAction repeatActionForever:unicornAction] withKey:@"move"];
Run Code Online (Sandbox Code Playgroud)
我这样做是为了让我可以在精灵运动中随时调整速度.
当我的精灵到达路径的末尾时,我需要一个回调,以便我可以删除精灵.我怎么能得到这样的回调?
另外,有没有更好的方法来使用SKAction
我想要做的事情,同时允许我在动作运行期间的任何地方改变速度?
我正在尝试做一个简单的自动倒车动画.
SKAction *a = [SKAction moveToX:10 duration:0.5];
a = [SKAction repeatActionForever:a];
[car runAction:a];
Run Code Online (Sandbox Code Playgroud)
但行动并没有逆转.你如何获得类似Core Animation的类似自动反转效果?
如何检查a SKAction
是否已完成动画?
我需要检查我的操作是否已完成或仍在执行其操作.之后,我想创建一个布尔值,以避免在主要操作期间的多个操作.
SKAction *lionJumpActionComplete = [lionNode actionForKey:@"lionIsJumping"];
lionJumpActionComplete = [SKAction sequence: @[lionJumpActionUp, lionJumpActionFly, lionJumpActionDown, lionJumpActionPause]];
if (lionJumpActionComplete) {
return;
}
[lionNode runAction:lionJumpActionComplete withKey:@"lionIsJumping"];
Run Code Online (Sandbox Code Playgroud) 我试图在触摸屏幕时为游戏添加声音效果.我已经有一个移动角色的touchesBegan方法,我可以把:
[SKAction playSoundFileNamed:@"sfx.wav" waitForCompletion:NO];
Run Code Online (Sandbox Code Playgroud)
进入该方法或我需要制作一个新方法.另外,我应该在哪里将声音文件存储在我的项目中?是否有某个地方或它可以在任何地方?
我正在用精灵套件构建一个游戏,并且有一个精灵从左到右移动,动作无穷无尽.
SKAction *moveRight = [SKAction moveByX:3.0 y:0 duration:3.5];
SKAction *moveLeft = [SKAction moveByX:-3.0 y:0 duration:3.5];
SKAction *reversedMoveRight = [moveRight reversedAction];
SKAction *reversedMoveLeft = [moveLeft reversedAction];
SKAction *completion = [SKAction runBlock:^{
SKAction *sequence = [SKAction sequence:@[moveRight, moveLeft, reversedMoveRight,reversedMoveLeft]];
SKAction *endlessAction = [SKAction repeatActionForever:sequence];
[snake runAction:endlessAction];
}];
[snake runAction:completion withKey:@"KeySnake"];
Run Code Online (Sandbox Code Playgroud)
这很有效,但在很短的一段时间后,我的游戏速度变慢了.在Xcode的调试导航器中,CPU和内存使用量持续增长.我认为无休止的行为导致了这个问题,但我不知道有任何其他方式可以像我想的那样不断地移动它.
我在屏幕中央有一个精灵,它可以向左或向右旋转,这是通过触摸屏幕的左侧或右侧部分来确定的。
我想要做的是让精灵不断向前移动,但始终朝着它所面对的方向移动。我知道如何使用 SKActions 等进行基本运动……但不知道如何计算在精灵旋转到的方向上连续运动?
数学从来都不是我的强项,所以非常感谢一些示例代码来帮助我。
var player = SKSpriteNode()
override func didMove(to view: SKView) {
player = SKSpriteNode(imageNamed: "4B.png")
player.setScale(0.3)
player.zPosition = 100
self.addChild(player)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let position = touch.location(in: self)
if position.x < 0 {
let rotate = SKAction.repeatForever(SKAction.rotate(byAngle: CGFloat(M_PI), duration: 2))
player.run(rotate, withKey: "rotating")
} else {
let rotate = SKAction.repeatForever(SKAction.rotate(byAngle: CGFloat(-M_PI), duration: 2))
player.run(rotate, withKey: "rotating")
}
}
}
override func touchesEnded(_ touches: …
Run Code Online (Sandbox Code Playgroud) skaction ×10
sprite-kit ×10
ios ×7
objective-c ×4
iphone ×2
swift ×2
audio ×1
key ×1
skspritenode ×1
sleep ×1
swift3 ×1