Subscribe to GameFromScratch on YouTube Support GameFromScratch on Patreon
22. March 2015

 

For those of you that like living on the bleeding edge, RC2 of the upcoming Blender 2.7 is now available.  If nothing else it gives you an idea of what is coming in Blender 2.74.

 

Splash 274.png

 

 

Cycles Rendering

Rl pointiness.png

  • Several improvements for BVH like making it watertight, solving several precision issues and reducing noise
  • Optimizations:
    • Black world backgrounds are now removed from the shader graph, resulting in great speed improvements
    • Various (and great!) memory optimizations

 

  • Nodes:
    • New Pointiness attribute for the Geometry node
    • Control texture space of one object by another

 

 

User Interface

Viewport FX release notes.png

  • New Viewport Compositing brings Ambient Occlusion and Depth of Field right into the Viewport!
  • View-depth can now be picked using an Eyedropper
  • Outliner:
    • An Orphaned Datablocks Mode was added for datablock management
    • Deleting of entire object hierarchies
    • Drag&Drop objects to groups

 

  • The Node Editor can now show text-blocks in frames
  • Customizable camera safe areas
  • And more!

 

Modeling

Rl split normals.png

  • Support for Custom Normals was added
  • Transferring data layers between meshes is now possible thanks to a new Mesh Data Transfer operator and modifier
  • Tools:
    • UV handling for Edge- and Vertex Slide was improved
    • Inverse-square blending for proportional-edit-mode
    • "Fit Camera View" now works for orthographic cameras as well
    • A "Split Concave Faces" tool to ensure a convex geometry was added

 

 

Particles

07 shape cut AFTER.png

  • Hair dynamics and editing tools were improved massively:
    • Support for hair collission with meshes
    • Simulation no happens using volumetric calculations for more realistic results
    • Strand bending uses a more realistic approach
    • Controlling of child hair shapes using curve widgets
    • New "Spiral" kink mode to generate spirals at hair ends
    • Toggle buttons for render and viewport visibility were added to the particle settings in the Properties Editor
  • And much more!

 

Sculpting/Painting

Release notes cavity.png

  • Brushes/Strokes:
    • Improvements to rake and random mapping
    • Line strokes now support constrains to 45 degree increments
  • Texture Painting:
    • Support for dithering for painting on byte images
    • A new tool "Cavity Mask" was added that creates masks based on mesh cavities or hills
  • And more!

 

Freestyle NPR Rendering

Blender 274 Freestyle BNPR NY2015.png

  • A great memory consumption optimization in stroke rendering was done
  • And more!

 

Animation

Rl anim.png

  • Grease Pencil:
    • New Editing tools like copy & paste strokes, duplicating active layer, ...
    • Enable eraser on the fly while drawing with "Continuous Drawing"
    • Various UI tweaks such as color swatches for Stroke and Fill colors
    • Grease Pencil data layers are now shown in the Outliner

 

  • Improvements to the action management to reduce the cases where unused actions are deleted
  • Pasting keyframes can now be done flipped
  • Using a new "Follow" option, the animation editors can now follow the time indicator
  • And more!

 

Game Engine

  • Physics:
    • The first contact point of colliding can now be accessed from Python
    • Usability improvements
  • New option "Lock Z Velocity" to avoid micro-jumping
  • And more!

 

Add-ons

  • A new Auto Tile Size Add-on helps setting up the fastest tile size for Cycles rendering
  • Import images as planes now works for Cycles as well
  • POV-Ray Renderer now supports volumetric rendering
  • FBX and OBJ now support custom normals import
  • New Python API functions
  • And more!

 

More Features

There are a lot more features that are new in Blender 2.74, so make sure to check them out!

 

It may be a minor thing, but that “fit camera view” fix is certainly going to make my life a happier thing.  Full release notes are available here.  You can download the RC2 release here.  Or wait 2-4 weeks for the full release.

Art News


19. March 2015

 

