Monday, August 26, 2013

Finally An Update!

I feel like I'm apologizing a lot in my posts recently for the irregular updates. I have indeed been working on things in the past month, but due to work and complications with where we are staying I haven't had much time to write up a post. I won't bore you with too many details, but my internet is very slow here...frustratingly slow.

Anyway, I finished up with the menus for N'Ferno and showed them to the rest of Pixel Jargon. They were met with approval, with just a few tweaks that I forgot about. Since then I have put them aside until we get some finalized code for a couple more features. There was only one major bug with the menus and I haven't been able to figure out what is causing it. It was a problem that we ran into when we were making menus and such for Umbra, but I can't remember if we fixed it or not. Basically, if you are holding a movement key and you pause the game, when you unpause the game the pawn will continue running in the direction you were pressing until you hit that button again. I've looked on the Epic Games' forums, but either we're the only ones to encounter this, or I'm not using the right keywords.

Also put on the back burner was my experiment with the custom input ini's. I posted on the forums asking if anyone had any solutions to the mouse problem I was experiencing, but not a single person responded. It seems like none of the problems I have ran into have been asked about in the forums.

Since I wasn't really working on the menus for the time being I decided to help the modeling team a little. I was assigned a pretty interesting street lamp. Given two reference images I had to come up with a design and do a low poly model of it. I realized it is really hard to model something that has all rounded edges and try and keep it under 100 polygons. This meant very little detail once the basic shape was done. Since I was so disheartened by the lack of detail in it I decided to do a slightly higher poly version for myself. This ended up being around 1500 polys, but I was able to explore the concept a lot more and I found a design I liked better than my original one.

Here are the reference images I was given:

This was the original composite reference I made t get started:


And this is what I came up with for my higher poly model:

The texture is just a sub-object material I put on so I could see the different elements better. I might add more on to this at a later date, but for now I am done with it. It served its purpose in helping me visualize what I wanted the very low poly version to look like.

That's all I have for now!

Sunday, July 21, 2013

My Troubles With A Custom Input

Since the Scaleform stuff for N'Ferno isn't due for a couple months I decided to try and figure out how to use a custom input ini in UDK. This would allow me to use a different file for holding what keys do what, for each project. That way I don't have to manually change the DefaultInput.ini every time I wanted to work on a different project. This involved creating a new Input class, referencing it in the PlayerController default properties, then setting up a default input .ini with the new keybinds.

Once I got all of those set up I went to test it, and I couldn't turn with the mouse. All of the other custom keybinds worked perfectly. I could click with the mouse, just not move the camera around. I spent a couple days just trying different combinations of code in the .ini itself, to no avail. If anyone has any idea how mouse movement is handled in Unrealscript let me know. I could hardly find anything on using custom inputs besides changing the bindings in the DefaulInput.ini.

On another note, I started retrofitting the upgrade screen a while ago to work with N'Ferno and realized that I'm going to have to redo a lot of the structure. I decided to do this since N'Ferno won't need that robust of an upgrade system, and I can also trim it down some so the file size is smaller. It shouldn't take me very long to get that put back together nicely.

Well, that's all for now. Thank you for reading my blog!

Friday, July 12, 2013

A Whole Lot of Menus - Nordic Sol, N'Ferno

Hey there guys!

Over the past week I've been working pretty hard on getting some menus put together and working the bugs out of them. For Nordic Sol, which has gone through a huge overhaul since my last post about it, I have almost all the menus working how they should.

I made a:
Title Menu
Pause Menu
Death Screen
Inventory Screen

I have a little cleanup to do on the Inventory screen, for some reason one of the features stopped working...

I also have to do a credits/end game screen.

For N'Ferno I have most of the same menus, except the Inventory. Instead, I have a store where you can upgrade your gear. It is based off the generic store/upgrade screen I made a while back.

I did find an interesting thing out about the ExternalInterface.call() function in AS3 though. When you pass parameters with it you can have the Unrealscript function catch them. Now, I know that is pretty standard functionality in a function. You know, in the function being called in GetItem("Plasma Gun"); it would be function GetItem(string ItemName) and ItemName would then be a local variable. However! In all of the examples I had seen of ExternalInterface.call() in Unrealscript they would always use GetInt() in the function itself instead of catching the passed the parameters. Seems pretty lame of a find, but it always confused me why you would get the variable in the function when you were passing it in ActionScript. Now I know I can treat it like a regular function, which is really handy and a lot cleaner.

