当前位置: 首页 > 知识库问答 >
问题:

Pygame TypeError:join()参数必须是str、bytes或os.PathLike对象,而不是“Surface”

赫连捷
2023-03-14

我学习Python才几个星期,这个问题难倒了我。我试图创建一个简单的塔防风格的游戏使用Pyplay。已经在谷歌上搜索和研究了4个多小时(pyplay docs网站在发布时已经关闭,依赖于缓存版本)。我相信它最终会变得非常容易修复,但我没有主意了。

我把塔类放在一个文件中,主游戏循环放在另一个文件中。图像文件存储在名为“资产”的文件夹中,该文件夹与tower类和主游戏循环位于同一目录中。当我试图创建一个新的塔,特别是加载塔的形象,我得到的错误列在标题。

我知道我以某种方式传递了一个“表面”作为参数,但我一生都无法弄清楚它在哪里。我让玩家使用1或2个键选择他们正在建造的塔的类型,然后查找相应的图像,然后将塔放在他们点击屏幕的地方。在pyplay事件之后立即正确单击鼠标的print语句将"elf_tower.png"列为文件名,但类的init中的print语句表示""。如果我硬编码图像的文件名,这个类会正常运行,但我怀疑这是最好的解决方案。我还尝试将一个变量设置为“资产/”tower_type但它同样表示它不能将Surface连接到str。

主文件:

"""Homebrew tower defense game using pygame and object oriented programming.
This is a learning project"""
import pygame
from tower import Tower
from scaling import get_scaling_info

get_scaling_info()

def run_game():
    """Runs the game"""
    pygame.init()
    get_scaling_info()
    width, height = get_scaling_info()[1:]
    screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN, 32)
    pygame.display.set_caption("Tower Defense")
    game_surface = screen.copy()

    def toggle_fullscreen():
        """Toggles between fullscreen and windowed mode"""
        if screen.get_flags() & pygame.FULLSCREEN:
            return pygame.display.set_mode((800, 600), pygame.RESIZABLE)
        return pygame.display.set_mode((width, height), pygame.FULLSCREEN)

    def update_display():
        """Update the game display"""
        scaling_info = get_scaling_info()[0]
        screen.fill((0, 0, 0))
        for tower in Tower.towers:
            tower.draw()
        screen.blit(pygame.transform.scale(
            game_surface, (scaling_info.current_w, scaling_info.current_h)), (0, 0))
        pygame.display.update()

    run = True
    tower_type = 0
    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    run = False
                if event.key == pygame.K_F11:
                    toggle_fullscreen()
                if event.key == pygame.K_1 or event.key == pygame.K_2:
                    tower_type = Tower.selection_dict[event.key]
            if event.type == pygame.MOUSEBUTTONDOWN and tower_type != 0: #to prevent game from breaking if no tower selected.
                print(tower_type) #returns elf_tower.png which is the expected result
                mouse_x, mouse_y = pygame.mouse.get_pos()
                Tower(tower_type, mouse_x, mouse_y).create_tower()

        update_display()

    pygame.quit()

run_game()

塔类文件:

"""Contains the class used to generate towers"""
import os
import pygame
from scaling import get_scaling_info

get_scaling_info()

class Tower:
    """Tower information"""
    selection_dict = {49:"elf_tower.png", 50:"dwarf_tower.png"} #pygame keypress of 1 corresponds to value 49, 2 to 50.
    towers = []
    def __init__(self, img, x, y, display_surface="game_surface"):
        x_scale, y_scale = get_scaling_info()[1:]
        self.img = pygame.image.load(os.path.join('assets', img))
        print(self.img) # returns <Surface(40x40x32 SW)>
        self.x_coord = x * x_scale
        self.y_coord = y * y_scale
        self.display_surface = display_surface

    def create_tower(self):
        """Creates a tower of the selected type and scales to the correct size"""
        Tower.towers.append(Tower(self.img, self.x_coord, self.y_coord))
        print(Tower.towers)

    def draw(self):
        """Draws the tower on the screen using the specified image at coordinates x and y"""
        pygame.transform.scale(self.img, (32, 32))
        self.display_surface.blit(self.img, (self.x_coord, self.y_coord))
        print(self.img)

 #   def attack(self):
 #       """Causes the tower to attack enemies in range
 #       Not yet written"""

