AttributeError:类型对象“projector”没有属性“dir”

2024-06-16 08:28:59 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,伙计们,我很抱歉打扰你们,但我现在浪费了几个小时修修补补,以使这个工作。你知道吗

代码运行得很好,但是射弹在发射后不断改变方向,所以我尝试为每个子弹分配自己的dir值,并将shot函数用于将子弹移动到projector类中。但我一直收到错误信息:

Traceback (most recent call last): File "PycharmProjects/Game/Pygame.py", line 90, in update() File "PycharmProjects/Game/Pygame.py", line 73, in update get_input() File "PycharmProjects/Game/Pygame.py", line 55, in get_input projectile.dir == {'N'} AttributeError: type object 'projectile' has no attribute 'dir'

我想很明显,我是一个新的编码,所以我会非常感谢一些帮助。你知道吗

改变投射物.dir在get\u input函数中项目符号.dir就这样。 把方向放在括号里。在get\ U输入函数外指定方向。在init函数之前为类中的字母赋值

class player():
    x = WIDTH / 2
    y = HEIGHT / 2
    width = 50
    height = 50
    speed = 1

    def draw(self):
        pygame.draw.rect(win, (0, 0, 255), (self.x, self.y, self.width, self.height))

class projectile():

    radius = 10
    speed = 8

    def __init__(self, x, y, dir={}):
        self.x = x
        self.y = y
        self.dir = dir

    def shot(self):
        for bullet in bullets:
            if self.dir == 'N':
                print('N')
                self.y -= 1
            if self.dir == 'W':
                print('W')
                self.x -= 1
            if self.dir == 'S':
                print('S')
                self.y += 1
            if self.dir == 'E':
                print('E')
                self.x += 1

    def draw(self):
        pygame.draw.circle(win, (255, 0, 0), (self.x, self.y), self.radius)


def get_input():
    keys = pygame.key.get_pressed()
    ev = pygame.event.get()

    if keys[pygame.K_w]:
        player.y -= player.speed
        projectile.dir == 'N'
    if keys[pygame.K_a]:
        player.x -= player.speed
        projectile.dir == 'W'
    if keys[pygame.K_s]:
        player.y += player.speed
        projectile.dir == 'S'
    if keys[pygame.K_d]:
        player.x += player.speed
        projectile.dir == 'E'
    for event in ev:
        if event.type == pygame.MOUSEBUTTONDOWN:
            bullets.append(projectile(round(player.x + player.width//2), round(player.y + player.height//2), dir))


def update():
    clock.tick(300)
    win.fill ((0, 0, 0))
    get_input()
    player.draw()
    for bullet in bullets:
        bullet.draw()
        bullet.shot()
    pygame.display.update()


running = True
player = player()
bullets = []

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

    update()

#pygame.quit()

Tags: inselfeventinputgetifdefdir
1条回答
网友
1楼 · 发布于 2024-06-16 08:28:59

.dir现在是一个instance attribute,因此类属性projectile.dir不再存在。
在全局名称空间中创建变量current_dir。使用^{} statement写入函数get_input中的变量,并使用该变量设置构造新projectile对象时的方向:

current_dir = 'N'
def get_input(ev):
    global current_dir

    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]:
        player.y -= player.speed
        current_dir = 'N'
    if keys[pygame.K_a]:
        player.x -= player.speed
        current_dir = 'W'
    if keys[pygame.K_s]:
        player.y += player.speed
        current_dir = 'S'
    if keys[pygame.K_d]:
        player.x += player.speed
        current_dir = 'E'

    for event in ev:
        if event.type == pygame.MOUSEBUTTONDOWN:
            px, py = round(player.x + player.width//2), round(player.y + player.height//2)
            new_prj = projectile(px, py, current_dir)
            bullets.append(new_prj)

请注意,==是比较相等运算符。要设置current_dir,必须使用赋值运算符=。你知道吗

避免在主循环中多次调用^{}。获取一次事件并将事件列表传递给函数updateget_input

def update(ev):
    clock.tick(300)
    win.fill ((0, 0, 0))
    get_input(ev)
    player.draw()
    for bullet in bullets:
        bullet.draw()
        bullet.shot()
    pygame.display.update()

running = True
player = player()
bullets = []

while running:
    ev = pygame.event.get()
    for event in ev:
        if event.type == pygame.QUIT:
            running = False

    update(ev)

相关问题 更多 >