LibTcod is a library for developing 'roguelike' games. A header and further information is available here.
Now I partially translated this tutorial from Python to FB to test the header. The result is a little app that shows two rooms, connected with a tunnel. One player (blue) can move in this dungeon, another is standing at one place.
Here's the source code
Code: Select all
#LIBPATH "libtcod-1.5.1"
#INCLUDE "libtcod.bi"
DIM SHARED AS TCOD_console_t con
TYPE Tile
DECLARE CONSTRUCTOR(BYVAL Vb AS INTEGER, BYVAL Vs AS INTEGER)
AS INTEGER Block, Block_Sight
END TYPE
CONSTRUCTOR Tile(BYVAL Vb AS INTEGER, BYVAL Vs AS INTEGER)
Block = Vb
Block_Sight = Vs
END CONSTRUCTOR
STATIC SHARED AS INTEGER MAP_WIDTH = 80, MAP_HEIGHT = 45
DIM SHARED AS Tile PTR map(MAP_WIDTH, MAP_HEIGHT)
SUB Rect(byval X AS INTEGER, BYVAL Y AS INTEGER, BYVAL W AS INTEGER, BYVAL H AS INTEGER)
FOR c AS INTEGER = X + 1 TO X + W
FOR r AS INTEGER = Y + 1 TO Y + H
map(c, r)->Block = FALSE
map(c, r)->Block_Sight = FALSE
NEXT
NEXT
END SUB
TYPE Objct
DECLARE CONSTRUCTOR(BYVAL x AS INTEGER, BYVAL y AS INTEGER, BYVAL char AS INTEGER, BYVAL col AS TCOD_color_t)
DECLARE SUB move(BYVAL dx AS INTEGER, BYVAL dy AS INTEGER)
DECLARE SUB draw()
DECLARE SUB clear()
AS INTEGER X, Y, Char
AS TCOD_color_t Col
END TYPE
CONSTRUCTOR Objct(BYVAL Vx AS INTEGER, BYVAL Vy AS INTEGER, BYVAL Vc AS INTEGER, BYVAL Cv AS TCOD_color_t)
X = Vx
Y = Vy
Char = Vc
Col = Cv
END CONSTRUCTOR
SUB Objct.move(BYVAL dx AS INTEGER, BYVAL dy AS INTEGER)
IF map(X + dx, Y + dy)->Block THEN EXIT SUB
X += dx
Y += dy
END SUB
SUB Objct.draw(BYVAL )
TCOD_console_set_foreground_color(con, Col)
TCOD_console_put_char(con, X, Y, Char, TCOD_BKGND_NONE)
END SUB
SUB Objct.clear()
TCOD_console_put_char(con, X, Y, ASC(" "), TCOD_BKGND_NONE)
END SUB
DIM SHARED AS Objct PTR obj(1)
CONST SCREEN_WIDTH = 80, SCREEN_HEIGHT = 50, LIMIT_FPS = 20
STATIC SHARED AS TCOD_color_t color_dark_wall, color_dark_ground
FUNCTION handle_keys() AS bool
VAR key = TCOD_console_check_for_keypress(TRUE) ' real-time
'VAR key = TCOD_console_wait_for_keypress(FALSE) ' turn-based
SELECT CASE AS CONST key.vk
CASE TCODK_ENTER : IF key.lalt THEN _
TCOD_console_set_fullscreen(IIF(TCOD_console_is_fullscreen(), FALSE, TRUE))
CASE TCODK_ESCAPE : RETURN TRUE
END SELECT
IF TCOD_console_is_key_pressed(TCODK_UP) THEN
obj(0)->move(0, -1)
ELSEIF TCOD_console_is_key_pressed(TCODK_DOWN) THEN
obj(0)->move(0, 1)
ELSEIF TCOD_console_is_key_pressed(TCODK_LEFT) THEN
obj(0)->move(-1, 0)
ELSEIF TCOD_console_is_key_pressed(TCODK_RIGHT) THEN
obj(0)->move(1, 0)
END IF : RETURN FALSE
END FUNCTION
SUB make_map()
FOR y AS INTEGER = 0 TO MAP_HEIGHT
FOR x AS INTEGER = 0 TO MAP_WIDTH
map(x, y) = NEW Tile(TRUE, TRUE)
NEXT
NEXT
Rect(20, 15, 10, 15) ' romm 1
Rect(50, 12, 15, 25) ' romm 2
Rect(30, 25, 20, 1) ' tunnel
END SUB
SUB render_all()
'#go through all tiles, and set their background color
FOR y AS INTEGER = 0 TO MAP_HEIGHT
FOR x AS INTEGER = 0 TO MAP_WIDTH
IF map(x, y)->Block_Sight THEN
TCOD_console_set_back(con, x, y, color_dark_wall, TCOD_BKGND_SET)
ELSE
TCOD_console_set_back(con, x, y, color_dark_ground, TCOD_BKGND_SET)
END IF
NEXT
NEXT
FOR i AS INTEGER = 0 TO UBOUND(obj)
obj(i)->draw()
NEXT
TCOD_console_blit(con, 0, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1, 0, 0, 0, 1.0, 1.0)
END SUB
TCOD_console_set_custom_font("libtcod-1.5.1/data/fonts/arial10x10.png", _
TCOD_FONT_TYPE_GREYSCALE OR TCOD_FONT_LAYOUT_TCOD, FALSE, FALSE)
TCOD_console_init_root(SCREEN_WIDTH + 1, SCREEN_HEIGHT + 1, "Rogue", FALSE, TCOD_RENDERER_SDL)
TCOD_sys_set_fps(LIMIT_FPS)
con = TCOD_console_new(SCREEN_WIDTH + 1, SCREEN_HEIGHT + 1)
color_dark_wall = TCOD_color_RGB(0, 0, 100)
color_dark_ground = TCOD_color_RGB(50, 50, 150)
obj(0) = NEW Objct(25, 23, ASC("@"), TCOD_white)
obj(1) = NEW Objct(SCREEN_WIDTH/2 - 5, SCREEN_HEIGHT/2, ASC("@"), TCOD_yellow)
make_map()
WHILE 0 = TCOD_console_is_window_closed()
render_all()
TCOD_console_flush()
FOR i AS INTEGER = 0 TO UBOUND(obj)
obj(i)->clear()
NEXT
IF handle_keys() THEN EXIT WHILE
WEND
' delete UDTs
FOR i AS INTEGER = 0 TO UBOUND(obj)
DELETE obj(i)
NEXT
FOR y AS INTEGER = 0 TO MAP_HEIGHT
FOR x AS INTEGER = 0 TO MAP_WIDTH
DELETE map(x, y)
NEXT
NEXT
[edit]-> Header updated now!
I found a bug in the header libtcod.bi. Edit line 138 to
Code: Select all
#DEFINE true CAST(bool, 1)