Le zoom et le défilement dans SpriteKit
Je suis nouveau sur SpriteKit. J'ai besoin d'afficher une image via UIImageView OU SpriteNode (c'est une image d'arrière-plan pour un jeu). Cependant, j'ai besoin de l'utilisateur d'être en mesure de faire un zoom sur le fond et pan dans. Je l'ai accompli facilement sans l'aide de SpriteKit, mais ne peut pas comprendre comment faire un nœud accepter de zoom et de panoramique. Si j'utilise UIScrollView dans le storyboard, tous les sprites ajouté dans ma scène ne deviennent pas des enfants et pas de zoom ou panoramique.
Est-il possible et pouvez-vous me diriger dans la bonne direction?
EDIT:
Je suis un peu confus par votre réponse, mais voici ce que j'ai fait:
Dans ma racine-vue-contrôleur .m:
- (void)viewDidLoad
{
[super viewDidLoad];
SKView * showDesigner = (SKView *)self.view;
SKScene * scene = [iMarchMyScene sceneWithSize:showDesigner.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;
[showDesigner presentScene:scene];
}
Dans ma scène .m: (vos étapes sont commentés)
-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {
//create SKView (step 1)
SKView *skview_field = [[SKView alloc]initWithFrame:(CGRectMake(0, 0, size.width, size.height))];
//create UIScrollView with same dimensions as your SpriteKit view (step 2)
UIScrollView* uiscrollview_field = [[UIScrollView alloc]initWithFrame:skview_field.frame];
//initialize the field (field is the game's background node)
SKSpriteNode *field = [SKSpriteNode spriteNodeWithImageNamed:@"Field"];
field.position = CGPointMake(CGRectGetMidX(self.frame), (CGRectGetMidY(self.frame)));
field.size = CGSizeMake(self.size.width, self.size.height /3);
//create a UIView (called scrollViewContent) with dimensions of background node (step 3)
UIView* scrollViewContent = [[UIView alloc]initWithFrame:field.frame];
//set UIScrollView contentSize with same dimensions as your scrollViewContent and add a scrollContentview as your UISCrollView subview (step 4)
[uiscrollview_field setContentSize:(CGSizeMake(scrollViewContent.frame.size.width, scrollViewContent.frame.size.height))];
scrollViewContent.frame = field.frame;
[uiscrollview_field addSubview:scrollViewContent];
//[self addChild:field]; -- my original code
//.....does a bunch of other inits
return self;
}
Et c'est là que je me suis perdu:
Étape 5: Maintenant, à votre vue de la racine ajouter votre SKView, et UIScrollView sur le dessus de SKView.
Si je vous ai bien compris, j'ai besoin d'aller à myRootViewController.m et dans la méthode viewDidLoad, ajouter le SKView et UIScrollView (qui ne sont initialisés dans myScene.m) comme des sous-vues à SKView initialisé ici dans la méthode viewDidLoad? Je ne vois pas comment faire cette partie.
OriginalL'auteur Justin Moore | 2013-09-29
Vous devez vous connecter pour publier un commentaire.
Voici ma solution pour le problème de défilement. Il s'articule autour de "voler" le comportement de la UIScrollView. J'ai appris cela d'un WWDC Vidéo à partir de 2012 sur le mélange UIKit avec OpenGL.
Exemple de projet:
https://github.com/bobmoff/ScrollKit
Comme je l'ai mentionné dans un commentaire ci-dessus, je suis en train de vivre un petit décalage d'environ 30% du temps, je suis en cours d'exécution de l'application. Le FPS est encore 60 ans, mais il semble y avoir un léger conflit ou quelque chose avec la façon dont souvent le délégué méthode est appelée, comme c'est parfois se sentir un peu de lag. Si quelqu'un réussit à résoudre ce problème, j'aimerais en entendre parler. Il semble que lorsque je tiens mon doigt vers le bas, il n'a jamais gal lors de la décélération qui se passe.
Oui @Smick, Il est assez facile de simplement brancher tochesMoved et de faire des nœuds déplacer mais comment gérez-vous de décélération et de rebondir qui est, à mon avis, la partie la plus difficile d'obtenir un assez bon sentiment de défilement.
juste donné un spin, fonctionne assez bien. Merci pour l'astuce! Maintenant pour essayer le pincement / zoom ??? .....
Je suis allé à notre bureau et de chercher un autre. Voici un exemple de projet où la scrollview est le programme d'installation et de travail: github.com/bobmoff/ScrollKit
Il est merveilleusement bien écrit, merci à vous pour cette. Je suis allé à travers et copié à la main pour mieux la comprendre et je ne peux pas aider mais l'envie est bien organisé et flexible de votre solution.
OriginalL'auteur bobmoff
Justin,
vous pouvez utiliser une petite astuce, je l'utilise et il fonctionne très bien pour moi. Voici la configuration:
Maintenant, à votre vue de la racine (UIView) ajouter votre SKView, et UIScrollView sur le dessus de SKView.
Il va quelque chose comme ceci (- vue-contrôleur):
Dernière partie de l'astuce est de mettre en œuvre UIScrollViewDelegate:
De cette façon, vous pouvez simuler SKView à l'intérieur de UISCrollView. Espérons que cette aide.
MODIFIER 2014-04-20
J'ai open source de mon composant pour le panoramique et le défilement des scènes dans SpriteKit, veuillez jeter un oeil à: https://github.com/pzbyszynski/PIOSpriteKit
J'ai essayé ta solution, mais suis un peu coincé. J'ai édité mon premier post avec le code cisailles et où je me suis perdu. Toute l'aide que j'apprécierais.
Justin, il me semble étrange que l'initialisation de 2 instances de SKView. Je pense que dans votre scène, vous devriez configurer la seule scène de nœuds enfants. Déplacez votre UIScrlooView de code de configuration à la racine de votre vue-contrôleur, et d'utiliser un seul SKView (je vais éditer ma réponse avec quelques extraits de code dans un instant)
je n'arrive pas à obtenir que cela fonctionne correctement, seriez-vous capable de lui fournir un exemple de code comment vous faites cela, incl. ViewController et de la scène de h&m fichiers?
Regardez: github.com/pzbyszynski/PIOSpriteKit
OriginalL'auteur Piotr Zbyszynski
Vous pourriez commencer avec ce Rayon W tutoriel SpriteKit tutoriel comment faire glisser et déposer qui comprend certaines des choses que vous demandez, y compris modules de reconnaissance de Geste.
C'est bon: Apple geste de Reconnaissance de référence
Un autre, de Ray, W: uigesturerecognizer-tutoriel-pour-ios-5-pince-casseroles-et-plus
Ci-dessus est bon de commencer avec.
u de bienvenue, d'ailleurs je ne pense pas que le scrollView fonctionne pour SpriteKit, donc je suppose que vous devez répondre pour vous-même avec le Geste cer..
im essayant de zoom à l'heure actuelle sur la scène nœud, à l'aide de setScale, mais alors il bousille toute la physique. Les sprites sont tous mis à l'échelle comme prévu, mais la masse de l'objet reste le même..
OriginalL'auteur PeterK
J'ai créé ma propre méthode pour zoomer un nœud spécifique sans avoir à zoomer dans l'ensemble de la scène et c'est la base, mais il n'est pas parfait (et en fait, j'ai créé sa propre demande d'aide ici: Zoom une SKNode incompatible )
Si la déclaration va dans le touchesMoved méthode de la scène:
Le seul problème que j'ai avec elle, c'est un comportement incohérent et rendre brut de défilement. J'utilise le mot "seulement" dans ce sens avec une grande liberalness.
OriginalL'auteur zeeple
Si vous utilisez un
SKCameraNode
vous pouvez calculer la différence entre deux touches pour définir le zoom et le panoramique à la fois.SKCameraNode
pour votre SKViewRésultat devrait être quelque chose comme ça. Notez que j'ai utilisé le
event?.allTouches
au lieu de le reçu de jeu, si un seul doigt ne bouge pas entre les touches, il n'est pas dans letouches
ensemble, ce qui entraînerait une casserole où l'utilisateur pourrait s'attendre à un zoom.OriginalL'auteur Kevin R