Jonathan Gardner's Portfolio


    The applications listed in this section were all done in C#. There are solo and group projects listed in this section. Some I have worked on as personal projects, some for College courses, and others for jobs. Below you will find the projects name with a detailed description. Most (if not all) of my projects have information available for download. Unless noted the download will be a zip file. If you need any more information check out my Contact Info page and let me know. I retain all rights to the material that is available for download or viewable.

World Editor
Project Title : DNA Project
Application Title : Genetics World Editor
Date Completed : December 2007
Project Timeline :
  July '07 to August '07 (Pre-Production),
  September '07 to December 3rd '07 (Production)
Team (roles) :
  Jonathan Gardner (Team/Project Lead, Programming Lead, Designer, Documentation)
  Jonathon Hubbard (Programmer, Designer, Outsource Manager)
Application Type : Entertainment (PC Game) / Tools
Location : Phoenix, AZ
Project Type : Personal, and College Course
Project Hours :
  Jonathan Gardner : ~350 Total Hours (275 Production, ~75 Pre-Production)
  Jonathon Hubbard : ~135 Total Hours (80 Production, ~55 Pre-Production)
Sister Links :
  Genetics Documentation (Docs)
  Genetics (C++)
Downloads :  ( ~ 2.29 MB)

Project Details :
  The DNA project was a project to develop a PC game with the Tools to develop the game. For information on the base code in C++, head over to my C++ section. You can also get to the project directly via the link above in the 'Sister Links' section.

  The World Editor was built on top of the C++ code for the DNA Project. The base sections of code were the Direct X9 Shell and the Tile Engine. The C++ versions were converted to C# for the World Editor. Overall this wasn't too bad of a conversion. It didn't take me to long to convert them over the C#. We did this conversion for 2 main reasons. The first was so that the World Editor would render in real time and display the world as it would appear in game. The second was so that there would be no issues with the created levels and the Game Engine. This would help ensure that the Worlds/Levels created would work properly in the game.

  *Note, The current version of the World Editor will load in any png file, but the tiles are displayed in 32x32 squares. So if you load something in bigger then that, it will not display correctly. Please use 32x32 png files for best performance. *One other note, RGB(255, 0 255) is the alpha on tiles.

  Features :
  Overall the World Editor has quite a few features for the short period of time I was able to spend programming it. Here is a list of the features that currently work in the World Editor : New Level, New Game World Obj, Load Game World, Import Level, All the various Saves, Map Information Dialog, Preferences (Save Options Only), Zoom, Application Information, Context Menus [World View, Tile Set, Layer, Visibility, Level ID, and Form], and the 'Special' Main Menu options. With this set of features you can create and edit Game Worlds and Level. You can also specify each level's Tile Set.

  While I only had so much time to implement features, there were a few that didn't get finished. The features that have yet to be completed are : Redo, Undo, Copy, and Paste. These didn't get implemented purely because of time restraints. I basically ran out of time to finish these additional features. They are scheduled to be completed when the project picks up again.

  Keys : Here are all of the keys for the application separated by section.

  World View :
    Bullet_Blue   Left Click : Places the selected tile on the current layer of the current level
    Bullet_Blue   Left Control + Left Click (and Hold) (+ Mouse Move) : Moves the viewpoint of the level (if zoom permits)

  Tile Set View :
    Bullet_Blue   Left Click : Select Tile
    Bullet_Blue   Left Control + Left Click (and Hold) (+ Mouse Move) : Scrolls the Tile (If there are enough)

  Left + Right Clicks :
    Bullet_Blue   All other input is from the Main Menu or the Context Menus (Right Click)
    Bullet_Blue   This means that the mouse left and right click operate all the other options and menus.

  GameWorldObjs :
  Here are some of the back end items that will help develop with the World Editor. First thing that you will need to know is that a 'GameWorldObj' is the main world object. This object contains all of the individual levels or maps. We developed the GameWorldObj to be used to help save time loading different worlds. Basically you would have a minimal set of GameWorldObjs that hold all of the game levels/maps for the entire game. As out game has several planets, our main GameWorldObjs would be each of these planets. If for some reason a planet had a lot of levels, it may be divided into smaller GameWorldObjs. Using this approach, you would only have to load in the GameWorldObj at major key points in the story. This would hopefully cut down on load times for the game.

  LevelObjs :
  The next big object are the Levels, they are called 'LevelObjs'. LevelObjs are basically the separate levels/maps that the player sees during the game. Each level holds its own tile set, and also holds all of the layer information. A level must have at least 1 valid layer and tile to be loaded correctly. Since our game is a 2D and tile based, each layer is a 2D grid of tile index numbers. Each layer s independent of the rest and can be edited or viewed individually if needed. Overall the first key aspect to any level would be the layers. You can create or delete layers as needed. The second key aspect to each level is the tile set. As mentioned each level saves its own tile set independently of any other level. This allows you to have GameWorldObjs with LevelObjs that have different tile sets. It can help with loading, as you don't have to load all of the tiles for a GameWorldObj.

  Level and Layer Attributes :
  The next area of interest would be the level and layer attributes. These values specify the individual aspects of each level and layer. Each Level will have a defined height and width. This in turn also specifies the height and width of any layers added to the level. Each level can be saved separately from a GameWorldObj if necessary. Thus giving the developer the freedom to develop a level separately from the GameWorldObj. This can become valuable if you have several people working on a single Game World at the same time. With this approach, all you need to do is import each level to the Game World as they are completed.

  The next item is the Layer attributes. It is possible to turn on/off the visibility of any layer. This can greatly enhance the developers' ability to design the level more effectively. It can save the developer from adding tiles to areas that are not visible. By leaving a tile 'empty' in the level, it causes the tile engine to ignore that tile. Thus saving tile in rendering and any other calculations involving the tiles (ex collision). The developer is also able to select the layer that they would like to currently edit. This does not always have to be the topmost layer, and can help fill in empty spots. You can only have 1 active layer at a time with the editor. One additional note, Any layer of a level can be set to the players active (or currently) layer. This basically tells the engine what layer the player will be actively using during gameplay.

  World Editor Key Parts :
  Now to cover the World Editors major parts. There are two parts though that are probably the most important, the 'World View' and the 'Tile Set'. These two sections are where you will spend the majority of your time. The World View is where the game world is displayed in the editor. More to the point, it is actually where the currently selected level is drawn. This is also were you edit each level that you create in the game world. More specifically you edit each layer of a level in the World View area. The 'Tile Set' is where all of the current Levels tiles are displayed. It also shows you the currently selected tile that is being used. The currently active tile is outlined with a White boarder.

  The other key areas of the World Editor are the additional dialogs. This is where some of the preferences are set for both the World Editor and the GameWorldObjs. Also some additional information on the project and team is listed in a dialog. Lastly, while there isn't any official help or design docs for the World Editor, I tried to design it so that with a few keys it would be easy it figure out. With the key outlines above, most developers (or even standard PC users) should be able to find the World Editor pretty easy to use. There are some samples included with the World Editor. If you have any questions or concerns just drop me a line and I should be able to help.