In this tutorial we are going to take a look at two key topics in Godot game development, Collision Detection and Physics Simulations.  Collision Detection is simply detecting if two objects overlap.  Physics on the other hand simulates the movement and interaction of game objects based on physical properties.  This of course also includes handling collisions.  There is also a video of this tutorial and this might be one of those times, due to all of the motion in the results, that you may in fact want to refer to the video even if you prefer text based tutorials.  So if you struggle to understand what I am talking about here, be sure to quickly check the video, it may have the answer.

 

You can watch the video here, or embedded below.

 

Checking for Collisions

 

Let’s start with checking collisions between two objects, in this case, two different Sprite objects.  I have created the following scene:

image

It’s simply two sprite objects side by side.  I then attached a script to the one on the left.  This script updates the position of the left sprite until a collision occurs, at which point it resets to the beginning and does it all over again.  Like so:

anim

 

Let’s take a look at the script now:

extends Sprite

var start_pos = Vector2()
var box1 = null
var box2 = null

func _ready():
   set_process(true)
   start_pos = get_pos()
   box1 = RectangleShape2D.new()
   box2 = RectangleShape2D.new()



func _process(delta):
   # Get a reference to the other sprite
   var sprite2 = get_node("/root/SceneRoot/Sprite 2")
   
   # Update our location
   self.move_local_x(0.1)
   
   # set the boundaries of each RectangleShape2D to those of the texture making up our sprite
   # values are relative to center, thus half width and height
   box1.set_extents(Vector2(self.get_texture().get_size().width/2,self.get_texture().get_size().height/2))
   box2.set_extents(Vector2(
sprite2.get_texture().get_size().width/2,sprite2.get_texture().get_size().height/2)) #Now check to see if box1 at sprite1's pos collided with box2 and sprite2's position if(box1.collide(get_transform(),box2,sprite2.get_transform())): set_pos(start_pos) # it did, so reset position to beginning, what's old is new again!

Essentially what you are doing here is creating a RectangleShape2D using the boundaries of each Sprite’s texture image.  AKA, creating a rectangle the size of the texture.  You then check if box1 at the transformed position of Sprite1 collides with box2 at the transformed position of Sprite2.  Of course, since they both use the same texture map, you don’t actually need to create two different RectangleShape2D objects!  Also, since the size never changes, you don’t actually need to set_extents() in process().  There are a number of simple shape classes that can be used to check for collisions such as concave and convex polygons, circles and even rays ( for mouse picking ).

 

This is one way to check for simple collisions.  However you will quickly find it gets unwieldy as you add more and more objects and have to check them against each other.  Fortunately the physics engine makes this process a whole lot easier.

 

Physics Simulations

 

Now that we looked at a way to test for collisions, lets move on and discuss the physics system.  Basically a physics engine simulates movement using complex math, calculating how items interact with each other and external forces like gravity.  The physics simulation then updates, either on a fixed or per frame basis, a set of objects with the new locations calculated by the simulation.  You then update your visible game objects positions accordingly.  In Godot however, you don’t generally need to perform that last step, it’s done automatically.

 

Let’s start with an extremely simple example, gravity.

 

First we start by creating a RigidBody2D node:

image

 

Next, parented to the RigidBody2D node, create a sprite node.  I am using the default icon.png that comes with Godot.  Your heirarchy should look like this:

image

 

… and that’s it.  You have now created a physics object that gravity will be applied to.  Run your game and you should see:

anim2

 

Now let’s pause a second to see exactly what is happening here.

 

First, let’s start with the RigidBody2D part…  There are three kinds of physics objects you can use in your 2D game world:

image

The biggest difference is how they are dealt with by the simulation.

 

A RigidBody can be thought of as a typical physics object.  It’s the most processing intensive, but it’s also got the most functionality.  Unless you have a reason otherwise, if something needs physics, it’s probably a rigid body.  This is a physics object that can move, can collide with other objects and itself by collided with.

 

Next up is the StaticBody2D.  This is an unmoving object in your world.  Basically things can hit it, it can be hit, but it doesn’t move.  It also takes a lot less processing power to handle.  Generally things like the world, or invisible but unmoving triggers will be static bodies.

 

