我按顺序运行3个SKActions,前两个运行正常,但fadeInWithDuration不会在节点中淡入,当视图加载时,节点会立即添加.我是否必须将节点的初始Alpha通道设置为0?有人可以解决问题吗?
- (void)setUpButtonStart
{
SKSpriteNode *buttonStart = [SKSpriteNode spriteNodeWithImageNamed:@"start"];
buttonStart.name = @"buttonStart";
buttonStart.position = CGPointMake(900,50);
[self addChild:buttonStart];
SKAction *wait = [SKAction waitForDuration:2.5];
SKAction *readIntro = [SKAction playSoundFileNamed:@"intro.mp3" waitForCompletion:NO];
SKAction *fadeIn = [SKAction fadeInWithDuration:1.0];
SKAction *sequence = [SKAction sequence:@[wait, readIntro, fadeIn]];
[buttonStart runAction: sequence];
}
Run Code Online (Sandbox Code Playgroud) 我正在使用SKAction中的repeatActionForever方法来更改SKShapeNode的颜色.这是我的代码:
SKShapeNode *ship = [SKShapeNode node];
[ship setPath:CGPathCreateWithRoundedRect(CGRectMake(-15, -15, 40, 17), 6.25, 6.25, nil)];
ship.fillColor = [SKColor redColor];
ship.glowWidth = 3;
[ship runAction:[SKAction repeatActionForever:[SKAction sequence:@[
[SKAction colorizeWithColor:[SKColor blueColor] colorBlendFactor:1.0 duration:0.5],
[SKAction waitForDuration:0.3],[SKAction colorizeWithColorBlendFactor:1.0 duration:0.5],
[SKAction colorizeWithColor:[SKColor redColor] colorBlendFactor:1.0 duration:0.5],
[SKAction waitForDuration:0.3],
[SKAction colorizeWithColorBlendFactor:1.0 duration:0.5],
[SKAction waitForDuration:0.3]]]]];
return ship; //because it's a method
Run Code Online (Sandbox Code Playgroud)
它看起来对我来说,但船不改变颜色.我做错了什么,谢谢.
我试图在路径上绘制笔画的动画SpriteKit
.我已经实现了使用的工作解决方案SKActions
和使用的单独实现CABasicAnimations
.该SKAction
解决方案是不是很优雅; 它在每次SKAction.repeatAction(action:count:)
调用迭代时创建并描绘一个新路径,每个新路径比前一个稍微完整.
func start() {
var i:Double = 1.0
let spinAction:SKAction = SKAction.repeatAction(SKAction.sequence([
SKAction.runBlock({
self.drawCirclePercent(i * 0.01)
if (++i > 100.0) {
i = 1.0
}
}),
SKAction.waitForDuration(0.01)
]), count: 100)
runAction(spinAction)
}
func drawCirclePercent(percent:Double) {
UIGraphicsBeginImageContext(self.size)
let ctx:CGContextRef = UIGraphicsGetCurrentContext()
CGContextSaveGState(ctx)
CGContextSetLineWidth(ctx, lineWidth)
CGContextSetRGBStrokeColor(ctx, 1.0, 1.0, 1.0, 1.0)
CGContextAddArc(ctx, CGFloat(self.size.width/2.0), CGFloat(self.size.height/2.0), radius/2.0, CGFloat(M_PI * 1.5), CGFloat(M_PI * (1.5 + 2.0 * percent)), 0)
CGContextStrokePath(ctx)
let textureImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
texture …
Run Code Online (Sandbox Code Playgroud) 我试图让我的spriteNode旋转手指触摸.
到目前为止,我可以做到,但我想要的是我的节点具有"旋转速度".所以我计算角度的长度然后设置一个不同的时间与它一起旋转(如果弧很长,则需要时间......).
这是我的代码:
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
_isTouched = true
for touch in touches {
let location:CGVector = touch.locationInNode(self) - miner.position
miner.weaponRotation = location.angle() - CGFloat(M_PI_2)
}
}
var wantedRotation: CGFloat {
get { return _wantedRotation }
set(rotation) {
if rotation > CGFloat(M_PI) || rotation < -CGFloat(M_PI) {
_wantedRotation = CGFloat(M_PI) + rotation % CGFloat(M_PI)
}
else {
_wantedRotation = rotation
}
removeActionForKey("rotation")
let arc: CGFloat = CGFloat(abs(_wantedRotation - zRotation))
let shortestArc: CGFloat = min(arc, CGFloat(M_PI …
Run Code Online (Sandbox Code Playgroud) 我正在创建一个简单的精灵套件游戏,将玩家放置在屏幕的左侧,而敌人从右侧接近.由于玩家可以上下移动,我希望敌人"巧妙地"调整他们向玩家的路径.
我试图在玩家移动时移除并重新添加SKAction序列,但是下面的代码会导致敌人根本不显示,可能是因为它只是在每次帧更新时添加和删除每个动作,所以他们永远不会有机会移动.
希望得到一些关于创造"聪明"敌人的最佳实践的反馈,这些敌人将随时转向玩家的位置.
这是我的代码:
func moveEnemy(enemy: Enemy) {
let moveEnemyAction = SKAction.moveTo(CGPoint(x:self.player.position.x, y:self.player.position.y), duration: 1.0)
moveEnemyAction.speed = 0.2
let removeEnemyAction = SKAction.removeFromParent()
enemy.runAction(SKAction.sequence([moveEnemyAction,removeEnemyAction]), withKey: "moveEnemyAction")
}
func updateEnemyPath() {
for enemy in self.enemies {
if let action = enemy.actionForKey("moveEnemyAction") {
enemy.removeAllActions()
self.moveEnemy(enemy)
}
}
}
override func update(currentTime: NSTimeInterval) {
self. updateEnemyPath()
}
Run Code Online (Sandbox Code Playgroud) 我想打断下面的序列2秒钟,然后恢复到最初没有中断的情况.
例如,从下面的代码中,如果我通过使精灵从序列的1.5 - 3.5秒可见而中断序列2秒(意味着hideInterval
动作加上showSprite
动作1 秒,并且showInterval
动作将丢失0.5秒))中断将在showInterval
动作剩余2.5秒时结束.如何让sprite在剩余的2.5秒内运行一个动作,并继续该点的正常序列.
请注意,这个例子是为了清楚起见,但我希望在中断后更通用的方法来恢复序列.
let hideSprite = SKAction.fadeAlpha(to: 0, duration: 0.5)
let showSprite = SKAction.fadeAlpha(to: 100, duration: 0.5)
let hideInterval = SKAction.wait(forDuration: 2)
let showInterval = SKAction.wait(forDuration: 3)
let spriteSequence = SKAction.sequence([hideSprite, hideInterval, showSprite, showInterval])
sprite.runAction(SKAction.repeatForever(spriteSequence))
Run Code Online (Sandbox Code Playgroud)
UPDATE
我认为下面的图表将使我的问题更容易理解,并进一步解释我想要通过中断序列实现的目标.
我目前正在使用Apple的SpriteKit库开发游戏,但是在开始播放之后我无法停止声音.我已经尝试使用文档中列出的方法来阻止Skaction运行,但似乎没有任何东西阻止播放声音.这些是我试图阻止声音的尝试.
//Playing sound action:
SKAction *music = [SKAction playSoundFileNamed:@"menu.wav" waitForCompletion:YES];
[musicNode runAction:[SKAction repeatActionForever:[SKAction sequence:@[
music,
[SKAction waitForDuration:0],
]]] withKey:@"MUSIC_PLAYING"];
//Later when i want to stop the sound:
[musicNode removeActionForKey:@"MUSIC_PLAYING"]; //Removing the action from the node
[musicNode runAction:[SKAction waitForDuration:0] withKey:@"MUSIC_PLAYING"]; //"Overriding" with another action with the same key
[musicNode removeAllActions]; //Removing all actions from the node
[musicNode removeFromParent]; //Removing the node from the parent
Run Code Online (Sandbox Code Playgroud)
musicNode只是一个运行动作的SkpriteNode,虽然我直接从场景中尝试了相同的方法,即:场景播放声音,然后尝试删除它.或者,由于waitForCompletion设置为YES,动作不会停止,但是再次尝试使用NO和相同的结果.有没有办法使用AVaudioSession的sharedInstante来停止声音?我也试过以下方法但也失败了:
[[AVAudioSession sharedInstance]setActive:FALSE error:nil];
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
在我的游戏中,我正在使用SKAction repeatActionForever:
方法定期调用某些方法performSelector:
.正如我所见,没有办法阻止这一点.我试图阻止通过removeActionForKey:
或removeAllActions
- 没有结果.我不想递归地调用这个动作,所以我需要帮助.
更新: 我的SKAction代码
levelTimer=[SKAction repeatActionForever:[SKAction sequence:@[[SKAction waitForDuration:30.0],[SKAction performSelector:@selector(moveToNextLevel) onTarget:self]]]];
[self runAction:levelTimer withKey:@"levelTimerAction"];
Run Code Online (Sandbox Code Playgroud) 我在做什么,我认为,这是一个非常简单的计时器栏,屏幕上没有别的东西.然而,这在iPad Pro上无法保持60fps ......我做的事情显然是重而错吗?
let previewTime: TimeInterval = 3.0
func timerBar(){
let tbW: CGFloat = frame.size.width / 2
let tbH: CGFloat = 64
let tbSize = CGSize(width: tbW, height: tbH)
let timerBox = SKSpriteNode(color: SKColor.black, size: tbSize)
timerBox.anchorPoint = CGPoint(x: 0.0, y: 0.0)
timerBox.position = CGPoint(x: frame.size.width / 2 - (tbW / 2), y: 500)
timerBox.zPosition = 8
addChild(timerBox)
let timerBoxBar = SKSpriteNode(color: .white, size: tbSize)
timerBoxBar.anchorPoint = CGPoint(x: 0.0, y: 0.0)
timerBoxBar.position.x = 0.0
timerBoxBar.position.y = 0.0
timerBoxBar.xScale = 0.0 …
Run Code Online (Sandbox Code Playgroud) 为什么从未调用完成?
我非常抱歉这是一个代码转储...因为我不知道为什么每个部分都有效,除了调用完成.
除了完成之外,没有调用完成的SKAction运行.就是这个:
curtain.run(fadeMoveWipeAndReveal, completion: {onDone(), print("I'm done!!!!")})
Run Code Online (Sandbox Code Playgroud)
在以下课程中:
import SpriteKit
class WipeCurtain: SKSpriteNode {
var wipeCurtainBase: SKSpriteNode?
var returnable = SKNode()
var moveRight = SKAction()
var node = SKNode()
init( color: SKColor,
size: CGSize,
time: TimeInterval,
reveal: @escaping () -> (),
onDone: @escaping () -> ())
{
super.init(texture: nil, color: color, size: size)
wipeCurtainBase = SKSpriteNode(color: color, size: size)
let show = SKAction.run(reveal)
let fadeIn = createFadeIn(duration: time)
let moveRight = createMoveRight(duration: time)
let wipeRight = createWipeRight(duration: time)
let …
Run Code Online (Sandbox Code Playgroud) skaction ×10
sprite-kit ×10
ios ×5
swift ×4
xcode ×2
audio ×1
closures ×1
completion ×1
ios8 ×1
performance ×1
rotation ×1
skshapenode ×1
skspritenode ×1
swift3 ×1