Столкновение не работает в Pygame без сообщения об ошибке - PullRequest
0 голосов
/ 02 февраля 2019

Я создаю игру в Pygame, но столкновение между игроком (прямоугольник) и стеной (изображение) не работает.

здесь v190131a/__init__.py,

import os
import sys
import pygame
import time
import screeninfo

screendata = screeninfo.get_monitors()
screendata = screendata[0]


class Player(object):
    def __init__(self):
        self.rect = pygame.Rect(32, 32, 16, 16)
        # self.offset = (screen.get_size()[0]-32, screen.get_size()[1]-32)
        self.offset = (1, 1)

    def move(self, dx, dy):

        # Move each axis separately. Note that this checks for collisions both times.
        if dx != 0:
            self.move_single_axis(dx, 0)
        if dy != 0:
            self.move_single_axis(0, dy)

    def move_single_axis(self, dx, dy):

        # Move the rect
        self.rect.x += dx
        self.rect.y += dy

        for wall in walls:
            if self.rect.colliderect(wall.rect):
                print(wall.rect)
                if dx > 0:  # Moving right; Hit the left side of the wall
                    self.rect.right = wall.obj.left
                if dx < 0:  # Moving left; Hit the right side of the wall
                    self.rect.left = wall.obj.right
                if dy > 0:  # Moving down; Hit the top side of the wall
                    self.rect.bottom = wall.obj.top
                if dy < 0:  # Moving up; Hit the bottom side of the wall
                    self.rect.top = wall.obj.bottom

        for border in borders:
            if self.rect.colliderect(border):
                if dx > 0:  # Moving right; Hit the left side of the wall
                    self.rect.right = border.left
                if dx < 0:  # Moving left; Hit the right side of the wall
                    self.rect.left = border.right
                if dy > 0:  # Moving down; Hit the top side of the wall
                    self.rect.bottom = border.top
                if dy < 0:  # Moving up; Hit the bottom side of the wall
                    self.rect.top = border.bottom


class Wall(object):
    def __init__(self, pos):
        walls.append(self)
        self.obj = assets["whitebrick"]
        self.rect = self.obj.get_rect()
        self.pos = pos


borders = [pygame.Rect(0, 0, screendata.width, 16),
           pygame.Rect(0, 16, 16, screendata.height),
           pygame.Rect(0, screendata.height-64, screendata.width, 16),
           pygame.Rect(screendata.width-16, 0, 16, screendata.height)
           ]
walls = []
screen = None
clock = None
player = None
assets = None


def assetgrab():
    return {
        "whitebrick": pygame.image.load("v190131a/assets/img/whitebrick.png").convert_alpha()
    }


def init():
    global screen, clock, player, assets
    os.environ["SDL_VIDEO_CENTERED"] = "1"
    pygame.init()

    # Set up the display
    pygame.display.set_caption("Get to the red square!")
    screen = pygame.display.set_mode((0, 0), pygame.RESIZABLE)

    clock = pygame.time.Clock()
    player = Player()  # Create the player
    assets = assetgrab()

    Wall((32, 256))


def event(evnt):
    if evnt.type == pygame.QUIT:
        sys.exit()
    if evnt.type == pygame.KEYDOWN and evnt.key == pygame.K_ESCAPE:
        sys.exit()


def mainloop():
    global borders

    # Move the player if an arrow key is pressed
    key = pygame.key.get_pressed()
    if key[pygame.K_LEFT]:
        player.move(-5, 0)
    if key[pygame.K_RIGHT]:
        player.move(5, 0)
    if key[pygame.K_UP]:
        player.move(0, -5)
    if key[pygame.K_DOWN]:
        player.move(0, 5)

    screen.get_size()

    borders = [pygame.Rect(0, 0, screen.get_size()[0], 16),
               pygame.Rect(0, 16, 16, screen.get_size()[1]),
               pygame.Rect(0, screen.get_size()[1]-64, screen.get_size()[0], 16),
               pygame.Rect(screen.get_size()[0]-16, 0, 16, screen.get_size()[1])
               ]

    player.move(0, 5)

    # Draw the scene
    screen.fill((0, 0, 0))
    pygame.draw.rect(screen, (255, 200, 0), player.rect)

    for wall in walls:
        screen.blit(wall.obj, wall.pos)

    [pygame.draw.rect(screen, (0, 0, 0), x) for x in borders]
    pygame.display.flip()


def end():
    time.sleep(0.0166666667)
    pass

Который затем управляется core.py:

import pygame
import v190131a as core

core.init()

while True:
    for event in pygame.event.get():
        core.event(event)

    core.mainloop()
    core.end()

Игрок должен приземлиться на стену и остановиться, но вместо этого он проходит сквозь него.Есть ли что-то, что я пропускаю;мне нужно изменить плеер на изображение, это очевидная логическая ошибка?

Помощь будет принята, спасибо.

...