Finally is KinematicBody2D.  This is a physics object that doesn’t have the range of functionality of a rigid body ( for example, you cant apply force to it ), but can move and can collide with other physics objects.  The biggest thing about a Kinematic body is that its motion is generally controlled directly by you no the physics simulation.  Generally this is the character sprite.  You want the physics simulation to react to its actions, but you generally control those movements directly in code.

 

So, those are the three major types of physics objects, now let’s look at global settings.  You notice how gravity is being applied to our simulation automatically?  Where is this coming from?

 

The answer is trust ole project settings:

image

 

So… what do those values means?  Well this is one of the nice things about working entirely in Godot.  In many physics engines like Box2D, you work in meters, then have to translate from meters to pixels when transforming your sprites.  In godot, these values are in pixels.  So a gravity value of 98 means gravity moves at 98 pixels per second.

 

Now what about Rigid Body settings?  Well let’s take a look:

image

 

Mass Friction and Bounce are the most commonly used values.  Hey, aren’t mass and weight the same thing?  Nope, not exactly.  Mass is the amount of “stuff” that composes and object, while weight is the amount that stuff weighs.

 

Consider the classic question “What weighs more, a ton of bricks or a ton of feathers?”  Both objects would have identical weights ( one ton ), but vastly different masses.  In some ways it can be easier to think of mass instead as density. 

 

Friction on the other hand is how it slides in contact with another surface.  Picture sliding a mouse down a surface on a 45 degree angle.  If one surface was rubber and the other was glass, the mouse is going to move at vastly different rates.  Friction controls this.   Bounce is often refered to as restitution.  This is the amount of, well, bounce in an object.  Or how much it reacts to a collision.  A rubber ball has a higher “Bounce” value, while a brick is almost 0.  Another key concept is sleep, this is the ability to turn the Rigid Body off during calculations, determines if it is or isn’t used as part of the over all simulation.  Linear and Angular velocity finally are the default movement values of the object.

 

Collisions Physics Style

 

Now let’s take a look at how collisions are handle using a Physics engine.  Let’s change the above scene to add another physics item, this time a static body, like so:

image

 

The top sprite has a RigidBody2D as it’s parent.  The bottom has a StaticBody2D for a parent.  Now we need to define a collision volume for each one, just like we did back at the beginning.  Simple add a new node to each Body ( not the sprite, it’s parent! ) of type CollisionShape2D, so your hierarchy looks like this:

image

 

Then for each CollisionShape2D, you need to pick a bounding shape.  With the CollisionShape2D selected in Inspector simply select the Shape dropdown and pick the one that is best suited:

image

Finally, size it so it covers the collide-able portions of your sprite:

image

 

Now when you run the game:

anim3

 

Tada!  Collisions calculated by the physics engine.  Now you can play around a bit with the physical properties of your Rigid Body and see how it reacts differently.

 

In this case we used a simple box for our collision detection, and that works well for box shaped objects.  But if your object isn’t box or circle shaped, what do you do?  Enter CollisionPolygon2D:

image

 

It works exactly the same as CollisionShape2D, but you can define the shape yourself.  Remove one of the CollisionShape2D nodes and replace it with a CollisionPolygon2D node.  With the Collision node selected, you will notice a new option in the 2D window:

image

 

Click the pen, and you can now draw a polygon around your object:

image

 

And once closed:

image

A MUCH more accurate representation of your object for collisions!

 

Kinematic Nodes

 

Finally let’s look at KinematicBody2D objects.  These are special in that the physics engine doesn’t control their motion, you do.  They can however collide with entities in the physics world.  Generally speaking, this is how you would create your character.  Unlike RigidBodies you cannot apply forces or impulses.  Instead you move them directly.  Let’s create a simple example:

 

First add a KinimaticBody2D to your scene, add a sprite and collision shape for it, like so:

image

 

Now apply a script to the KinematicBody2D with the following code:

extends KinematicBody2D



func _ready():
   set_process(true)
   
func _process(delta):
   move(Vector2(0.04,0))

We are simply moving the body by 0.4 pixels per update.  As you can see from the results however collisions will occur between your game code controlled object and the physics simulation:

