Python中的Libtcod访问违规错误

问题描述:

因此,像许多人一样,我正在阅读关于在Python中使用libtcod的roguelikes教程。 http://www.roguebasin.com/index.php?title=Complete_Roguelike_Tutorial,_using_python%2Blibtcod,_part_3Python中的Libtcod访问违规错误

我终于得到了一切正在运行,但我得到了一个特定的命令错误,我不知道如何解决它或什么是错的。它似乎是在教程中使用相同的命令,我的代码是完全相同的,据我所知,我正在使用由作者提供的下载链接。我的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 

的问题是在renderall功能,当它被调用 libtcod.console_set_char_background(CON,X,Y,color_dark_wall,libtcod.BKGND_SET)

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位。

请给我找一个详细的,阻止问题的YouTube视频,了解如何在Python中正确设置libtcodpy,或者让我知道我在搞什么。

我在Windows 7 64bit上得到了同样的问题,Python 2.7的dll也是64位。

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

给出的错误信息(例如,0x0000000000640000)只是颜色的十六进制代码,所以错误消息代码根据所使用的颜色而异。

我所经历的代码加载DLL和颜色代码初始化的.py脚本挖libtcod使用DLL所以错误可能是在libtcod.dll甚至sdl2.dll作为SDL2 .dll完成所有的渲染。

可悲的是,我的知识并不是那么棒,我刚刚开始,但如果任何人对我和克里斯有一个答案,它将是伟大的。

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

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教程中最大的罪过)。

希望这会有所帮助。