Bonjour,
Comment gère t'on le déplacement d'un lot d'images (sprites) avec kivy?
Avec tkinter, j'utiliserai un tag. Mais comment procéder avec kivy?
Je n'ai pas su trouver l'info. Merci
Version imprimable
Bonjour,
Comment gère t'on le déplacement d'un lot d'images (sprites) avec kivy?
Avec tkinter, j'utiliserai un tag. Mais comment procéder avec kivy?
Je n'ai pas su trouver l'info. Merci
Bonjour,
Peut-être en utilisant la classe Image et la classe Animation,
Je n'ai pas testé, c'est juste pour l'exemple en lisant la docCode:
1
2
3
4
5
6
7
8
9
10
11 from kivy.uix.image import Image from kivy.animation import Animation def move_images(image_paths, pixels): for path in image_paths: # charger l'image image = Image(source=path) # créer une animation pour déplacer l'image de tant de pixels animation = Animation(x=image.x+pixels, y=image.y+pixels) animation.start(image)
Sources,
Bonjour,
Il me semble que animate() n'est pas adapté à une animation complexe qui comporterait des tests ... (?)
Pour expliciter là où je bloque:
à partir du code suivant,
Ce code déplace une image sur l'horizontale de l'écran en partant de son centre vers la droite jusqu'à la limite de l'écran, puis repart dans l'autre sens. Ainsi de suite...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 from kivy.app import App from kivy.lang import Builder from kivy.properties import ObjectProperty, NumericProperty from kivy.clock import Clock from kivy.vector import Vector from kivy.uix.widget import Widget Builder.load_string(""" <MonImage>: canvas.before: Rectangle: pos: self.pos size: self.size source: 'crane.png' <BougeIm>: monImage: monImage MonImage: id: monImage pos: root.center """) class MonImage(Widget): pass class BougeIm(Widget): monImage = ObjectProperty(None) vecteur = Vector([4,0]) def go(self): self.callback = Clock.schedule_interval(self.update, 1/60) def update(self,sn): self.monImage.pos = self.vecteur + self.monImage.pos if self.monImage.pos[0]+self.monImage.size[0] > self.width or self.monImage.pos[0] < 0: self.vecteur.x *= -1 class TestApp(App): def build(self): bougedela = BougeIm() bougedela.go() return bougedela if __name__ == '__main__': TestApp().run()
Jusqu'à là pas de souci.
Maintenant, je souhaite modifier le code afin d'ajouter d'autres images qui vont suivre le même cheminement.
Pour ajouter une image, j'ajouterai une règle dans <BougeIm> :
J'ai bien maintenant deux images qui suivent la même trajectoire depuis leur ordonnée respective.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 from kivy.app import App from kivy.lang import Builder from kivy.properties import ObjectProperty, NumericProperty from kivy.clock import Clock from kivy.vector import Vector from kivy.uix.widget import Widget Builder.load_string(""" <MonImage>: canvas.before: Rectangle: pos: self.pos size: self.size source: 'crane.png' <BougeIm>: monImage: monImage monImage2: monImage2 MonImage: id: monImage pos: root.center MonImage: id: monImage2 pos: (self.parent.width /2, self.parent.height* 3/ 4) """) class MonImage(Widget): pass class BougeIm(Widget): monImage = ObjectProperty(None) vecteur = Vector([4,0]) def go(self): self.callback = Clock.schedule_interval(self.update, 1/60) def update(self,sn): self.monImage.pos = self.vecteur + self.monImage.pos self.monImage2.pos = self.vecteur + self.monImage2.pos if self.monImage.pos[0]+self.monImage.size[0] > self.width or self.monImage.pos[0] < 0: self.vecteur.x *= -1 class TestApp(App): def build(self): bougedela = BougeIm() bougedela.go() return bougedela if __name__ == '__main__': TestApp().run()
ok mais pour 20 images comment procéder? (imaginons un jeu de type space invender avec 20 monstres
qui avancent en groupe).
Hello,
et pourquoi ne pas utiliser pygame pour gérer des sprites avec détection de collisions. Voir ici par exemple :
Pièce jointe 632916
Ami calmant, J.P
Bonjour,
Je tiens à formuler cela dans le 'kv file' . J'ai suivi le tutoriel Pong proposé dans la doc et c'est cette approche que je veux suivre...
Hello,Citation:
Envoyé par jurassic pork
J'ai choisi kivy car prenant en charge l'écran tactile, pour un développement sur android.
Peut-être qu'avec pygame, c'est aussi possible... mais pas nativement
Bonjour,
Il est possible d'utiliser des modules graphiques tels que PyQt, Pygame, ... de façon native sur un écran tactile.
Cependant, il est important de noter que Kivy est un module qui permet non seulement de travailler avec les écrans tactiles des appareils Android, mais également avec d'autres composants de ces appareils mobiles. Il est donc important de déterminer si ces fonctionnalités supplémentaires sont nécessaires pour ton projet avant de choisir Kivy comme module graphique.
bonjour
pas sûr de la demande, existe le dico "ids" pour justement itérer sur les composants qui ont un "id"
Code:
1
2
3
4 def MyInvaders.update(self): for id_img, img in self.ids.items(): img.position.x += 4 if 'bottom' in id_img and img.position.y > screen.height: raise(GameOver)
Bonjour,
Effectivement bien plus simple...Citation:
Envoyé par wiztricks
Merci à tous pour vos réponses.
Je clôture ce sujet. Je continue mon étude de kivy.
Sinon, l'un de vous à réalisé un projet avec kivy?
kivy semble peu évoqué sur les forums francophones dont DVP ...
Bonjour,
Petit retour sur cette question.Citation:
Envoyé par Moi
Réponse:
Pour la création de widget à la volée depuis le 'kv file', on utilise Factory et pour faire l'équivalent d'une boucle for , on utilise la bibliothèque Jinja2 (à installer).
Exemple d'écriture:
Code:
1
2
3
4
5
6
7
8
9
10 #:import Factory kivy.factory.Factory BoxLayout: Button: text: "Button 1" Button: text: "Button 2" {% for i in range(5) %} Factory.Button: text: "Button {{ i }}" {% endfor %}
bonjour
Je déterre pour faire du hors-sujet (presque :mouarf:)
je ne connais pas kivy mais par contre j'ai joué avec le nouveau framework flet.
Ce framework utilise une app générique flutter incluse dans le module python qui exécute python et reprend même une syntaxe très très proche de flutter. Connaissant flutter, pour moi, la prise en main a été ultra rapide. Faire la même chose que flutter mais sans son environnement hyper-lourd, pour moi c'est le top.
NOTE:
- le support android n'est pas encore actif :oops: mais devrait l'être prochainement ... nous avons donc pour l'instant "que" windows, linux et js
- Puisque très jeune, on n'a pas les 50 000 widgets de flutter (mais il est très simple d'en créer en python et on en trouve déjà)
La gallerie ne donne pas trop envie :mrgreen:, mais en cherchant un petit peu, on peut trouver des exemples plus engageants
https://github.com/1Mr-Newton/WhatsApp-Clone-With-Flet
https://github.com/iforvard/yf-manager
https://github.com/LineIndent/Flet-Product-Design
https://github.com/LineIndent/flet_ui_cards
https://github.com/LineIndent/flet-modern-navbar
https://github.com/nbilbo/flet-alquemy