Python 在pygame中创建碰撞

Python 在pygame中创建碰撞,python,pygame,Python,Pygame,我的代码有问题。所以,我想创建一个游戏,在Pygame中,香蕉从天而降,猴子必须抓住它们。我很难在这两者之间制造冲突(已经花了几个小时尝试了) 这是我的代码: import pygame, sys, random, time, os from pygame.locals import * #Variáveis necessárias banana_speed = 5 monkey_speed = 20 WIDTH = 800 HEIGHT = 800 pontos = 0 vidas = 3

我的代码有问题。所以,我想创建一个游戏,在Pygame中,香蕉从天而降,猴子必须抓住它们。我很难在这两者之间制造冲突(已经花了几个小时尝试了)

这是我的代码:

import pygame, sys, random, time, os
from pygame.locals import * 

#Variáveis necessárias
banana_speed = 5
monkey_speed = 20
WIDTH = 800
HEIGHT = 800
pontos = 0
vidas = 3

#Nome do jogo
pygame.display.set_caption("Catch the fruit")

#Tamanho do ecrã do jogo
screen = pygame.display.set_mode((WIDTH, HEIGHT))

class Macaco(pygame.sprite.Sprite):
    def __init__(self):
        self.image = pygame.image.load('monkey.png')
        self.rect = self.image
        self.x = 300
        self.y = 640 
    def keyboard(self):
        key = pygame.key.get_pressed()
        if key[pygame.K_RIGHT]:
            self.x += monkey_speed
        elif key[pygame.K_LEFT]:
            self.x -= monkey_speed
    def draw (self, screen):
        screen.blit(self.rect, (self.x, self.y))

class Background(pygame.sprite.Sprite):
    def __init__(self, image_file, location):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(image_file)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = location

class Banana(pygame.sprite.Sprite):
    def __init__(self):
        self.image = pygame.image.load('banana.png')
        self.rect = self.image
        self.x = random.randrange(0,WIDTH)
        self.y = -50
    def draw(self, screen):
        self.y = self.y + banana_speed
        screen.blit(self.rect,(self.x, self.y))

#Funções necessárias para o Loop
macaco = Macaco()
banana = Banana()
Background = Background('background.png', [0,0])

os.environ["SDL_VIDEO_CENTERED"] = "1"
pygame.init()

while vidas > 0:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                running = False
        elif event.type == QUIT:
            running = False

    screen.blit(Background.image, Background.rect)
    pressed_keys = pygame.key.get_pressed()
    macaco.keyboard()
    macaco.draw(screen)
    banana.draw(screen)
    pygame.display.update()
编辑: 因此,我尝试了另一种解决方案,并做到了这一点:

import pygame, sys, random, time, os
from pygame.locals import * 

#Variáveis necessárias
banana_speed = 5
monkey_speed = 20
WIDTH = 800
HEIGHT = 800
pontos = 0
vidas = 3
green = (0, 0 , 255)

#Nome do jogo
pygame.display.set_caption("Catch the fruit")

#Tamanho do ecrã do jogo
screen = pygame.display.set_mode((WIDTH, HEIGHT))

