如何应对自上而下的RPG运动?


13

我有一个用Java编写的游戏。这是自上而下的RPG,我正在尝试处理世界上的运动。这个世界在很大程度上是程序性的,我很难解决如何处理角色在世界各地的移动以及如何将更改呈现到屏幕上。我将世界加载到包含所有图块的块中。

我该如何应对角色移动?

我很沮丧,无法弄清楚应该去哪里。

编辑:好吧,我对手头的问题很抽象。

现在,我只能想到将所有内容严格地粘贴到2D数组中并在块中保存块ID和播放器偏移,否则我可以“浮动”所有内容并在块之间移动。

Answers:


11

使用世界坐标

(或者如您所说,将所有内容都浮动。)

世界坐标就是您通常使用的坐标,这有很多原因。它们是代表您在世界上的位置的最简单直观的方法,并且是真正比较同一世界中任何两个实体的位置的唯一方法。

通过在单个块中跟踪他,您除了工作之外一无所获。好吧,一个好处是您可以确定他所在的块,但是您已经可以使用世界坐标来计算出该块。


该答案的其余部分将解释如何根据玩家的世界坐标来计算玩家所在的世界块。

我将编写代码段,就像您有一个名为的2D 矢量Vector2-在几何中找到的矢量Vector类型,而不是所提供的列表类型java.util。如果没有任何几何Vector类,则应该在线找到一些或自己动手(任何人都知道Java的任何优质几何库吗?)

Vector2类将具有一个X字段和一个Y字段,它们是公共数字(与此处的数字类型无关)。

// Current player X,Y position in the world
Player.Position.X, Player.Position.Y

// An array of map blocks with consistent width and height
Block[x][y] blocks = World.GetBlocks();

// We'll wing it with an example global width/height for all blocks
Block.GetWidth() == 100;
Block.GetHeight() == 100;

// To ensure we're on the same page:
// blocks[0][0] should be at position (0,0) in the world.
// blocks[2][5] should be at position (200,500) due to the width/height of a block.

// Also:
// Assuming (0,0) is in the top-left of the game world, the origin of a block
// is its top-left point. That means the point (200,500) is at the top-left of
// blocks[2][5] (as oppose to, say, its center).

public Vector2 GetPlayersBlockPosition() {
    Vector2 blockPosition = new Vector2();
    blockPosition.X = (int)(Player.Position.X / Block.GetWidth());
    blockPosition.Y = (int)(Player.Position.Y / Block.GetHeight());

    return blockPosition;
}

public Block GetPlayersBlock() {
    Vector2 bp = GetPlayersBlockPosition();
    return blocks[bp.X, bp.Y];
}

Block block = GetPlayersBlock();

2个功能>块内跟踪和块间传输的所有混乱


1
比我想要的答案好得多
WarmWaffles 2011年

0

您的问题有点抽象,但也许您正在寻找一种寻路算法,我建议使用A *(http://en.wikipedia.org/wiki/A*_search_algorithm)。如果贴图没有被遮挡地形,这将帮助您将角色贴图移动到贴图上。


1
更多的是我如何处理渲染。是否在每个块中保存块ID和播放器偏移?
WarmWaffles
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.