区分组中的对象
Difficiating objects in a group
在名为 powerUpGroup
的组中,有两个对象:speedUp
和 jumpUP
。以下代码检查 player
对象是否与组中的任何对象发生碰撞:
for eachPowerUp in powerUpGroup:
if pygame.sprite.spritecollide(eachPowerUp, playerGroup, False) :
eachPowerUp.kill()
假设我 仅 希望程序在玩家与 speedUp
对象碰撞时打印“速度增加”。根据上面的代码,如果 speedUp
或 jumpUP
都将打印消息,因为它们在同一组中。在不创建新组的情况下,有没有办法让python识别它们是不同对象运行某些代码?
使用 if 语句检查 power-up 是否 speedUp
for eachPowerUp in powerUpGroup:
if pygame.sprite.spritecollide(eachPowerUp, playerGroup, False):
if eachPowerUp == speedUp:
print("Speed increased")
eachPowerUp.kill()
编辑问题的第二部分:
您可以检查它是否是某个 class,而不是检查加电是否是某个对象。
假设您有一个名为 SpeedUp
的 class。您可以检查 eachPowerUp
是否是 SpeedUp
对象,然后打印您想要的消息。
for eachPowerUp in powerUpGroup:
if pygame.sprite.spritecollide(eachPowerUp, playerGroup, False):
if type(eachPowerUp) == SpeedUp:
print("Speed increased")
eachPowerUp.kill()
如果 speedUp
和 jumpUp
不同 classes,你应该在他们的 classes 中实现他们的行为(something something something something polymorphism):
speepUp
class 应该包含加速(或任何它做的)和触发次要效果(比如向玩家展示东西和从游戏中移除自己)的代码,以及jumpUp
class 也应该这样做。当然,您可以深入抽象的兔子洞,但让我们保持简单。
这是一个小例子:
import pygame
from random import choice
class Actor(pygame.sprite.Sprite):
def __init__(self, color, pos, *grps):
super().__init__(*grps)
self.image = pygame.Surface((64, 64))
self.image.fill(color)
self.rect = self.image.get_rect(topleft=pos)
def update(self, events, dt):
pass
class Player(Actor):
def __init__(self, *grps):
super().__init__('dodgerblue', (400, 300), *grps)
self.pos = pygame.Vector2(self.rect.topleft)
self.dir = pygame.Vector2((0, 0))
self.speed = 300
def update(self, events, dt):
pressed = pygame.key.get_pressed()
self.dir.x, self.dir.y = (0, 0)
if pressed[pygame.K_d]: self.dir += ( 1, 0)
if pressed[pygame.K_a]: self.dir += (-1, 0)
if pressed[pygame.K_s]: self.dir += ( 0, 1)
if pressed[pygame.K_w]: self.dir += ( 0, -1)
if self.dir.length() > 0:
self.dir.normalize()
self.pos += self.dir * self.speed * dt
self.rect.topleft = self.pos
class PowerUp(Actor):
def __init__(self, color, pos, player, *grps):
super().__init__(color, pos, *grps)
self.player = player
def apply(self):
pass
def update(self, events, dt):
if pygame.sprite.collide_rect(self, self.player):
self.apply()
self.kill()
class SpeedUp(PowerUp):
def __init__(self, player, *grps):
super().__init__('yellow', (100, 100), player, *grps)
def apply(self):
print('Speed Up')
self.player.speed += 200
class ColorChange(PowerUp):
def __init__(self, player, *grps):
super().__init__('purple', (600, 300), player, *grps)
def apply(self):
print('ColorChange!')
self.player.image.fill(choice(['green', 'blue', 'yellow', 'grey']))
def main():
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock, dt = pygame.time.Clock(), 0
sprites = pygame.sprite.Group()
player = Player(sprites)
SpeedUp(player, sprites)
ColorChange(player, sprites)
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
screen.fill('black')
sprites.draw(screen)
sprites.update(events, dt)
pygame.display.flip()
dt = clock.tick(120)/1000
if __name__ == '__main__':
main()
之前的代码是两个精灵之间的相等性测试,而不是一种精灵。变量 speedUp
是您的 powerUpGroup
精灵之一。只有当玩家碰撞的特定 speedUp
是该变量中的特定 speedUp
时,if 语句才会为真。
所以我加了一个属性.
在构造函数中(未在 OP 中添加),我有 self.type = "multiShot"
或 self.type = "speed"
,具体取决于它是哪种类型。然后,if 语句现在将类似于:
for eachPowerUp in powerUpGroup:
if pygame.sprite.spritecollide(eachPowerUp, playerGroup, False) :
if eachPowerUp.type == "multiShot" :
...
elif eachPowerUp.type == "speed" :
...
在名为 powerUpGroup
的组中,有两个对象:speedUp
和 jumpUP
。以下代码检查 player
对象是否与组中的任何对象发生碰撞:
for eachPowerUp in powerUpGroup:
if pygame.sprite.spritecollide(eachPowerUp, playerGroup, False) :
eachPowerUp.kill()
假设我 仅 希望程序在玩家与 speedUp
对象碰撞时打印“速度增加”。根据上面的代码,如果 speedUp
或 jumpUP
都将打印消息,因为它们在同一组中。在不创建新组的情况下,有没有办法让python识别它们是不同对象运行某些代码?
使用 if 语句检查 power-up 是否 speedUp
for eachPowerUp in powerUpGroup:
if pygame.sprite.spritecollide(eachPowerUp, playerGroup, False):
if eachPowerUp == speedUp:
print("Speed increased")
eachPowerUp.kill()
编辑问题的第二部分:
您可以检查它是否是某个 class,而不是检查加电是否是某个对象。
假设您有一个名为 SpeedUp
的 class。您可以检查 eachPowerUp
是否是 SpeedUp
对象,然后打印您想要的消息。
for eachPowerUp in powerUpGroup:
if pygame.sprite.spritecollide(eachPowerUp, playerGroup, False):
if type(eachPowerUp) == SpeedUp:
print("Speed increased")
eachPowerUp.kill()
如果 speedUp
和 jumpUp
不同 classes,你应该在他们的 classes 中实现他们的行为(something something something something polymorphism):
speepUp
class 应该包含加速(或任何它做的)和触发次要效果(比如向玩家展示东西和从游戏中移除自己)的代码,以及jumpUp
class 也应该这样做。当然,您可以深入抽象的兔子洞,但让我们保持简单。
这是一个小例子:
import pygame
from random import choice
class Actor(pygame.sprite.Sprite):
def __init__(self, color, pos, *grps):
super().__init__(*grps)
self.image = pygame.Surface((64, 64))
self.image.fill(color)
self.rect = self.image.get_rect(topleft=pos)
def update(self, events, dt):
pass
class Player(Actor):
def __init__(self, *grps):
super().__init__('dodgerblue', (400, 300), *grps)
self.pos = pygame.Vector2(self.rect.topleft)
self.dir = pygame.Vector2((0, 0))
self.speed = 300
def update(self, events, dt):
pressed = pygame.key.get_pressed()
self.dir.x, self.dir.y = (0, 0)
if pressed[pygame.K_d]: self.dir += ( 1, 0)
if pressed[pygame.K_a]: self.dir += (-1, 0)
if pressed[pygame.K_s]: self.dir += ( 0, 1)
if pressed[pygame.K_w]: self.dir += ( 0, -1)
if self.dir.length() > 0:
self.dir.normalize()
self.pos += self.dir * self.speed * dt
self.rect.topleft = self.pos
class PowerUp(Actor):
def __init__(self, color, pos, player, *grps):
super().__init__(color, pos, *grps)
self.player = player
def apply(self):
pass
def update(self, events, dt):
if pygame.sprite.collide_rect(self, self.player):
self.apply()
self.kill()
class SpeedUp(PowerUp):
def __init__(self, player, *grps):
super().__init__('yellow', (100, 100), player, *grps)
def apply(self):
print('Speed Up')
self.player.speed += 200
class ColorChange(PowerUp):
def __init__(self, player, *grps):
super().__init__('purple', (600, 300), player, *grps)
def apply(self):
print('ColorChange!')
self.player.image.fill(choice(['green', 'blue', 'yellow', 'grey']))
def main():
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock, dt = pygame.time.Clock(), 0
sprites = pygame.sprite.Group()
player = Player(sprites)
SpeedUp(player, sprites)
ColorChange(player, sprites)
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
screen.fill('black')
sprites.draw(screen)
sprites.update(events, dt)
pygame.display.flip()
dt = clock.tick(120)/1000
if __name__ == '__main__':
main()
之前的代码是两个精灵之间的相等性测试,而不是一种精灵。变量 speedUp
是您的 powerUpGroup
精灵之一。只有当玩家碰撞的特定 speedUp
是该变量中的特定 speedUp
时,if 语句才会为真。
所以我加了一个属性.
在构造函数中(未在 OP 中添加),我有 self.type = "multiShot"
或 self.type = "speed"
,具体取决于它是哪种类型。然后,if 语句现在将类似于:
for eachPowerUp in powerUpGroup:
if pygame.sprite.spritecollide(eachPowerUp, playerGroup, False) :
if eachPowerUp.type == "multiShot" :
...
elif eachPowerUp.type == "speed" :
...