Cellular Automata
Application Title : Cellular Automata
Date Completed : October 2007
Project Timeline : Most of October '07
Team (roles) :
  Jonathan Gardner (All)
Application Type : Tool, Data Structure, Demonstrative
Location : Phoenix, AZ
Project Type : College Course
Downloads :  ( ~ 1.18 MB)
External Links :
  Wiki Cellular Automata

CA Details :
  This is one of the more interesting projects I worked on. By definition a cellular automata (CA) is a discrete model, with a specific set of rules that affect a cells state. The best way to explain the layout is by using a sheet of grid paper. Each square represents a cell in the CA, and any cell adjacent to it can affect that cell. These adjacent cells are usually referred to as neighboring cells. Each cell has 2 states, on and off (or sometimes referred to as white and black). The rule set that is applied to the CA will cause the cells to either turn on or off after each cycle (or generation). This can in turn produce patterns and intricate designs.

  My CA is a 9 cell rule set. This means that there are 512 rules for my CA. Each rule is any one of the 512 possible states that the 9 cell can be in. As my CA only deals with an On and Off state, the way to calculate the number of rules is 2^9. Your base value is the number of possible states that a specific cell can have. In mine it is On and Off, or 2 states. But you can have a CA were the cell can have multiple states. The exponent is the number of neighboring (or influencing) cells that can affect the cell. Mine has a total of 9 effecting cells. You can have any range of effecting cells in your CA, which can affect the rule set. So by example, if you have a CA in which a cell has 3 states and 3 effecting cells, you get a rule set of 27 (3^3).