图像缩放文件

"""Gets the scaling info used in the other modules of the game"""
import pygame

def get_scaling_info():
    """Gathers display info for scaling elements of the game"""
    pygame.init()
    display_info = pygame.display.Info()
    scaling_info = pygame.display.Info()
    x_ratio = display_info.current_w/scaling_info.current_w
    y_ratio = display_info.current_h/scaling_info.current_h
    return scaling_info, x_ratio, y_ratio

共有1个答案

盖弘毅
2023-03-14

您看到的是错误的塔楼结构(即在run_game中);这个问题实际上是在这条线上出现的

Tower.towers.append(Tower(self.img, self.x_coord, self.y_coord))

create_tower方法中,使用self.img作为第一个参数,构建一个新的tower。在\uuuu init\uuuu中,self.img被初始化为pygame.image.load(os.path.join('assets',img)),它返回一个曲面。

很可能,您想存储img参数,其中Tower构造为另一个实例属性,然后在create_tower方法中使用该参数,例如:

class Tower:
    """Tower information"""
    selection_dict = {49:"elf_tower.png", 50:"dwarf_tower.png"} #pygame keypress of 1 corresponds to value 49, 2 to 50.
    towers = []
    def __init__(self, img, x, y, display_surface="game_surface"):
        x_scale, y_scale = get_scaling_info()[1:]
        self.img_file = img
        self.img = pygame.image.load(os.path.join('assets', self.img_file))
        print(self.img) # returns <Surface(40x40x32 SW)>
        self.x_coord = x * x_scale
        self.y_coord = y * y_scale
        self.display_surface = display_surface

    def create_tower(self):
        """Creates a tower of the selected type and scales to the correct size"""
        Tower.towers.append(Tower(self.img_file, self.x_coord, self.y_coord))
        print(Tower.towers)

 类似资料:
  • 问题内容: 我有以下抛出的非常基本的代码; 我尝试将解码设置为Data变量,如下所示,但是会引发相同的错误; 有什么建议? 问题答案: 您只是将其以错误的顺序放置,是无辜的错误。 (深入解答)。正如wim礼貌地指出的那样,在极少数情况下,他们可以选择UTF-16或UTF-32。在这种情况下,对于开发人员而言,这种情况将不那么常见,在这种情况下,他们将有意识地决定放弃宝贵的带宽。因此,如果遇到编码问

  • 问题内容: 我一直在尝试更新一个名为libpynexmo的小型Python库以与Python 3一起使用。 我一直坚持这个功能: 遇到这个问题时,json会回应: 我在一些地方读到,应该为您传递带有附件的对象(在这种情况下为对象),但是它不适用于对象。 我不知道下一步该怎么做,但是由于我的整个1500行脚本是新转换为Python 3的,所以我不想回到2.7。 问题答案: 我最近写了一个小功能来发送

  • 我试着在keras的博客文章中运行代码。 代码写入到一个文件。npy文件如下: 然后从这个文件中读取: 现在我得到一个错误,说: 在此之后,我尝试将文件模式从“w”更改为“wb”。这导致读取文件时出错: 如何修复此错误?

  • 我有一个问题,我做了一个乒乓游戏,但我有一个问题,把分数打印到pyplay窗口。 我得到错误'TypeError:参数1必须是pygame.Surface,而不是str 我在文本中输入了blit,但出现了一个错误。我知道代码乱七八糟,我稍后会修复它

  • 我是机器学习的初学者,目前正在尝试将VGG网络应用于我的神经网络 这是发生的错误 发现714幅图像,分属10类。发现100个图像,属于 到10个班。------------------------------------------------------------------------------------------------------------------------------

  • 你好,我正在创建一个游戏使用pyplay和我有一些问题。我创建了一些按钮(使用图像),并根据某些操作,此按钮的图像将发生变化。我将向您展示代码中存在错误的部分。抱歉,我是西班牙人,我的英语不好。这是代码: 那么错误就是那个: 例如,在代码的最后一行: 如果我把默认,图像是那些所谓的default_ap和default_ip,那些: 如果我把丘巴卡,图像将被称为chewbacca_ap和chewba