Python 为什么不是';我的Pygame colliderect()工作不正常吗?

Python 为什么不是';我的Pygame colliderect()工作不正常吗?,python,pygame,Python,Pygame,我正在创建一个游戏,玩家在网格周围移动并躲避岩石,但我的碰撞检测代码似乎不起作用 import pygame from pygame.locals import * import random pygame.init() xSize = 500 ySize = 500 win = pygame.display.set_mode((xSize, ySize), RESIZABLE) pygame.display.set_caption('Grid Game: Featuring Sad Bl

我正在创建一个游戏,玩家在网格周围移动并躲避岩石,但我的碰撞检测代码似乎不起作用

import pygame
from pygame.locals import *
import random

pygame.init()

xSize = 500
ySize = 500
win = pygame.display.set_mode((xSize, ySize), RESIZABLE)

pygame.display.set_caption('Grid Game: Featuring Sad Blue Circle')

grid = pygame.image.load('gr.png').convert()
clock = pygame.time.Clock()

rockWait = 1000
rock_spawn_ev = pygame.USEREVENT

class player(object):

    def __init__(self):
        self.right = [pygame.image.load('right_%s.png' % frame) for frame in range(1, 9)]
        self.x = 109
        self.y = 109
        self.frameCount = 0
        self.rect = pygame.Rect(self.x, self.y, 32, 32) #rect for collision

    def draw(self, win):
        if self.frameCount + 1 >= 40:
            self.frameCount = 0
        win.blit(self.right[self.frameCount//5], (self.x, self.y))
        self.frameCount +=1
        self.rect = pygame.Rect(self.x, self.y, 32, 32) #update rect position


class rock(object):

    def __init__(self, vel):
        self.rock = pygame.image.load('rock.png')
        self.vel = vel
        self.ran = random.randint(0, 3)
        self.ran2 = random.randint(1, 10) * 50 - 41
        if self.ran > 1:
            self.x = 550
            self.y = 550
        else:
            self.x = -50
            self.y = -50
        rocks.append(self)
        self.rect = pygame.Rect(self.x, self.y, 32, 32) #rect for collision

    def draw(self, win): 
        if self.ran == 0: #top to bottom
            self.y += self.vel
        win.blit(self.rock, (self.ran2, self.y))

        if self.ran == 2: #bottom to top
            self.y -= self.vel
        win.blit(self.rock, (self.ran2, self.y))

        if self.ran == 1: #left to right
            self.x += self.vel
        win.blit(self.rock, (self.x, self.ran2))

        if self.ran == 3: #right to left
            self.x -= self.vel
        win.blit(self.rock, (self.x, self.ran2))
        self.rect = pygame.Rect(self.x, self.y, 32, 32) #update rect position


def rgw():
    win.blit (grid, (0,0))
    player.draw(win)
    for rock in rocks:
        rock.draw(win)
        colliding = player.rect.colliderect(rock.rect)

        if colliding:
            print('collide') #nothing happens, even when touching rock
    pygame.display.update()

pygame.time.set_timer(rock_spawn_ev, rockWait)

player = player()

rocks = []

run = True
while run:
    clock.tick(60)

    events = pygame.event.get()

    for event in events:
        if event.type == pygame.QUIT:
            run = False
        if event.type == rock_spawn_ev:
            rock(6)

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP and player.y > 9:
                player.y -= 50
            elif event.key == pygame.K_DOWN and player.y < ySize - 41:
                player.y += 50
            elif event.key == pygame.K_LEFT and player.x > 9:
                player.x -= 50
            elif event.key == pygame.K_RIGHT and player.x < xSize - 41:
                player.x += 50

    rgw()
pygame.quit()
我知道for循环本身是有效的,因为岩石正在被抽取

class player(object):

    def __init__(self):
        self.x = 109
        self.y = 109
        self.rect = pygame.Rect(self.x, self.y, 32, 32) #rect for collision

    def draw(self, win):
        self.rect = pygame.Rect(self.x, self.y, 32, 32) #update rect position


class rock(object):

    def __init__(self):
        rocks.append(self)
        self.rect = pygame.Rect(self.x, self.y, 32, 32) #rect for collision

    def draw(self, win): 
        self.rect = pygame.Rect(self.x, self.y, 32, 32) #update rect position

player = player()
rocks = []
def rgw():
    win.blit (grid, (0,0))
    player.draw(win)
    for rock in rocks:
        rock.draw(win)
        colliding = player.rect.colliderect(rock.rect)
        if colliding:
            print('collide') #nothing happens, even when touching rock
    pygame.display.update()


首先,在位置
(self.x,self.y)
上没有绘制岩石,但在位置
(self.ran2,self.y)
(self.x,self.ran2)


我建议从相应的对象创建围绕对象的矩形。用于生成具有图像大小的对象,并通过关键字参数设置位置(
self.rect=self.rock.get_rect(topleft=(self.x,self.ran2))
)或使用返回的矩形。例如:

class播放器(对象):
# [...]
def抽签(自我,赢):
# [...]
self.rect=win.blit(self.right[self.frameCount//5],(self.x,self.y))
岩石类(对象):
# [...]
def抽签(自我,赢):
# [...]
self.rect=win.blit(self.rock,(self.x,self.ran2))

由于在类
rock
中,在
(self.ran2,self.y)
(self.x,self.ran2)
的位置绘制了两块岩石,因此必须设置两个不同的矩形对象:

岩石类(对象):
# [...]
def抽签(自我,赢):
# [...]
self.rect_1=win.blit(self.rock,(self.ran2,self.y))
# [...]
self.rect_2=win.blit(self.rock,(self.x,self.ran2))
您必须进行两次碰撞测试:

def rgw():
win.blit(网格,(0,0))
球员。平局(获胜)
对于岩石中的岩石:
摇滚。平局(胜利)
碰撞=player.rect.collide rect(rock_1.rect)或player.rect.collide rect(rock_2.rect)
如果发生碰撞:
打印(“碰撞”)#即使碰到岩石,也不会发生任何事情
pygame.display.update()

首先,在
(self.x,self.y)
位置没有绘制岩石,但在
(self.ran2,self.y)
(self.x,self.ran2)


我建议从相应的对象创建围绕对象的矩形。用于生成具有图像大小的对象,并通过关键字参数设置位置(
self.rect=self.rock.get_rect(topleft=(self.x,self.ran2))
)或使用返回的矩形。例如:

class播放器(对象):
# [...]
def抽签(自我,赢):
# [...]
self.rect=win.blit(self.right[self.frameCount//5],(self.x,self.y))
岩石类(对象):
# [...]
def抽签(自我,赢):
# [...]
self.rect=win.blit(self.rock,(self.x,self.ran2))

由于在类
rock
中,在
(self.ran2,self.y)
(self.x,self.ran2)
的位置绘制了两块岩石,因此必须设置两个不同的矩形对象:

岩石类(对象):
# [...]
def抽签(自我,赢):
# [...]
self.rect_1=win.blit(self.rock,(self.ran2,self.y))
# [...]
self.rect_2=win.blit(self.rock,(self.x,self.ran2))
您必须进行两次碰撞测试:

def rgw():
win.blit(网格,(0,0))
球员。平局(获胜)
对于岩石中的岩石:
摇滚。平局(胜利)
碰撞=player.rect.collide rect(rock_1.rect)或player.rect.collide rect(rock_2.rect)
如果发生碰撞:
打印(“碰撞”)#即使碰到岩石,也不会发生任何事情
pygame.display.update()

如果这是一个愚蠢的问题,很抱歉。我是pygame的新手。如果你能制作一个@khelwood好的,我制作了一个。你的玩家图像是32x32像素,对吗?通常,您会将rect设置为关闭图像:
self.rect=self.image.get_rect()
。如果rect的大小不正确,可能会导致您的问题。当你画精灵的时候,也可以试着自己画碰撞矩形(只是轮廓)。如果这是一个愚蠢的问题,对不起。我是pygame的新手。如果你能制作一个@khelwood好的,我制作了一个。你的玩家图像是32x32像素,对吗?通常,您会将rect设置为关闭图像:
self.rect=self.image.get_rect()
。如果rect的大小不正确,可能会导致您的问题。在绘制精灵时,也可以尝试自己绘制碰撞矩形(只是轮廓)。
class player(object):

    def __init__(self):
        self.x = 109
        self.y = 109
        self.rect = pygame.Rect(self.x, self.y, 32, 32) #rect for collision

    def draw(self, win):
        self.rect = pygame.Rect(self.x, self.y, 32, 32) #update rect position


class rock(object):

    def __init__(self):
        rocks.append(self)
        self.rect = pygame.Rect(self.x, self.y, 32, 32) #rect for collision

    def draw(self, win): 
        self.rect = pygame.Rect(self.x, self.y, 32, 32) #update rect position

player = player()
rocks = []
def rgw():
    win.blit (grid, (0,0))
    player.draw(win)
    for rock in rocks:
        rock.draw(win)
        colliding = player.rect.colliderect(rock.rect)
        if colliding:
            print('collide') #nothing happens, even when touching rock
    pygame.display.update()