SKSpriteKit - Appliquer une impulsion depuis le fichier swift

#1

Bonjour à tous !

Après avoir vu certains poste à propos du SKSpriteKit, j’ai voulu m’y mettre aussi, mais je bloque un peu hélas.

J’ai créé une SpriteKit View dans mon ViewController.
J’ai créé une scène SKScene.
J’ai associé ma scène .sks à ma SpriteKitView (Attributes Inspector / SpriteKit View / Scene).
J’ai créé un fichier Cocoa Touch Class avec comme sous-classe SKScene.
J’ai ensuite associé mon fichier swift à ma scène dans Custom Class Inspector / CustomClass.

Ma scène est assez simple : 4 murs et une balle qui est censée rebondir indéfiniment.

Ma SKSpriteKitNode as “ball” comme nom dans l’Attributes Inspector.

Et voici le code de mon fichier .swift associé à ma scène :

import SpriteKit

class GameOne: SKScene {
        
    let ball = SKSpriteNode(fileNamed: "ball")
    let vectorBall = CGVector(dx: 1000, dy: 1000)
        
    override func sceneDidLoad() {
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        ball?.physicsBody?.applyImpulse(vectorBall)
    }
}

Mais rien n’y fait, cette satané balle ne veut pas bouger.

Par contre si j’applique une “Initial Velocity” à partir de l’Attributes Inspector de ma balle, tous fonctionne correctement.

Où se situe le problème ? Dans la déclaration de ma propriété “applyImpulse” ou dans la gestion de mes classes ?

Merci d’avance pour vos réponses !

#2

Bonjour @Nicow,

As-tu donné un SKPhysicsBody à ta balle ? Sans celui-ci, la gravité n’est pas appliquée, donc les impulsions non plus.

Bonne journée,

Alexandre

#3

Salut Alexandre,

Merci de ta réponse!

J’ai régler la PhysicBody de ma balle à partir du StoryBoard.
BodyType : AlphaMask, Dynamic : :white_check_mark:.
Et ma scène a une gravité x = 0, y = 0.

Encore une fois, je précise que si je met une vitesse initiale à partir du StoryBoard, ça fonctionne correctement.

Nicolas

#4

Et que se passe t’il si tu mets une gravité positive ou négative en y?

Si cela ne fonctionne toujours pas, peux-tu poster un bout de code? Ainsi je peux tester de mon coté et revenir vers toi! :sunglasses:

Bonne journée,

Alexandre

#5

J’ai pas essayer avec différentes gravité mais j’ai essayer de passer ma balle de alpha = 1 à alpha = 0 et rien ne se passe.

Hélas il y as tous mon code la ahah !

La seule chose qui manque c’est : mavue.present(ma_scene) qui se situe dans mon ViewController directement aprés le viewDidLoad parce-que je veux qu’elle sois présenté directement.

J’esayerais de changer la gravité ce soir, merci de te réponse !

#6

Pas de soucis :joy:

Tiens moi au courant, que je puisse tester chez moi si besoin.

Bonne journée,

Alexandre

#7

Salut Alex,

Qu’est ce que tu entend par “donner un SKPhysicBody” ?

Est-on obliger de déclarer un PhysicBody dans la classe ? Je pensais que les réglages fait à partir du StoryBoard suffisait.
Surtout que si je met une initiale velocity, la balle agit correctement.

J’ai fait un print “touchbegan” et celui ci est bien afficher dans ma console, mais mon “applyImpulse” est quand même ignoré …

Bonne journée !

#8

N’ayant plus Xcode installé sur ma machine, je ne peux essayer ton code. Cependant je pense que tu n’as pas compris la manière d’utiliser un objet SpriteKit du Storyboard.

let ball = SKSpriteNode(fileNamed: "ball")

Cette ligne ne crée pas un lien vers l’objet “ball” définis dans le Storyboard. C’est même le contraire, elle génère un nouveau SpriteNode dans la mémoire, forcément invisible puisque tu ne le places pas sur l’écran.

Pour récupérer un lien vers un objet du Storyboard, il faut utiliser la fonction childNode(withName:).

https://developer.apple.com/documentation/spritekit/sknode/1483060-childnode

Elle retourne un SKNode. Il faut le caster en SKSpriteNode pour l’utiliser. De mémoire le code ressemble à ça :

let ball = nodeParent.childNode(withName:"ball") as? SKSpriteNode

Là, tu devrais récupérer un objet optionnel utilisable (null si le nom donné n’existe pas).

1 Like
#9

Salut Draken !

Merci beaucoup de ta réponse, tu m’as débloqué la situation !
Il faut vraiment que je travail l’anglais pour complètement comprendre la docu d’Apple par contre. =/

Nicolas.

#10

A ton service.

Tu sais, on peut se débrouiller sans connaître l’anglais. Je fais un blocage psychologique sur ce sujet, et je suis incapable de me débrouiller dans la langue de Shakespeare. Google traduction est ton ami, même pour la documentation d’Apple.

Ceci dis, c’est vrai que si j’arrivais à passer ce stupide blocage, ma vie serait plus simple.