Tuesday, December 16, 2014

Component Based Design

Today I am going to talk about using Components for your game objects. 

Wow, that one came out of nowhere, wasn't I just talking about my new alpha version game and the design contest I have going for it at adventuregamequest.azurewebsites.net/#/contest? Yes, but let us take a break from Text-RPG games and focus on some exciting 3D Games.

As I have mentioned before, I am currently working on two projects. Both of these projects are a 3rd person adventure/action game of sorts. From various phases of the design process, before implementing any code, I have come to the conclusion that components are great. In fact, I would venture to say its the next best thing to inheritance.

To keep this in scope, I am not talking about the Component-Entity design pattern per say, rather, the component systems implemented in both Unreal Engine 4 and Unity 4. Not coincidentally, these are two of the largest game engines I can think of that are still of relevance and readily available to the public. Both of these engines incorporate a component model, where you have a base object within the world that has objects attached to them.

In Unity these are the MonoBehaviour scripts. They can be attached to any GameObject within the engine and readily used. In Unreal Engine 4, these are ActorComponents that can be attached to Actors.

Why is this such a good system?

I have several answers to that question. These answers are as follows: modularity, prototyping, less limitations.

The first point is the best: modular components make life awesome. I would venture to say that, for games, components are the next best thing after object oriented programming languages/design. By allowing a designer/programmer to take an unspecified object with no real value other than existing as an entity - GameObject in Unity and Actor in Unreal - on can put together pieces to design a complex system or entity within the game. The best part is that traits of the entity can be replicated and attached to other entities that are not necessarily an instance of that entity. For example, one of the problems I had with a game I was making in UE4 was as follows:

An Actor has several different methods to attack. They can have a weapon, or use an unarmed attack. This means the Actor (we will refer it to creature from now on) will need to have some way to cause damage without a weapon. Simple enough, sounds like a simple property named damage. And, again, simply, the weapon now needs a property called damage. Nice, simple, easy to the point, use some logic to see if the creature has a weapon, if not, use it's damage.
But wait, now we want ranged weapons. Well, a ranged weapon is a weapon, so we will just inherit from weapon, also inheriting the damage property. But a ranged weapon doesn't do damage, it shoots things that cause damage. Well, we could give that projectile a damage property too, sounds good, and ignore the ranged weapon's damage property when the projectile hit an enemy. Another route would be to have a pointer to the firing weapon, and if the projectile hits anything, use the ranged weapons damage to cause damage.
Nice, that is all wired up now. So for each actor that has this damage property, add a callback event to apply damage on the other Actor hit by the creature, the creature's weapon, or the creature's ranged weapon's projectile.
Awesome done.
But wait, now we want spells, okay, just copy all logic from the other four classes...
 Clearly, you can see where this is going. And it is a long an miserable road to travel. This is what your (prototyped) files would begin to look like:

class Creature : AActor
{
public:
float Damage;
Weapon* MyWeapon;
float GetDamage()
{
if(MyWeapon == NULL)
return this->Damage;
else
return MyWeapon->Damage;
}
}
class Weapon : AActor
{
public:
float Damage;
}
//Notice the circular dependencies in this awful design not using components
class RangedWeapon : Weapon
{
public:
Projectile* WhatIShoot;
}
class Projectile : Actor //You could even have projectile inherit from weapon if you would like... but is that really any better?
{
public:
float GetDamage()
{
return WhatShotMe->Damage;
}
RangedWeapon* WhatShotMe;
}


Sure, you could argue, "Well, why not have a DamageActor that has all these stats?" As an exercise to the reader, I will let you argue that point.

So here is the alternative:

Make an ActorComponent called DamageComponent, add a damage property (and any other awesome damage like properties like critical hit, critical chance, critical multiplier, etc.) and have a get method that calculates damage.
Slap that component onto any actor you want and implement whatever event that causes damage (overlap, hit, fall, etc.)
Done, Need spells? Awesome, create a spell actor and slap that puppy on there.

Seems pretty obvious why the whole modularity thing comes in handy now, doesn't it? This also helps create a nice, distinct, seperation of concerns when it comes to your software. Rendering components render, collision components collide, gameplay components do game stuff, and so on and so forth.

