2016-04-04 17 views
1

Programlamada yeniyim ve hala çok öğreniyorum. Sadece bir problemle karşılaştım. Benim bir sorunum var "sharkWall() işlevi" SHARKNODE "-sprite etrafında çevirmek ve her yöne ekranın sonuna ulaştığında ters yönde başını. "SHARKNODES", Y-yönünde bir zamanlayıcı ile her 0,75 saniyede üretilir. Ve işte problem. SharkWall() işlevi, sadece ilk ortaya çıkmış "SHARKNODE" -sprite üzerinde çalışıyor gibi görünmektedir ve Y ekseni üzerinde daha yüksek olan diğerlerini değil. Bahsedilen ilk şey, ilk ortaya çıkan hareketli grafiğin, oyuncu Y-ekseninde daha yüksek bir upp ve ekrandaki diğer "SHARKNODE" -spritler görünene kadar ekranda görünen tek göstergedir. Ve elbette, istediğim, tüm "SHARKNODE" -sprites üzerinde çalışmak için sharkWall() işlevini yapmaktır. Burada ne yapılacağı ve ne yapılabileceği hakkında bir fikri olan var mı? Şimdiden teşekkürler.Fonksiyon, sadece ilk sprinkli sprite üzerinde çalışıyor ve diğer

GameScene.swift:

class GameScene: SKScene, SKPhysicsContactDelegate { 


var background:SKNode! 
var midground:SKNode! 
var foreground:SKNode! 

var buttonPressed = 0 

var leftButtonFirst: UIButton! 
var rightButtonFirst: UIButton! 

var hud: SKNode! 
var scaleX = 0 
var sharkSprite = SKSpriteNode() 

var counter = 1 
var player: SKNode! 

var scaleFactor:CGFloat! 

var startButton = SKSpriteNode(imageNamed: "TapToStart") 

var endOfGamePosition = 0 

let montionManager = CMMotionManager() 

var xAcceleration:CGFloat = 1 

var scoreLabel: SKLabelNode! 
var flowerLabel: SKLabelNode! 

var playersMaxY:Int! 

var GameOver = false 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    } 

