Subscribe to GameFromScratch on YouTube Support GameFromScratch on Patreon
3. December 2015

 

Having never used or even heard of sketch based animation you can’t help but feel like a “someone changes something in the matrix” moment, when not one but two stories cross your desk in the same week.

 

The first was release of VPaint Beta 1.5.  It is in their own words:

VPaint is an experimental vector graphics editor based on the Vector Animation Complex (VAC), a technology developed by a collaboration of researchers at Inria and the University of British Columbia, featured at SIGGRAPH 2015. It allows you to create resolution-independent illustrations and animations using innovative techniques.

Or you can watch the SIGGRAPH video:

I checked out the free download, and it is interesting, but I decided not to do a story about it.  Then…

 

Just today, Autodesk announced they are looking for beta testers for Project Draco, which is an iPad app that sounds a hell of a lot like VPaint.  Here is their (year old) SIGGRAPH video:

 

Well now Autodesk is officially ready for testing, so if this looks interesting to you head on over to Autodesk labs to sign up.

 

Are there any other sketch based 2D animation packages in the works?  Anyone excited for this technology to mature?

Art GameDev News


3. December 2015

 

BabylonJS is a popular 3D game engine for WebGL that I covered back in the spring.  Today Sébastien Pertus at Microsoft announced the release of a project generator available on npm:

 

Today I want to share with you a new project I work on those days. The idea is to bring you a new tool to generate code for BabylonJS

Imagine you want to create a quick project with BabylonJS. You have to create a project, reference BabylonJS, create a simple scene, add assets and so on.

It’s straightforward, but we can do better…

BabylonJS Generator is a npm package based on Yeoman to provide you a simple way to create a BabylonJS project, hosted on node.js

Yeoman generator is already used with a lot of project (angular, webapp, wordpress, asp.net, office addins and so on …)

Check the generators here : http://yeoman.io/generators/

The Babylon generator

Installation

First, install Yeoman and generator-babylonjs using npm (we assume you have pre-installed node.js).

This step has to be done only one time. The “-g” argument will install those packages globally to your computer.

npm install -g yo

npm install -g generator-babylonjs

From now, you can generate your new project with this simple command :

yo babylonjs

 

GameDev News


2. December 2015

 

Today on the Xamarin blog, they announced the release of Urhosharp.  You may recall I covered Urho3D a while back in the Closer Look at Series.  From the announcement:

Building 3D experiences and games using a high-level framework that works across all of the major platforms is now as easy as installing a single NuGet package.

UrhoSharp brings the Urho3D game engine to C# and F# developers targeting Android, iOS, Mac, tvOS, and Windows. It delivers scene management, a component-based architecture, actions, animations, 3D and 2D physics, audio, mesh navigation, and networking richly blended into .NET with all of the idioms that you’ve come to know and love.

To learn more, check out our introduction to UrhoSharp, take a look at oursamples, or add a level or challenge to SamplyGame, our homage to ShootySkies written in UrhoSharp.

From the introduction:

UrhoSharp is a powerful 3D Game Engine for Xamarin and .NET developers. It is similar in spirit to Apple’s SceneKit and SpriteKit and include physics, navigation, networking and much more while still being cross platform.

It is a .NET binding to the Urho3D engine and allows developers to write cross platform code that can target Android, iOS, Windows and Mac with the same codebase and can render to both OpenGL and Direct3D systems.

UrhoSharp is a game engine with a lot of functionality out of the box:

 

Between Urhosharp and Atomic Game Engine, Urho3D derived engines are certainly becoming more common these days!  You can get the SDK on nuget here.

 

EDIT: User /u/marynate on reddit’s r/gamedev noticed the license for Urhosharp

You may only use the Software, as expressly permitted herein, in conjunction with Your Primary Xamarin Software. As used herein, “Your Primary Xamarin Software” means Xamarin.iOS software or Xamarin.Android software that is both (a) covered by a separate valid Xamarin software license agreement under which You are the licensee (Your “Primary Xamarin License”) and (b) for which You have acquired an Indie license, Business license, or Enterprise license under Your Primary Xamarin License.

So basically they took an open source project and tied it to using their commercial product.  Bad form Xamarin, bad form.

 

