Pygame滚动地图

2024-06-25 22:53:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个流氓,我试着让一个摄像头跟踪玩家在地图上移动。在

我可以使绘制功能只在平铺在摄影机视口内[以灰色显示]时发生,但我不能使摄影机停留在窗口的一角。在

事情是这样的: enter image description here

应该是这样的: enter image description here

有没有一种方法可以“裁剪”屏幕表面,或者只复制相机视口内的内容,然后再在屏幕上快速播放。在

可能我做得很辛苦。 我在整个地图上迭代,为每个平铺创建一个矩形,并使用“.contains()”检查它是否在摄影机视口矩形内。在

编辑: 我是这样画地图的:

for x in xrange(mymap.width):
    for y in xrange(mymap.height):
        lit = field_of_view.lit(x, y)
        visited = field_of_view.visited(x, y)
        graphic = mymap.tileAt(x, y).graphic
        if lit:
            color = mymap.tileAt(x, y).color
        elif visited:
            color = GRAY
        else:
            color = BLACK
        renderedgraphic = myfont.render(graphic, 1, color)
        screen.blit(renderedgraphic, (x*TILESIZE, y*TILESIZE))

我对玩家,怪物,物品等等做同样的事情,但是所有的东西都是用它自己的类方法。在

我的相机是这样设置的:

^{pr2}$

所以我尝试了用户3762084所说的。在

简而言之:

for x in xrange(mymap.width):
    for y in xrange(mymap.height):
        ... # do fov stuff        
        tile = Tile.At(x, y)  # get tile instance
        if tile:
            tile.update() # update it's relative position
            screen.blit(renderedgraphic, (tile.relX * TILESIZE, tile.relX * TILESIZE)) # blit the postion to it's relative position

发生的情况如下:

enter image description here

全都挤在窗边了。如果玩家移动,一切都会变黑。在


Tags: infor地图玩家colortile摄影机xrange
2条回答

我以前做过的创建滚动环境的方法是给每个对象在世界上的坐标,然后给你的相机一个位置。绘图时,根据对象的实际坐标和相机的坐标计算每个对象在屏幕上的位置。在

class Tile:
    def __init__(self, x, y, other_variables):
        self.x = x
        self.y = y

        # relative vars for later
        self.relX = None
        self.relY = None

# then your camera should have a position as well as its width and height:
class Camera:
    def __init__(self, x, y, width, height):
        # assign those variables here

# your drawing function:
for tile in tiles:
    tile.relX = tile.x - camera.x
    tile.relY = tile.y - camera.y
    # blit your tiles to the screen at the relative coordinates

此外,还可以执行检查,以查看平铺是否完全位于摄影机空间之外,并且不绘制这些平铺。在

好吧,我找到了我要找的东西,我做了一点小改动。如果有人想更好的话。在

我改变了地图的绘制方式

  • 我拍了相机的正位[左上角和右下角]
  • 把它转变成世界地位
  • 用枚举器迭代它
  • 有没有用X和Y计算过光照/探访过的雾
  • 并在屏幕上使用枚举数“i”和“j”进行Blited。在

代码如下:

topleft = Map.toWorld(camera.rect.topleft)
bottomright = Map.toWorld(camera.rect.bottomright)
for i, x in enumerate(xrange(topleft[0], bottomright[0])):
    for j, y in enumerate(xrange(topleft[1], bottomright[1])):
        tile = mymap.tileAt(x, y)
        object = [obj for obj in Object.OBJECTS if obj.pos == (x,y)]
        if tile:
            lit = field_of_view.lit(x, y)
            visited = field_of_view.visited(x, y)
            graphic = tile.graphic
            if lit:
                color = tile.color
            elif visited:
                color = GRAY
            else:
                color = BLACK
            renderedgraphic = myfont.render(ch, 1, graphic)
            screen.blit(renderedgraphic, Map.toScreen((i + 1, j)))
        if object:
            Draw.drawObject(object[0], Map.toScreen((i + 1, j)))

现在唯一的问题是当玩家在地图的两侧时,它会显示一个黑色的边界。在

相关问题 更多 >