Project Details :
  As noted above, my CA is a 9 cell CA and has 512 rules. My CA is also in a grid with overlapping edges. This means that the left edge of the CA wraps around to the right (and visa versa), and the top wraps around to the bottom (and visa versa). This is used to simulate the effect of an infinite space. My CA is able to save and load rules sets. This can prove useful when trying to reproduce a pattern with a rule set. This way you don't have to memorize or select each individual rule. My CA does come with a couple rule sets for demonstration.

  My application can also generate a random rule set. This can be useful to see random patterns, or just to play with the rules without having to set each individual one. My grid is also able to be set anywhere from 20x20 to 250x250. This can give you a lot of room to view the patterns of a CA simulation. My CA also allows you to set the speed of the CA. The speeds provided are : 1 FPS (Frame/Generation Per Second), 4 FPS, and 16 FPS. It is also able to set the number of generations to perform during each draw. One of the last features of my CA is real time rule set changes. It is possible to edit the rules in real time and have it affect the CA. this means while running the CA you can edit the rule set to make changes.


Directed Node Mesh
Application Title : Directed Node Mesh
Date Completed : May 2007
Project Timeline : Most of May '07
Team (roles) :
  Jonathan Gardner (All)
Application Type : Tool
Location : Phoenix, AZ
Project Type : Personal
Sister Links :
  Console Directed node Mesh (C++)
Downloads :  ( ~ 25 KB)

Project Details :
   Originally this project started out in C++. You can link directly to the C++ counterpart via the link above. Basically the underlying details and information are about the same. The main reason I upgraded the application to C# was the visual aspects. Using the Console window can make things hard to read and take more time to set up. With the new and improved Gui in C#, it is much easier and faster to run the application. Although the original C++ version started out as a course project, this version is a personal project.

  For this version one of the first things I did was the Gui design. I spent a little bit of time figuring out what information needed to be displayed, and what information needed to be editable. With my current design I think I have a pretty smooth layout and flow for the application.

  To run the application one of the first things you need to do is create a node mesh. This can be done either by hand or by using the application to generate a random node mesh. I have included a testing node mesh with the application. The next step would be to load in the node mesh. Before you can do anything with the algorithms, you need to check the node mesh file. Once the file is cleared all of the options will be available and all of the information will be filled in. At this point all you would need to do is select a few options and run the algorithm.

  As I have worked on a few path finding applications, I know that some of the algorithms could take a long time to complete. This is one of the reasons I designed this application with threads. It is possible to stop any algorithm at any point using threads. This can save a lot of time waiting for an algorithm to finish. It also keeps the application from appearing to the 'locked' up.
  All of the algorithms are included in the C++ version. To cover them again I have implemented : Shortest Path, Longest Path, Breadth First, Best First, Dijkstra, and Astar. Some of these have different options for the weight. But here are all of the possible weight options : No Weight (Node count Only), Vertex/Node Weight, Edge/Path Weight, and Both Vertex/Edge Weight. With a variety of combinations of algorithms and weight options, you can find multiple solutions to the same problem.

  The next part of the application would be to set a start and end node. This can be done by selecting the node in the list boxes provided. Finally all that is left is to 'Run' the algorithm by pressing the Run button. When the algorithm is finished, the solution(s) will be displayed in a text box on the lower left of the form. It will also display some information about the algorithm that was run. This information is selectable so it can be taken from the form and put into an external file (ie. text file). The last area of the form that displays information is the Node Mesh text box. This displays all of the information about the Node Mesh. It lists each Node and all of the connections that the node has. It also displays the weight of the node and the connections.

  The last part of the form is the Random Node Mesh Section. You start by giving the Node Mesh a file name. Then you just set the parameters of the node mesh. When everything is set, all you have to do is press the 'Create Random File' button. This will generate your new node mesh and output it to the file name you specified. It will also display the node mesh in the text field for viewing.


