这个平台滚动代码到底是做什么的?

时间:2011-12-21 04:46:25

标签: java theory game-physics

我正在阅读现有平台游戏的源代码,我来到这里:

    /* assign the horizontal position of the TileMap on the screen to offsetX
     * this, center aligns the player. */
    int offsetX = width / 2 - Math.round(player.getX()) - TILE_SIZE;
    /* stop the map scrolling if the player reaches the two ends
     * of the map */
    offsetX = Math.min(offsetX, 0); // if offsetX < 0 , offsetX = 0
    offsetX = Math.min(offsetX, width-tileMap.getWidth()); //if offsetX > map width, offsetX = mapwidth

    int offsetY = height - toPixels(tileMap.getHeight()); // not really necessary, I think

    int firstTile = toTiles(-offsetX); // ???
    int lastTile = firstTile + toTiles(width) + 1; // why the +1

我评论了一些我认为理解的部分,并在评论中询问了其他部分。

最困扰我的是:

1-如何分配offsetX(width/2 ... ?)我已经明白它将offsetX分配给地图中某个位置对齐玩家的地方,但我不知道如何

2 - 在第3行,为什么开发人员写width - tileMap.getWidth()

注意:如果逐行解释代码太麻烦,请给我一个粗略的想法,也许用图表?开发人员在这里尝试做什么。感谢。

1 个答案:

答案 0 :(得分:1)

1 - 我认为这个偏移是用于绘制瓷砖而不是为了使玩家居中,当玩家移动时,此功能会以负数增加偏移,他移动的距离越远,player.getX()越高,偏移越高。

示例:

width=300
player.getX()=300
TILE_SIZE=10
tileMap[0]=(x,y)=(10,10)

offset=300/2-300-10
offset= -160

现在这个偏移用于绘制具有负偏移的图块,换句话说,进一步向左,在这种情况下tileMap[0]=(10-160,10) 这意味着tileMap [0]超出了屏幕范围(平铺滚动到左侧,玩家向右滚动)

2 - 我认为这应该是offsetX = Math.max(offsetX, width-tileMap.getWidth()); 在这种情况下,它只是一个额外的检查,只滚动到地图的末尾。

示例:

    width=300
    player.getX()=900
    TILE_SIZE=10
    tileMap[last]=(1010,10)
    tileMap.getWidth()=1000

    offset=300/2-900-10
    offset= -760
    offsetX = Math.min(-760, 0);
    offsetX = -760
    offsetX = Math.max(-760, 300-1000);
    offsetX = -700