LibGDX is a powerful video game framework . I’ve been using it for some time now with my projects. Mostly cause its free and offers good portability and libraries.
I made this game as a learning exercise using libGDX and some of its libraries .
The code is by no means perfect, but I hope it helps you get on the right track if you are looking to develop a game Using libGDX. Also, even though libGDX is a cross-platform framework, I only targeted Android and desktop for testing .
Note: I assume you have prior experience in using java and you know how to setup the ADT with eclipse .I also won’t be explaining much on libGDX or anyother libraries used (tween for animation and transitions) I’m only taking you through my own implementation . So if you get lost I recommend you read the libGDX wiki. You should also know that I’m doing this tutorial in a top to bottom manner . So I am going to implement this project starting from the beginning of the app i.e when app is launched ,its a strange way to do things since most people work on gameplay first.
By the end of this tutorial you should be able to make a game that looks like this.
Game Concept.
The game concept is simple . You have to help red (a bird) to collect as many of her eggs as possible before it gets killed by moving square blocks . I know its cheesy but it will do . The player controls red by swiping across the screen.
With our awesome design done, let’s build the game!
Creating the project.
Let’s setup our project with the gdx-setup . There are two setup’s that we can use . The newer gradle setup or an older setup .You can double click on the jar to make it run but it doesn’t work on my computer so I will be using the cmd.
If you dont know how to use the cmd to run a jar file .
- Open cmd by typing “cmd” in your search box
- Type” cd/ “to go to the begining of your hard drive and navigate to where your jar files are . use “dir” in order to see what is in the current directory.
- Once you find your jars type”java -jar name of your jar”
Then wait until your jar starts .It should look something like this.
We are not going to be using any extensions and I’m only targeting android and desktop but don’t worry if you want to add more platforms you can but you will need an emulator in order to test and run your program in Html and Ios.
Importing Project into Eclipse .
Once you import your project into eclipse it will have several errors ,so lets fix them.
- You can delete the code in your core project but leave the class declaration.
- In the android package you need to delete the line
Cfg.20 =false;
- Then right click on your android project and go to properties .On the list select Android and check the Project Build Target and click apply .
- Finally in the desktop project do the first step you did on the android project .
Time to Code.
After cleaning your code the game class should look like this after extending the Game class.This class allows us to create multiple screens.
Package com.me.mygdxgame;
Import com.badlogic.gdx.Game
Public class MygdxGame extends Game{
@override
Public void create(){}
@override
Public void dispose(){}
Now create a new package called screens and add three new classes Gamescreen ,Splashscreen,Menuscreen.They should all look like this
package com.screens;
import com.badlogic.gdx.Screen;
public class GameScreen implements Screen {
@Override
public void render(float delta) {
}
@Override
public void resize(int width, int height) {
}
@Override
public void show() {
}
@Override
public void hide() {
}
@Override
public void pause() {
}
@Overridepublic void resume() {
}
@Override
public void dispose() {
}
Now we need to tell our game class to set the Splashscreen when our game starts.
Package com.me.mygdxgame;
Import com.badlogic.gdx.Game
Public class MygdxGame extends Game{
@override
Public void create(){
setScreen (new Splashscreen (this));
}
@override
Now we setup the splashscreen so that we can display our splash as our game is loading assets . We will need the tween engine so that we can add a smooth fade in and fade out effect. In order to add tween to your project you need to again open your project setup and click update then add the tween package just like you did with libgdx.
The splashscreen class done.
Package com.screens
Public class splashscreen{
Private TweenManager manager;
Private Spritebatch batcher;
Private Sprite sprite;
Private MyGdxGame game;
Public splashscreen(MyGdxGame game){this.game=game;}
@override
Public void show(){
sprite = new Sprite(Assetloader.logo);
sprite.setColor(1,1,1,0);
float width = Gdx.graphics. getWidth();
float height = Gdx.graphics. getHeight();
float desiredWidth = width *.7f
float scale = desiredWidth / spirte.getWidth();
sprite.setSize(sprite.getWidth() * scale ,sprite.getHeight*scale);
sprite.setPosition((width/2)-(sprite.getWidth()/2),(height /2)-(sprite.getHeight()/2));
setupTween();
}
private void setupTween(){
Tween.register Accessor(Sprite.class,new SpriteAccessor());
manager = new TweenManager();
TweenCallback back = new TweenCallback(){
@override
Public void onEvent(int type,BaseTween<?>source){
game.setScreen(new MenuScreen(game));
}
};
Tween.to(spriteAccessor.ALPHA, .8f).target (1).ease(TweenEquations.easeInQuad).repeatYoyo(1,.4f).setCallback(back).setCallbackTriggers(TweenCallback.COMPLETE).start(manager);
@override
Public void render(float delta){
manager.update(delta);
Gdx.gl.glClearColor(1,1,1,1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
sprite.draw(batch);
batch.end() ;
}
Adding this code to your splashscreen will cause a ton of errors .To fix them we need to create another package tween and a dd three new classes spriteAccessor,Value,ValueAccessor.
The spriteAccessor class .
Package tween;
Public class spriteAccessor implements TweenAccessor<Sprite>{
public static final int ALPHA = 1;
@override
Public int getValues(Sprite target, int tweenType, float[] returnValues){
switch(tweenType){
case ALPHA:
returnValues[0] = target.getColor().a;
return 1;
default:
return 0;}
@override
Public void setValues(Sprite target, int tweenType,float[]returnValues){
switch(tweenType){
Case ALPHA:
target.setColor(1,1,1,newValues);
break;
}}
The value class.
package com.tween;
public class Value{
private float val = 1;
public float getValue(){
return val;
}
public void setValue(float newVal){
val = newVal;}}
The valueAccessor class.
package com.tween;
public class ValueAccessor implements TweenAccessor<Value>{
@override
Public int getValues(Values target,int tweenType,float[] returnValues){
returnValues[0] =target.getValue();
return 1;
}
@override
public void setValues(Value target , int tweenType,float[] newValues){
target.setValue(newValues[0])
And that does it for the tween package.but we still have some errors . So lets create a new package called utils we are going to create our asset loader class in here it will load all our assets at start up .
Package utils;
public class AssetLoader{
Public static Texture logo;
public static void load(){
logo =new Texture(Gdx.files.internal (“logo.png”));
}
public static void destroy(){
logo.dispose
As you can see we have imported our logo to be used by the splashscreen . You need to remember to dispose of the assets you import.Now we need to update our game class so that our assets can be loaded at start up.
Note : You need to put all your assets in the android assets folder for them to get added to your project.
Package com.me.mygdxgame;
Import com.badlogic.gdx.Game
Public class MygdxGame extends Game{
@override
Public void create(){
Assetloader.load();
setScreen (new Splashscreen (this));
}
Setting Up the World.
Now we need a world for our red bird . Create a new package called world and create a world class.This class is responsible for our game object getting updated . We also need a render class in order to draw all our objects to the screen.
Now lets put these two new classes to use . Open the Gamescreen class and update the code with the one below .The finished gamescreen class.
public class GameScreen implements Screen{
private World world;
private Renderer renderer;
private float runTime;
public GameScreen(){
float screenWidth=Gdx.graphics.getWidth();
float screenHeight=Gdx.graphics.getHeight();
float gameHeight=408;
float gameWidth=screenWidth/(screenHeight/gameHeight);
int screenY=(int)(gameHeight/2);
world=new World(screenY);
renderer=new Renderer(world,(int)gameWidth,screenY);
world.setRenderer(renderer);
}
@Override
public void show() {
}
@Override
public void render(float delta) {
runTime+=delta;
world.update(delta);
renderer.render(delta,runTime);
}
Thats it for now next time we will add code to our world class and renderer as well as adding our bird to the world.
If you have any questions or comments, feel free to let me know in the comments section.
Cheers!