python - 区分组中的对象

标签 python object pygame sprite

在名为powerUpGroup 的组中,有两个对象:speedUpjumpUP。以下代码检查 player 对象是否与组中的任何对象发生碰撞:

for eachPowerUp in powerUpGroup:        
    if pygame.sprite.spritecollide(eachPowerUp, playerGroup, False) :
        eachPowerUp.kill()

假设我希望程序在玩家与speedUp 对象发生碰撞时打印“Speed increased”。根据上面的代码,如果 speedUpjumpUP 都将打印消息,因为它们在同一组中。在不创建新组的情况下,python 是否有办法识别它们是运行某些代码的不同对象?

最佳答案

如果 speedUpjumpUp 是不同的类,您应该在它们的类中实现它们的行为(something something something something polymorphism):

speepUp 类应该包含用于加速(或它所做的任何事情)和触发次要效果(比如向玩家显示内容和将其自身从游戏中移除)的代码,以及 jumpUp 类应该做同样的事情。当然,您可以深入抽象的兔子洞,但让我们保持简单。

这是一个小例子:

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()

enter image description here

关于python - 区分组中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65556939/

相关文章:

属性名称上的 Javascript toString 方法

python - Pygame - 防止 Sprite 重叠

python - 在乒乓球中将球弹到墙上和桨上

python - 如何检测用户是否在 pygame 中双击?

python - 在 Python 中访问数组列的最佳方法是什么?

python - 如何将带有字数统计的列表转换为字典

python - 在python中匹配两个 Pandas 数据框的列名

python - Django 模板中的 `form.as_p` 从哪里来?

javascript - 使用变量作为对象的属性,如何?

javascript - 从 JSON 创建对象