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
permitirestiramiento: True
pero todavía no funcionó
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 claseBall
. Actualmente, el métodoself.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
: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étodoon_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
ypos_hint
del widgetBall
.