Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SWIFT] Shooter game : Problème zone de jeu

    11 février 2019 à 4:24:53

    Bonjour à tous, 

    Je suis en train de développer un shoot'em up, type "Space Invaders" sur iOS.

    Je précise que c'est la première fois que je développe en Swift et en utilisant SpriteKit, il se peut (presque obligatoirement) qu'il y ait de nombreuses erreurs dans mon code (si vous en voyez n'hésitez pas à m'en faire part).

    Je vous explique mon problème : lorsque je bouge la planète sur l'axe des x, j'aimerais faire en sorte que celle-ci reste dans le cadre mais que les missiles soient lancés au maximum du factor de l'iPhone (peut importe sont form factor).

    Avec mon code cela fonctionne parfaitement sur iPhone 8 (cf. photo 1). Cependant en passant au nouveau form factor (iPhone X, XS...), la planète peut complètement sortir du screen (cf. photo 2)... J'aimerais donc savoir si quelqu'un peut me venir en aide.

    Merci à tous pour votre aide :).

    Voici mon code (uniquement le GameScene) : 

    //
    //  GameScene.swift
    //  Solar Shoot
    //
    //  Created by Lucas A. on 07/02/2019.
    //  Copyright © 2019 Lucas A. All rights reserved.
    //
    
    import SpriteKit
    import GameplayKit
    
    class GameScene: SKScene {
        let planete = SKSpriteNode(imageNamed: "Planete") //variable globale pour son utilisation dans le missile.postion (par ex)
        
        // déclaration son missile (voir conv --> message important)
        
        
        func random () -> CGFloat {
            return CGFloat(Float(arc4random()) / 0xFFFFFFFF) //plus secure que la fonction drand48, notamment pour la protection
            //arcr4random(), sans valeur car on veut créer une infinité de départ possible pour les astéroides
        }
        
        func random (min : CGFloat, max : CGFloat) -> CGFloat { // Pobablement bug, va servir pour l'apparition aléatoires des ennemies
            return random() * (max - min) + min
        }
        
        var zone_de_jeu: CGRect
        override init(size: CGSize) {
         
            let max_ratio_aspect: CGFloat = 16.0 / 9.0
            let largeur_jouable = size.height / max_ratio_aspect
            let marge_largeur = (size.width - largeur_jouable) / 2
            /* let hauteur_jouable = size.width / max_ratio_aspect
            let marge_hauteur = (size.height - hauteur_jouable) / 6 */
            
        
            zone_de_jeu = CGRect(x: marge_largeur, y: 0, width: largeur_jouable, height: size.height)
            super.init(size: size)
    
        }
        
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        override func didMove(to view: SKView) {
            
            let background = SKSpriteNode(imageNamed: "Background")
            background.size = self.size //self.size = taille form factor peut importe le factor
            background.position = CGPoint(x: self.size.width/2, y: self.size.height/2 ) //l'image prend la taille de tout l'écran
            background.zPosition = 0
            self.addChild(background)
    
        
            planete.setScale(0.55) //diminution de la taille de la planète
                            // scale : aggrandissement si > 1, plus petit si < 1, si 1 = taille normal (coeff multiplicateur)
            planete.position = CGPoint(x: self.size.width/2, y: self.size.height/7) //on la situe au milieu en abscisse, et en bas de l'écran
            planete.zPosition = 2 //cote = 2
            self.addChild(planete)
            
        }
        
        func tir_missile () { //fonction missiles envoyé par la planète
            let missile = SKSpriteNode(imageNamed: "Missile")
            missile.setScale(0.5) //réduction de la taille du missile
            missile.position = CGPoint(x: planete.position.x, y: planete.position.y) // = position planète
            missile.zPosition = 1
            self.addChild(missile)
            
            let mouvement_missile = SKAction.moveTo(y: self.size.height + missile.size.height, duration: 1.2)
                            // duration = temps que le missile va mettre à disparaitre en sec
            let disparition_missile = SKAction.removeFromParent()
            let tir_missile = SKAction.sequence([mouvement_missile, disparition_missile])
                            // Comme une sorte de boucle :
            missile.run(tir_missile)
        }
        /*
        func spawn_asteroide () {
            
            let start_randomX = random(min: , max: )
         
            
            
        }
     */
        
        
        
        
        
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            tir_missile()
        }
        override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
            for touch:AnyObject in touches {
                    
                let initialisation_mouvement_planete = touch.location(in: self)
                let mouvement_planete = touch.previousLocation(in: self)
                let arrive_final_planete_x = initialisation_mouvement_planete.x - mouvement_planete.x
                //let arrive_final_planete_y = initialisation_mouvement_planete.y - mouvement_planete.y
                /* Si on veut arriver à bouger la planète en hauteur */
                
                planete.position.x += arrive_final_planete_x
                //planete.position.y += arrive_final_planete_y
                /*(cf arrive_final_planete_y)*/
                
                if planete.position.x > zone_de_jeu.maxX - planete.size.width / 6.5 { //6.5 = parfait sur iPhone 8
                    planete.position.x = zone_de_jeu.maxX - planete.size.width / 6.5
                }
                
                if planete.position.x < zone_de_jeu.minX + planete.size.width / 6.5 {
                    planete.position.x = zone_de_jeu.minX + planete.size.width / 6.5
                    //problème sur le max x sur les différents format factor (même avec self.size.width/6.5
                    
                    
                    // if planete.position.y > zone_de_jeu.maxY - planete.size.height / 2 {
                }
            }
         }
    }
    
    





    Photo 1.

    -
    Edité par LucasA. 11 février 2019 à 4:27:03

    • Partager sur Facebook
    • Partager sur Twitter
      11 février 2019 à 9:52:39

      Salut, j’ai un peu de mal à lire ton code. Je n’arrive Pas à voir où est utilisé zoneDeJeu. 

      Pour positionner ton background tu fais des divisions par 2. Pourquoi ne pas placer son centre au centre de l’ecrant Tout simplement ?

      oublie les self.size un peu partout. Hardcode tout. SpriteKit gère le scaling. https://stackoverflow.com/questions/34242768/basic-positioning-for-devices-in-spritekit

      • Partager sur Facebook
      • Partager sur Twitter
        11 février 2019 à 18:39:07

        Geda a écrit:

        Salut, j’ai un peu de mal à lire ton code. Je n’arrive Pas à voir où est utilisé zoneDeJeu. 

        Pour positionner ton background tu fais des divisions par 2. Pourquoi ne pas placer son centre au centre de l’ecrant Tout simplement ?

        oublie les self.size un peu partout. Hardcode tout. SpriteKit gère le scaling. https://stackoverflow.com/questions/34242768/basic-positioning-for-devices-in-spritekit


        Salut, merci pour ta réponse. Oui même moi j'ai du mal à m'y retrouver, je suis en train de le réorganiser afin qu'il soit plus lisible. 

        Pour ce qui est du background, et du self.size c'est mon professeur encadrant qui m'a conseillé de faire cela (CÉar c'est un projet pour mon 4ème semestre à l'université).

        J'ai également un peu avancé, en pouvant également bouger la planète sur l'axe des ordonnées tout en définissant une limite max.

        • Partager sur Facebook
        • Partager sur Twitter
          11 février 2019 à 20:48:32

          Ton professeur encadrant il y connaît quelque chose à spriteKit ? Son truc c’est plus iOS non ? 

          La tu définis un ratio de 16/9 sur des téléphones qui ne sont pas en 16/9 avec une librairie qui gère le scale automatiquement. Je pense que ton professeur encadrant peut l´entendre. On marche un peu sur la tête 

          • Partager sur Facebook
          • Partager sur Twitter

          [SWIFT] Shooter game : Problème zone de jeu

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          • Editeur
          • Markdown