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