anim4

 

There is obviously quite a bit more to the physics simulation.  You can create joints and springs and define what objects collide with other objects, but that covers most of the basics.  Be sure to watch the video if you struggle, as it covers things in a bit more detail!

 

The Video

 

Programming


17. March 2015

 

MonoGame, the popular cross platform spin-off the now dead XNA framework has just released version 3.3.

 

For the official release notes:

 

This is a short summary of all the changes in this release:

  • Support for vertex texture fetch on Windows.
  • New modern classes for KeyboardInput and MessageBox.
  • Added more validation to draw calls and render states.
  • Cleaned up usage of statics to support multiple GraphicsDevice instances.
  • Support Window.Position on WindowsGL platform.
  • Reduction of redundant OpenGL calls.
  • Fullscreen support for Windows DX platform.
  • Implemented Texture2D SaveAsPng and SaveAsJpeg for Android.
  • Improved GamePad deadzone calculations.
  • We now use FFmpeg for audio content building.
  • BoundingSphere fixes and optimizations.
  • Many improvements to Linux platform.
  • Various fixes to FontTextureProcessor.
  • New Windows Universal App template for Windows Store and Windows Phone support.
  • Many fixes to reduce garbage generation during runtime.
  • Adding support for TextureFormatOptions to FontDescriptionProcessor.
  • XNA compatibility improvements to FontDescriptionProcessor.
  • Resuscitated the unit test framework with 100s of additional unit tests.
  • BoundingFrustum fixes and optimizations.
  • Added VS2013 project templates.
  • Moved to new MonoGame logo.
  • Added MSAA render target support for OpenGL platforms.
  • Added optional content compression support to content pipeline and runtime.
  • TextureCube content reader and GetData fixes.
  • New OpenAL software implementation for Android.
  • Xact compatibility improvements.
  • Lots of Android fixes and improvements.
  • Added MediaLibrary implementation for Android, iOS, Windows Phone, and Windows Store.
  • Added ReflectiveWriter implementation to content pipeline.
  • Fixes to Texture2D.GetData on DirectX platforms.
  • SpriteFont rendering performance optimizations.
  • Huge refactor of ModelProcessor to be more compatible with XNA.
  • Moved NET and GamerServices into its own MonoGame.Framework.Net assembly.
  • Runtime support for ETC1 textures for Androud.
  • Improved compatibility for FBXImporter and XImporter.
  • Multiple SpritBatch compatibility fixes.
  • We now use FreeImage in TextureImporter to support many more input formats.
  • MGFX parsing and render state improvements.
  • New Pipeline GUI tool for managing content projects for Windows, Mac, and Linux desktops.
  • New implementation of content pipeline IntermediateSerializer.
  • All tools and content pipeline built for 64-bit.
  • New documentation system.
  • Implement web platform (JSIL) stubs.
  • Lots of fixes to PSM.
  • Added Protobuild support for project generation.
  • Major refactor of internals to better separate platform specific code.
  • Added MGCB command line tool to Windows installer.

 

Monogame runs on Windows, Mac and Linux and is available for download here.  They have also announced that they are going to a more frequent release schedule, something I always view as a good move.

News


16. March 2015

 

This post popped up on reddit a few days back and didn’t really get a ton of interest.  I almost missed it myself, but I am glad I didn’t.  Off and on the last couple days, I’ve been playing around with BDX and I have to say, there is the kernel of something really cool here!

 

First off, let me say BDX is really young and it shows some times.  You do some things wrong and you are left with either a crashing game or a cryptic Python error message.  Armature support is currently missing as are a few other features I looked for.  The community is currently small and we are talking a 0.10 release here…  I had to work around a couple bugs, the Android SDK path was getting an extra “ added and I simply can’t get gradle import to work with IntelliJ without hacking out the Android project.  So expect some warts and experimentation.  It’s worth it though, this is pretty cool stuff, as you will now see.

 

Oh yeah, there is also a video version of this post.  It’s also embedded below if you scroll down.  It covers basically the same topics as this tutorial.

 

What is BDX?

 

