Я кодирую игру Pokemon и хочу, чтобы два спрайта сталкивались.
Этот код работает для левого и правого (хитбокс в порядке).
Когда спрайт сталкивается ссверху или снизу player2.rect.right
становится player.rect.left
.Вместо того, чтобы просто блокировать движение, он телепортирует спрайт в стороны.
Я заметил, что если сначала поставить два последних оператора if
, проблема возникает с левым и правым вместо верхнего и нижнего.
import pygame
from pygame.locals import *
pygame.init()
width = 960
height = 512
keys = pygame.key.get_pressed()
screen = pygame.display.set_mode((width, height))
GREEN = (0, 255, 0)
RED = (255,0,0)
FPS = 60
clock = pygame.time.Clock()
#Player 1 Sprite -------------------------------------------------------------
class Player(pygame.sprite.DirtySprite):
def __init__(player1):
pygame.sprite.DirtySprite.__init__(player1)
player1.image = pygame.Surface((50, 50))
player1.image.fill(RED)
player1.rect = player1.image.get_rect()
player1.rect.bottom = height/2
player1.rect.centerx = width/2
def update(player2):
player2.dirty = 1
#Player 2 Sprite -------------------------------------------------------------
class Player2(pygame.sprite.DirtySprite):
def __init__(player2):
pygame.sprite.DirtySprite.__init__(player2)
player2.image = pygame.Surface((50, 50))
player2.image.fill(GREEN)
player2.rect = player2.image.get_rect()
player2.rect.bottomleft = 128, 128
player2.velocity = 2
def update(player2):
player2.dirty = 1
keys = pygame.key.get_pressed()
#player 2 movement -----------------------------------------------------------
if keys[pygame.K_LEFT]:
player2.rect.centerx -= player2.velocity
player2.rect.centerx += 0
player2.rect.bottom -= 0
player2.rect.bottom += 0
elif keys[pygame.K_RIGHT]:
player2.rect.centerx += player2.velocity
player2.rect.centerx -= 0
player2.rect.bottom -= 0
player2.rect.bottom += 0
elif keys[pygame.K_UP]:
player2.rect.bottom -= player2.velocity
player2.rect.bottom += 0
player2.rect.centerx -= 0
player2.rect.centerx += 0
elif keys[pygame.K_DOWN]:
player2.rect.bottom += player2.velocity
player2.rect.bottom -= 0
player2.rect.centerx -= 0
player2.rect.centerx += 0
player = Player()
player2 = Player2()
all_sprites = pygame.sprite.LayeredDirty(player, player2)
running = True
while running:
clock.tick(FPS)
#Collision -----------------------------------------------------------------------------------------------------------------------------------------------------------------
if player2.rect.right > player.rect.left and player2.rect.right < player.rect.right and player2.rect.top < player.rect.bottom and player2.rect.bottom > player.rect.top:
player2.rect.right = player.rect.left
elif player2.rect.left < player.rect.right and player2.rect.left > player.rect.left and player2.rect.top < player.rect.bottom and player2.rect.bottom > player.rect.top:
player2.rect.left = player.rect.right
elif player2.rect.top < player.rect.bottom and player2.rect.top > player.rect.top and player2.rect.right > player.rect.left and player2.rect.left < player.rect.right:
player2.rect.top = player.rect.bottom
elif player2.rect.bottom > player.rect.top and player2.rect.bottom < player.rect.bottom and player2.rect.right > player.rect.left and player2.rect.left < player.rect.right:
player2.rect.bottom = player.rect.top
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill(0)
all_sprites.update()
all_sprites.draw(screen)
pygame.display.flip()
pygame.quit()