Итак, как и многие, я прохожу учебник по roguelikes с использованием libtcod в python.
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
Проблема заключается в функции 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 и мою PyCharm IDE на 64-битных Windows 10. Пробовал 32-битной ранее, не найдет SDL2.dll. Я уже исправил это самостоятельно. Теперь я просто не могу понять, что является ошибкой и как переписать ее в уроке XX. Извините, что впервые опубликовал здесь, и не нашел точного решения в другой ветке, имел некоторые другие, касающиеся проблемы SDL и 32 против 64 бит.
Пожалуйста, либо найдите мне подробное видео с YouTube о том, как правильно настроить libtcodpy в python, чтобы избежать ошибок, либо просто дайте мне знать, что я испортил.
Я получаю ту же проблему на Windows 7 64-битных, Python 2.7 DLL также 64-битных.
Это только кажется с цветным кодом. Удалить любые изменения цвета позволяет ему работать.
Данное сообщение об ошибке (например, 0x0000000000640000) является шестнадцатеричным кодом для цвета, поэтому коды сообщений об ошибках меняются в зависимости от используемого цвета.
Я копался в коде для libtcod в в этом.Сценарий py загружает dll, а код цвета использует 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 () (но ваша трассировка стека не поддерживает это).
Немного дополнительного совета: поскольку переменные темной стены / светлой стены (точнее, «освещенной стены», если быть точным, но без) объявляются вне какой-либо функции, они уже глобальные. Задавать их как глобальные переменные внутри функции, в то время как они даже не объявлены в ней (используется только функцией), совершенно излишне (плохое обращение с переменными — самый большой грех в обучающем руководстве по python roguelike в libtcod).
Надеюсь это поможет.