Problème actualisation kivy

Tomh5962 - Modifié le 8 janv. 2024 à 20:08
mamiemando Messages postés 33385 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 - 8 janv. 2024 à 20:12

Bonjour,

J'ai un problème avec mon code kivy. Tous mes print marchent, sauf celui de collision qui devrait en pratique marcher. J'ai l'impression que ma page ne se réactualise pas étant donner que right et left marchent. 

import kivy
import random
import time
from kivy.app import App
from kivy.animation import Animation
from kivy.clock import Clock
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.properties import (
    NumericProperty, ReferenceListProperty, ObjectProperty
)
from kivy.uix.button import ButtonBehavior
from kivy.uix.image import Image
from kivy.uix.label import Label
from kivy.uix.screenmanager import Screen, FadeTransition
from kivy.uix.widget import Widget
from kivy.vector import Vector


class ImageButton(ButtonBehavior, Image):
    pass


class Home(Screen):
    pass


class Player():
    def __init__(self):
        self.life=3
        self.point=0

    def add_point(self):
        self.point += 1

    def supp_life(self):
        self.life -= 1

class Game(Screen):
    def __init__(self, **kwargs):
        super(Game, self).__init__(**kwargs)
        self._keyboard = Window.request_keyboard(self._keyboard_closed, self)
        self._keyboard.bind(on_key_down=self._on_keyboard_down)
        self.player = Player()
        Clock.schedule_interval(self.Select_image, 1)
        Clock.schedule_interval(self.update, 1.0 / 60.0)

    def _keyboard_closed(self):
        self._keyboard.unbind(on_key_down=self._on_keyboard_down)
        self._keyboard = None

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] in ['left', 'right']:
            if keycode[1] == 'left':
                print("left")
                self.ids.mon_widget.x -= 30
            elif keycode[1] == 'right':
                print("right")
                self.ids.mon_widget.x += 30
        return True

    def Animate_image(self, rand_image):
        anim = Animation(y = -2000, duration = 3)
        anim.start(rand_image)
        print("imageanim")

    def Select_image(self, dt):
        image_list = [self.ids.egg, self.ids.canette]
        rand_image = image_list[random.randint(0,1)]
        self.Animate_image(rand_image)

    def update(self,dt):
        if self.player.life > 0:
            if self.ids.egg.collide_widget(self.ids.mon_widget):
                print("collide")
            self.player.supp_life()


lead = Builder.load_file("main.kv")

class Ecogame(App):
    def build(self):
        self.game = Game()
        return lead

    def change_screen(self, screen_name):
        screen_manager = self.root.ids['screen_manager']
        screen_manager.transition = FadeTransition()
        screen_manager.current = screen_name

Ecogame().run()

Main.kv 

#:kivy 1.0.9
#:include home.kv
#:include game.kv

GridLayout:
    cols: 1
    ScreenManager:
        id: screen_manager

        Home:
            name: "home"
            id: home

        Game:
            name: "game"
            id: game
        


game.kv:

<Game>:
   
    canvas.before:
        Color:
            rgba: 0.961, 0.937, 0.831, 1
        Rectangle:
            pos: self.pos
            size: self.size
    FloatLayout:

        Image:
            id: mon_widget
            pos_hint: {"center_x": 0.5, "center_y": 0.05 }
            source: "poubelle1.png"
            size_hint: 0.3, .2
            
        Image:
            id: egg
            pos_hint: {"center_x": 0.5, "center_y": 0.5 }
            size_hint: 0.3,0.3
            source: "egg.png"

        Image:
            id: canette
            pos_hint: {"center_x": 0.5, "center_y": 0.5 }
            size_hint: 0.3,0.3
            source: "canette.png"
            

home.kv : 


<Home>:
   
    canvas.before:
        Color:
            rgba: 0.298, 0.424, 0.325, 1
        Rectangle:
            pos: self.pos
            size: self.size
    FloatLayout:
        GridLayout:
            rows: 1 
            pos_hint: {"center_x": 0.5, "center_y": 0.5 }
            size_hint: 1, .2
            ImageButton:
                source: "play.png"
                id: play_image
                pos_hint: {'center_x': 0.5, 'center_y': 0.5 }
                size_hint: 1, 1
                on_release: app.change_screen("game")

Merci beaucoup d'avance 
Bonne soirée

1 réponse

mamiemando Messages postés 33385 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 7 803
8 janv. 2024 à 20:12

Bonjour,

Veille à partager tes extraits de code comme expliqué ici.

J'ai essayé de remettre en forme (et réindenter) ton code mais je ne sais pas si c'est exactement ce que tu as. Merci de contrôler et de corriger ton message initial si besoin.

En admettant que ce soit bien :

if self.player.life > 0:
    if self.ids.egg.collide_widget(self.ids.mon_widget):
        print("collide")

Il faudrait commencer par s'assurer que la vie est positive (rajoute un print ?). Si ça n'est pas ça il faudrait vérifier les arguments passés à collide_widget.

Bonne chance

0