Buenas.
Pues no entendí bien lo del efecto raro. Talves si nos muestras el codigo podamos identificar el problema. En lo que si te puedo ayudar es en que el personaje solo colicione con los pies. A principio de año me habia puesto a hacer un juego del mismo estilo del que nos comentas, lo que hice fue crear una función
gravedad(), dentro de la clase de tu personaje, en donde si el personaje no estab tocando nada que cayera, en caso contrario que revisara que eran solo los pies. Te muestro el codigo:
def Gravedad(self):
for obj in Objeto:
if not self.rect.colliderect(obj.rect) and not self.SALTANDO:
self.CAYENDO = True
elif self.rect.bottom >= obj.rect.top and self.rect.bottom <= obj.rect.top+10 and not self.JUMPING:
self.CAYENDO = False
self.recty = obj.rect.top+2
break
Entonces, si te fijas primero revisa que no esté tocando nada y que además no esté saltando, de este modo tu personaje podrá atravesar el objeto y pasar hacia arriba, si las dos condiciones se cumplen el personaje caerá. En caso de que de que haya un impacto el programa verificará si la base del personaje (self.rect.bottom) está por debajo debajo, o a la misma altura, del tope del objeto (obj.rect.top). Para esto se usa el signo de
>= ya que self.rect.bottom y obj.rec.top son la cordenada Y de la base y el tope de los objetos rect, correspondientemente; y como sabemos, en programación a diferencia de las matemáticas, en plano carteciano la Y crece hacia abajo. Luego de esto el programa verifica que self.rect.bottom sea menor a obj.rect.top más 10 pixeles. Entonces, lo que estamos haciendo es que estamos haciendo es verificar que la base de nuestro personaje se encuentre dentro de los primeros 11 pixeles del objeto, esto es una medida que tuve que aplicar para evitar que el personaje pasara de largo ya que la velocidad de caida del personaje era de más de un pixel por loop, por lo que si el tope del objeto estaba por ejemplo en (x, 5) y la base de mi personaje se encontraba en (x, 4) y hacia un salto de dos pixeles iva a acabar por debajo de (x, 5) y el personaje simplemente caería al vacio.
Otro pequeño detalle, si te fijas dentro del elif dice
self.recty = obj.rect.top+2. Esto hará que el personaje, si se pasó de largo, vuelva arriba y no se note. Pero lo que quería destacar es el +2 (osea dos pixeles dentro del obj). Lo puse así porque se veia más estetico de esta manera con los sprites que yo estaba usando, talves con los tuyos no. Arreglalo a tu gusto.
Espero haber contestado a tu necesidad y que no haya sido muy confuso. Si algo no te quedó claro, pregunta tranquilo que yo te contesto
