android - 制作背景滚动游戏的最佳方法?

标签 android scroll game-engine game-physics 2d-games

我想做一个2D游戏,背景和精灵(视图)在屏幕上移动。

我想用滚动的方式制作游戏。我的意思是用户必须在屏幕顶部看到地平线,该地平线充满了屏幕尺寸的30%。地面必须滚动,并且必须为屏幕尺寸的70%。例如,如果我将汽车放在地面上,则汽车必须驶入一条正在滚动的道路,并且必须在屏幕上方的道路上方看到天空(地平线),并填满屏幕的30%。

我正在Google中搜索有关滚动游戏的内容,但找不到通过地平线实现这种滚动地面游戏的方法。

任何想法和方法都会被磨碎,我只是在研究如何做到这一点。

谢谢

最佳答案

这种效果可以通过多种方式来实现,这是我可以想到的一个非常基本的示例。

首先为您的地平线创建背景图像-带有阳光的蓝天会很好。现在为背景创建一些细节图像,例如云朵和小鸟。它们可以在背景图像上从左到右移动(反之亦然)。在渲染代码中,您将首先渲染“背景”图像,然后渲染“详细”图像。确保背景图像覆盖屏幕的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值,但我将由您自己决定。

虽然这根本不是一个完整的实现,但它应该使您朝正确的方向前进。

我希望这对您有意义,如果没有,请随时提出:)

关于android - 制作背景滚动游戏的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16911206/

相关文章:

c++ - 尝试在 C++ 中实现状态管理器时出现链接错误

android - gradle-android-scala-插件 : error after following the tutorial

1 个 fragment 布局上的 Android 多个 RecyclerView(水平和垂直)

java - 测试调用静态包装器方法的类

javascript - 是否可以将滚动事件的上下文设置为 `document.body` 而不是 `window` ?

networking - 什么是点对点游戏中的同步?

Android 2D图形游戏引擎?

Android SDK 不更新已安装的包

android imageview滚动显示完整的高质量图像

Android:滚动显示 WebView 的示例