So, what exactly is BDX?  Well basically it’s a Java library built over top of LibGDX adding 3D support.  Essentially I suppose you can think of it as a 3D scene graph.  Then the cool part… it’s also a plugin to Blender that turns Blender into your 3D world editor.  Basically you create your assets and world in Blender, apply properties using the BGE and Physics portions of Blender, then export and run.  To a much lesser degree, it is also a code generator… sort of.  Let’s take a look at how it works now…

 

Prerequisites

 

First off, you need to have a Java JDK installed, personally I am using JDK 1.7.  If you are going to be building BDX from sources ( we wont here ) you also need Ant installed.  If you have trouble, watch this video on configuring a Java/LibGDX development environment.  It’s more than what you need, but will certainly get you running.

 

Next head on over to the BDX download page and download the BDX zip file.  If you happen to be running on Mac, turn off that infernal “automatically run trusted downloads” setting, as you want the file to remain zipped.

 

image

 

Of course, you will also need Blender installed.  You can download it here.  For the record I, at the time of writing this, am using 2.73a and as you can see from the screenshot above, 0.1.1 of BDX.

 

Please note, I WILL NOT be covering how to use Blender in this post, except for the configuration bit below.  Fortunately I’ve got that down already, so if you are brand new to Blender run through this tutorial series.  It will cover everything you need to get started (and more).

 

Installing BDX

 

At this point I assume you have Blender installed and BDX downloaded.  Now we need to set it up in Blender.  Don’t worry, it’s pretty simple.

 

Load Blender up.

In the menu, select File->User Preferences…

image

 

Select the Add-ons tab, then Install From Disk:

image

 

Now navigate to and select Bdx.zip then click “Install from File…”

image

 

Now we need to enable the plugin.  Back in the Add-ons tab, on the left hand side toggle the option Testing.  Import-Export: BDX should now appear as an option.  Click the Checkbox beside the dynamite icon.

image

 

BDX should now be ready to use!

 

Creating Your First Project

 

BDX does an impressive job of wrapping the project generator for you.  Coincidentally if you see the LibGDX project wizard you’ve made a mistake!

 

In Blender, make sure you are in Default view to start:

image

 

Now, assuming you are running factory settings, look for the Properties window on the right hand side, and scroll down to locate the BDX settings:

image

 

Fill in the settings like so:

image

 

Click Create BDX project.  For Java Package, make sure to give the entire name, not just the url qualifier.   Base Path is the directory the project will be created in, while Directory is the folder within that directory that will be created.  So using the above settings, you will get the directory c:\temp\bdxdemo.

 

Once you click the Create BDX project, the magic begins!

 

It will churn away for a few seconds, and assuming no errors occurred, it should create a new scene for you like so:

image

 

A complete but very simple “game” created for you.  A couple things to notice.  First your Blender now has a new display mode “BDX” available:

image

 

This enables you to switch in and out of the BDX view you see in the screenshot above.  Also, the controls in the BDX scene are now completely different:

image

 

Go ahead and click Export and Run.   This will package your Blender scene, generate some Java code for you, call the Java compiler and assuming no errors, run your game.

 

image

 

Cool stuff!

 

So basically you can now create and edit a world in Blender and code it using LibGDX.  Let’s take a look at the code portion now…  actually, lets look at the project this created.  Go to the directory you specified earlier.

 

The Project Hierarchy… how it works

 

So, here’s the directory structure that is created, with the critical directories expanded:

image

 

If you’ve done any LibGDX development, most of the structure should be immediately obvious.  You get one directory for each project ( android, desktop, html, ios ), then all of the common code goes in to core.  All of the assets ( graphics, scenes, data files, etc… ) that make up your game are put in the assets folder of the android folder.

 

The other folder of note is the Blender folder.  This is where your Blender .blend files are generated/stored.  In many ways, when using BDX, this becomes the heart of your project.  You re-open the .blend file in Blender to reload your project.

 

What about the code?

 

So far we’ve just used Blender… how exactly do we work in Java? 

 

Well the code is located in core/src/com/yourdomain/yourproject.

There are a pair of files generated by default here.  First is BdxApp.java