Wednesday, July 3, 2013

Way Too Long

Hello everyone!

It has been a long time hasn't it? Life has been pretty hectic the past couple weeks. Between graduating with my Bachelor's degree in Digital Entertainment/Game Design and moving two states away I haven't had much time to work on a lot of things. I have been slowly putting together some menus and other UI screens for two of our projects.

The inventory screen for one of them works pretty good so far, but it is catching me up on one part. After not looking at it for a week I forgot exactly where I was going with the code but I think I found a solution. For another menu I am reusing one I made a while back, but it seems like one of the components is no longer supported, or something went haywire when I upgraded to a newer version of UDK. I'm currently rebuilding it from scratch and seeing if that will work.

Sorry I don't really have much to show you, though I'm a bit more established now with internet and power so I should be back to regular updates.

Monday, June 3, 2013

A Proof Of Concept And An Old Datapad

Hey guys,

Over the past week I've been doing a small proof of concept for a game I'm thinking about starting development on. The working title for the game is Crazy Steve. I have the core game design document done for it, I just have to create an asset list, animation list, and put in some initial concepts for the menus/HUD.

Here's the synopsis of the game: Crazy Steve is a top-down, horde survival game. You play as Crazy Steve, an aging man protecting his dying wife from the Grim Reaper and its minions. In between each level there will be stills of their lives together before this point. You must defend yourself and your trailer. If either one falls, you lose. You win by defeating all the minions in each round, and eventually defeating the Grim Reaper.

Here is the proof of concept so far, though I apologize the graphics are nowhere near pretty. This proof of concept served two purposes; the first was to get a rough idea of what it would take to make this game in Construct2, and the other was to flesh out the enemy classes to get a better understanding of what I am envisioning. Overall I like the enemies as they are, although the Warlock(The ones who shoot things at you) may need to be toned down just a little. Just click on the window to play. If the game is too small you can click here and it will open it in a new tab/window in a larger size.

The controls are: WASD or the arrow keys to move, the left mouse button to fire, and R to reload.
P will pause the game.

That has been taking up most of my time, along with getting ready to move. As I was looking through my old documents I found a datapad I modeled a while ago. It was modeled off one from the Star Wars universe. Here is the model and reference photo. The reference photo is courtesy of Wookiepedia.



It doesn't quite have the same proportions and the textures are way off. It's interesting to go back and look at projects you worked on a long time ago and see how far you've progressed. 

That's all I have for you guys for now!

Sunday, May 26, 2013

Learning Challenge, AS3 Style!

Hey guys!

After my last post I began looking at what I would need to do in order to get the visuals for the action queue to work. I decided I wanted it to look similar in style to the example below. In this example the player wants to use a key, move, talk to a person, then move again. The action that is being performed is scaled larger and is in the 'highlighted' slot on the bar.
This seemed pretty easy in theory, just spawn an icon tot he left of the last one. When one action is completed move the remainder to the right and make the 1st action icon larger. Instead of diving in to this I decided to do a little challenge. The challenge was to make an inventory system that could support a dynamic amount of items. I also wanted to make it scrollable. Now this doesn't seem like it would help with the action queue problem, but both involve spawning movieclips in a line and setting parameters from an array. The last will be important because the actions will be stored in an array and that information will be used to spawn the correct icon. I added the scrolling challenge since I plan on using a system very similar to the challenge if I redo my crafting page, or add an inventory system to my menu collection.