Media Database
Application Title : Media Database
Date Completed : v1r : December 2008 - Still Ongoing
Project Timeline : November and December 2008
Team (roles) :
  Jonathan Gardner (All)
Application Type : Tool, Item Collection
Location : Orlando, FL
Project Type : Personal
Project Hours :
  Jonathan Gardner : ~80 Total Hours
Downloads :  ( ~ 105 KB)

Project Background :
  This personal application is an endeavor to make an application that could hold some of my personal items. I was writing down my CD collection, and realized it would probably be easier to make an application to do it for me. That way I would also be able to carry it with me if needed. It would also make it easier to update my collection and search for information on my own CDs. Soon after starting I decided to include some more multimedia. So this version of the application holds CDs, DVD's, DVD Series, Software, Games (Console and PC), and a set of items that are like a wish list.

  This proved to be a very interesting application. After I got a test build working, I asked a couple friend and family members to try it out. I was looking to see if the application was easy enough to use and held all the information anyone could think of that may be useful. Everyone that used the test build felt it was pretty easy to use and update. The thing that surprised me is that everyone asked if it would be possible to add different items. Things from Car Parts to a teddy bear collection. So that really got me thinking. I have plans to expand the application to hold any item that a person could think of. So there are some ambitious goals for this application.

Project Details :
  The Media Database has a few back end parts to it. The Item Database/Library is probably the best place to start. This is where all of the items are defined. It contains all of the attributes and information about all of the items. It is also used to specify a sorting style for displaying information. This is also where the searching capabilities are for the items. While I don't have the ability to search currently in the form, the backend functions for this have been developed. This feature kind of fell out of scope because of some of the future features and items.

  While this version of the form uses tabs, I do plan on changing that in future builds. Mainly because I will have more then a few items to display in the tabs. Some early ideas include the use of a list box to select the item category. This would act similar to the tabs now in the current build. This is still being developed so any future information on this may come later.

  The Media files used for this application are binary. Although when a database is saved, a text file is produced for easy viewing. It has no bearing on the binary file when loaded though. So any changes to the text file won't affect the database file itself. One other feature that this application ahs is threads. There are a few areas that use threads in this application. The sorting and displaying areas of the application use threads. This is to keep the application moving and to not appear locked up. One last thing is that a sample database file is included. It doesn't have a lot of information, but it does have at least 1 item for each category.


Russian Flash Card
Application Title : Russian Flash Card - Still Ongoing
Date Completed : August 2009
Project Timeline : 3 Weeks of August '09
Team (roles) :
  Jonathan Gardner (All)
Application Type : Tool, Tutoring Application
Location : Orlando, FL
Project Type : Personal
Downloads :  ( ~ 115 KB)

Project Details :
  After starting a Russian course, I came to find that studying was very important. I thought about it for a little while, and then decided to write an application to help me out. So this application is similar to that of a set of flash cards.
  To start there are a few sections of this application. They are : Card Set, Prefs, Practice, 10? Quiz, and Image Quiz. Each of these sections has a specific objective. Using all of these sections effectively can greatly aid the learning of the Russian language.

Card Set :
  This area is where all of the flash cards are displayed. You also use this area to enter new cards into the application. All of the cards are currently displayed in a text field with all of the information on the card displayed. You can also use this area to practice or study some of the cards.

Prefs :
  In this section you can set a handful of preferences for the application. All of the preferences here are pretty straight forward. The only 2 areas you can edit are the Practice and 10? Quiz section. Mostly the prefs are used to edit what information is displayed in each section.