This is your main application class implementing ApplicationListener.  Here is the code below:

 

package com.gamefromscratch.bdxdemo;

import java.util.HashMap;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.g3d.ModelBatch;

import com.nilunder.bdx.Bdx;
import com.nilunder.bdx.GameObject;
import com.nilunder.bdx.Scene;
import com.nilunder.bdx.Instantiator;
import com.nilunder.bdx.utils.*;
import com.nilunder.bdx.inputs.*;

public class BdxApp implements ApplicationListener {

   public PerspectiveCamera cam;
   public ModelBatch modelBatch;

   @Override
   public void create() {
      modelBatch = new ModelBatch();
      
      Bdx.init();
      Gdx.input.setInputProcessor(new GdxProcessor(Bdx.keyboard, Bdx.mouse, Bdx.allocatedFingers));

      Scene.instantiators = new HashMap<String, Instantiator>();
      Scene.instantiators.put("Scene", new com.gamefromscratch.bdxdemo.inst.iScene());

      Bdx.scenes.add(new Scene("Scene"));
   }

   @Override
   public void dispose() {
      modelBatch.dispose();
   }

   @Override
   public void render() {
      Bdx.profiler.start("__graphics");
      Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
      Bdx.profiler.stop("__graphics");

      Bdx.updateInput();
      Bdx.profiler.stop("__input");

      for (Scene s : (ArrayListNamed<Scene>)Bdx.scenes.clone()){
         s.update();
         Bdx.profiler.start("__render");
         renderScene(s);
         Bdx.profiler.stop("__render");
      }
      Bdx.profiler.update();
   }
   
   
   public void renderScene(Scene scene){
      Gdx.gl.glClear(GL20.GL_DEPTH_BUFFER_BIT);
      modelBatch.begin(scene.cam);
      for (GameObject g : scene.objects){
         if (g.visible()){
            modelBatch.render(g.modelInstance);
         }
      }
      modelBatch.end();
   }

   @Override
   public void resize(int width, int height) {
   }

   @Override
   public void pause() {
   }

   @Override
   public void resume() {
   }
}

 

If you’ve worked in LibGDX before, this should all look pretty straight forward.  Basically it’s setting up the BDX classes and a regular LibGDX render loop.

 

However, the part that is critical to understand is this little line…  it goes a long way towards figuring out how BDX actually works:

 

      Scene.instantiators = new HashMap<String, Instantiator>();
      Scene.instantiators.put("Scene", new com.gamefromscratch.bdxdemo.inst.iScene());

 

This is the special sauce that links Blender and LibGDX together.  If you look in sub directory inst, you will see a class named iScene.java:

package com.gamefromscratch.bdxdemo.inst;

import com.badlogic.gdx.utils.JsonValue;
import com.nilunder.bdx.Instantiator;
import com.nilunder.bdx.GameObject;
import com.gamefromscratch.bdxdemo.*;
public class iScene extends Instantiator {

   public GameObject newObject(JsonValue gobj){
      String name = gobj.name;

      if (name.equals("Sacky"))
         return new com.gamefromscratch.bdxdemo.Sacky();

      return super.newObject(gobj);
   }
   
}

This is actually an area I struggled with at first because I kept editing it by hand, then when I would run the game my changes were being overwritten!  GRRRRRR…  Then it dawned on me, BDX is also a code generator.  This file is being created automatically when you click the “Export and Run” button.

 

So what exactly is it doing?  Well basically it loops through each object in the Blender scene by name and creates the cooresponding Java class in our scene.   For example, when it finds an object named “Sacky” in the Blender scene, it then creates a new com.gamefromscratch.bdxdemo.Sacky instance in our java code.  Essentially this is the link between Blender and Java.

 

Wait, you might ask… what the heck is a Sacky?

 

Great question!

 

First, lets take a look at our Blender scene graph:

image

 

Ahhh… so that’s a “Sacky”.  It’s basically a texture mesh in Blender that’s been named Sacky.  So… where exactly is the class Sacky.java?  If you look in the code directory:

image

 

No Sacky.java. 

 