The challenge only took me a couple hours of work, though I had a couple days where both of my computers were out of commission. Many thanks to Craig Campbell over at School of Flash, and Ali Qureshi for their tutorials. Between the two I was able to get the bulk of the logic figured out and implemented. I ended up using Craig's custom scrollbar and masking approach rather than the scrollpane as in Ali's example so I could have more control over the look of it. Ali has a very well commented block of code for spawning the desirable amount of movieclips from AS3. I used this primarily to get the inventory items to spawn. Overall I learned a lot about spawning movieclips and setting parameters using a for loop, and what math is needed to get a particular block of content to scroll. Here is the final product of my self-challenge: (Go ahead, click on it! It's interactive!)



Here is the Actionscript3 code that makes it work: Not too different from the tutorials though.

import flash.events.MouseEvent; stop(); //Movieclip vars var desiredMCs:int = 20; var nextYPos:int = 10; var i:int = 0; var invoCont:invoContainer; var invoArray:Array = ["Bread", "Milk", "Juice", "Steak", "Pinapple", "Carrot", "Ginger", "Parsley", "Eggs", "Peppers", "Onions", "Porkchops", "Chicken Nuggets", "Salmon", "Prickly Pear Cactus", "Butter Cup Squash", "Spam", "Red Leaf Lettuce", "Cornbread", "Cheeseburger"]; //Scrollbar vars var rect:Rectangle; var scrollerMinY:Number = slider_mc.handle_mc.y; var containerMaxY:Number; var padding:Number = 20; slider_mc.handle_mc.buttonMode = true; slider_mc.handle_mc.addEventListener(MouseEvent.MOUSE_DOWN, dragHandle); popup_mc.drawInvo_btn.addEventListener(MouseEvent.CLICK, drawInvo); back_btn.addEventListener(MouseEvent.CLICK, removeInvoCont); //Inventory functions function drawInvo(e:MouseEvent) { desiredMCs = popup_mc.inputField_txt.text; if(desiredMCs >= 1 && desiredMCs <= 20) { invoCont = new invoContainer(); invoCont.x = 170; invoCont.y = 30; mainICont_mc.addChild(invoCont); containerMaxY = invoCont.y; popup_mc.visible = false; for (i = 0; i < desiredMCs; i++) { var item:invoItem = new invoItem(); item.x = 10; item.y = nextYPos; item.name = "invoItem" + i; item.itemName_txt.text ="Item Name: " + invoArray[i]; item.itemType_txt.text ="Item Number: Item " + (i +1); item.itemDesc_txt.text =""; invoCont.addChild(item); nextYPos += item.height + 1; } for (i = 0; i < invoCont.numChildren; i++) { trace ("name: " + invoCont.getChildAt(i).name + "\t type:" + invoCont.getChildAt(i)); } //If there is not enough content to scroll, disable it if(desiredMCs <= 3) { slider_mc.visible = false; } else { slider_mc.visible = true; } } else { //Do something to show an invalid number } } function removeInvoCont(e:MouseEvent) { //Removing the existing inventory mainICont_mc.removeChild(invoCont); //Reseting variables for a new test slider_mc.handle_mc.y = 3; nextYPos = 10; popup_mc.inputField_txt.text = ""; popup_mc.visible = true; } //Slider Functionality function dragHandle(e:MouseEvent):void { rect = new Rectangle(0, 3, 0, 345); slider_mc.handle_mc.startDrag(false, rect); stage.addEventListener(MouseEvent.MOUSE_UP, releaseHandle); slider_mc.handle_mc.addEventListener(Event.ENTER_FRAME, scrollInvo); } function scrollInvo(e:Event):void { var scrollerRange:Number = rect.height; var contentRange:Number = invoCont.height - mask_mc.height + padding; var percentage:Number = (slider_mc.handle_mc.y - scrollerMinY) / scrollerRange; var targetY:Number = containerMaxY - percentage * contentRange; invoCont.y = targetY; } function releaseHandle(e:MouseEvent):void { slider_mc.handle_mc.stopDrag(); slider_mc.handle_mc.removeEventListener(Event.ENTER_FRAME, scrollInvo); }

That's about it. It was a nice little challenge that I think will help me with creating the action queue visuals when I get around to them, plus a better inventory management system. For bearing with me here is an point pickup inspired by the 2007 game Monster Madness: Battle for Suburbia!
No texture, sorry!

Sunday, May 19, 2013

Looking For Another Name For A Queue...

Hello everyone,

Over the past several days I've been working on a queue system where the player, or another portion of code, can add an attack, action, or item to a queue and it will play them after a set delay. This could be used to set up attacks during a battle so you can focus your attention on strategies or your allies. It could also be used to receive function calls from code to handle them if more than one is called at once, for instance if two animations are called at the same time. It ended up being pretty easy to set up once I figured out what steps were needed.

When I first attempted this a couple weeks ago I ended up putting it down in frustration because I couldn't figure out how to get it to do what I wanted it to do. Earlier this week I remembered something from an article I read about coding, and it helped my out with this. The article suggested to write down the steps that the code needed to take before you even begin working on the computer. By doing this you are forcing yourself to think about the different components that make up the chunk of code that you are trying to create.   I decided to do this and the breakdown ended up looking like this:


This really helped me get the order down on what needed to happen where. After that I could take each step and write them out, essentially creating three functions reflecting the outline above.

Here's what I came up with in Unrealscript. This is in my custom Pawn class:

//Struct used in the Action Array struct Actions { var string N; //Action Name var float D; //Action Delay }; //Delay playing another action var bool bDelay; //Holds the actions currently queued to run var Array<Actions> ActArray; function AddAction(string Action, float Delay) { local int i; //Set i to the current length i = ActArray.Length; //Add another element in the array ActArray.Length = ActArray.Length + 1; //Set the properties of the new element ActArray[i].N = Action; ActArray[i].D = Delay; PlayAction(); } function PlayAction() { local string TempN; local float TempD; //If an action is already playing if(bDelay == true) { //Place any action to run if an action is currently being ran. } //If not else if(bDelay == false) { bDelay = true; //Set the temporary variables TempN = ActArray[0].N; TempD = ActArray[0].D; //Check which action needs to be played switch(TempN) { case("sAttack"): //Standard Attack Played break; case("hAttack"): //Heavy Attack Played break; default: break; } //Remove the played action ActArray.Remove(0, 1); //Set bDelay = false after a set time SetTimer(TempD, false, 'ResetDelay'); //Output the time to the screen WorldInfo.Game.Broadcast(self, "PlayAction Time:" @ TempD); } } function ResetDelay() { bDelay = false; //If there is another action waiting if(ActArray.Length > 0) { PlayAction(); } } defaultproperties { bDelay = false }
And the functions that call it from my custom GFxMoviePlayer class:

function sAttack() { GP.AddAction("sAttack", 10.0); } function hAttack() { GP.AddAction("hAttack", 20.0); }
I'll go through and break down what is happening in each one starting in the Pawn class. The variables are pretty self explanatory. I chose to use an array consisting of the Actions structs I defined earlier, that way each action could have multiple properties assigned to it. In this case I just have the action name and how long its cooldown should be. 

Next I'll go through the AddAction function. As you can see it takes two parameters when it is called, this was the easiest way I found to set up the different attacks. We'll then create a local int that will store what element number the action need to go into. Arrays use a base-0 numbering system, meaning they start at 0 and end at one less than the number of elements. I.e. if you have 4 elements the last one would be Element3. Since this is the case I set i equal to the current length of the array, then added one more element onto the array. This left i being the last element in the array. I then set the name and delay properties of that element equal to the parameters that were passed from the calling function. Last, I call the PlayAction function which actually calls the function to play the attack.

Onto the PlayAction function! Most of this is pretty easy to follow. Basically, if an action isn't cooling down(if bDelay is false) then check what the name of the action is and play the appropriate function.Then we're going to remove the first element from the array which will move the rest of them up one. I did this because it simulates a real queue, or line. Only one person can be helped at once. When the first person is done they move off and everyone moves forward, thus creating an organized system to handle multiple people. Finally, we set a timer to mark the system as ready to play another action. You might be able to use ActArray[0].N in the switch directly, or ActArray[0].D in the timer, but I ran into some issues previously with using array elements directly. I may give it a whirl later and see if I can, but I'm going to leave it for now.

Our last function in the Pawn class is resetting bDelay and calling PlayAction if there is another action waiting to be played. 

The functions in the GFxMoviePlayer class simply call the AddAction function and declare what action needs to be set. 

Well, there is a basic working queue system to use in a multitude of situations. You could even make a function for when an action is double clicked on your graphical display to remove that specific action. It could look something like this(though I haven't tried it)

RemoveAction(3); function RemoveAction(int ActNum) { ActArray.Remove(ActNum, 1); }
In this example it would remove 1 element at the 3rd slot, or whatever we pass into ActNum.

Anyway, that's all I have for today. Hope this was useful to someone. Once I figure out how I want the graphical display to look/work I'll post the code and such for that as well.