EDIT2: Xamarin have fixed the license and it is now released under the MIT open source license.

GameDev News


2. December 2015

 

I find once you’ve learned a couple of programming languages, the way you learn future programming languages changes a bit.  Instead of learning a language feature by feature, you instead tend to jump right in and learn the language relative to languages you already know.  In this case I find it handy to create a quick cheat sheet or Coles/Cliff notes version as I learn that programming language.  This is that sheet, so if you already know a couple programming languages and want to learn Kotlin, hopefully this will be as useful as any tutorial at getting you going quickly.  Keep in mind I don’t even pretend to be a subject matter expert here!

 

Hello World

Starting off with a Hello World example is all but required by law, so here it is:

fun main(args: Array<String>){
    println("Hello World")
}

As you can see the app entry point is main() just like most C influenced programming languages.  Functions are marked with fun keyword and unlike Java, they do not have to be in a class nor in a package really cutting down the code count.  Variables and parameters are named in the format  name:type, it is increasingly popular for variable type to be on the right ( Haxe, Swift, Go, etc ).  Otherwise nothing shocking here.  It should be noted that semicolon line terminators are completely optional.

 

Variables

Read Only Vs. Variant Types

Let's look at a simple example with variables allocated.

fun main(args: Array<String>){
    val meaningOfLife:Int = 42;
    var meaningOfDeath = meaningOfLife +1
    meaningOfLife++ // NOT ALLOWED!!!
}

Notice val and var.  A val type is read only and once initialized cannot be altered.  A var type is a traditional variable and as you can see in this case, type can be inferred automatically by the compiler.  The final line there will not compile because meaningOfLife is a read only type.  If it was a var type however, that line would compile just fine (in other words, there is a postfix increment operator in Kotlin).  Oh and Kotlin supports C++ style // Comments.  Speaking of comments…

 

Commenting

All the traditional C++ style comments are supported, as are JDoc style

// This is a comment
/*
And so is this
 */
/**
 * And this is a JDoc/KDoc style comment
 * @param args Comment documenting param args meaning
 */
fun main(args: Array<String>){

}

 

Numeric Types

Kotlin has several built in number types: Char, Byte, Short, Int, Float, Long and Double:

fun main(args: Array<String>){
    var byte: Byte = 127 // Signed byte, -128 to 127
    var char: Char = 'A' // A 16bit Unicode character
    var short: Short = Short.MAX_VALUE //16bit signed MAX_VALUE == 32767
    var int: Int = 0xff // 32bit signed, Hex can be used with 0x prefix
    var long:Long = 0b11101101// 64bit signed, binary can be used with 0b prefix
    var float:Float = 3.14f // 32bit floating point number, floats designated with f postfix
    var double:Double = 3.1e10 // 64bit floating point, IEEE notation can be used too

    //double = float; // automatic down conversation is not allowed
    //float = double; // Nor is up conversion!

    double = float.toDouble() //Explicit conversion is allowed
    float = double.toFloat()

    byte = short.toByte() // allowed, but value too big so value is -1
    short = 42;
    byte = short.toByte() // value fits, new val would be 42
}

Bigger and smaller types share no relationship, so automatic conversation does not exist, except in the case of literals.  So you cant automatically assign a short to a byte, nor a byte to a short without calling the appropriate to() method.  Truncation will occur if the type doesn’t fit the new type.

 

Functions

As we’ve seen already, functions are marked with the fun keyword.  The format is “fun named(args): return type” like so:

fun doSomething(a:Int, b:String): String {
    return "$b $a";
}

fun main(args: Array<String>){
    println(doSomething(42,"Meaning of Life is"));
}

This example declares a function that takes and Int and a String and returns a String.  This example also illustrates the use of string templates in Kotlin.  Inside a string you can use the $ symbol to do a C printf style format.  If however you need to use a dollar sign in a literal string you can escape it in the form {‘$’}.

 

Nullable Types

Functions can also return a null value, but need to be marked as such using the ? operator, like so:

fun setName(name:String) : String? {
    if(name == "Mike")
        return "Mike"
    else
        return null;
}
fun main(args: Array<String>) {
    var name = setName("Mike");
    if (name is String) {
        // in if block containing an is, no casting is required
        println(name);
    }
}

