我正在使用Pygame在Python上使用简单的基于2d tile的游戏。我已经掌握了相机开始工作的基础知识,它在一个偏移处使瓷砖闪烁,但瓷砖的实际部分并没有随着blitting而移动。这是相机类,非常简单:
from Map import level
import Globals as gb
class Camera(object):
def __init__(self, x, y, screen_width, screen_height):
self.rect = gb.pygame.Rect(x, y, screen_width, screen_height)
def update(self):
self.rect.center = gb.player.rect.x, gb.player.rect.y
并且blitting在这里完成:
def render(fov, cam):
for block in new_blocks:
gb.window.screen.blit(block.image, (block.rect.x - cam.rect.x,
block.rect.y - cam.rect.y))
地图是一个简单的二维数组,我将所有的数据块放入列表" new_blocks" 像这样:
for row in level.current_map:
for block in row:
if block == '.':
block = Blocks()
block.pic = 'sand.png'
block.rect.x = x
block.rect.y = y
x += 50
new_blocks.append(block)
if block == '#':
block = Blocks()
block.ID = 1
block.is_wall = True
newImage(block, 'img', 'wall.png')
block.rect.x = x
block.rect.y = y
walls.append(block)
x += 50
new_blocks.append(block)
if x == len(level.current_map[0])*50:
y += 50
x = 0
其中很多都很混乱,而且我计划清理它并使用更多的常量并在我开始工作后声明更好的变量。谢谢你的帮助!
答案 0 :(得分:0)
这就是:你不希望相机修改瓷砖本身的实际坐标值。答案实际上很简单,当你对角色进行blit时,使用相机来修改角色的位置。然后,对于您绘制到屏幕的所有内容,将有两组不同的坐标。 1)对象的实际位置和2)相对于屏幕的坐标。您需要注意的一件事是每个对象都是相对于屏幕绘制的,因为如果只有其中一个不是,那么它会破坏您的碰撞检测。