Next is how easy this modularity makes prototyping. Let us go back to the first example of making attack power/damage where we created a file for each entity that could possibly cause damage. Better, yet, let us take that a step further and say we used some good OOP and have a DamageActor inherited from Actor that all of these classes inherit from. Now, we just add all the extra properties we need for this. Seems like a good solution.

Well, the Game Designer came in and changed something. The player can now transform into any one of the enemy AI you see before you. You already created all of these awesome combat mechanics using inheritance, and you created the player with a controller, as well as some stats of his own (since this is a stealth game all of a sudden, the player is not a DamageActor because, unlike every other protagonist in the world of games, he does not kill people). So, do we turn this docile, sneaky player into a Damage Actor? Do we just create and inherited class for each possible AI in the game into a PlayerXXXActor and have a bunch of unneeded data implemented?

No. That is bad.

This is a tough one, but my approach would be to find a reference to the base class and copy over the components into the component array, exclude the ones that are type or super type of DamageComponent. One line of code, done. Call it a day, and no crunch time.

Who loves components, modularity, and prototyping? We do.

Finally, this brings to the point of less limitations. In the world of programming, refactoring is a way of life. It can be fun, it can be tedious, but it is also the result of lots of prototyping. With components we can swap in and out common and uncommon responsibilities between common and uncommon entities within the game. Let us, for instance look at a Unity example.

You have a multi player game and there is a single player mode. Do you want to write a script called AIScript where you have if statements for every single action? For instance:

public class AIScript : MonoBehaviour
{
private bool multiplayer;
private ClientRunner client;
OnUpdate()
{
if(multiplayer && client != null)
{
client.Send("Position", new object[]{position.x, position.y, position.z});
}
else
{
//Do nothing, so we have a stupid if/else statement here (or we could hide it with out putting the else, but does that really make you feel good                                 inside?)
}
if(multiplayer && client != null)
{
//Receive a whole slew of data to update
}
else
{
//Um.... do nothing, perhaps go out into the local game world and get that //same data
}
//A plague of if/else blocks
if(multiplayer && client != null)
{
}
else
{
}
if(multiplayer && client != null)
{
}
else
{
}
if(multiplayer && client != null)
{
}
else
{
}
if(multiplayer && client != null)
{
}
else
{
}
}
}
Looks okay. I mean, if the AI is on the network it replicates, if not it uses the game world. Well, that is a lot of conditional branching in an update loop - kind of sucks for performance. And now the AI is responsible for its own Client/Server or Local Gameplay management. Might as well as throw ALL information that requires that knowledge into those blocks of data, or do a lot more copying and pasting.

I have your solution from this awful life: Have a CommonAI, NetworkAI, and LocalAI, have an AI manager detect gamemode and when creating AI, attach the appropiate script. No need to go in and out of if/else blocks to change little things, you can still use inheritance by having common AI routines go in Common AI and have the Network* or Local* inherit from that. Not bad, components win the day again.

In the end I would like to say that I love the component systems used in modern game engines. I know this may seem obvious, but some schools teach the importance of OOP in schools to the point where one can focus on only using OOP in game engines and gameplay classes. When there is a better solution out there, it should be taught, and I hope this helped you to see the light or help solve a difficult case of multi-inheritance messes.
 

Tuesday, December 9, 2014

Game Development Competition Announced!

Hello Blogger/enjoy-game-programming/Game Development community,

I am posting this because I plan on holding a competition for the alpha version of my online text RPG game found at http://adventuregamequest.azurewebsites.net/#/. The competition is simple, create a short story based quest line that falls in line with the quest flow of the game. Before I continue, there will be three winners selected from the competition. The winning quests will be included in the game as a playable quest line and credit for assissting in the devleopment of the game on the website.
There are several categories that will be judged for this competition. These categories are flow, balance, and originality. Flow is judged on how well the story of the quest fits together with the actual quest objectives as well as how the quests go together when leading from one to the other. Balance is the difficulty progression of the quests as the player completes them. Finally, originality is the cumalitive story line of the quests. The latter includes, characters, places, monsters, and all of the other exciting elements of an epic.