As you can see, with a type preceded with a ? can be set to null.  This example also illustrates the is operator, which is the Kotlin analog of typeof in C++.  Another neat trick is illustrated here, within the scope of an if using the is operator, typecasts are not required.  Speaking of typecasts…

 

Typecasts

As we saw earlier, all of the built in numeric types have a toXXX() method for type conversion.  However to straight casts, Kotlin has “safe” and “unsafe” casts.  An unsafe cast could potentially result in an exception because the type cast isn’t possible.  To perform an unsafe cast, use the as operator, like so:

    var i:Int = 42;
    println(i as String);

However if you run this code, BOOM!

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String.

If there is a possibility your cast could fail, instead use the operator as? like so:

 

    var i:Int = 42;
    println(i as? String);

This will result in either the casted value being returned, but if the cast cannot be performed, instead of throwing an exception, it instead returns null.

 

Conditionals and Flow Control

Kotlin works much like most modern languages with a couple exceptions.  if works pretty much like you would expect, except its an expression and returns a value ( the evaluated conditional ) like so:

    var a = 1; var b = 2;
    var bigger = if( a > b) a else b;
    println(bigger); // Prints 2

As a result Kotlin does not have C's confusing ternary ? operators. Additionally you can also set the value returned within an if block, it's simply the last value within the block. Like so:

enum class Enemies { Orc, Skeleton, Pigeon}
fun main(args: Array<String>) {
    var enemy = Enemies.Pigeon;
    println("Enemy was of type " +
        if(enemy == Enemies.Orc){
            // Do Orc related code
            "Orc";
        }
        else{
            "Not Orc";
        }
    );
}

As you can see, the final value in the if block is the returned value by the if statement.  Oh yeah… and Kotlin supports enums, as you can see from this example.

 

One other major difference in Kotlin is there is no else if, nor is there a switch statement.  Instead you have the somewhat confusingly named when that fills both roles, like so:

enum class Enemies { Orc, Skeleton, Pigeon}
fun main(args: Array<String>) {
    var enemy = Enemies.Pigeon;
    when(enemy){
        Enemies.Pigeon -> print("Pigeon");
        Enemies.Orc -> print("Orc");
        else -> {
            print("Who the heck knows at this point??")
        }
    }
}

Much like a C/C++ style switch statement except there is no case keyword, default is replaced with an else statement and you use –> instead of a colon.

You can also do ranges in when statements, like so:

fun main(args: Array<String>) {
    var meaningOfLife:Int = 42;
    when(meaningOfLife){
        in 1..22 -> print("Between 1 and 22");
        !in 22..44 -> print("Not between 22 and 44");
        else -> {
            // None of the above
        }
    }
}

 

For, while and do-while loops all work pretty much the same as other languages.  Kotlin supports break, return and continue statements and they work as expected ( and can be used to short circuit a when statement ).  You can however set a label using the @ postfix then specify it specifically in the break/continue/return statement, like so:

fun main(args: Array<String>) {
    [email protected] for(i in 1..100){
        [email protected] for(j in 1..100) {
            if (j == 42) {
                [email protected];
            }
        }
    }
}

This above example will immediately cause the outer loop to jump to it’s next iteration when the inner loops condition is true, effectively short circuiting the inner loop. (Yes, an un-labeled break would have the exact same result)

 

Extension Method

Class can be easily via extensions methods.

class A {}

fun A.somethingNew() {
    print("Gave A new superpowers, woot")
}

fun String.toA() : A {
    return A();
}
fun main(args: Array<String>) {
    var a = A();
    a.somethingNew()

    var s = "Meaningless initial value";
    s.toA().somethingNew();

}

As you can see any class can be extended using the form 'fun classname.newMethod". You can also extended built-in classes, like shown here with String.

 

And that brings us nicely too…

 

Classes

As we just saw, a class is declared like:

class MyClass {
    
}

 

In fact for an empty class like this, you can omit the body entirely, like:

class MyClass;

fun main(args: Array<String>) {
    var myClass = MyClass();
}

Of course, that code wont actually do anything.  As you can see from this and earlier examples there is no new operator.

 

Constructors

Kotlin has a primary constructor, which is similar to a default constructor in C++.   However no code can be contained in the constructor.  Here is an example:

