sprites for dirtysprite collide python pygame collision

python - dirtysprite - sprites for pygame



Manejo de colisiones de rectángulo de Python con pygame (2)

Dividir el movimiento x / y.

Mueva x, verifique si colisiona, si es así, retroceda y configure xspeed en 0.

Mueve y, verifica si colisionan, si es así, retrocede y configura yspeed a 0.

Significa dos controles de colisiones por paso, pero es super suave. :)

He estado haciendo una extensa investigación sobre este tema durante los últimos días y parece que no puedo encontrar una respuesta para mi problema exacto.

Entonces, tengo un juego simple configurado donde tengo el jugador en 0, 0 con un ancho de 10x10

player= pygame.Rect(0, 0, 10, 10)

y aparte de eso, el jugador tiene una velocidad de x: 0, y: 10, lo que lo hará caer (y es positivo porque el origen de la pantalla está en la parte superior izquierda).

y tengo una ficha en 0, 100, como se muestra:

dirt= pygame.Rect(0, 100, 10, 10)

Entonces, ¿cómo puedo manejar la colisión? Ya sé que puedo detectarlo con Rect.colliderect (Rect).

Lo intenté de varias maneras, pero encontré algunos problemas:

No puedo reducir la velocidad del jugador a 0 cuando golpea algo y luego lo muevo hacia atrás hasta que solo toca el objeto porque todavía causa el problema de caminar, cuando camina, aplico +10 de velocidad en x, pero desafortunadamente, El juego todavía procesa que está cayendo y chocando y moviéndose hacia los lados, por lo que solo lo mueve de vuelta al punto de partida.

Soy un principiante, por lo que una respuesta simple sería apreciada, y me gustaría no tener que usar ningún otro módulo de terceros que no sea pygame si no fuera necesario.

Actualizar:

Aquí está el código de prueba aproximado que he probado:

def sim(obj, time, world): time= time / 1000 obj.physProp[''vel'']= (obj.physProp[''vel''][0] + (accel[0] * time), obj.physProp[''vel''][1] + (accel[1] * time)) if obj.physProp[''vel''][1] > terminalY: obj.physProp[''vel'']= (obj.physProp[''vel''][0], terminalY) obj.pos= (obj.pos[0] + (obj.physProp[''vel''][0] * time) + ((accel[0] / 2) * (time ** 2)), obj.pos[1] + (obj.physProp[''vel''][1] * time) + ((accel[1] / 2) * (time ** 2))) for ID in world: if obj.getRect().colliderect(world[ID].getRect()) == True: pass return (obj.pos, obj.physProp[''vel''])


Pygame API te invita a escribir todos los temas de tu juego de forma orientada a objetos, para que tu personaje que cae tenga todos los "métodos" y "atributos" para responder correctamente a las situaciones, como golpear algo.

Entonces, si tu personaje está definido por algo tan simple como:

class Char(object): # these start as class attributes, # but whenever they are assigned to with a "self.var = bla" in # a method, an instance attribute starts existing x, y = 0,0 vx, vy = 0,0 def update(self): self.x += self.vx self.y += self.vy

Y su código externo, al detectar una colisión, podría hacer esto:

def mainloop(): while True: ... obj.update() if obj.getRect().colliderect(world[ID].getRect()): # don''t do "== True" in `if''s - it is just silly # take character back to the precious position obj.x -= obj.vx obj.y -= obj.vy # zero out velocities to make it stop: obj.vx = obj.vy = 0

Y así sucesivamente - pronto percibirás que piensas en tus "cosas" de juego como "objetos", ya que se utilizan para programar, hacen que el código fluya de manera muy natural; tan pronto como obtienes la forma en que funciona, mira el módulo de sprites de Pygame, que permite usted puede automatizar una gran cantidad de controles y actualizaciones sin tener que escribir explícitamente bucles para cada control