python 如何在Pygame中使用sprite类参数作为pygame.Surface.get_rect()中的关键字参数?

kmbjn2e3  于 2023-04-10  发布在  Python
关注(0)|答案(1)|浏览(146)

我正在尝试创建一个精灵类,我可以分配它的大小,颜色,坐标和组。下面是它的外观:

import pygame, sys
from pygame.locals import *

RED = (255,0,0)

class MapObject(pygame.sprite.Sprite):
    def __init__(self, size, color, originxy, group):
        super().__init__()
        self.surf = pygame.Surface(size)
        self.surf.fill(color)
        self.rect = self.surf.get_rect(bottomleft = originxy)
        group.add(self)

floors = pygame.sprite.Group()

#    MapObject(size, color, originxy, group)
PT1 = MapObject((5760, 150), RED, (-2880, 1080), floors)

它工作得很好,但是我只能将坐标分配给sprite的左下角,所以我尝试向它添加另一个参数,以允许originxy成为,例如,它本身的中顶部。
我想我可以简单地用一个新的MapObject()参数替换bottomleft,即origin,它将从该参数设置坐标。

import pygame, sys
from pygame.locals import *

RED = (255,0,0)

class MapObject(pygame.sprite.Sprite):
    def __init__(self, size, color, origin, originxy, group):
        super().__init__()
        self.surf = pygame.Surface(size)
        self.surf.fill(color)
        self.rect = self.surf.get_rect(origin = originxy)
        group.add(self)

floors = pygame.sprite.Group()

#    MapObject(size, color, origin, originxy, group)
PT1 = MapObject((5760, 150), RED, midtop, (-2880, 1080), floors)

我希望origin参数代替通常左下角的参数,但我得到了一个错误:

Traceback (most recent call last):
File "problem test2.py", line 17, in \<module\>
PT1 = MapObject((5760, 150), RED, midtop, (-2880, 1080), floors)
NameError: name 'midtop' is not defined

我知道我必须将楼层定义为一个精灵组,但我不知道我必须将midtop定义为什么,以便将其用作get_rect中的关键字参数。有人知道我如何做到这一点吗?

moiiocjp

moiiocjp1#

midtop是虚拟属性的名称,但是没有名为midtop的常量。在任何情况下,您都不能使用and参数指定关键字参数的关键字。您可以做的最好的事情是将方向编码到元组中。第一项是水平方向(-1 =左,0 =中,1 =右),第2项为垂直方向(-1 =上,0 =中,1 =下):

class MapObject(pygame.sprite.Sprite):
    def __init__(self, size, color, orientation, pos, group):
        super().__init__()
        self.surf = pygame.Surface(size)
        self.surf.fill(color)
        cx = pos[0] - orientation[0] * size[0] // 2
        cy = pos[1] - orientation[1] * size[1] // 2
        self.rect = self.surf.get_rect(center = (cx, cy))
        group.add(self)
midtop = (0, -1)
PT1 = MapObject((5760, 150), RED, midtop, (-2880, 1080), floors)

相关问题