2016-03-20 2 views
0

Я сделал так, чтобы при нажатии на левую или правую сторону экрана он будет двигаться соответственно, перемещая worldNodeЯ пытаюсь сделать игру с прокруткой, и я изо всех сил пытаюсь бесконечно искриться.

import SpriteKit 
import UIKit 
import GameplayKit 

var ground = Ground(imageNamed: "grass.png") 
var sceneBody = SKPhysicsBody() 

enum BodyType:UInt32 { 
    case Player = 1 
    case Wall = 2 
    case Ground = 4 
    case AnotherObject = 8 
    case AnotherObject2 = 16 
    case AnotherObject3 = 32 
    case AnotherObject4 = 64 

} 



class GameScene: SKScene, SKPhysicsContactDelegate{ 

    var player = Player(imageNamed: "p1_walk02.png") 
    let theCamera: SKCameraNode = SKCameraNode() 
    var textAtlas = SKTextureAtlas() 
    var textArry = [SKTexture]() 
    var worldNode = SKNode() 






    override func didMoveToView(view: SKView) { 
     self.physicsWorld.gravity = CGVectorMake(0, -9.8) 
     physicsWorld.contactDelegate = self 



     self.anchorPoint = CGPointMake(0, 0) 
     self.backgroundColor = SKColor.whiteColor() 

     //self.camera?.position = player.position 

     addChild(worldNode) 

     let spawn = SKAction.runBlock({ 
      () in 

      self.makeGU1() 

     }) 

     let delay = SKAction.waitForDuration(2) 

     let seq = SKAction.sequence([spawn, delay]) 

     worldNode.runAction(SKAction.repeatAction(seq, count: 1)) 

     self.addChild(player) 

     player.xScale = 0.5 
     player.yScale = 0.5 
     player.position = CGPoint(x: self.frame.width*0.3, y: ground.position.y+56) 

     worldNode.position = self.position 
     worldNode.xScale = self.xScale 
     worldNode.yScale = self.yScale 


    } 