Now that we have those details out of the way, there are several rules which I will outline below.

1) Submissions must be made to alpha-adventuregamequest@outlook.com with the subject line of "Alpha Game Quest Contest"

2) There must be a grand total of 50 Quests.

3) Quests have the following structure:

a) Quest Giver
i) Name of the Quest Giver
ii) A description of the quest giver
iii) The location a quest giver is in
iv) The quests that must be completed to unlock this quest giver
v) The quest that quest giver gives

b) Quest
i) The name of the quest
ii) A description of the quest (this is mostly the story part)
iii) Quest brief - Follows the syntax of verb, number, what.
iv) Quest Type
aa) Collect
bb) Slay
cc) Travel To
v) Quests that may be triggered after this one is completed (optional)
vi) Rewards: Score, Experience, Gold

4) Finally, a high level overview of your collection of quests. This includes the full story, where the quests fit in, and anything else you find useful. (Essentially, a short story)

5) Full list of the linear progression (or not so linear progression ;) ) of the quests, each one numbered

6) The deadline is February 27, 2015 and the finalists (top 10) will be posted on the website [ http://adventuregamequest.azurewebsites.net/#/ ] by March 6, 2015. The winners will be announced April 10, 2015.

With all the nitty gritty out of the way, I do have some notes to make about the submissions. These notes are listed as follows:

1) *Slight* Deviation of quest structure are encouraged. By slight, I mean the types of quests, as well as rewards. Be creative - not crazy. Remember, it is a text based RPG.

2) Questions are encouraged in email at the submission address with the subject line "Alpha Game Quest Contest Inquiry", or as a comment below

3) Spelling and grammar are encouraged to be correct

4) English is my primary language, so I encourage submissions in English, but will attempt to go through some online translator if I must. I read German as a poor secondary language.

