2017-03-17 2 views
0

Si une forme est un rectangle, la position tactile est exactement droite. mais si une forme contient une zone transparente (comme un triangle ci-dessous), lorsque l'utilisateur tape sur la zone transparente (c'est l'espace vide sur l'écran), le toucher est également valide.Comment obtenir la position tactile exacte d'un SKShapeNode?

enter image description here

Quand il y a beaucoup de formes à l'écran, l'utilisateur peut appuyez sur la bonne position, mais obtenir la mauvaise forme. Par exemple, si un utilisateur souhaite choisir le triangle vert et appuyer sur le point rouge, la forme sélectionnée sera un triangle rose car la zPosition du triangle rose est supérieure au triangle vert et la position tactile est dans la zone transparente du triangle rose.

enter image description here

Voici les codes pour créer la forme quand BEGIN:

var touchShapeName:String! 
var currShape: SKShapeNode! 
var shapeArr = [SKShapeNode]() 

formes creat:

for i in 1...count { 
    let shape = SKShapeNode() 
    shape.path = petalPath 
    shape.strokeColor = UIColor(red: 0.9, green: 0.7, blue: 0.1, alpha: 1.0) 
    shape.lineWidth = 0.1 
    shape.glowWidth = 0.1 
    shape.fillColor = UIColor(red: getRandomColor(245, 255), green: getRandomColor(190, 210), blue: getRandomColor(10, 15), alpha: 0.98) 
    shape.name = "\(i)" 
    shape.position = CGPoint(x: frame.midX + CGFloat(30 * i), y:frame.midY + 60) 
    addChild(shape) 
shapArr.append(shape) 
} 

J'utilise les codes suivants pour obtenir la forme:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     let touch = touches.first 
     let location = touch?.location(in: self) 
     touchShapeName = self.atPoint(location!).name 
     if currShape == nil{ 
      for s in shapeArr{ 
       if s.name == touchShapeName{ 
        currShape = s 
       } 
      } 
     } 
    } 

Maintenant, les formes peuvent être créées et déplacées lorsque vous tapez sur la zone de couleur. Le problème est que tapoter sur la forme avec une zone transparente supérieure peut obtenir la mauvaise forme comme je l'explique ci-dessus.

Est-ce que j'écris les bons codes? Y a-t-il une autre solution pour obtenir la position exacte?

Thx.

+1

Oui, c'est le bon code pour obtenir l'emplacement exact. Bien que vous ne pouvez pas cliqué sur l'image réelle, je veux dire l'image verte, mais en fonction de l'écran, la partie cliquée vous donne le point exact. – Poles

+0

D'accord avec @poles. De plus, si ce dont vous avez besoin, ce sont les coordonnées du toucher par rapport à la forme verte, voir la méthode convert (_: to:) en SKNode. –

+0

@AliBeadle sait comment l'obtenir avec la méthode convert (_: to :)? J'ai essayé currShape = SKShapeNode() convertir (emplacement !, à: currShape) impression (currShape.name), mais il imprimé nul. – jdleung

Répondre

0

Je crois que vous utilisez ici le nœud de forme: vous essayez de travailler sur un triangle, tout en en choisissant une forme rectangulaire. Si vous voulez avoir une forme triangulaire, alors vous devez utiliser un chemin approprié, pas le rect générique. Une fois que vous représentez un triangle par une forme triangulaire, la détection de l'emplacement tactile doit être automatiquement fixée.

+0

La forme de triangle est un exemple pour expliquer le problème, en fait les formes sont nombreuses. J'ai dessiné les formes, ce que je fais face est comment choisir la forme sous la zone transparente de sa forme supérieure. – jdleung