Practice :
  The Practice section is basically an area that you use to practice. You can set a few preferences to help yourself practice the flash cards. This is a good area to start with and really helped me out at first. After using this area for a while I came up with the next section.

10? Quiz :
  This is a section that is used to quiz yourself on the flash cards. This section will display 10 random cards. Depending on the prefs it can show either the Russian or English section of the card. The user then has to answer the other side of the card. Example : if the Russian word is displayed, the user has to input the English translation. The application will clearly state which questions you answered correctly, and will display information about any that were answered incorrectly. This section is extremely helpful for testing your knowledge.

Image Quiz :
  The Image quiz came up after a session where I had to name colors. This section will display an image corresponding to a flash card. The user will then be asked to enter both the Russian and English translations of the image. If the user wants they can actually use this section for all of the flash cards. As long as you can find an image to represent the item on the flash card. But this was very useful for doing colors. The form will display images with the dimensions of : 325px x 325px.

  I have found this be a very useful application. It also allows me to memorize the Russian keyboard. I have an Image in the application of the placement of all of the Russian characters. The application also automatically switches from an English keyboard to a Russian keyboard setup (and visa versa). This switch happens based on the field you have currently selected on the form. If you have a Russian text field selected, the application automatically switches to Russian input. This is also true for any of the English text fields. It is possible to enter Russian characters into the Notes area, but this field is only setup for English input. This has actually helped me out a lot. I am getting better with the Russian layout of the keyboard because of this feature.

  One of the last things I should probably mention is the loading of Flash Cards. While you can have multiple sets of flash cards, the application can only have 1 set loaded at a time. The cards are saved out in a text file, so edits to the file do affect the cards. This can be handy if you want to mix and match specific cards to a set. I have included a set of flash cards that cover some standard words and phrases.


Movie Editor
Application Title : Movie Editor
Date Completed : January 2009
Project Timeline : Parts of January '09
Team (roles) :
  Jonathan Gardner (All)
Application Type : Tool
Location : Orlando, FL
Project Type : Personal
Downloads :  ( ~ 40 KB)

Project Details :
  This is an application that I developed to help me recompile movies onto various sized DVDs. Basically I was recompressing movies I owned so that I could get multiple movies on a single DVD. This application more or less does all of the background math for me. It also holds the DVD's and new collection DVD's. Overall the application is pretty much self contained. There isn't a lot of input from the user to get all of the calculations. More or less you enter a few numbers and a movie title to calculate the space for that movie. Then with a set of movies you can start to develop DVD collections of multiple movies.

  The first part of the application you would use is probably the lower half. This is where you input all of the information for the individual movies. You enter the movie title, the original length, the edited length, any estimated sizes, and lastly any finished sizes. After building a set of movies in this section you will probably move to the upper half of the application.

  The upper half of the application is where you build most of the compilation DVD's. You give the compilation DVD a name, a target size, an optimal size, and a percentage of the optimal size to use. This will then calculate all of the number for you for that DVD. It will be based on the length of the movies listed for the compilation DVD. The movies that are on a compilation DVD are listed on the right side of the form. These fields also give you the approximate target size for each of these movies. These numbers are a guideline for me to render the movies at. They give me the target size and optimal video display (MBpm [MegaBytes Per Minute]).

  With this information I can develop new compilation DVDs with any number of specs. I can create DVD compilations with any number of movies. This application will also handle newer DVD formats (ie. Blue Ray). All you would need to do is input the specs of the destination format and viola. So far I have used this application to create 5 DVD compilations. This doesn't include DVD series that I have recompiled.

  This application has 2 different save files. 1 is for the movies, and the other is for the DVD compilations. They can be used independently of each other. Some sample files have been included.

Website Home
Std Ver Home

  -Professional Experience
  -Personal Intel
      ~World Editor
      ~Cellular Automata
      ~Directed Node Mesh
      ~Media Database
      ~Russian Flash Card
      ~Movie Editor
  -Contact Info


Personal Data

Site Map

Error Reports