I look forward to your submissions and am very excited for the opportunity to do this for the game development community. If you want to get a feel for the game before getting started, join now for free and play for a bit at the games website. [ http://adventuregamequest.azurewebsites.net/#/ ]

Thursday, December 4, 2014

Greatest Adventure Game Update (so far)

Today is an exciting day! I have just release version 0.0.3.1 for my text adventure game at adventuregamequest.azurewebsites.net, feel free to try out the new version at the site! The game is chocked full on new features that I am excited to share. These features are as follows:


  • Enhanced Security: Users now need to confirm email address when signing up for the game. This will pave the way for password recovery and support.
  • Quests: The quest system for the game has been added! This is a huge update as it will pave the way for the Beta version and a fully implemented story!!!!!!!!!! Can you not see the impact of this feature!?!?!? If not, or even if you do, go and check it out.
  • More Achievements: With more things to do in the game, there come more achievements, meaning more opportunities to gain bragging rights.
So go ahead, join today, or log back in, you won't regret it! Here is the path for the alpha testing server - all are invited:

adventuregamequest.azurewebsites.net

Monday, November 24, 2014

Community Feedback for Text-based Adventure Game

I am in need of some verbose feedback in regards to my online game that I created. There are various sections of the game and the website of the game that I am looking to receive feedback on. These sections are the game itself, the game manual, website layout/design, and further suggestions.

If you would like to stop reading and just go ahead and play, here is the link:http://adventuregamequest.azurewebsites.net/  
Before I continue to explain what I am looking for, I would like to explain the project a little as well as the roadmap I have planned out for myself. What I would like to explain is the game itself and its inspiration. Secondly, I will discuss the roadmap of where I am at and where I wish to go.

In regards to the explanation of the game I have two main topics I would like to point out. These topics are the game itself (as in gameplay) and the inspiration behind the game.

First, the game is a text-based adventure game. You, like I did so many years ago, probably just threw out all interest in playing the game. That is fine, we all have different tastes and you aren't forced to continue reading. For those who wish to know more, here is a high level overview. The game is built to be played online and semi-competitively. There is a ranking system based on your adventures that tracks relics you collect, areas you explore, and monsters you fight. It includes a simple achievement system that auto-brags for you what you are doing. I plan on adding inter-player communication and a quest system. Finally, as most indie games/small projects have these days, I plan on adding random gameplay to the mix. What I mean by this is random quest generation (for smaller quests) and random dungeons (tried and true). I will stop here as it is getting more into my roadmap, so I will now discuss with you the inspiration behind such a game.

What is the inspiration behind this game? Well, to be honest, as I stated on my blog - enjoy-game-programming- I did it because I could and was in training to use new libraries, technologies, platforms. Ultimately, I say, it was because I could. However, it grew to be more than that. As I progressed I kept getting new ideas and drive to keep going. I had an idea of a world, a story, gameplay elements, and friendly competition between players. I also new that working on this part time with no artistic skills would be a huge roadblock. So I stuck with the KISS model. I kept it simple and focused on what really makes a game - a medium to tell an interactive story from the designer to you.

Yes, awesome effects, epic music, and slick graphics help with that story telling - I will admit that. However, I wanted to delve into the deeper parts of a game, to create something that gives real drive to keep playing, not just a firework show for the eyes and hears. A game where people think, where the gamer is not treated as a gigantic wallet awed by cheap tricks. Where the game is created with a tight gameplay system and well balanced mechanics. This is where you come in and the reason behind this announcement. I am looking for people to play and give feedback and it would be much appreciated. "This isn't my first rodeo", I have gone to other communities for other projects to receive feedback. I am no stranger to criticism or direction. If you want to be brutal, be brutal. If you had a bad day and want to rip my game to shreds, do. I beg you, feedback is the most important.

Finally, the roadmap I have for this game. Right now I have all of the core functionality in place and is accessible to the player. There are a few features that I would like to add and then some other stuff to jazz it up. Here is a list to keep this short:

Gameplay: On Beta Finished
  • Player chat for players in the same location
  • Quest system
  • Expanded world and story
  • Better balancing
  • Expanded npc roster.
  • Non-combat npcs (monstly for giving quests)

Before Going Gold
  • Users may pick portraits
  • Background art based on location
  • Revamped UI (hopefully with the help of the community That's you)

With that in mind I want to change direction from the game and the motivation behind it to what I am asking assistance for. Remember, what I am mostly looking for is feedback in regards to the game itself (broad overview), the game manual (is it understandable?), website layout/design (is it user friendly/intuitive), and further suggestions.

The first discussion point would be the game itself. I as this because my background and degree is mostly programming related work, I did not always focus my efforts on game design. I feel strongly that I know the theory well, but it is the implementation of various mechanics that I wish to receive feedback on. Such mechanics would be feedback from the game (is it descriptive enough, do you understand what it is telling you, is it appropriate?), balance, and do you simple just get the game. I mean, do you really get it.

Secondly, I would like feedback on the game manual. As this is a text-based game, there really wasn't much in the way of a smooth tutorial I could offer. So I decided with an age-old classic - the game manual. I explain all the commands available in the game and what sections of the HUD say and do. I also offer descriptions of various hints the game offers in regards to the HUD. What I am looking for here is if there are any sections that are not clear, missing, or should be replaced.

Finally, with the game being online, I would like to have a user-friendly website to host it on. Right now I would have to say it is pretty basic. I would love it if people with website design backgrounds could offer hints to make it better. Also, the UI for the game and its intuitiveness can fall into this category as well.

I would appreciate all of the feedback possible and here is a link to the website that the game is hosted on (the game name is a working title and WILL be changed):

http://adventuregamequest.azurewebsites.net/

Thursday, November 20, 2014

Continuous Integration in Azure

From my last post, many of you can tell that I just launched a test website / text-based game. This has driven me to start thinking about Continuous Integration in my projects.

Now, I learned all through school game programming and not much else in regards to some of the higher level tech management processes. Sure, there was project management and some Agile stuff thrown in, as well as using version control, but never anything on CI.

So, to help my career move forward and to provide an easier time in developing and deploying my little project, I have decided to begin implementing CI in my current project. As it stands, it should follow some basic tenets to even be considered following CI procedures. These are as follows:


  • Automatic pulling from remote repository on production branch update
  • Automatic version of files before build.
  • Automatic build process
  • Automatic unit testing
  • Automatic deployment on all tests passed
For the most part, Azure has done a lot of this for me when I linked it to my Bitbucket account and I can configure pre-build scripts as well. I plan on working on the rest of CI integration into my project in parallel of the production of features and enhancements. So the above list, currently, looks like this:

  • Automatic pulling from remote repository on production branch update
  • Automatic version of files before build.
  • Automatic build process
  • Automatic unit testing
  • Automatic deployment on all tests passed
So, really, that just leaves the unit testing (blech) and the version injection of the files. I already have a nifty script I can use for making versions, I just have to tie it into git, Bitbucket, and Azure.

If you haven't already, feel free to visit the website at http://adventuregamequest.azurewebsites.net/ and play around!

Monday, November 17, 2014

First Alpha Version of Text-Based Adventure Game

As promised, I am here to give a link to all the readers, for the text based adventure game that I have created. It is currently an alpha version, looking for feedback. As always I would love the feedback.

The name of the game is AdvetureQuestGame (working title) and this is the link:
http://adventuregamequest.azurewebsites.net/

Thursday, November 13, 2014

Where Have I Been?

For the past few months I have been hidden under a rock, not posting anything. Why? Well, life moves fast and I was keeping up with it. I have taken on one independent project (near completion), two after hours projects, and a full time job. I found myself wanting for time but also enjoying what I am doing.

First is my current independent project. I have recently finished the core features of a web based text adventure game. Why? As any programmer/engineer/mad-scientist will inform you: "Because I can." And I certainly can, did, and will continue with. Quite frankly, the project just needs some added game-play features and a hosting platform. The technologies used in this project were:
  • .NET 4.x Framework
  • ASP.NET
  • Entity Framework
  • AngularJS
  • Identity Framework
  • Twitter Bootstrap
What was the biggest motivation behind this project? I could say it was a yearning for the classic games, or a drive to make a deep story driven adventure. Quite frankly though, it was to learn various web technologies. It has always been my weakest skill in the world of programming. However, in this world, that would leave me without a job (games or not, the web is growing and so are the demands for positions to create it).

The other two projects that I am working on are all done in Unreal Engine 4, the engine I raved about so few months ago. I have pretty much stopped all production in Unity as I just didn't want to use it. I prefer C++ when I want to, and uber-fast prototyping in Blueprints when I need to. Plus I find the tool sets in UE4 significantly more robust and user-friendly. It feels wrong saying user-friendly, but it is true and it makes the projects move along smoother and at a more rapid pace than I have ever seen.

I am not sure as to whether I can talk in detail about these final two projects, but I will definitely give many updates if they turn out to go farther and allow me to share screenshots/videos with everyone.

Until next time! Keep an eye out on this blog as I will be posting a link to my web based game very soon once I get a hosting platform up and running.

Sunday, August 10, 2014

Back To the Land of the Net

Ah, that refreshing, exhilarating feeling of moving into a new place - and not having internet. A week of no internet left me raving with ideas and code I could not write down. So prepare for a torrent of updates about games, code, and pandas.

Although the move and the week off has been relaxing, I have established for myself a new base of operations - which I hope may prove to be more productive than the last one. 

Currently, as mentioned before previously, my future endeavors involve working on a possible two games- but keep that hush hush as I cannot exhale from my keyboard, any more details. But, I can say this, there are trees, escapes, daring escapades, and wild jungle fever in one of the projects.

It is all super exciting, I assure you in the most confidence with the least amount of detail possible.

Until next time!

Sunday, July 27, 2014

The Adventure Begins

What to do, what to do... That is the common question a newly graduate student needs to ask him/herself. Currently, I am not working in the video game or gaming industry and so have a wide variety of options before me.

I am currently working in software development, but it is not games. That is an option. There are some people that want me to join up in their "indie" game project. That is another option. Then there are all the games I want to make. There is a final option.

Of the last two options, I will be showing you my progress in these adventures. I plan on using two different game engines and languages for each project. After all, variety is the spice of life! Some of these projects are solo, some with groups, some with imaginary friends that I swear are real.

Tune in later for some awesome demos and screenshots of what there is to come!

Friday, July 18, 2014

Onward Towards the Light

Unfortunately, Starbound Aces didn't cut the mustard when it came to the Senior Project Showdown. So that is that, thank yous to everyone who ever assisted on the project such as play-testing and input.

What to do now? I am not sure, but this blog will not die with the conclusion of this project and my graduation.

I have recently acquired a license to Unreal Engine 4 and may do some posts/tutorials about it in their Wiki page and link to it from here. Then I can explain in depth my opinions behind what I did and use cases.

  • I also plan on having many more projects lined up and will speak of them when the appropriate time comes.

Friday, July 11, 2014

DeVry Senior Project

Short announcement today afer a long time of no posting. Starbound Aces is submitted into DeVry University's Senior Project Showdown. Here is our presentation video, enjoy!


Friday, June 27, 2014

Final Build

Today marks the end of my 16 week class as well as my education as I am graduating. Here is the final build for Starbound Aces. To note, we focused mostly on multiplayer and there that is the game option that is complete. So, invite a friend or 7 and play a round.

Link to WebPlayer

Monday, June 23, 2014

The Final Week - Starbound Aces

Today marks the beginning of the final week of our 16 week production cycle for my Senior Project - "Starbound Aces".

I would like to thank everybody who contributed to the project, both my team members and those who helped test it. It was a long (well, actually short) journey to produce a decent multiplayer game. Thankfully, it was a school project and I have learned much from it.

I will soon be posting our competition submission video here as well as a link to the newest version for the webplayer. I will also link downloads for the PC version. They play the same but there is definitely a performance increase using the PC version.

Wednesday, June 18, 2014

Starbound Aces Latest Build

Today I present to your the latest build for Starbound Aces. Here we have some new features in the game as well as improvements.

Play Now (Unity WebPlayer)

Whats New?

  • Enemy Death Effects
  • Better Sounds
  • Button Sounds
  • Server enhancements
  • Server configuration
  • Different stats for each weapon
  • Different stats for each ship

Tuesday, June 17, 2014

Server Side Player Properties

An after effect of our server side overhaul is that the game now has a database full of ship, weapon, and projectile configurations. This means the server can pull data from there and send the properties to players upon game starts. In conjunction with the client side GUI to configure a ship, we have a good system going for multi-player games.

The only real issue was wrestling with the timing of script execution, construction, and threads. This caused some issues where the client was not updating its properties when the server sends the data due to the script not existing and therefore not listening for the event. When that happened, the event just disappeared. Unity does allow for script execution ordering but that would not have fit my case as the GameManager Singleton and the SmartFox Client Controller needed to send and receive events before, during, and after other scripts. Therefore, I rolled some code in the C# scripts to time events the way they would work with our system.

Saturday, June 14, 2014

Unity / SmartFox Senior Project Update

For the past two weeks I have been working on overhauling the server side logic to be more authoritative in our game Starbound Aces. Most of the work is done and completed to satisfaction. The parts that are complete are server side validation of input, shooting, abilities, ship configurations, and weapon configurations. All of that data is replicated well to each client.

The final step - transformations and maneuvers are hitting a rough patch.

As it works now, the game on the server is launched in a new thread that is updated every 150 milliseconds. Right now, this causes jittery game play and horrible movement. These are the issues I plan on resolved soon.

Wednesday, June 11, 2014

Server Replication

I have been spending the past two weeks re-factoring the server for our game - Starbound Aces. It is in an attempt to move to a more authoritative server model for the game to prevent cheating and game-play issues due to players being out of sync. The biggest improvement I have made is translating and rotating object on the server and sending the new positions to the players. With the aid of the LWJGL and the Apache Math3 API, I was able to imitate the original Unity C# scripts we had for movement onto the server in Java.

Here is the source code for that:

package com.gspteama.gamedriver;
import org.apache.commons.math3.geometry.euclidean.threed.Rotation;
import org.apache.commons.math3.geometry.euclidean.threed.RotationOrder;
import org.lwjgl.util.vector.Matrix4f;
import org.lwjgl.util.vector.Vector3f;
import org.lwjgl.util.vector.Vector4f;
public class Movement{
    public float Velocity;
    public float Acceleration;
    
    private float maxVelocity;
    
    protected Vector3f position = new Vector3f();
    protected Vector3f rotation = new Vector3f();
    protected Vector4f quaternion = new Vector4f();
    
    protected static final Vector3f UP = new Vector3f(0.0f, 1.0f, 0.0f);
    protected static final Vector3f LEFT = new Vector3f(-1.0f, 0.0f, 0.0f);
    protected static final Vector3f FORWARD = new Vector3f(0.0f,0.0f, 1.0f);
    
    protected Matrix4f transform = new Matrix4f();
    
    public void onUpdate(float deltaTime){
        Velocity = Velocity + Acceleration * deltaTime;
        if(Velocity >= maxVelocity){
            Velocity = maxVelocity;
        }
        
        Rotation rotator = new Rotation(RotationOrder.XYZ, rotation.getX(),
                rotation.getY(),
                rotation.getZ());
        quaternion = new Vector4f((float)rotator.getQ0(),
                (float)rotator.getQ1(),
                (float)rotator.getQ2(),
                (float)rotator.getQ3());
        
        transform.setIdentity();
        
        transform = transform.translate(position);
        transform = transform.rotate(rotation.getY(), UP);
        transform = transform.rotate(rotation.getX(), LEFT);
        transform = transform.rotate(rotation.getZ(), FORWARD);
        transform = transform.scale(new Vector3f(1.0f, 1.0f, 1.0f));
        
        //to row major
        transform.transpose();
        
        //get the forward vector
        Vector3f forward = new Vector3f(transform.m20,
                                        transform.m21,
                                        transform.m22);
        forward.normalise();
                                        
        Vector3f forwardVel = new Vector3f(forward.getX() * Velocity,
                                            forward.getY() * Velocity,
                                            forward.getZ() * Velocity);
        
        position = Vector3f.add(position, forwardVel, position);
    }
    public Movement(float maxVelocity){
        this.maxVelocity = maxVelocity;
        Velocity = 0.0f;
        Acceleration = 0.0f;
        transform.setIdentity();
    }
    
    public void onLeft(float value){//A
        rotation.y += value;
    }
    
    public void onRight(float value){//D
        onLeft(value);
    }
    
    public void onUp(float value){//W
        Acceleration += value;
    }
    
    public void onDown(float value){//S
        Acceleration -= value;
    }
    
    public void onHorizontal(float value){//MouseX
        rotation.z += value;
    }
    
    public void onVertical(float value){//MouseY
        rotation.x += value;
    }
    
    public float[] getPosition(){
        return new float[]{position.getX(),
            position.getY(),
            position.getZ()
        };
    }
    
    public float[] getQuaternion(){
        return new float[]{quaternion.getX(),
            quaternion.getY(),
            quaternion.getZ(),
            quaternion.getW()
        };
    }
}

Monday, June 9, 2014

Hey Baby, I Wanna Know (What Have I Been Up to)!

Seems like it has been a while since I have done my last post. This is with good reason, my fingers are blistering from refactoring the server side engine. What is it that I am doing? Something maniacal in a time crunch - every programmers dream come true.

Currently I am in the middle of a major overhaul of the server side engine to be more authoritative in regards to gameplay. The key word here is gameplay. So far, the engine works great in regards to GUI systems calling server events and data. Such things would be high scores, creating games, joining games, ship configuration, and so on and so forth. The part that needs work is the actual code that handles the game logic simulation such as collisions and player positions. As it stands right now, the server just forwards all this information with no replication. This can lead to easy cheating and abuse of networking. So, I decided to fight this by doing the following:

  • Player input is sent to server for processing
  • Server calculates position
  • Server updates game world on itself, then sends data to players
  • Server handles collisions
  • Server handles player elements - health, life, death, ammo, cooldown, etc.
On another note, I have also been working on the special effects in the game to make it more visually appealing. More on that on another date.