This is because by default the code is actually “embedded” in the blend file.  In the BDX control buttons, there is a button “Make internal java files external”.  Click it:

image

 

Now in your src folder you should see:

image

 

Ahhh, much better.  At this point you can actually import the gradle project into your favorite IDE and work normally.  You only need to return to Blender and click Export and Run when you make changes to the Blender scene.

 

NOTE: I am using IntelliJ and had a problem with the gradle import.  It really doesn’t like the android gradle version created by default, but updating the version number caused other dependencies to break… oh the joy of Java build systems.  I personally just hacked out everything but desktop and core from the gradle build.  Leave a comment if you want more details how to do this… if you run into the same problem that is.

 

Meet the GameObject

 

The heart of the BDX scenegraph is GameObject.  It’s basically a thing in the world, often called an entity or node in other engines.  Here for example is Sacky.java:

package com.gamefromscratch.bdxdemo;

import com.nilunder.bdx.*;

public class Sacky extends GameObject{

    public void main(){
        if (Bdx.keyboard.keyHit("space"))
            applyForce(0, 0, 300);
    }
    
}

GameObjects have a couple key methods.  main() you see above is what you traditionally think of as update or tick.  It is called each frame, so this is where you update your objects logic.  There is also init() called on creation and onEnd() called when removed.   In the above example you simply poll to see if the user hits space, and if they do apply 300 “force” along the Z axis.  BDX makes use of the physics properties of Blender, as we will see shortly.

 

In a nutshell, the things that make up your game are GameObjects.  Under the curtain, GameObjects are still LibGDX classes we know and love, let’s take a quick look behind the curtain with a debugger and inspect what makes up Sacky here…

image

Essentially GameObject is a fairly light wrapper over the LibGDX ModelInstance class, which is what you ultimately get when you import a 3D model into LibGDX.  It holds all the nodes, animations, geometry and bones that make up an object.  Unfortunately bone animation isn’t currently supported by BDX.  You may also notice that each GameObject holds a reference to the Scene that contains it.

 

Scene itself is essentially the scene graph.  That is, the container that holds the contents of your game ( the GameObjects, Cameras, etc ):

image

 

All told, pretty straight forward stuff and a good reminder that below it all, LibGDX is still right there, just slightly wrapped.

 

Creating a new GameObject

 

Now let’s actually look at creating your own GameObject.  This is basically what the majority of your game development workflow will look like in BDX.  It’s a multistep process, but isn’t difficult.

 

First, in Blender, simply add a new object.  I am going to add a new Mesh->Cube:

image

 

Now in the scene graph select your newly created Cube, rename it to MyCube:

image

 

Now if you select Export and Run, you will now see your Cube:

image

 

Now let’s wire some code to it.

 

In the same directory as your App and the existing Sacky.java file, create a new Java class named MyCube.java, with the following contents:

package com.gamefromscratch.bdxdemo;

import com.nilunder.bdx.*;

public class MyCube extends GameObject{

    public void main(){
        if (Bdx.keyboard.keyHit("space"))
            visible(!visible());
    }

}

Next in Blender click the Export and Run button. Now when you press the spacebar, the visibility of the newly created cube will now toggle.

 

You will notice something… now that we have an object named MyCube in Blender and a class named MyCube.java, when we click the Export button, the iScene.java class is being auto generated each time:

package com.gamefromscratch.bdxdemo.inst;

import com.badlogic.gdx.utils.JsonValue;
import com.nilunder.bdx.Instantiator;import com.nilunder.bdx.GameObject;
import com.gamefromscratch.bdxdemo.*;
public class iScene extends Instantiator {

   public GameObject newObject(JsonValue gobj){
      String name = gobj.name;

      if (name.equals("MyCube"))
         return new com.gamefromscratch.bdxdemo.MyCube();
      if (name.equals("Sacky"))
         return new com.gamefromscratch.bdxdemo.Sacky();

      return super.newObject(gobj);
   }
   
}

Again, this is basically the glue that ties Java and Blender together

 

Texturing our Cube

 