class Macaco(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.rect = pygame.image.load('monkey.png')
        self.image = pygame.Surface([WIDTH, HEIGHT])
        self.x = 300
        self.y = 640
        self.image.fill(green)
    def keyboard(self):
        key = pygame.key.get_pressed()
        if key[pygame.K_RIGHT]:
            self.x += monkey_speed
        elif key[pygame.K_LEFT]:
            self.x -= monkey_speed
    def draw (self, screen):
        screen.blit(self.rect, (self.x, self.y))

class Background(pygame.sprite.Sprite):
    def __init__(self, image_file, location):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(image_file)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = location

class Banana(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.rect = pygame.image.load('banana.png')
        self.image = pygame.Surface([WIDTH, HEIGHT])
        self.x = random.randrange(0, WIDTH)
        self.y = -50
    def draw(self, screen):
        self.y = self.y + banana_speed
        screen.blit(self.rect,(self.x, self.y))


#Funções necessárias para o Loop
macaco = Macaco()
banana = Banana()
Background = Background('background.png', [0,0])

os.environ["SDL_VIDEO_CENTERED"] = "1"
pygame.init()

while vidas > 0:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                running = False
        elif event.type == QUIT:
            running = False
    screen.blit(Background.image, Background.rect)
    pressed_keys = pygame.key.get_pressed()
    macaco.keyboard()
    macaco.draw(screen)
    banana.draw(screen)
    blocks_hit_list = pygame.sprite.spritecollide(macaco, banana, True)
    for blocks in blocks_hit_list:
        pontos +=1
    pygame.display.update()

你能给我一些帮助吗?

我创建了两个精灵组:
所有精灵
包含所有精灵,用于更新和绘制它们,只需两行代码;
香蕉
组用于检查猕猴和香蕉之间的碰撞。然后我们需要函数来获得碰撞的精灵。您必须传递一个精灵实例和一个精灵组,它将为您检查精灵是否与组中的精灵发生碰撞。它以列表的形式返回被碰撞的香蕉,您可以在该列表上进行迭代以对其执行某些操作,例如,增加点计数器

您必须在精灵中调用父类的
\uuuuu init\uuuuu
方法,才能在精灵组中正确使用它们(使用
super
函数
super()。\uuuu init\uuuu()
(在Python2
super(Macaco,self)中)。\uuu init\uuu()

要更新精灵的位置,请将其
左上方
(或
中心
)属性设置为新的x、y坐标

要从映像调用获取rect,请调用
self.rect=self.image.get_rect()


我创建了两个精灵组:
all_sprites
,它包含所有精灵,用于更新和绘制它们,只需两行代码;
bananas
组用于检查macaco和香蕉之间的碰撞。然后我们需要函数来获取碰撞的精灵。您必须传递一个精灵实例ce和一个精灵组,它会检查精灵是否与组中的精灵发生了碰撞。它会将碰撞的香蕉作为列表返回,您可以在该列表上迭代以对其执行操作,或者例如增加点数计数器

您必须在精灵中调用父类的
\uuuuu init\uuuuu
方法,才能在精灵组中正确使用它们(使用
super
函数
super()。\uuuu init\uuuu()
(在Python2
super(Macaco,self)中)。\uuu init\uuu()

要更新精灵的位置,请将其
左上方
(或
中心
)属性设置为新的x、y坐标

要从映像调用获取rect,请调用
self.rect=self.image.get_rect()


呃…联盟?你是说碰撞吗?是的,对不起我的错误你已经熟悉了吗?你试过什么了吗?现在就试着…还是什么都没有:(中对精灵和精灵组有一个很好的介绍。请记住,如果您想使用精灵的矩形进行碰撞检测,您必须更新它们。呃…联盟?您是指碰撞吗?是的,对不起,我的错误您已经熟悉了吗?您尝试了什么?现在尝试一下…仍然没有:(中对精灵和精灵组有很好的介绍。请记住,如果要使用精灵的矩形进行碰撞检测,必须更新它们。谢谢!这就是我当时缺少的…你帮了我很多!谢谢!这就是我当时缺少的…你帮了我很多!
import sys
import random
import pygame


pygame.init()
screen = pygame.display.set_mode((800, 800))


class Macaco(pygame.sprite.Sprite):

    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill((190, 140, 20))
        self.rect = self.image.get_rect()
        self.x = 300
        self.y = 640
        self.speed = 20

    def keyboard(self, keys):
        if keys[pygame.K_RIGHT]:
            self.x += self.speed
        elif keys[pygame.K_LEFT]:
            self.x -= self.speed

    def update(self):
        self.rect.topleft = self.x, self.y


class Banana(pygame.sprite.Sprite):

    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill((230, 230, 40))
        self.rect = self.image.get_rect()
        self.x = random.randrange(0, 770)
        self.y = -50
        self.speed = 5

    def update(self):
        self.y += self.speed
        self.rect.topleft = self.x, self.y


macaco = Macaco()
banana = Banana()

all_sprites = pygame.sprite.Group(macaco, banana)
bananas = pygame.sprite.Group(banana)

clock = pygame.time.Clock()
running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False

    keys = pygame.key.get_pressed()
    macaco.keyboard(keys)
    all_sprites.update()
    # Collision detection. Check if macaco collided with bananas group,
    # return collided bananas as a list. dokill argument is True, so
    # that collided bananas will be deleted.
    collided_bananas = pygame.sprite.spritecollide(macaco, bananas, True)
    for collided_banana in collided_bananas:
        print('Collision.')

    screen.fill((70, 40, 70))
    all_sprites.draw(screen)

    pygame.display.update()
    clock.tick(30)

pygame.quit()
sys.exit()