override init(size: CGSize){ 
    super.init(size: size) 

    backgroundColor = UIColor(red: (57/255.0), green: (214/255.0), blue: (255/255.0), alpha: 1.0) 

    scaleFactor = self.size.width/200 


    background = createBackground() 
    addChild(background) 

    midground = createMidground() 
    addChild(midground) 

    foreground = SKNode() 
    addChild(foreground) 

    player = createPlayer() 
    foreground.addChild(player) 



    var bubbleTimer = NSTimer.scheduledTimerWithTimeInterval(0.75, target: self, selector: #selector(GameScene.bubbleMaker), userInfo: nil, repeats: true) 

    var sharkTimer = NSTimer.scheduledTimerWithTimeInterval(0.75, target: self, selector: #selector(GameScene.sharkMaker), userInfo: nil, repeats: true) 


    physicsWorld.gravity = CGVector(dx: 0, dy: -3) 
    physicsWorld.contactDelegate = self 

    } 



func bubbleMaker() { 
    let randomXPos = arc4random_uniform(172) + 15 
    let yPosition = CGRectGetMidY(self.frame) + 200 * CGFloat(counter) 
    counter += 1 
    let platformNode = createPlatformAtPosition(CGPoint(x: CGFloat(randomXPos), y: yPosition - 180), ofType: PlatformType.normalBubble) 
    foreground.addChild(platformNode) 


} 


func sharkMaker() { 
let randomXPos = arc4random_uniform(170) + 10 
let yPosition = CGRectGetMidY(self.frame) + 200 * CGFloat(counter) 
counter += 1 
let shark = createSharkAtPosition(CGPoint(x: CGFloat(randomXPos), y: yPosition - 180), ofType: SharkType.normalShark) 
foreground.addChild(shark) 

} 


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

    if player.physicsBody!.dynamic { 
     return 
    } 

    player.physicsBody?.dynamic = true 
    player.physicsBody?.velocity.dy = CGFloat(500) 
    createLeftButton() 
    createRightButton() 

    createLeftButtonFirst() 
    createRightButtonFirst() 

} 

override func didSimulatePhysics() { 

    if player.position.x < -10 { 
     player.physicsBody?.applyImpulse(CGVectorMake(3, 0)) 
    }else if (player.position.x > self.size.width + 10) { 
      player.physicsBody?.applyImpulse(CGVectorMake(-3, 0)) 
    } 
    sharkWall() 
} 


func didBeginContact(contact: SKPhysicsContact) { 
    var otherNode:SKNode! 

    if contact.bodyA.node != player { 
     otherNode = contact.bodyA.node 
    } else { 
     otherNode = contact.bodyB.node 
    } 

    (otherNode as! GenericNode).collisionWithPlayer(player) 
} 


override func update(currentTime: CFTimeInterval) { 





    foreground.enumerateChildNodesWithName("PLATFORMNODE"){ (node, stop) -> Void in 
     let platform = node as! PlatformNode 
     platform.shoudRemoveNode(self.player.position.y) 
    } 

    if player.position.y > 200 { 
     background.position = CGPoint(x: 0, y: -((player.position.y - 200)/10)) 
     midground.position = CGPoint(x: 0, y: -((player.position.y - 200)/4)) 
     foreground.position = CGPoint(x: 0, y: -((player.position.y) - 200)) 
    } 
} 


func sharkWall(){ 
if foreground.childNodeWithName("SHARKNODE")?.position.x < -10 { 
     foreground.childNodeWithName("SHARKNODE")?.xScale = -1 
     foreground.childNodeWithName("SHARKNODE")?.physicsBody?.velocity.dx = CGFloat(50) 
    }else if (foreground.childNodeWithName("SHARKNODE")?.position.x > self.size.width + 10) { 
      foreground.childNodeWithName("SHARKNODE")?.xScale = 1 
      foreground.childNodeWithName("SHARKNODE")?.physicsBody?.velocity.dx = CGFloat(-50) 
    } 

} 


func createLeftButton() { 
    let button = UIButton(); 
    button.frame = CGRectMake(self.frame.width - self.frame.width, 0, self.frame.width/2, self.frame.height) // X, Y, width, height 

    button.addTarget(self, action: #selector(GameScene.buttonPressedRight(_:)), forControlEvents: .TouchUpInside) 
    self.view!.addSubview(button) 
    button.layer.zPosition = -1 

} 

func createRightButton() { 

    let buttonRight = UIButton(); 

    buttonRight.frame = CGRectMake(self.frame.width/2, 0, self.frame.width/2, self.frame.height) // X, Y, width, height 

    buttonRight.addTarget(self, action: #selector(GameScene.buttonPressedLeft(_:)), forControlEvents: .TouchUpInside) 
    self.view!.addSubview(buttonRight) 
    buttonRight.layer.zPosition = -1 
} 

func createLeftButtonFirst() { 
    leftButtonFirst = UIButton() 
    leftButtonFirst.frame = CGRectMake(self.frame.width - self.frame.width, 0, self.frame.width/2, self.frame.height) // X, Y, width, height 

    leftButtonFirst.addTarget(self, action: #selector(GameScene.buttonPressedLeftFirst(_:)), forControlEvents: .TouchUpInside) 
    self.view!.addSubview(leftButtonFirst) 
    leftButtonFirst.layer.zPosition = 1 
} 

func createRightButtonFirst() { 

    rightButtonFirst = UIButton() 
    rightButtonFirst.frame = CGRectMake(self.frame.width/2, 0, self.frame.width/2, self.frame.height) // X, Y, width, height 
    rightButtonFirst.addTarget(self, action: #selector(GameScene.buttonPressedRightFirst(_:)), forControlEvents: UIControlEvents.TouchUpInside) 
    self.view!.addSubview(rightButtonFirst) 
    rightButtonFirst.userInteractionEnabled = true 
    rightButtonFirst.layer.zPosition = 1 

} 


func buttonPressedRight(sender: UIButton!) { 

    if player.physicsBody?.velocity.dx > 0 { 
     player.physicsBody?.velocity = CGVector(dx: -200, dy: player.physicsBody!.velocity.dy) 
} 

    player.xScale = -1 
} 
func buttonPressedLeft(sender: UIButton!) { 
    if player.physicsBody?.velocity.dx < 0 { 
     player.physicsBody?.velocity = CGVector(dx: 200, dy: player.physicsBody!.velocity.dy) 
    } 
    player.xScale = 1 

} 
func buttonPressedLeftFirst(sender: UIButton!) { 
    player.physicsBody?.velocity = CGVector(dx: -200, dy: player.physicsBody!.velocity.dy) 

    player.xScale = -1 

    rightButtonFirst.hidden = true 
    leftButtonFirst.hidden = true 
} 

func buttonPressedRightFirst(sender: UIButton!) { 
    player.physicsBody?.velocity = CGVector(dx: 200, dy: player.physicsBody!.velocity.dy) 
    player.xScale = 1 

    rightButtonFirst.hidden = true 
    leftButtonFirst.hidden = true 
} 
} 

GameElements.swift:

import SpriteKit 

extension GameScene { 


func createBackground() -> SKNode{ 
    let backgroundNode = SKNode() 
    let spacing = 32 * scaleFactor 

    for index in 0 ... 20 { 

     let node = SKSpriteNode(imageNamed: String(format: "Background/Background%02d", index + 1)) 
     node.setScale(scaleFactor) 
     node.anchorPoint = CGPoint(x: 0.5, y: 0) 
     node.position = CGPoint(x: self.size.width/2, y:spacing * CGFloat(index)) 
     node.size.width = self.frame.width 

     backgroundNode.addChild(node) 
    } 

    return backgroundNode 
} 


func createMidground() -> SKNode{ 

let midgroundNode = SKNode() 
var anchor: CGPoint! 
var xPos: CGFloat! 

for index in 0 ... 250 { 
    var name: String 

    let randomNumber = arc4random() % 2 

    if randomNumber > 0 { 
     name = "whale" 
     anchor = CGPoint(x: 0, y: 0.5) 
     xPos = CGFloat(arc4random_uniform(170) + 15) 
    } else{ 
     name = "whale" 
     anchor = CGPoint(x: 1, y: 0.5) 
     xPos = CGFloat(arc4random_uniform(170) + 15) 
    } 
    let cloudNode = SKSpriteNode(imageNamed: name) 
    cloudNode.alpha = 0.3 
    cloudNode.anchorPoint = anchor 
    cloudNode.position = CGPoint(x: xPos, y: 500 + 500 * CGFloat(index)) 
    midgroundNode.addChild(cloudNode) 

} 
    return midgroundNode 

} 

func createPlayer() -> SKNode { 

let playerNode = SKNode() 
    playerNode.position = CGPoint(x: self.size.width/2, y: 80) 

    let sprite = SKSpriteNode(imageNamed: "Player") 
    playerNode.addChild(sprite) 

    playerNode.physicsBody = SKPhysicsBody(circleOfRadius: sprite.size.width/2) 

    playerNode.physicsBody?.dynamic = false 
    playerNode.physicsBody?.allowsRotation = false 

    playerNode.physicsBody?.restitution = 1 
    playerNode.physicsBody?.friction = 0 
    playerNode.physicsBody?.angularDamping = 0 
    playerNode.physicsBody?.linearDamping = 0 

    playerNode.physicsBody?.usesPreciseCollisionDetection = true 

    playerNode.physicsBody?.categoryBitMask = CollisionBitMask.Player 

    playerNode.physicsBody?.collisionBitMask = 0 
    playerNode.physicsBody?.contactTestBitMask = CollisionBitMask.Bubble | CollisionBitMask.Shark 

    return playerNode 

} 



func createSharkAtPosition (position:CGPoint, ofType type:SharkType) -> SharkNode { 

    let shark = SharkNode() 
    let position = CGPoint(x: position.x * scaleFactor, y: position.y) 
    shark.position = position 
    shark.name = "SHARKNODE" 
    shark.sharkType = type 

    let spriteTexture1 = SKTexture(imageNamed: "shark1") 
    let spriteTexture2 = SKTexture(imageNamed: "shark2") 
    let spriteTexture3 = SKTexture(imageNamed: "shark3") 

    let sharkAnimation = SKAction.animateWithTextures([spriteTexture1, spriteTexture2, spriteTexture3], timePerFrame: 0.2) 
    let makeSharkFlap = SKAction.repeatActionForever(sharkAnimation) 

    sharkSprite = SKSpriteNode(texture: spriteTexture1) 
    sharkSprite.runAction(makeSharkFlap) 
    shark.addChild(sharkSprite) 


    shark.physicsBody = SKPhysicsBody(rectangleOfSize: sharkSprite.size) 
    shark.physicsBody?.dynamic = true 
    shark.physicsBody?.affectedByGravity = false 
    shark.physicsBody?.categoryBitMask = CollisionBitMask.Shark 
    shark.physicsBody?.collisionBitMask = 0 
    shark.physicsBody?.velocity = CGVectorMake(-60, 0) 

    return shark 
} 



func createPlatformAtPosition (position:CGPoint, ofType type:PlatformType) -> PlatformNode { 

    let node = PlatformNode() 
    let position = CGPoint(x: position.x * scaleFactor, y: position.y) 
    node.position = position 
    node.name = "PLATFORMNODE" 
    node.platformType = type 
    var sprite:SKSpriteNode 

    sprite = SKSpriteNode(imageNamed: "bubble") 

    node.addChild(sprite) 

    node.physicsBody = SKPhysicsBody(circleOfRadius: sprite.size.height/2) 
    node.physicsBody?.dynamic = false 
    node.physicsBody?.categoryBitMask = CollisionBitMask.Bubble 
    node.physicsBody?.collisionBitMask = 0 

    return node 
} 

}

+0

Bunun nasıl düzeltileceği konusunda herhangi bir bilgiye sahip olan var mı? – rkoi95

cevap

1

childNodeWithName sadece adıyla ilk çocuk düğüm çağırır, sen numaralandırmak gerekir hepsi

func sharkWall(){ 
    foreground.enumerateChildNodesWithName("SHARKNODE"){ 
     node, stop in 
     if node.position.x < -10 { 
      node.xScale = -1 
      node.physicsBody?.velocity.dx = CGFloat(50) 
     }else if (node.position.x > self.size.width + 10) { 
      node.xScale = 1 
      node.physicsBody?.velocity.dx = CGFloat(-50) 
     } 
    } 
} 
+0

Şimdi mükemmel çalışıyor! Teşekkür ederim! – rkoi95

İlgili konular