es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mueva la imagen de Kivy solo cuando se presione la imagen.

Estoy haciendo un juego en kivy en el que cuando presionas en el balón de fútbol se mueve. Quiero que el balón se mueva solo cuando presione exactamente en el balón, si presiono en cualquier otro lugar, no debería moverse. Actualmente, el balón se mueve si presiono en cualquier lugar cercano al balón, lo cual no es lo que quiero. ¿Hay algo que pueda hacer para que solo se mueva cuando presione exactamente en el balón? ¡Aquí está mi código!

main.py

class Ball (Image):
velocidad = NumericProperty (0)

def on_touch_down (self, touch):
    if self.collide_point (* touch.pos):
        self.source = "iconos/bola.png"
        self.velocidad = 275
    return super (). on_touch_down (touch)

def on_touch_up (self, touch):
    if self.collide_point (* touch.pos):
        self.source = "iconos/bola.png"
    return super (). on_touch_up (touch)

class MainApp (App):
GRAVEDAD = 300

def move_ball (self, tiempo_pasado):
    ball = self.root.ids.game_screen.ids.ball
    ball.y = ball.y + ball.velocidad * tiempo_pasado
    ball.velocidad = ball.velocidad - self.GRAVEDAD * tiempo_pasado

def start_game (self):
    Clock.schedule_interval (self.move_ball, 1/60.)

Código kivy

#:importar utils kivy.utils

:
FloatLayout:
lienzo:
Color:
rgb: utils.get_color_from_hex (“# 39B3F2”)
Rectangle:
size: self.size
pos: self.pos
GridLayout:
filas: 1
pos_hint: {“arriba”: 1, “izquierda”: 1}
size_hint: 1, .1
Imagen:
origen: “iconos/sol.png”
GridLayout:
filas: 1
pos_hint: {“arriba”: 1, “izquierda”: 1}
size_hint: 1, .2
Imagen:
origen: “iconos/nubes.png”
GridLayout:
filas: 1
pos_hint: {“abajo”: 1, “izquierda”: 1}
size_hint: 1, .5
Imagen:
origen: “iconos/Field4.png”
permitir_estiramiento: True
keep_ratio: False
pos: self.pos

Botón:
    size_hint: No, No
    font_size: dp (20)
    font_name: 'SackersGothicStd-Medium.otf'
    texto: "Comenzar juego"
    color: "oro"
    pos_hint: {"centro_x": 0.5, "centro_y": 0.3}
    tamaño: 150, 55
    size_hint: No, No
    background_normal: ''
    color_de_fondo: (57/255.0, 179/255.0, 242/255.0, .10)

    sobre_liberación:
        self.disabled = True
        self.opacity = 0
        root.play_sound ()
        App.start_game (self)

Pelota:
    origen: "iconos/bola.png"
    size_hint: No, No
    tamaño: 500, 500
    pos_hint: {"centro_x": 0.5}
    id: ball

También intenté keepratio: True
permitir
estiramiento: True
pero todavía no funcionó

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para asegurar que la bola se mueva solo cuando sea presionada exactamente en la bola, se puede modificar el método on_touch_down de la clase Ball. Actualmente, el método self.collide_point(*touch.pos) comprueba si el punto de contacto está dentro del cuadro delimitador de la imagen de la bola, lo que incluye un área más amplia más allá de la propia imagen.

    Para restringir la detección de contacto a los píxeles reales de la imagen de la bola, se puede utilizar el método self.collide_point_exact en su lugar. Este método comprueba si el punto de contacto está exactamente en los píxeles opacos de la imagen y devuelve “True” solo si la posición del toque coincide con las coordenadas de los píxeles de la imagen de la bola.

    Aquí tienes el código modificado de la clase Ball:

    class Ball(Image):
        velocity = NumericProperty(0)
    
        def on_touch_down(self, touch):
            if self.collide_point_exact(*touch.pos):
                self.source = "icons/ball.png"
                self.velocity = 275
                return True  # capturar evento de toque
            return super().on_touch_down(touch)
    
        def on_touch_up(self, touch):
            if self.collide_point_exact(*touch.pos):
                self.source = "icons/ball.png"
                return True  # capturar evento de toque
            return super().on_touch_up(touch)
    

    Con esta modificación, el método on_touch_down captura el evento de toque solo si el punto de contacto coincide con los píxeles opacos de la imagen de la bola, y devuelve “True” para indicar que el toque ha sido procesado. De manera similar, el método on_touch_up también captura el evento de toque solo si coincide con los píxeles de la imagen de la bola.

    También puede ser necesario ajustar el tamaño y la posición de la imagen de la bola para que coincida con su tamaño y ubicación real en la pantalla del juego. Esto se puede hacer estableciendo valores apropiados para las propiedades size y pos_hint del widget Ball.

Comments are closed.