Python - Detectar colisión de imagenes en python tkinter?

 
Vista:
sin imagen de perfil
Val: 2
Ha aumentado su posición en 957 puestos en Python (en relación al último mes)
Gráfica de Python

Detectar colisión de imagenes en python tkinter?

Publicado por Aesio (1 intervención) el 12/06/2021 06:58:07
Sé que para éstas cosas es mejor pygame, pero quiero probar en tkinter solo para ver.

la cosa es que quiero mover una esfera y que atraviese un laberinto, algo simple, pero quiero ver que cuando llegue a los muros no las pase Hice unos botoncitos para que la imagen se mueva a medida que vaya apretando, y luego iré agregando más cosas, sólo quería saber si sigo con esto o mejor me paso a pygame o turtle o como se llamen las demás librerías.

Por ahora he puesto que los muros aparezcan encima de la bola, pero no sé como hacer para que no se toquen.

Hasta los puse en diferentes labeles para que sea más fácil.

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import tkinter as tk
 
def arriba():
    global posx    #variables de alcance para todo el script no solo la función
    global posy
    global ima
 
    posx = posx
    posy -= 4
    canvas.delete(ima)
    ima = canvas.create_image(posx,posy, image=myimg)
    canvas.delete(image2)
    canvas.create_image(450,400,image=image2)
 
def abajo():
    global posx    #variables de alcance para todo el script no solo la función
    global posy
    global ima
 
    posx = posx
    posy += 4
    canvas.delete(ima)
    ima = canvas.create_image(posx,posy, image=myimg)
    canvas.delete(image2)
    canvas.create_image(450,400,image=image2)
 
def derecha():
    global posx    #variables de alcance para todo el script no solo la función
    global posy
    global ima
 
    posx -= 4
    posy = posy
    canvas.delete(ima)
    ima = canvas.create_image(posx,posy, image=myimg)
    canvas.delete(image2)
    canvas.create_image(450,400,image=image2)
 
def izquierda():
    global posx    #variables de alcance para todo el script no solo la función
    global posy
    global ima
 
    posx += 4
    posy = posy
    canvas.delete(ima)
    ima = canvas.create_image(posx,posy, image=myimg)
    canvas.delete(image2)
    canvas.create_image(450,400,image=image2)
 
 
ventana=tk.Tk()
ventana.title("Bosque")
ventana.geometry('900x800')
ventana.resizable(0,0)
 
 
frame = tk.Frame(ventana)
frame.pack()
 
canvas = tk.Canvas(frame, width=900, height=800)
canvas.pack()
 
image=tk.PhotoImage(file="labetinto.gif")
canvas.create_image(450,400,image=image)
 
 
myimg = tk.PhotoImage(file='circlo.png')
posx=70
posy=235
ima = canvas.create_image(70,235,image=myimg)
 
frame2 = tk.Frame(ventana)
frame.pack()
canvas2 = tk.Canvas(frame2, width=900, height=800)
canvas.pack()
 
image2=tk.PhotoImage(file="muros.png")
canvas.create_image(450,400,image=image2)
 
 
boton = tk.Button(text="  ↑  ",font=("Verdana",17),command=arriba)
boton.config(bg="#135C3F", fg="#D7D731")
boton.place(x=750,y=330)
 
boton1 = tk.Button(text="  ↓  ",font=("Verdana",17),command=abajo)
boton1.config(bg="#135C3F", fg="#D7D731")
boton1.place(x=750,y=423)
 
boton2 = tk.Button(text="  Ir  ",font=("Verdana",16))
boton2.config(bg="#135C3F", fg="#D7D731")
boton2.place(x=751,y=379)
 
boton3 = tk.Button(text=" → " ,font=("Verdana",17),command=izquierda)
boton3.config(bg="#135C3F", fg="#D7D731")
boton3.place(x=817,y=376)
 
boton4 = tk.Button(text=" ← ",font=("Verdana",17),command=derecha)
boton4.config(bg="#135C3F", fg="#D7D731")
boton4.place(x=690,y=376)
 
ventana.mainloop()
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Detectar colisión de imagenes en python tkinter?

Publicado por rolando jose Torres Sánchez (76 intervenciones) el 28/06/2021 04:09:31
Yo creo que el problema se solucion fcil gracias al onceptomismo del Juego, pues si tuvieras las paredes del laberinto en una matriz, te seria mucho mas facil mover la bola por esa matriz y saber en que momento la bola o el radio tocan las paredes del laberinto "corredor".

