libgdx游戏引擎开发笔记(十)SuperJumper游戏例子的讲解(篇四)---- 主游戏界面内部框架编写...
上一讲,我们已经实现了点击play进入游戏界面但仅仅是个黑屏
今天,我们就试着编写代码让它出现游戏的一些简单场景。还是在上一讲的代码基础上,我们创建两个类:World 和 WorldRenderer
1.Word类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package com.zhf.mylibgdx;
/**
* 统一管理世界中各个部分
* @author ZHF
*
*/
public class World {
/**世界监听器接口**/
public interface WorldListener {
//跳跃
public void jump ();
//高跳
public void highJump ();
//碰撞
public void hit ();
//收集金币
public void coin ();
}
//宽和高
public static final float WORLD_WIDTH = 10 ;
public static final float WORLD_HEIGHT = 15 * 20 ;
//状态
public static final int WORLD_STATE_RUNNING = 0 ; //运行
public static final int WORLD_STATE_NEXT_LEVEL = 1 ; //下一关
public static final int WORLD_STATE_GAME_OVER = 2 ; //游戏结束
//世界监听器
public WorldListener listener;
public World(WorldListener listener) {
this .listener = listener;
}
}
|
2.WorldRenderer类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
package com.zhf.mylibgdx;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
/**
* 用来把每个对象关联相应的图片资源,同时控制相机,实现动画。
* @author ZHF
*
*/
public class WorldRenderer {
//宽和高
static final float FRUSTUM_WIDTH = 10 ;
static final float FRUSTUM_HEIGHT = 15 ;
World world; //世界
OrthographicCamera cam; //相机
SpriteBatch batch; //用于绘画
TextureRegion background; //背景图片
public WorldRenderer(SpriteBatch batch, World world) {
this .world = world;
//OrthographicCamera 被定义成 宽度为10,高度为15,同样的也把相机对准中心点。
this .cam = new OrthographicCamera(FRUSTUM_WIDTH, FRUSTUM_HEIGHT);
//它指定了和屏幕一样大小的 OrthographicCamera ,并把相机对准屏幕的中心。
this .cam.position.set(FRUSTUM_WIDTH / 2 , FRUSTUM_HEIGHT / 2 , 0 );
this .batch = batch;
}
/**渲染**/
public void render () {
cam.update();
//它的作用都是通过把映射矩阵绑定给SpritBatch,告诉SpritBatch怎么去绘制图形
batch.setProjectionMatrix(cam.combined);
//渲染背景
renderBackground();
//渲染游戏中各种元素(Bob,跳板,松鼠,弹簧。。)下一讲中会具体讲到
// renderObjects();
}
/**渲染背景**/
public void renderBackground () {
batch.disableBlending();
batch.begin();
//绘制背景
batch.draw(Assets.backgroundRegion, cam.position.x - FRUSTUM_WIDTH / 2 , cam.position.y - FRUSTUM_HEIGHT / 2 , FRUSTUM_WIDTH,
FRUSTUM_HEIGHT);
batch.end();
}
}
|
接下来,就是在GameScreen中调用这两个类,完成框架的连接搭建。
声明:
1
2
3
4
|
//游戏场景
World world;
WorldRenderer renderer;
WorldListener worldListener;
|
实例化:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//实例化场景
worldListener = new WorldListener() {
@Override
public void jump () {
// Assets.playSound(Assets.jumpSound);
}
@Override
public void highJump () {
// Assets.playSound(Assets.highJumpSound);
}
@Override
public void hit () {
// Assets.playSound(Assets.hitSound);
}
@Override
public void coin () {
// Assets.playSound(Assets.coinSound);
}
};
world = new World(worldListener);
renderer = new WorldRenderer(batcher, world);
|
调用:在GameScreen的draw()方法中调用
1
2
|
//绘制游戏主场景
renderer.render();
|
运行一下代码,发现我们的黑屏没有了!
这里我需要再啰嗦几句,相机的掌握是比较抽象的,WorldRenderer 中 OrthographicCamera的定义就的得先说说游戏是怎么进行的:为什么要把 WorldRender中的OrthographicCamera 定义10 *15,实际上就是把屏幕320*480 映射成每个单位为32像素。这是因为游戏中的素材基本都是基于32像素为单位构建,同时屏幕的分辨率也可以被分解成以32像素为单位。
游戏中,我们的主角Bob会不断进行跳跃,但是他的最高点始终不会超过屏幕的中点,他停留在最高点的过程中会通过移动所有的物体来造成他看上去好像在往上跳,实际上他一直停留在屏幕中点的高度。同时,我们需要为每一关定义一个长度,也就是,需要‘跳’多高才能到达城堡,顺利通关。并且要准备好整一关的过程中,哪里应该出现什么物体,然后根据Bob到达的高度不停的切换这些物体。
想象一下有一段被垂直放置的胶卷,这就是我们的一个关卡,也就是一个World,它准备好了一个关卡的长度,并且设置好了所有的物体。而我们的Bob和WorldRender中的OrthographicCamera 一开始被放置在胶卷的底部,Bob开始不断的跳跃,当超过屏幕中点的高度时则OrthographicCamera 会被往上移动,并且所有进入OrthographicCamera 的物体都会被绘制。直到到达最高点,或Bob死亡。
所以 WorldRender中的OrthographicCamera 被设置成 10 *15 。
并且而在World类中,定义了两个变量:
public static final float WORLD_WIDTH = 10;
public static final float WORLD_HEIGHT = 15 * 20;
同样的关卡的宽带也被定义为10个单位,与WorldRender中的一致(因为我们不需要在X方向进行移动);而高度定义成15*20 这就是一关的长度,也就是Bob要'跳'的高度。
从上面的分析可以得出,分别设置两个不同 OrthographicCamera ,就是因为不同场景的需求。并且 在WorldRender中的OrthographicCamera 其实也可以被设置成 320*480 只是为了简便,才把单位设为32像素变成 10*15。 所以不管是哪个OrthographicCamera它提供的只是一个映射信息,而这个映射的信息真正的使用者是SpriteBatch,它会根据映射信息的不同来决定究竟要把图片绘制在什么位置上,以及该不该绘制这些元素。
即使GameScreen和WorldRender使用的是同一个SpriteBatch,只要在恰当的时候绑定相应的投影矩阵,两者是互不影响的。
后面说了好多,全是文字,大家先理解着,在下一讲中我们将加入各种对象:Bob、跳板,弹簧、松鼠、金币、城堡,以及源码是如何定义他们的。
源码下载:http://down.51cto.com/data/895165
本文转自zhf651555765 51CTO博客,原文链接:http://blog.51cto.com/smallwoniu/1263323,如需转载请自行联系原作者
libgdx游戏引擎开发笔记(十)SuperJumper游戏例子的讲解(篇四)---- 主游戏界面内部框架编写...相关推荐
- 【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由zhm ...
- 【转】【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI
原文连接:http://www.cnblogs.com/dyllove98/archive/2012/04/07/2461865.html#commentform 我们常常听闻AI(Artificia ...
- 【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI .
本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7434317 作者:毛星云 邮箱: happy ...
- [原]【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI
本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7434317 作者:毛星云 邮箱: happy ...
- 游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI
我们常常听闻AI(Artificial Intelligence人工智能)这个名词,比如Dota里面的AI地图.写这篇文章的时候,最新版的Dota AI是6.72f,估计过几天6.73的AI也要出来了 ...
- 简单游戏引擎开发笔记(一)
---恢复内容开始--- 一.游戏引擎简介 1.概念 游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些互交式实时图像应用程序的核心组件.这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在 ...
- libgdx游戏引擎开发笔记(一)引擎介绍和Helloworld
做Android快一年了,项目也做了四五个,感觉没什么动力向前,思绪整理了一段时间,决定转入Android游戏开发,同时发现了一款强大的游戏引擎libgdx,在此边学边整理,好记性不如烂笔头嘛! ...
- 【Visual C++】游戏开发笔记十二 游戏输入消息处理(一) 键盘消息处理
相信大家都熟悉<仙剑奇侠传98柔情版>的人机交互方式,用的仅仅是键盘.在那个物质并不充裕的时代,一台配置并不高的电脑,一款名叫<仙剑奇侠传>的游戏,却能承载一代人对梦想的追逐. ...
- 【Visual C++】游戏开发笔记十八 游戏基础物理建模(一) 匀速与加速运动
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7496200 作者:毛星云 邮箱: h ...
最新文章
- java定义一个类计算圆的半径,C++编程:定义一个圆类要求属性为半径,操作为计算圆的周长和面积...,java编程:定义一个圆类,属性为半径,方法为对输入的半径计...
- ZOJ 3700 Ever Dream(模拟)
- 数据库连接jdbc理解
- android上传图片被旋转,input上传照片旋转解决办法
- 如何设计安全的用户登录功能
- VS2017编译UE4.19.2报错
- SQL Server数据库迁移最佳实践,可降低风险和停机时间
- perl linux 独立运行,Perl脚本打包为独立执行程序
- 基恩士plc-EtherCAT三十一轴,控制案例程序(包含plc程序/人机界面/BOM表)
- Android Studio 制作.9图片时无法拖拉,导致没法办制作.9图片
- Python编程之找完数
- Java项目:调查问卷管理系统(java+SpringBoot+Vue+ElementUI+Maven+mysql)
- 短视频入门,第一步应该如何做?超详细,3分钟学会轻松上手
- python中0x3f_单片机中0x3f代表什么意思
- 逻辑表达式 -- 对蕴含的理解(举例更清晰、明白哦)
- docker实践-oxidized网络设备自动备份部署
- 爆炸的符卡洋洋洒洒(dp)
- 洗稿,技术上怎么判断文章相似性?
- 【历史上的今天】1 月 15 日:维基百科上线;信息安全大师出生;英特尔推出 Viiv
- 如何使用IMEI号码追踪丢失的安卓手机
热门文章
- Maven,在pom.xml配置JDK 9版本。
- Github 王炸功能!Copilot 替代打工人编程?
- cf914D. Bash and a Tough Math Puzzle(线段树)
- flex 布局以及样式
- 8月19学习练习[两三个TableView并排显示]
- 关于Android studio找不到sqlite数据库的解决方法
- 系统架构:Web应用架构的新趋势 前后端分离的想法
- Leetcode: Palindrome Partition I II
- 《转》CXF WebService 开发文档-目录索引
- SBO中的manager用户已锁定