python - 如何修复对象图像无法正确加载的问题

标签 python python-3.x image class pygame

我正在编写一个代码,可以在屏幕上生成多个敌人。 敌人属性过去采用用于所有敌人的颜色属性,我现在尝试将其更改为可以加载的图像。 我也有兴趣这样做,这样我就可以从图像中 get_rect() ,我将用它来检查敌人何时位于屏幕上的某个位置。

问题是,当我尝试用图像属性替换颜色属性时,之前的代码非常依赖于使用颜色属性加载敌人,因此我很难让代码正常工作。 使用我编写的当前代码,它无法正确加载图像。

这是我开始使用的旧版本(功能性的,使用颜色属性):


import sys
import pygame as pg


class Enemy:

    def __init__(self, pos, color):
        self.rect = pg.Rect(pos, (26, 45))
        self.color = color
        self.pos = pg.math.Vector2(pos)

    def update(self, player):
        vel = (player.center - self.pos).normalize() * 4
        self.pos += vel
        self.rect.center = self.pos

    def draw(self, screen):
        pg.draw.rect(screen, self.color, self.rect)


def main():
    screen = pg.display.set_mode((640, 480))
    bg_color = pg.Color('gray12')
    player_color = pg.Color('dodgerblue1')
    enemy_color = pg.Color('sienna1')
    clock = pg.time.Clock()
    player = pg.Rect((100, 300), (26, 50))
    enemy_list = [Enemy((100, 300), enemy_color)]

    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            elif event.type == pg.KEYDOWN:
                if event.key == pg.K_f:
                    enemy_list.append(Enemy((400, 0), enemy_color))

        keys = pg.key.get_pressed()
        if keys[pg.K_a]:
            player.x -= 5
        elif keys[pg.K_d]:
            player.x += 5
        if keys[pg.K_w]:
            player.y -= 5
        elif keys[pg.K_s]:
            player.y += 5

        for enemy in enemy_list:
            enemy.update(player)

        screen.fill(bg_color)
        pg.draw.rect(screen, player_color, player)
        for enemy in enemy_list:
            enemy.draw(screen)

        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()
    sys.exit()

以下是我尝试更改的代码,但目前无法正常工作:


import sys
import pygame as pg
import os
from os import path

pg.init()

screen = pg.display.set_mode((640, 480))

game_folder = os.path.dirname(__file__)
img_folder = os.path.join(game_folder, "images")

enemy_img = pg.image.load(path.join(img_folder, "goblin.png"))

class Enemy(pg.sprite.Sprite):
    def __init__(self, pos, image):
      pg.sprite.Sprite.__init__(self)
      self.image = pg.transform.scale(enemy_img, (48,37))
      self.image.set_colorkey((0,0,0))
      self.rect = self.image.get_rect()
      self.pos = pg.math.Vector2(pos)

    def update(self, player):
        vel = [-5,0]
        self.pos += vel
        self.rect.center = self.pos

    def draw(self, screen):
        screen.blit(Enemy.image, Enemy.rect)


def main():
    bg_color = pg.Color('gray12')
    player_color = pg.Color('dodgerblue1')
    clock = pg.time.Clock()
    player = pg.Rect((100, 300), (26, 50))
    enemy_list = [Enemy((100, 300), enemy_img)]

    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            elif event.type == pg.KEYDOWN:
                if event.key == pg.K_f:
                    enemy_list.append(Enemy((400, 0), enemy_img))

        keys = pg.key.get_pressed()
        if keys[pg.K_a]:
            player.x -= 5
        elif keys[pg.K_d]:
            player.x += 5
        if keys[pg.K_w]:
            player.y -= 5
        elif keys[pg.K_s]:
            player.y += 5

        for enemy in enemy_list:
            enemy.update(player)

        screen.fill(bg_color)
        #pg.draw.rect(screen, player_color, player)
        for enemy in enemy_list:
            enemy.draw(screen)

        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()
    sys.exit()

有人可以帮我弄清楚出了什么问题以及我应该更改或添加哪些代码吗?非常感谢您抽出宝贵的时间。

最佳答案

你的问题是这一行:

screen.blit(Enemy.image, Enemy.rect)

在这里,您尝试访问 Enemyimage class 属性,但 Enemy 类却无法访问没有这样的属性,也没有 rect 属性。

您可以使用

解决此问题
screen.blit(self.image, self.rect)

它将使用实例属性

但是由于您已经使用了 Sprite 类,因此不必费心自己将 Sprite 绘制到屏幕上,而是使用 Group :

import sys
import pygame as pg
import os
from os import path

pg.init()

screen = pg.display.set_mode((640, 480))

game_folder = os.path.dirname(__file__)
img_folder = os.path.join(game_folder, "images")

enemy_img = pg.image.load(path.join(img_folder, "goblin.png"))

class Enemy(pg.sprite.Sprite):
    def __init__(self, pos, image):
      pg.sprite.Sprite.__init__(self)
      self.image = pg.transform.scale(enemy_img, (48,37))
      self.image.set_colorkey((0,0,0))
      self.rect = self.image.get_rect()
      self.pos = pg.math.Vector2(pos)

    def update(self, player):
        vel = [-5,0]
        self.pos += vel
        self.rect.center = self.pos

def main():
    bg_color = pg.Color('gray12')
    player_color = pg.Color('dodgerblue1')
    clock = pg.time.Clock()
    player = pg.Rect((100, 300), (26, 50))
    enemy_list = pg.sprite.Group([Enemy((100, 300), enemy_img)])

    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            elif event.type == pg.KEYDOWN:
                if event.key == pg.K_f:
                    enemy_list.append(Enemy((400, 0), enemy_img))

        keys = pg.key.get_pressed()
        if keys[pg.K_a]:
            player.x -= 5
        elif keys[pg.K_d]:
            player.x += 5
        if keys[pg.K_w]:
            player.y -= 5
        elif keys[pg.K_s]:
            player.y += 5

        enemy_list.update(player)

        screen.fill(bg_color)
        enemy_list.draw(screen)

        pg.display.flip()
        clock.tick(30)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()
    sys.exit()

关于python - 如何修复对象图像无法正确加载的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55414293/

相关文章:

python - 如何修复 google 脚本中的 "Login information disallowed"错误?

python - LineString 和 Point 之间的距离

python - 如何在 Python 中使用 selenium 登录网站?

python - 正则表达式无法识别 '#' 来删除

python - 类型错误:+ 不支持的操作数类型: 'dict_keys' 和 'list'

Wordpress XML-RPC 和特色图像

css - 通过css替换图片

python - Tkinter,并排显示两个图像

python - 在 Python 中制作字符串系列

c# - 如何使用 ASP.NET 显示来自 SQL Server 的图像?