    func scheduledTimerWithTimeInterval(){ 
     //Scheduling timer to Call the function **Countdown** with the interval of 1 seconds 
     let myTimer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("updateCounting"), userInfo: nil, repeats: true) 
    } 
    func updateCounting() { 

    } 


    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     for touch in touches { 
      let location = touch.locationInNode(self) 
      print(location) 

      //-7.49999237060547 
      if player.position.x > 230.499969482422{ 

      } 
      if location.x > self.frame.width/2 { 
       // Left side of the screen 
       textAtlas = SKTextureAtlas(named: "Walk") 

       for i in 1...textAtlas.textureNames.count{ 
        let Name = "p1_walk0\(i).png" 
        textArry.append(SKTexture(imageNamed: Name)) 
       } 
       let Animate = SKAction.animateWithTextures(textArry, timePerFrame: 0.1) 
       player.runAction(SKAction.repeatActionForever(Animate), withKey: "Left run") 
       print(location) 
       worldNode.runAction(SKAction.repeatActionForever(SKAction.moveBy(CGVectorMake(1000, 0), duration: 4).reversedAction()), withKey: "moveLeft") 
       self.runAction(SKAction.repeatActionForever(SKAction.moveBy(CGVectorMake(1000, 0), duration: 4).reversedAction()), withKey: "moveLeft") 


      } else { 
       textAtlas = SKTextureAtlas(named: "Walk") 

       for i in 1...textAtlas.textureNames.count{ 
        let Name = "p1_walk0\(i).png" 
        textArry.append(SKTexture(imageNamed: Name)) 

       } 
       let Animate = SKAction.animateWithTextures(textArry, timePerFrame: 0.1) 
       player.runAction(SKAction.repeatActionForever(Animate), withKey: "Left run") 
       print(location) 
       worldNode.runAction(SKAction.repeatActionForever(SKAction.moveBy(CGVectorMake(1000, 0), duration: 4)), withKey: "moveLeft") 
       self.runAction(SKAction.repeatActionForever(SKAction.moveBy(CGVectorMake(1000, 0), duration: 4)), withKey: "moveLeft") 

      } 
     } 
    } 




    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     player.removeActionForKey("Left run") 
     var tex = [SKTexture]() 
     tex.append(SKTexture(imageNamed:"p1_walk02.png")) 
     player.runAction(SKAction.animateWithTextures(tex, timePerFrame: 0.2)) 
     worldNode.removeActionForKey("moveLeft") 
     self.removeActionForKey("moveLeft") 

    } 




    func makeGU1(){ 

Здесь я создал сцену

 var ground1 = SKSpriteNode(imageNamed: "grass.png") 
     var ground2 = SKSpriteNode(imageNamed: "grass.png") 
     var ground0 = SKSpriteNode(imageNamed: "grass.png") 
     var ground3 = SKSpriteNode(imageNamed: "grass.png") 
     var ground4 = SKSpriteNode(imageNamed: "grass.png") 
     var ground5 = SKSpriteNode(imageNamed: "grass.png") 
     var ground6 = SKSpriteNode(imageNamed: "grass.png") 
     var ground7 = SKSpriteNode(imageNamed: "grass.png") 
     var ground8 = SKSpriteNode(imageNamed: "grass.png") 
     var ground9 = SKSpriteNode(imageNamed: "grass.png") 
     var ground10 = SKSpriteNode(imageNamed: "grass.png") 
     var ground11 = SKSpriteNode(imageNamed: "grass.png") 
     var ground12 = SKSpriteNode(imageNamed: "grass.png") 
     var ground13 = SKSpriteNode(imageNamed: "grass.png") 




        ground0.xScale = 0.7 
        ground0.yScale = 0.7 

        ground0.position = CGPoint(x: 20, y: 10) 

        worldNode.addChild(ground0) 

        ground0.physicsBody = SKPhysicsBody(rectangleOfSize: ground0.size) 
        ground0.physicsBody?.affectedByGravity = false 
        ground0.physicsBody?.dynamic = false 
        ground0.physicsBody?.categoryBitMask = BodyType.Ground.rawValue 
        ground0.physicsBody?.collisionBitMask = BodyType.Player.rawValue 
        ground0.physicsBody?.contactTestBitMask = BodyType.Player.rawValue 
        ground0.copy() 

        ground1 = ground0.copy() as! SKSpriteNode 
        ground1.position = CGPoint(x: ground0.position.x+ground1.size.width, y: 10) 
        ground1.copy() 

        worldNode.addChild(ground1) 









        ground2.xScale = 0.7 
        ground2.yScale = 0.7 

        ground2.physicsBody = SKPhysicsBody(rectangleOfSize: ground2.size) 
        ground2.physicsBody?.affectedByGravity = false 
        ground2.physicsBody?.dynamic = false 
        ground2.physicsBody?.categoryBitMask = BodyType.Ground.rawValue 
        ground2.physicsBody?.collisionBitMask = BodyType.Player.rawValue 
        ground2.physicsBody?.contactTestBitMask = BodyType.Player.rawValue 
        ground2.position = CGPoint(x: ground1.position.x+ground2.size.width, y: 10) 

        worldNode.addChild(ground2) 



        ground3.xScale = 0.7 
        ground3.yScale = 0.7 

        ground3.physicsBody = SKPhysicsBody(rectangleOfSize: ground3.size) 
        ground3.physicsBody?.affectedByGravity = false 
        ground3.physicsBody?.dynamic = false 
        ground3.physicsBody?.categoryBitMask = BodyType.Ground.rawValue 
        ground3.physicsBody?.collisionBitMask = BodyType.Player.rawValue 
        ground3.physicsBody?.contactTestBitMask = BodyType.Player.rawValue 
        ground3.position = CGPoint(x: ground2.position.x+ground3.size.width, y: 10) 

        worldNode.addChild(ground3) 



        ground4.xScale = 0.7 
        ground4.yScale = 0.7 

        ground4.physicsBody = SKPhysicsBody(rectangleOfSize: ground4.size) 
        ground4.physicsBody?.affectedByGravity = false 
        ground4.physicsBody?.dynamic = false 
        ground4.physicsBody?.categoryBitMask = BodyType.Ground.rawValue 
        ground4.physicsBody?.collisionBitMask = BodyType.Player.rawValue 
        ground4.physicsBody?.contactTestBitMask = BodyType.Player.rawValue 
        ground4.physicsBody?.affectedByGravity = false 
        ground4.physicsBody?.dynamic = false 
        ground4.position = CGPoint(x: ground3.position.x+ground4.size.width, y: 10) 

        worldNode.addChild(ground4) 



        ground5.xScale = 0.7 
        ground5.yScale = 0.7 

        ground5.physicsBody = SKPhysicsBody(rectangleOfSize: ground5.size) 

        ground5.physicsBody?.categoryBitMask = BodyType.Ground.rawValue 
        ground5.physicsBody?.collisionBitMask = BodyType.Player.rawValue 
        ground5.physicsBody?.contactTestBitMask = BodyType.Player.rawValue 
        ground5.physicsBody?.affectedByGravity = false 
        ground5.physicsBody?.dynamic = false 
        ground5.position = CGPoint(x: ground4.position.x+ground5.size.width, y: 10) 

        worldNode.addChild(ground5) 



        ground6.xScale = 0.7 
        ground6.yScale = 0.7 
        ground6.physicsBody = SKPhysicsBody(rectangleOfSize: ground6.size) 
        ground6.physicsBody?.affectedByGravity = false 
        ground6.physicsBody?.dynamic = false 

        ground6.physicsBody?.categoryBitMask = BodyType.Ground.rawValue 
        ground6.physicsBody?.collisionBitMask = BodyType.Player.rawValue 
        ground6.physicsBody?.contactTestBitMask = BodyType.Player.rawValue 

        ground6.position = CGPoint(x: ground5.position.x+ground6.size.width, y: 10) 

        worldNode.addChild(ground6) 



        ground7.xScale = 0.7 
        ground7.yScale = 0.7 
        ground7.physicsBody = SKPhysicsBody(rectangleOfSize: ground6.size) 
        ground6.physicsBody?.affectedByGravity = false 
        ground7.physicsBody?.dynamic = false 

        ground7.physicsBody?.categoryBitMask = BodyType.Ground.rawValue 
        ground7.physicsBody?.collisionBitMask = BodyType.Player.rawValue 
        ground7.physicsBody?.contactTestBitMask = BodyType.Player.rawValue 

        ground7.position = CGPoint(x: ground6.position.x+ground7.size.width, y: 10) 
        worldNode.addChild(ground7) 



        ground8.xScale = 0.7 
        ground8.yScale = 0.7 
        ground8.physicsBody = SKPhysicsBody(rectangleOfSize: ground8.size) 
        ground8.physicsBody?.affectedByGravity = false 
        ground8.physicsBody?.dynamic = false 

        ground8.physicsBody?.categoryBitMask = BodyType.Ground.rawValue 
        ground8.physicsBody?.collisionBitMask = BodyType.Player.rawValue 
        ground8.physicsBody?.contactTestBitMask = BodyType.Player.rawValue 

        ground8.position = CGPoint(x: ground7.position.x+ground8.size.width, y: 10) 

        worldNode.addChild(ground8) 



        ground9.xScale = 0.7 
        ground9.yScale = 0.7 
        ground9.physicsBody = SKPhysicsBody(rectangleOfSize: ground9.size) 
        ground9.physicsBody?.affectedByGravity = false 
        ground9.physicsBody?.dynamic = false 

        ground9.physicsBody?.categoryBitMask = BodyType.Ground.rawValue 
        ground9.physicsBody?.collisionBitMask = BodyType.Player.rawValue 
        ground9.physicsBody?.contactTestBitMask = BodyType.Player.rawValue 

        ground9.position = CGPoint(x: ground8.position.x+ground9.size.width, y: 10) 
        worldNode.addChild(ground9) 




        ground10.xScale = 0.7 
        ground10.yScale = 0.7 
        ground10.physicsBody = SKPhysicsBody(rectangleOfSize: ground10.size) 
        ground10.physicsBody?.affectedByGravity = false 
        ground10.physicsBody?.dynamic = false 

        ground10.physicsBody?.categoryBitMask = BodyType.Ground.rawValue 
        ground10.physicsBody?.collisionBitMask = BodyType.Player.rawValue 
        ground10.physicsBody?.contactTestBitMask = BodyType.Player.rawValue 

        ground10.position = CGPoint(x: ground9.position.x+ground10.size.width, y: 10) 
        worldNode.addChild(ground10) 



        ground11.xScale = 0.7 
        ground11.yScale = 0.7 
        ground11.physicsBody = SKPhysicsBody(rectangleOfSize: ground11.size) 
        ground11.physicsBody?.categoryBitMask = BodyType.Ground.rawValue 
        ground11.physicsBody?.collisionBitMask = BodyType.Player.rawValue 
        ground11.physicsBody?.contactTestBitMask = BodyType.Player.rawValue 
        ground11.physicsBody?.affectedByGravity = false 
        ground11.physicsBody?.dynamic = false 
        ground11.position = CGPoint(x: ground10.position.x+ground11.size.width, y: 10) 
        worldNode.addChild(ground11) 



        ground12.xScale = 0.7 
        ground12.yScale = 0.7 
        ground12.physicsBody = SKPhysicsBody(rectangleOfSize: ground12.size) 
        ground12.physicsBody?.categoryBitMask = BodyType.Ground.rawValue 
        ground12.physicsBody?.collisionBitMask = BodyType.Player.rawValue 
        ground12.physicsBody?.contactTestBitMask = BodyType.Player.rawValue 
        ground12.physicsBody?.affectedByGravity = false 
        ground12.physicsBody?.dynamic = false 
        ground12.position = CGPoint(x: ground11.position.x+ground12.size.width, y: 10) 
        worldNode.addChild(ground12) 


       //if ground13.parent == nil { 
        ground13.xScale = 0.7 
        ground13.yScale = 0.7 
        ground13.physicsBody = SKPhysicsBody(rectangleOfSize: ground13.size) 
        ground13.physicsBody?.categoryBitMask = BodyType.Ground.rawValue 
        ground13.physicsBody?.collisionBitMask = BodyType.Player.rawValue 
        ground13.physicsBody?.contactTestBitMask = BodyType.Player.rawValue 
        ground13.physicsBody?.affectedByGravity = false 
        ground13.physicsBody?.dynamic = false 
        ground13.position = CGPoint(x: ground12.position.x+ground13.size.width, y: 10) 
        worldNode.addChild(ground13) 
       //} 


    }//end of Make Block 
} 

