Python 在pygame中创建碰撞
我的代码有问题。所以,我想创建一个游戏,在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
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()
(在Python2super(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()
(在Python2super(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()