class MyClass(myString:String){};

fun main(args: Array<String>) {
    var myClass = MyClass("test");
}

If you need to set initial values programmatically, you can do so in the init block, like so:

class MyClass(stringParam:String){
    var myString:String;
    val valToAppend: String = "42";
    init {
        myString = stringParam;
        myString += valToAppend;
    }

    constructor(stringParam:String, myInt:Int) : this(stringParam){
        myString += myInt.toString();
    }
};

fun main(args: Array<String>) {
    var myClass = MyClass("test");
    print(myClass.myString); // Prints test42

    var myClass2 = MyClass("test", 43);
    print(myClass2.myString); //Prints test4243 !!!!
}

This example also showed how to set a secondary constructor using the constructor keyword.  Note the call back to the default constructor in the secondary constructor.  Also note the result on myClass as per the comment, showing the order of constructor calls.

 

Inheritance

 

The base class of all classes in Kotlin is Any, which is analogous to object in Java ( and there is no equivalent in C++ ).  Inheritance looks almost exactly like Java, like so:

open class Base{};

class Derived : Base() {};

The only major difference is the parent class is marked open, otherwise it would be marked final. If the base class has a constructor, you must call it in the derived class like so:

open class Base(param:Int){};

class Derived : Base(42) {};

 

If a derived class has no primary constructor then it’s secondary constructors need to call the base class using super like so:

open class Base(param:Int){};

class Derived : Base {
    constructor(param:Int) : super(param){}
}

 

Method inheritance is done with a combination of open and override, like so:

open class Base {
    open fun baseFunc() {
        println("base");
    }
};

class Derived : Base() {
    override fun baseFunc() {
        println("derived");
    }
}

fun main(args: Array<String>) {
    var derived = Derived()
    derived.baseFunc() // prints "derived"
}

 

There are also interfaces in Kotlin, but they are probably a bit different than what you expect, as the interface can contain both abstract functions as well as implementations, like so:

interface BaseInterface {
    fun a()
    fun b() {print("b");}
};

class implementation : BaseInterface {
    override fun a() { print("a");}
}

fun main(args: Array<String>) {
    var imp = implementation()
    imp.a();
    imp.b();
}

The abstract method must be implemented in the derived class.  The only difference between an interface and abstract class is an interface does not have state.  Like Java you can only have one base class but as many interfaces as wanted.  If you name collision, it can be resolved like so:

interface A {
    fun a(){print("A")};
};
interface B {
    fun a(){print("B")};
};


class implementation : A,B {
    override fun a() {
        super<A>.a();
        super<B>.a();
    }
}

fun main(args: Array<String>) {
    var imp = implementation()
    imp.a();
}

 

Functional Programming

Kotlin also has good functional programming capabilities, consider the following example that takes a function, both anonymous or named:

fun onCallback(callback:() -> Unit) {
    return callback();
}
fun otherFunc() { print("Maybe"); }

fun main(args: Array<String>) {
    onCallback({print("Callme")});
    onCallback(::otherFunc);
}

 

An anonymous function takes the form (params) –> return.  In the above example there are no params and no return.  In Kotlin Unit is the equivalent of void in C.  The :: operator returns a callable reference.

 

 

This material should be more than enough to get started making a game in Kotlin.  I guess we shall see.  Of course, this is just a quick start, to dig deeper the entire language reference is available here.

Programming


1. December 2015

 

Autodesk just announced the release of Extension 2 for 3ds Max 2016.  Extensions are interim updates between major releases.  Extensions 2 adds the follow functionality:

  • With fundamental improvements in the Max Creation Graph (MCG), users can now animate accurate simulation data like Computational Fluid Dynamic (CFD) data or other data inside their 3ds Max scenes. 
  • With the new built-in “Send To” Autodesk Print Studio button, users can quickly export and 3D print any of their 3ds Max creations. 
  • The new Texture Object Mask modifier allows users to position and animate textures on an object using other objects in the scene. 
  • The new TextPlus feature, introduced in Extension 1, now has the ability to use text strings and shapes to be used as a material map, creating material decals in your scene.  

They have created a video showcasing the new capabilities:

Read more at the official announcement.

GameDev News


See More Tutorials on DevGa.me!

Month List

Popular Comments