Странная проблема столкновения с Pygame - PullRequest
0 голосов
/ 28 марта 2019

Я кодирую игру 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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...