Препятствие для развития Roguelike! libtcod.map_compute_fov устарела?

Я постараюсь быть кратким и исчерпывающим.

Я следую учебнику tcod Rouguelike по следующей ссылке:

http://rogueliketutorials.com/tutorials/tcod/

Я использую PyCharm Community Edition, хотя не думаю, что это имеет большое значение. Все шло хорошо до конца части 4, где мы реализовали FOV для игрока. Когда я пытаюсь запустить основной движок, используя следующий код (данный в учебнике):

def recompute_fov(fov_map, x, y, radius=1, light_walls=True, algorithm=0):
libtcod.map_compute_fov(fov_map, x, y, radius, light_walls, algorithm)

Компилятор выдает следующую ошибку:

File "C:\Users\drago\anaconda3\envs\Roguelike\lib\site-packages\tcod\libtcodpy.py", line 3320, in map_compute_fov
    m.compute_fov(x, y, radius, light_walls, algo)
AttributeError: 'NoneType' object has no attribute 'compute_fov'

Process finished with exit code 1

По крайней мере, я знаю достаточно, чтобы понять, что речь идет о самом пакете tcod. Но я не понял. К счастью, PyCharm дал мне небольшое представление...

Отзыв PyCharm о libtcod.map_compute_fov

Поэтому я последовал его совету и изменил libtcod.map_compute_fov на libtcod.map.compute_fov.

Это дало мне другую ошибку:

File "C:\Users\drago\PycharmProjects\Roguelike\map_objects\fov_functions.py", line 13, in recompute_fov
    libtcod.map.compute_fov(fov_map, x, y, radius, light_walls, algorithm)
TypeError: compute_fov() takes from 2 to 5 positional arguments but 6 were given

Process finished with exit code 1

Итак, еще раз, PyCharm смог рассказать мне об этой новой функции и о том, как она использует разные значения. Вместо FOV_map используется что-то, называемое pov, и для этого pov требуется массив из двух значений. Это также как-то связано с прозрачностью, которая на данный момент выше моих сил ради того, чего я хочу достичь.


Я все еще изучаю Python, поэтому учебник. Я понимаю, что такое массив. Но я понятия не имею, как заставить мой существующий код работать с этой новой функцией/модулем (я их перепутал), поскольку старый устарел.

Любая помощь будет оценена по достоинству.

Я также использую Python 3.8.


person R3TURN-0    schedule 12.06.2020    source источник
comment
Есть ли в вашем скрипте импорт import tcod as libtcod, описанный в части 0 руководства? 'NoneType' object has no attribute 'compute_fov' повышается, потому что libtcod равно None, когда вы вызываете libtcod.compute_fov(...)   -  person Aaron    schedule 12.06.2020
comment
Да... Как в основном движке, так и в функциях рендеринга fov.   -  person R3TURN-0    schedule 17.06.2020
comment
Я должен был обратить более пристальное внимание, исключение вызывается из класса библиотеки, и это не libtcod, а None, извините за неправильное направление. Мой питон заржавел, и я не знаком с этими библиотеками, я могу только надеяться, что вы найдете кого-то еще, кто поможет!   -  person Aaron    schedule 17.06.2020


Ответы (1)


У меня была такая же проблема, и я обнаружил, что помещая

def recompute_fov(fov_map, x, y, radius, light_walls=True, algorithm=0):
    libtcod.map_compute_fov(fov_map, x, y, radius, light_walls, algorithm)

в конце кода в fov_functions.py исправлено

AttributeError: объект «NoneType» не имеет атрибута «compute_fov»

проблема у меня была как у вас.

вот как автор учебника (начиная с части 4) настроил fov_functions.py:

import libtcodpy as libtcod


def initialize_fov(game_map):
    fov_map = libtcod.map_new(game_map.width, game_map.height)

    for y in range(game_map.height):
        for x in range(game_map.width):
            libtcod.map_set_properties(fov_map, x, y, not game_map.tiles[x][y].block_sight,
                                       not game_map.tiles[x][y].blocked)

    return fov_map


def recompute_fov(fov_map, x, y, radius, light_walls=True, algorithm=0):
    libtcod.map_compute_fov(fov_map, x, y, radius, light_walls, algorithm)

вот ссылка на код части 4, которую автор помещает в конце каждой части туториала: https://github.com/TStand90/roguelike_tutorial_revised/tree/part4 здесь я нашел файл fov_functions, который я сравнил со своим

Где автор размещает код в конце каждой части: https://i.stack.imgur.com/AgjCp.png

Надеюсь, это поможет вам!

person Dakkah    schedule 14.07.2020