El problema es como escanear el laberinto y vectorizarlo, y gracias a que tkinter esta basado en TCL y que python comparte esta libreria con TCL creo que tengo la ssolucion.

en TCL photo maneja las imagenes de color real como las pngs, por lo que la forma para rastrear los pixeles de una imagen se puede hacer si se le pide get a la imagen en los puntos x,y y retuena tres valores correspondientes a RGB con valores del 0 al 255.

Si rastreas toda la imagen del labrinto y hay una diferencia en el color netre los muros y el piso fondo del laberinto, podras rastrear los muros y saber en que pixel hay muro y en cual hay corredor, de esa forma puedes o dibujar el laberinto como poligono o bien poner el laberinto en un matriz e para cada apaso de ls bola clcular si con un radio R la bola toca alguno de los muros o no.


la documnetcion e canvas eta en ests pagina.

https://www.tcl-lang.org/man/tcl/TkCmd/canvas.htm
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Detectar colisión de imagenes en python tkinter?

Publicado por Rolando José (76 intervenciones) el 12/08/2025 02:56:42
hay diferentes problemas para hacer un juego de laberinto donde se pueda mover un objeto y detecte otros objetos.

1. Escanear el tablero: mediante filtros se va a pasar la imagen a una matriz que le indicara a los objetos por donde se pueden mover y por cuales no se pueden mover, simulando un detector de colisiones.
1.1 Binarizacion: se busca que el tablero este en dos colores, negro los muros del laberinto y blanco el espacio vacio corredores por donde se debe poder mover una bola o un objeto.
1.1.1 Umbralizacion: se escanea cada pixel de la imagen, si el brillo (nivel de gris) de cada pixel es mayor a 128, se pinta ese pixel con color blanco puro #FFFFFF, de lo contrario se pinta de negro puro #000000, esto permite binarizar rapidamente cualquier imagen.
1.2 Posterizacion: es un proceso de reducción de la gama tonal de una imagen para obtener solo unos pocos tonos o colores planos, uniformes, en lugar de una gradación continua. En términos simples, busca transformar zonas con transiciones suaves de color o tono en áreas con cambios abruptos entre colores o tonos bien definidos, permitiendo detectar mas zonas grises dentro del mapa sin descartarlos.

2. finalmente la imagen se digitaliza en una matriz, que sirve para que se controle el movimiento de los personajes dentro del tablero del juego.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Detectar colisión de imagenes en python tkinter?

Publicado por Rolando José (76 intervenciones) el 29/09/2025 01:52:08
Yo soy acerrimo defensor de tkinter pero esto no tiene sentido.

pygame es una libreria hecha para hacer juegos, y tkinter no es una libreria es un lenguaje diferente a python embebido en python.

Con pygame solo se pueden detectar choques entre objetos que hayan sido creados con pygame, por lo que no es posible que muevas una bola por un laberinto, si no haz hecho el laberinto en pygame.

Por otra parte en tcltk que es el lenguaje embebido que se ejecuta cuando llamas a tkinter, podria hacerse la libreria que cargue el laberinto dentro de una de los tipos de imagenes que permite como son png ppm pngm o gif, pero aun asi primero debe vectorizar la imagen y convertirla en objetos que se puedan modificar por el lenguaje lo cual ya deberia hacer otras librerias como opencv si hubiesen sido hechas con esa finalidad.

En comclusion, con pygame como con tkinter obliga a que tanto la bola como el laberinto sean hechos como objetos propios de cada libreria.

La unica ventaja de hacerlo en tkinter es que la aplicacion seria mucho mas pequeña, porque la libreria completa son 10Mb frente a los 30 de pygame, la otra ventaja es que tkinter funciona bien en Linux y en Mac, cosa que no se si lo hace pygame, pero no hay muchos usuarios de Mac que paguen por un juego 2D que posiblemente no corra en Mac, sino en una instalacion problematica.

en tkinter puedes manejar pixeles uno a uno, pero debes practicamente hacer opencv de nuevo, para que los contornos de un laberinto en una imagen gif o png sean vectorizados y pasados al canvas de tkinter.
ya lo otro es que la bola tendria un centro en coordenadas (x,y) y al moverlo, habria que ponerle como limites los demas objetos con centros (x,y) por ejemplo si es un rectangulo, un objeto en tkinter devuelve un cuadro con 4 pares de coordenadas que lo encierran.

No hay que arreglar lo que ya funciona bien, pygame es para juegos y si necesitas hacer una app con entorno grafico, un graficador con mas de 300 fuentes, puedes recurrir a tkinter.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar