1

所以,像许多人一样,我正在阅读关于在 python 中使用 libtcod 的 roguelikes 教程。 http://www.roguebasin.com/index.php?title=Complete_Roguelike_Tutorial,_using_python%2Blibtcod,_part_3

我终于让一切都运行起来了,但是我在某个特定命令上遇到了错误,我不知道如何修复它或者它到底有什么问题。它似乎在教程中使用相同的命令工作,据我所知,我的代码实际上是相同的,并且我使用的是作者提供的下载链接。我的项目文件夹中有 libtcodpy、dundalk12x12_gs_tc.png、libtcod.dll 和 SDL2.dll(复制并粘贴)。如果您需要查看 .py 的其余部分,则只需查看教程第 3 部分地牢生成中的代码。它和我的一模一样,唯一我看不到的是他的 libtcodpy 文件夹,但这是他的下载链接。错误是:

C:\Python27\python.exe C:/Users/Chris/PycharmProjects/untitled/KingKong.py
Traceback (most recent call last):
  File "C:/Users/Chris/PycharmProjects/untitled/KingKong.py", line 233, in     <module>
render_all()
  File "C:/Users/Chris/PycharmProjects/untitled/KingKong.py", line 172, in render_all
libtcod.console_set_char_background(con, x, y, color_dark_wall, libtcod.BKGND_SET )
  File "C:\Users\Chris\PycharmProjects\untitled\libtcodpy\__init__.py", line 822, in console_set_char_background
_lib.TCOD_console_set_char_background(con, x, y, col, flag)
WindowsError: exception: access violation reading 0x0000000000640000
24 bits font.
key color : 0 0 0
24bits greyscale font. converting to 32bits

Process finished with exit code 1

问题在于调用 libtcod.console_set_char_background(con, x, y, color_dark_wall, libtcod.BKGND_SET) 时的 renderall 函数

def render_all():
global color_dark_wall, color_light_wall
global color_dark_ground, color_light_ground

# Go through all tiles, and set their background color
for y in range(MAP_HEIGHT):
    for x in range(MAP_WIDTH):
        wall = map[x][y].block_sight
        if wall:
            libtcod.console_set_char_background(con, x, y, color_dark_wall, libtcod.BKGND_SET )
        else:
            libtcod.console_set_char_background(con, x, y, color_dark_ground, libtcod.BKGND_SET )

# Draw all objects in the list
for Object in objects:
    Object.draw()

# Blit the contents of "con" to the root console
libtcod.console_blit(con, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 0)

这是库函数

def console_set_char_background(con, x, y, col, flag=BKGND_SET):
    _lib.TCOD_console_set_char_background(con, x, y, col, flag)

libtcodpy 与 libtcod.dll 和 SDL2.dll 一起位于我的项目文件夹中。都是 64 位的,包括 python 和我在 64 位 windows 10 上的 PyCharm IDE。早先尝试 32 位,找不到 SDL2.dll。虽然我自己已经修复了这些东西。现在我无法弄清楚什么是错误以及如何在教程 XX 中重写它。抱歉,第一次在这里发帖,没有在另一个线程中看到确切的解决方案,但还有其他一些关于 SDL 问题和 32 位与 64 位的问题。

请给我找一个关于如何在 python 中正确设置 libtcodpy 的非常详细、防延迟的 youtube 视频,或者让我知道我在搞砸什么。

4

2 回答 2

1

我在 Windows 7 64 位、Python 2.7 上遇到了同样的问题,这些 dll 也是 64 位的。

它似乎只与颜色代码有关。删除任何颜色更改允许它运行。

给出的错误消息(例如 0x0000000000640000)只是颜色的十六进制代码,因此错误消息代码根据使用的颜色而有所不同。

我在init .py 脚本中挖掘了 libtcod 的代码,它加载了 dll,颜色代码使用了 dll,因此错误可能在 libtcod.dll 甚至 sdl2.dll 中,因为 sdl2.dll 完成了所有渲染.

可悲的是,我对python的了解并不是那么好,我才刚刚开始,但如果有人对我和克里斯有答案,那就太好了。

于 2016-11-18T09:13:19.403 回答
0

我在代码的模块化版本中遇到了同样的问题,答案很简单:您没有创建一个窗口来将控制台传送到。确保首先调用代码来创建窗口。我将它包装在一个单独的函数中:

def create_window():
    # set custom font
    libtcod.console_set_custom_font("arial10x10.png", libtcod.FONT_TYPE_GREYSCALE | libtcod.FONT_LAYOUT_TCOD)
    #initialize the main window
    libtcod.console_init_root(SCREEN_W, 
                                SCREEN_H,
                                WINDOW_TITLE + " ver.: " + VERSION,
                                fullscreen = False)
    #limit fps
    libtcod.sys_set_fps(LIMIT_FPS)

我还敦促您检查缩进,因为在您粘贴在这里的代码中,所有内容都与 render_all() 处于同一级别(但您的堆栈跟踪不支持)。

一点额外的建议:由于暗墙/亮墙变量(应该是“亮墙”,准确地说是 w/e)是在任何函数之外声明的,它们已经是全局变量。将它们设置为函数内部的全局变量,而它们甚至没有在函数中声明(仅由函数使用)是完全多余的(变量的滥用是 libtcod python roguelike 教程中最大的罪过)。

希望这可以帮助。

于 2017-02-25T13:09:31.130 回答