An un-textured cube isn’t exactly exciting, so let’s quickly texture our cube.  To do so, switch to edit mode in Blender, select all vertices and unwrap.  Then create a new material, then a new texture.  Watch the attached video for more details of this process.

 

There is one critical part you need to be aware of, thus why I am bothering to mention it at all.  When generating your texture map, you need to put it in your assets folder!  So when saving it, save it to the correct folder, like so:

image

 

To the following location:

 

image

 

If you don’t implicitly save it to this folder, or a sub-directory, your code will die on execution.  Oh, another top tip… DO NOT RUN YOUR GAME WHILE IN EDIT MODE!  Yeah, it doesn’t work.  I’m guessing it’s a bug, but always switch back to object mode before running.

 

Now that we’ve got our cube textured, let’s run it:

image

 

Very cool.

 

Adding Physics

 

You can also make objects physics objects using Blender.  With your object selected selected the Physics tab in Blender:

image

 

You can now set the object to static ( unmoving ), dynamic ( affected by physics but not moving on its own ) or rigid body ( fully simulated physics ):

image

All other options are ignored, so stick to those three or No Collision.

 

For a Rigid Body there are a number of properties you can select.  You can also determine the bounding type.  Your choices are limited to Box (uses a bounding box to determine boundaries), Sphere (uses a sphere instead) and Mesh (uses the mesh itself. More accurate but much more CPU intensive):

image

As you can see, you can also configure Mass, velocity, etc.

 

Setting Properties

 

Another cool feature is you can actually set properties using Blender and access them in your code.  Therefore you can use Blender as a proper game editor, setting properties such as HP.

 

To do this, open the Logic Editor in Blender, and click Add Property.

image

 

Now name and type your property and set a default value, like so:

image

 

Then in code you can easily access these values:

public class MyCube extends GameObject{
    public void main(){
        if (Bdx.keyboard.keyHit("space")) {
            int hp = this.props.get("hitPoints").asInt();
            Gdx.app.log("Current HP",String.valueOf(hp));
            visible(!visible());
        }
    }
}

Very cool stuff

 

The Video

 

 

Conclusion

 

BDX is certainly a project to watch if you are working in 3D with LibGDX, especially if you use Blender as part of your workflow.  It does over all make for a pretty seamless pipeline and makes world authoring a breeze.

Programming


12. March 2015

 

I’ve long been a fan of the Phaser HTML5 game library, as my ongoing tutorial series might indicate.  Somewhat recently Phaser started adding premium commercial plugins.  The most recently added plugin adds support for Box2D, the popular 2D physics based library.  This is a commercial plugin (aka, you’ve got to pay for it.  $65 for premium $45 for standard – only difference is number of samples ), but don’t fret, Phaser still has a number of physics systems built-in that are completely free.

 

Box2D is a feature-rich 2D physics system used by thousands of hit games.

This plugin opens-up the power of Box2D directly within Phaser. It has the same user-friendly approach to its API that the rest of Phaser does, making integration and game development a beeze.

image

It uses the excellent box2d-html5 JavaScript port by Isaac Burns. We found that this library had the best performance of those tested, even on mobile.

Development of the plugin was lead by Box2D experts iForce2D - the company responsible for the excellent Box2D visual editor R.U.B.E

 

See the Box2D Plugin Page for More Details

 

The Download includes

  • Getting Started Guide - You'll be coding in next to no time.
  • 90 Code Examples - From games to core mechanics.
  • API Documentation and Box2D User Manual
  • Free Upgrades
  • License free - Use it in commercial games
  • Ready built and minified source files + grunt scripts
  • Delivered via download from FastSpring.com

Try it out

We've added 40 of the Box2D examples to this site.

Run them, play with them and edit the code to get a feel for how it all works.

 

The full release details are available here.

 

I actually like to see this form of monetization.  Developers need to eat and we want  them working to make better and better products.  Keeping the core free while adding premium but optional features as a premium plug-in seems like a good middle line to me.  The key is to keep developing the core free product at the same rate that commercial plugins are added.

News


AppGameKit Studio

See More Tutorials on DevGa.me!

Month List