2013-06-04 67 views
1

我想做一个2D游戏,背景和精灵(视图)在屏幕上移动。制作背景滚动游戏的最佳方法?

我想用滚动的地面做一个游戏。我的意思是用户必须在屏幕的顶部看到填充屏幕大小30%的地平线。地面必须滚动,并且必须是屏幕尺寸的70%。例如,如果我将汽车放在地面上,汽车必须驶入滚动道路,必须在屏幕上的道路顶部看到天空(地平线),才能填满屏幕的30%。

我在谷歌搜索关于滚动游戏,但我无法找到实现这种滚动地游戏视界的方式。

任何想法和做法将被磨碎的,我只是拍一部关于如何做到这一点的研究。

感谢

回答

0

好了,你可以使用libgdx(http://libgdx.badlogicgames.com/)。 superjumper的例子会让你在正确的方式:)(https://github.com/libgdx/libgdx/tree/master/demos/superjumper

+0

我tryed这样一来,咬它不是一个好办法。 android演示需要3个项目,需要4个以上的项目,每个项目需要更多的项目....代码被分散到项目中。我想通过一种简单的方式实现这一点,只需要我需要做的滚动与地平线代码 – Pableras84

+1

这不是真的xD你可以只使用两个项目,如果你想(核心和Android),和android项目是自动生成的,所以你实际上只使用一个:)这个库大大简化了一切。 但是,如果你仍然想用其他方法,我运气好的你! n.n – Lestat

+0

lestat我导入了android项目,android项目给了我5个错误,其中两个依赖于其他两个项目。我导入其他两个项目,他们给我更多的错误,其中一些更依赖项目。我导入这些新的依赖项目,我仍然获得更多的依赖。其中一些不能在拉链中找到,就像其中一个罐子一样。这是一个绝对的混乱。 – Pableras84

1

这种影响可以以各种方式完成,这是一个非常基本的例子,我可以想出。

首先为您的地平线创建一个背景图像 - 有太阳的蓝色天空会很好。现在为背景创建一些细节图像,例如云彩和鸟类。这些可以从背景图像的左侧移到右侧(和/或反之亦然)。在你的渲染代码中,你首先渲染“背景”图像,然后渲染“细节”图像。确保你的背景图像覆盖了屏幕的大约35%,这样当你渲染70%的地层时,会有一些重叠 - 防止两层相遇的洞。

下一页为地面创建纹理图像。为此,我将使用具有正确类型的纹理的静态图像,用于表示要表示的内容(如污垢)。在图像的顶部添加一些基本的细节(例如山脉,树木等)也可能很好。 这应该是之后的的背景层。

一旦你有了这个布局,下一步将是模拟你的世界的深度。为此,您需要创建对象(2D图像),它将在您的“世界”中将放置为。有些例子是树木,岩石,房屋等

要定义你的世界,你会需要存储2个坐标,每个对象 - 在x轴的位置,以及在深度值z轴(您也可以使用y轴组件来包含高度,但本例中我将省略)。

您还需要跟踪您的播放器的同一x和z轴的位置。当玩家移动到屏幕中时,这些值将实时更改 - z将根据速度进行更改,并且x将基于转向(例如)进行更改。

还定义了一个视图距离 - 远离玩家的单位数量,在这个单位上可以看到物体。

现在,一旦你有了这样的世界,渲染就会产生移动到屏幕的错觉。首先将您的玩家对象渲染到底层的底部。接下来,为每个世界对象,计算它与玩家的距离 - 如果它的距离在您定义的视图距离之内,那么它应该被渲染,否则它可以被忽略。

一旦发现应呈现一个对象,你需要规模它基于它从玩家距离。此缩放的公式如下所示:

distance_from_player_z = object.z - player.z 
scale = (view_distance - distance_from_player_z)/view_distance 

这将导致介于0.0和1.0之间的浮点值,该值可用于缩放对象的大小。使用这个,距离玩家的距离越大,物体越小。

接下来,您需要计算x轴和y轴上的位置来渲染对象。这可以用简单的3D投影的公式来实现:

distance_from_player_x = object.x - player.x 
x_render = player.x + (distance_from_player_x/distance_from_player_z) 

y_render = (distance_from_player_z/view_distance) * (height_of_background_img); 

此计算对象相对的给玩家仅在x轴的距离。然后,根据距离玩家在z轴上的距离,它取这个值并“投射”它。结果是,z轴上的物体越远,x轴上的玩家就越靠近。 y轴部分使用远离玩家的距离将对象放置在背景图像上。

因此,所有这些信息,这里是在代码中的(非常基本的)示例(用于单个对象):

// define the render size of background (resolution specific) 
public final static float RENDER_SIZE_Y = 720.0f * 0.7f; // 70% of 720p 

// define your view distance (in world units) 
public final static float VIEW_DISTANCE = 10.0f; 

// calculate the distance between the object and the player (x + z axis) 
float distanceX = object.x - player.x; 
float distanceZ = object.z - player.z; 

// check if object is visible - i.e. within view distance and in front of player 
if (distanceZ > 0 && distanceZ <= VIEW_DISTANCE) { 

    // object is in view, render it 
    float scale = (VIEW_DISTANCE - distanceZ)/VIEW_DISTANCE; 
    float renderSize = (object.size * scale); 

    // calculate the projected x,y values to render at 
    float renderX = player.x + (distanceX/distanceZ); 
    float renderY = (distanceZ/VIEW_DISTANCE) * RENDER_SIZE_Y; 

    // now render the object scaled to "renderSize" at (renderX, renderY) 
} 

注意,如果距离小于或等于零,则意味着对象是后面的玩家,也不可见。这很重要,因为distanceZ == 0会导致错误,所以一定要排除它。您可能还需要调整renderX值,具体取决于解决方案,但我会将其留给您。

虽然这不完全是一个完整的实现,它应该让你朝着正确的方向前进。

我希望这对你有意义的,如果没有,随意问:)