Pygame不识别碰撞

2024-10-06 12:16:32 发布

您现在位置:Python中文网/ 问答频道 /正文

但我是pygame的新手,仍然在研究一些小怪癖。我有碰撞功能不再向我抛出错误,但它无法检测到碰撞?我知道它比较了左上角的点,所以这是否意味着精灵必须有相同的大小? 我调整了对象的大小,使其保持相同的大小,但它无法适应,但我知道有一种方法可以让它移动。如有任何建议,我们将不胜感激

from classyforryan import sprites
import pygame
import os
import time

pygame.init() #short for initialize does return a tuple of successful intilizaton
gameDisplay= pygame.display.set_mode((800, 600))

bg=pygame.image.load('clouds_converted.jpg')
moore=pygame.image.load("baemoore_converted.png")
jump = False
fall = False

cube = pygame.image.load("otherreferece.png")
player=sprites(moore, 50, 544)
ob = sprites(cube, 2125, 540) #changing 580 to 540
ob1 = sprites(cube, 2125, 540)
ob2 = sprites(cube, 2125, 540)


clock = pygame.time.Clock()


class sprite1(pygame.sprite.Sprite):
    def __init__(self, ob, ob1, ob2):
        pygame.sprite.Sprite.__init__(self)
        #self.image = pygame.image.load("1136693.jpg")
        self.spritesgroup = pygame.sprite.Group() #sprite group
        self.spritesgroup.add(ob)
        self.spritesgroup.add(ob1)
        self.spritesgroup.add(ob2)
        #self.spritesgroup = pygame.sprite.Group() #sprite group
        pygame.display.update()



while not gameExit:
    clock.tick(40)
    timer = pygame.time.get_ticks()
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            gameExit=True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                if not fall:
                    jump = True
            if event.key == pygame.K_ESCAPE:
                gameExit= True
    if jump:
        player.recty -= 18
        if player.recty <= 410:
            ycoor = 500
            jump = False
            fall = True

    if fall:
        player.recty += 18
        if player.recty >= 544:
            ycoor = 0
            fall = False
    pygame.display.update()
    gameDisplay.blit(bg,[0,0])
    time.sleep(.05)
    player.pos()
    ob.pos()
    ob.left()
    ob1.pos()
    ob2.pos()
    if(timer > 1600):
        ob1.left()
    if(timer > 2800):
        ob2.left()  
    score = 100
    spritegroup=sprite1(ob, ob1, ob2)
    blocks_hit_list = pygame.sprite.spritecollide(player, spritegroup.spritesgroup, True)

    print(blocks_hit_list)
    #for block in blocks_hit_list:
    #    score +=1
    #    print("yo new score is", score)
pygame.quit() #unintiliazes pygames
quit() #this will exit out of python

这是我导入的类

import pygame
import os
import time

gameDisplay= pygame.display.set_mode((800, 600))
class sprites(pygame.sprite.Sprite):
    def __init__(self, image, xcoor, ycoor):
        # Call the parent class (Sprite) constructor
        pygame.sprite.Sprite.__init__(self)
        self.image = image
        self.rect = self.image.get_rect()
        self.rectx=xcoor
        self.recty=ycoor
        self.rect.topleft = self.rectx, self.recty
    def pos(self):
        gameDisplay.blit(self.image, [self.rectx, self.recty])
    def left(self):
        dist = 7
        self.rectx = self.rectx - dist

Tags: imageimportselfeventiftimepygameplayer
1条回答
网友
1楼 · 发布于 2024-10-06 12:16:32

pygame.sprite.collide()使用精灵的rect属性检查是否发生了冲突。您正在为每个精灵创建一个rect对象,但是正在使用另一个属性来移动和定位它们。self.rect属性在整个游戏中处于相同的位置。所以玩家和物体永远不会碰撞,除非它们从同一个位置开始,然后它们总是碰撞

使用rect的x和y来移动精灵,而不是创建新的属性self.rectxself.recty。这可以通过点符号来访问

class Sprite(pygame.sprite.Sprite):  # Start classnames with capital letter!
    def __init__(self, image, x_coor, y_coor):
        # Call the parent class (Sprite) constructor
        pygame.sprite.Sprite.__init__()
        self.image = image
        self.rect = self.image.get_rect()
        self.rect.x = x_coor  # Notice that we're assigning to the rects x value!
        self.rect.y = y_coor  # The same here.

    def pos(self):
        gameDisplay.blit(self.image, self.rect)  # Position the sprite according to the the rect.

    def left(self):
        dist = 7
        self.rect.x = self.rect.x - dist  # Assigning to the rect's x attribute.

在程序的其余部分,您应该更改属性player.rect.xplayer.rect.y,而不是player.rectxplayer.recty

相关问题 更多 >