列表地图如何工作?我看到他们看起来像这样
level = [
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
"P P",
"P P",
"P P",
"P PPPPPPPPPPP P",
"P P",
"P P",
"P P",
"P PPPPPPPP P",
"P P",
"P PPPPPPP P",
"P PPPPPP P",
"P P",
"P PPPPPPP P",
"P P",
"P PPPPPP P",
"P P",
"P PPPPPPPPPPP P",
"P P",
"P PPPPPPPPPPP P",
"P P",
"P P",
"P P",
"P P",
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",]
我也看到过这种由多维数组表示的..我知道我们对其进行了迭代,但是究竟如何使它们完全出现在我们的游戏中,以及它们在游戏开发社区中的实际称呼是什么??
答案 0 :(得分:1)
您所称的“列表图”只是一个2D地图,其中每个符号/字母代表屏幕上不同的图块纹理。地图中的每一行都定义一个屏幕上的行。
下面的代码从问题中获取数组/列表,并将其作为砖块或草砖形式绘制到屏幕上。纹理来自https://opengameart.org。基本上,在调用drawMap()
函数时,将在级别字符串上进行双循环迭代,以绘制32x32图形位图的网格,该位图随每个字母而变化。
其余代码仅用于处理窗口的基本打开,箭头键输入和窗口大小调整。
import pygame
import time
import sys
# Window size
WINDOW_WIDTH=400
WINDOW_HEIGHT=400
pygame.init()
WINDOW = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE )
pygame.display.set_caption("Map Loader")
clock = pygame.time.Clock()
TILE_SIZE = 32
wall_image = pygame.image.load('brick_32.png')
grass_image = pygame.image.load('grass_32.png')
level = [
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
"P P",
"P P",
"P P",
"P PPPPPPPPPPP P",
"P P",
"P P",
"P P",
"P PPPPPPPP P",
"P P",
"P PPPPPPP P",
"P PPPPPP P",
"P P",
"P PPPPPPP P",
"P P",
"P PPPPPP P",
"P P",
"P PPPPPPPPPPP P",
"P P",
"P PPPPPPPPPPP P",
"P P",
"P P",
"P P",
"P P",
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",]
def drawMap( screen, level ):
level_width = len(level[0]) # width for first row
level_height = len(level) # number of rows
for y in range( level_height ):
for x in range ( level_width ):
if ( level[y][x] == 'P' ):
screen.blit( wall_image, ( x*TILE_SIZE, y*TILE_SIZE) )
elif ( level[y][x] == ' ' ):
screen.blit( grass_image, (x*TILE_SIZE, y*TILE_SIZE) )
def drawGameWindow( screen ):
global WINDOW_WIDTH, WINDOW_HEIGHT
drawMap( screen, level )
pygame.display.update()
pygame.display.flip()
clock = pygame.time.Clock()
done = False
while not done:
for event in pygame.event.get():
if ( event.type == pygame.QUIT ):
done = True
elif ( event.type == pygame.VIDEORESIZE ):
WINDOW_WIDTH = event.w
WINDOW_HEIGHT = event.h
WINDOW = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE )
# Movement keys
keys = pygame.key.get_pressed()
if ( keys[pygame.K_UP] ):
print("up")
elif ( keys[pygame.K_DOWN] ):
print("down")
elif ( keys[pygame.K_LEFT] ):
print("left")
elif ( keys[pygame.K_RIGHT] ):
print("right")
drawGameWindow( WINDOW )
clock.tick_busy_loop( 60 )
pygame.quit()
很明显,在真实游戏中,地图比屏幕大得多。因此,只需编写代码即可将地图的正确部分绘制到屏幕上。上面的示例代码只是从左上角绘制而来。如果列表非常复杂,则有必要将所有图块纹理加载到字典中,然后按数字绘制,例如:textures['P']
-> { {1}}
还有一些python库已经可以处理所有这类事情。一个流行的示例是TMX,但还有一些其他示例。
题外话,但相关注释:
如果您曾经看过Roguelike game(我个人最喜欢的是Angband),则他们会将字母用作“图形”元素,例如玩家是textures[ level[y][x] ]
,龙是@
或d
,他们再也不需要使用 fancy 图形,只用文字符号就可以制作出出色的游戏