Это делает достаточно, чтобы заполнить почву на экране Iphone 6

+0

Похоже, вам нужно сделать процесс генерации местности «скачкообразным» или как ваш игрок движется вперед и попадает на линию обнаружения, которая появляется в новом наземном узле, добавляет ее в сцену, а затем, возможно, просто забывает об этом? Кроме того, все ли они будут одинаковыми, или он сможет повторно использовать 2 для «чехарды», только имея рельеф, когда игрок передвигается? – Gliderman

+0

Создайте несколько текстур земли, которые отличаются друг от друга (но, возможно, одинакового размера), которые могут быть размещены рядом с любым другим без очевидного соединения. Затем, работая с одной стороны экрана на другую, поместите достаточно, чтобы заполнить экран и одну дополнительную плитку. После прокрутки экрана проверьте, не ушла ли панель. если это так, удалите его и создайте новую плиту, готовую для прокрутки на экране. –

+0

Подкласс SKSpriteNode для создания вашей земли, поэтому вы можете легко создавать новые спрайты на земле - страницы дублированного кода выглядят плохо и негибко. –

ответ

0

У меня есть code on github, что создает бесконечно прокрутки фона. Он занимается созданием фона параллакса, но вы можете увидеть код там, чтобы он прокручивал бесконечно. Хитрость заключается в том, чтобы создать достаточное количество наземных узлов, чтобы покрыть ширину, плюс несколько дополнительных дополнений для каждого конца. Когда тот, который находится слева, полностью отходит от экрана (проверяя его значение origin.x + size.width против источника представления) вы подбираете его и перемещаете в крайнее правое. И наоборот, если вы двигаетесь в другом направлении и обнаруживаете, что ваш последний узел полностью отключен от экрана, вы выбираете один самый правый и переместите его в начало.

Когда все сделано правильно, оно выглядит гладко и довольно просто.

Смежные вопросы