libGDX screen game 多界面游戏
来源:互联网 发布:python 字典 append 编辑:程序博客网 时间:2024/05/29 16:59
Screen接口
screens对大多数的游戏都是必要的。screens包括了你使用过的ApplicationListener中的一些方法,还包括了一对新的方法:show和hide,前者在Screen获得焦点的时候被调用,后者在Screen失去焦点的时候被调用。
Game类
Game是一个抽象类,它实现了ApplicationListener接口,还有一些帮助设置和处理屏幕渲染的方法。
Screen和Game这两个对象经常被一起使用来构建一个游戏的完整结构。
下面先来看看一个Game类的代码:
package com.badlogic.drop;import com.badlogic.gdx.Game;import com.badlogic.gdx.graphics.g2d.BitmapFont;import com.badlogic.gdx.graphics.g2d.SpriteBatch;public class Drop extends Game { public SpriteBatch batch; public BitmapFont font; public void create() { batch = new SpriteBatch(); //Use LibGDX's default Arial font. font = new BitmapFont(); this.setScreen(new MainMenuScreen(this)); } public void render() { super.render(); //important! } public void dispose() { batch.dispose(); font.dispose(); }}
我们在程序开始的时候实例化了一个SpriteBatch和一个BitmapFont。创建多个可以被重用的对象是不好的。SpriteBatch对象是用来在屏幕上进行绘制的;BitmapFont使用的时候需要一个SpriteBatch来向屏幕上绘制文字。
下一步,我们设置了Game的当前Screen为MainMenuScreen对象。
一个经常犯的错误就是忘记调用super.render()。如果没有调用这个方法,你设置的这个screen就不会被渲染。
主菜单 Menu Screen
下面,让我们来看看MainMenuScreen类的细节:
package com.badlogic.drop;import com.badlogic.gdx.Gdx;import com.badlogic.gdx.Screen;import com.badlogic.gdx.graphics.GL20;import com.badlogic.gdx.graphics.OrthographicCamera;public class MainMenuScreen implements Screen { final Drop game; OrthographicCamera camera; public MainMenuScreen(final Drop gam) { game = gam; camera = new OrthographicCamera(); camera.setToOrtho(false, 800, 480); } //...Rest of class omitted for succinctness.}
在上面的代码片段中,我们创建了这个类的构造器,这个类实现了Screen接口。Screen接口并没有提供create()函数,所以我们用一个构造函数来代替。这个构造器的唯一的参数是一个当前游戏的实例(即Drop),所以我们可以访问它的方法和变量。
下一步,MainMenuScreen类中的render(float)方法:
public class MainMenuScreen implements Screen { //public MainMenuScreen(final Drop gam).... @Override public void render(float delta) { Gdx.gl.glClearColor(0, 0, 0.2f, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); camera.update(); game.batch.setProjectionMatrix(camera.combined); game.batch.begin(); game.font.draw(game.batch, "Welcome to Drop!!! ", 100, 150); game.font.draw(game.batch, "Tap anywhere to begin!", 100, 100); game.batch.end(); if (Gdx.input.isTouched()) { game.setScreen(new GameScreen(game)); dispose(); } } //Rest of class still omitted...}
这里的代码是相当健壮的,除了我们需要调用game的SpriteBatch和BitmapFont实例,而不是创建我们自己的。game.font.draw(SpriteBatch,String,float,float),这个指定了如何在屏幕上进行文字的绘制。
然后,我们检测了屏幕是否被触摸,如果是,那么我们使用setScreen方法把Game的Screen设置成GameScreen,然后释放了当前screen的资源。
游戏界面 Game Screen
这里面的代码几乎和上篇博客中的Drop中的代码一致:
package com.badlogic.drop;import java.util.Iterator;import com.badlogic.gdx.Gdx;import com.badlogic.gdx.Input.Keys;import com.badlogic.gdx.Screen;import com.badlogic.gdx.audio.Music;import com.badlogic.gdx.audio.Sound;import com.badlogic.gdx.graphics.GL20;import com.badlogic.gdx.graphics.OrthographicCamera;import com.badlogic.gdx.graphics.Texture;import com.badlogic.gdx.math.MathUtils;import com.badlogic.gdx.math.Rectangle;import com.badlogic.gdx.math.Vector3;import com.badlogic.gdx.utils.Array;import com.badlogic.gdx.utils.TimeUtils;public class GameScreen implements Screen { final Drop game; Texture dropImage; Texture bucketImage; Sound dropSound; Music rainMusic; OrthographicCamera camera; Rectangle bucket; Array<Rectangle> raindrops; long lastDropTime; int dropsGathered; public GameScreen(final Drop gam) { this.game = gam; // load the images for the droplet and the bucket, 64x64 pixels each dropImage = new Texture(Gdx.files.internal("droplet.png")); bucketImage = new Texture(Gdx.files.internal("bucket.png")); // load the drop sound effect and the rain background "music" dropSound = Gdx.audio.newSound(Gdx.files.internal("drop.wav")); rainMusic = Gdx.audio.newMusic(Gdx.files.internal("rain.mp3")); rainMusic.setLooping(true); // create the camera and the SpriteBatch camera = new OrthographicCamera(); camera.setToOrtho(false, 800, 480); // create a Rectangle to logically represent the bucket bucket = new Rectangle(); bucket.x = 800 / 2 - 64 / 2; // center the bucket horizontally bucket.y = 20; // bottom left corner of the bucket is 20 pixels above // the bottom screen edge bucket.width = 64; bucket.height = 64; // create the raindrops array and spawn the first raindrop raindrops = new Array<Rectangle>(); spawnRaindrop(); } private void spawnRaindrop() { Rectangle raindrop = new Rectangle(); raindrop.x = MathUtils.random(0, 800 - 64); raindrop.y = 480; raindrop.width = 64; raindrop.height = 64; raindrops.add(raindrop); lastDropTime = TimeUtils.nanoTime(); } @Override public void render(float delta) { // clear the screen with a dark blue color. The // arguments to glClearColor are the red, green // blue and alpha component in the range [0,1] // of the color to be used to clear the screen. Gdx.gl.glClearColor(0, 0, 0.2f, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // tell the camera to update its matrices. camera.update(); // tell the SpriteBatch to render in the // coordinate system specified by the camera. game.batch.setProjectionMatrix(camera.combined); // begin a new batch and draw the bucket and // all drops game.batch.begin(); game.font.draw(game.batch, "Drops Collected: " + dropsGathered, 0, 480); game.batch.draw(bucketImage, bucket.x, bucket.y); for (Rectangle raindrop : raindrops) { game.batch.draw(dropImage, raindrop.x, raindrop.y); } game.batch.end(); // process user input if (Gdx.input.isTouched()) { Vector3 touchPos = new Vector3(); touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0); camera.unproject(touchPos); bucket.x = touchPos.x - 64 / 2; } if (Gdx.input.isKeyPressed(Keys.LEFT)) bucket.x -= 200 * Gdx.graphics.getDeltaTime(); if (Gdx.input.isKeyPressed(Keys.RIGHT)) bucket.x += 200 * Gdx.graphics.getDeltaTime(); // make sure the bucket stays within the screen bounds if (bucket.x < 0) bucket.x = 0; if (bucket.x > 800 - 64) bucket.x = 800 - 64; // check if we need to create a new raindrop if (TimeUtils.nanoTime() - lastDropTime > 1000000000) spawnRaindrop(); // move the raindrops, remove any that are beneath the bottom edge of // the screen or that hit the bucket. In the later case we increase the // value our drops counter and add a sound effect. Iterator<Rectangle> iter = raindrops.iterator(); while (iter.hasNext()) { Rectangle raindrop = iter.next(); raindrop.y -= 200 * Gdx.graphics.getDeltaTime(); if (raindrop.y + 64 < 0) iter.remove(); if (raindrop.overlaps(bucket)) { dropsGathered++; dropSound.play(); iter.remove(); } } } @Override public void resize(int width, int height) { } @Override public void show() { // start the playback of the background music // when the screen is shown rainMusic.play(); } @Override public void hide() { } @Override public void pause() { } @Override public void resume() { } @Override public void dispose() { dropImage.dispose(); bucketImage.dispose(); dropSound.dispose(); rainMusic.dispose(); }}
上面的代码和Drop几乎一致,只不过我们使用构造器来代替了create()方法。
上面的代码中也在左上角添加了一个字符串,用来跟踪有多少个雨滴被收集到了。
上面就是你所要知道的关于Game和Screen的知识,这样就可以来构建一个拥有多界面的游戏了。
0 0
- libGDX screen game 多界面游戏
- Libgdx专题系列:对象篇 Game游戏控制中心 Screen 场景
- Libgdx之Game场景切换Screen
- (libgdx小结)切换游戏界面
- libgdx 同步screen的dispose和game的dispose
- libgdx游戏引擎教程(五)多游戏界面的实现(一)附源码
- libgdx游戏引擎教程(六)多游戏界面的实现(二)附源码
- libgdx游戏引擎(七)之多游戏界面的实现
- A simple libgdx game (一个简单的游戏)
- libgdx 像素鸟 游戏 go on 第一个欢迎界面
- 【libgdx】Learning Libgdx Game Development初探
- Game 和Screen分析
- libgdx游戏引擎教程
- libgdx游戏引擎教程
- libgdx,android游戏框架
- Libgdx开发ios游戏
- libgdx游戏引擎(一)
- (libgdx小结)游戏地图
- Qt移动应用开发(七):QML与Java的交互
- 《算法艺术与信息学竞赛》(刘汝佳 黑皮书)在pku等网站上的题目
- POJ 3067 Japan
- hdu 3255 Farming (线段树扫描线球体积并)
- java.util包(二)
- libGDX screen game 多界面游戏
- linux 内存管理3
- 并查集总结
- ELF文件解析之 ELF头 程序头表 节头表-补充之前文章代码 只支持32位 出版
- 编程算法 - 最长上升子序列问题 代码(C)
- STL_set——set::size
- 01背包水题篇之HDU3466——Proud Merchants
- python常用的可框架
- HBase Random Read性能测试