-
-
Save sinistersnare/6367829 to your computer and use it in GitHub Desktop.
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 { | |
SpriteBatch batch; | |
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(); | |
} | |
} |
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.GL10; | |
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(GL10.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 play back | |
// a sound effect as well. | |
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(); | |
} | |
} |
GameScreen.dispose never gets called, so resources used by it will never be disposed??
@sinistersnare GameScreen.dispose()
wasn't called at all; calling super.dispose()
in Drop.dispose()
didn't help, I was getting these messages when closing desktop window:
AL lib: (WW) FreeDevice: (0x7f9185959a00) Deleting 4 Buffer(s)
Adding screen.dispose();
to Game.dispose()
fixed this issue.
Hey I am a little new to java, I just wanted to know where the setScreen function used in Drop class like:
this.setScreen(new MainMenuScreen(this));
I want to know where it is defined...because i thought 'this' keyword calls functions of the self class itself...but there seems to be no such function.
The above code needs to make a call to GameScreen's dispose method. Add
this.getScreen().dispose();inside Drop class's dispose method. Hence the last screen's dispose method will be called through Game class' dispose method.
Hi All,
How can i add stop and start button in this game screen?
Please help me.
Thanks,
Sumit
Hey @sinistersnare, the link in your description of the gist is no longer correct. The extended game tutorial can now be found at https://libgdx.com/dev/simple_game_extended/.
Thanks!
Is dispose()
inside MainMenuScreen required? It's overriden and has an empty code block.
if (Gdx.input.isTouched()) {
game.setScreen(new GameScreen(game));
dispose();
}
@sinistersnare I forked the gist and fixed some minor bugs and readability issues. Please feel free to merge my fork into this one.
https://gist.github.com/TobLoef/42f1fd370426d9ebe511/