libgdx demo 分析:<superjumper>

来源:互联网 发布:物流配货软件 编辑:程序博客网 时间:2024/05/17 04:39

1. GameObject

GameObject是游戏内物体的基类,派生出Castle(关卡结束时的城堡)、Coin(硬币)、Spring(弹簧)、DynamicGameObject(动态物体)。

DynamicGameObject又派生出Bob(玩家角色)、Platform(用来跳跃的踏板)、Squirrel(松鼠敌人)。


这几个类型都没有任何涉及Render的函数,算是数据和表现的分离。

其中GameObject本身只有两个成员变量:Vector2 position和Rectangle bounds,三种静态物体类Castle、Coin和Spring也很简单,只有Coin多出一个成员变量float stateTime,想必是作动画计时用(当玩家角色触碰硬币后,硬币要播放一个动画)。

DynamicGameObject多出两个成员变量:速度和加速度。

Bob的有三种逻辑状态:BOB_STATE_JUMP(上升ing)、BOB_STATE_FALL(下落ing)、BOB_STATE_HIT(被小松鼠击中,即死亡状态)。

它还有一个update成员函数,在其中刷新速度、坐标、上升或下落状态的切换。还有三个成员hitSquirrel, hitPlatform, hitSpring分别用在与松鼠、踏板、弹簧发生碰撞时调用。


Platform有两种类别:PLATFORM_TYPE_STATIC(静止踏板)、PLATFORM_TYPE_MOVING(会左右移动的踏板)。

有两种逻辑状态:PLATFORM_STATE_NORMAL(普通状态)、PLATFORM_STATE_PULVERIZING(正在碎裂的状态)。

它也有一个update函数,在其中刷新速度、坐标。还有一个pulverize函数用在开始碎裂时调用(主角踩过踏板之后,踏板即开始碎裂)。


2.Game和Screen

先看Screen,它一共有以下几种具体派生类:GameScreen(游戏界面)、HelpScreen(帮助界面,还有HelpScreen2,3,4,5)、HighscoreScreen(最高分界面)、MainMenuScreen(主菜单界面)。

Game继承自ApplicationListener,有一个派生类SuperJumper。


Screen有Game game的引用,Game也有当前激活的界面Screen screen的引用。

在游戏界面需要切换回主菜单界面时,就要调用game.setScreen


Screen定义了五个虚函数,update, present, pause, resume, dispose。

而Game,拥有引擎提供的create, resume, render, resize, pause, dispose事件响应函数。

Game::create中,通过getStartScreen来初始化screen,这里的getStartScreen也是个虚函数,SuperJumper::getStartScreen里会实现该函数并返回MainMenuScreen,使游戏一开始时进入主菜单界面。

Game::render中,先调用screen.update对游戏中的物体和角色的属性进行刷新,再调用screen.present进行显示。


GameScreen(游戏界面)有一个World world的引用,在GameScreen::update中,会调用world.update来刷新整个场景,然后还会根据world.state来改变GameScreen::state的值。

而World类,就是整个游戏场景的管理者。它维护着所有GameObject类的实例,包括玩家主角、踏板、松鼠、钱币、城堡等。在World::generateLevel中会随机生成场景中的踏板、松鼠、钱币。在World::update中会刷新所有动态Obj的状态、坐标、速度等属性。

GameScreen(游戏界面)还有一个WorldRender render的引用。在GameScreen::present中调用render.render,来渲染整个场景。

GameScreen中还有一个OrthographicCamera guiCam用来渲染UI,而WorldRender中有一个OrthographicCamera cam用来渲染场景。

在处理用户输入时,superjumper的做法很简单,把鼠标点击或触屏的坐标点通过guiCam.unproject转换到UI空间坐标,然后检测这些坐标是否在指定UI的矩形范围内。


原创粉丝点击