Jump to content
  • Advertisement

Eruadan

Member
  • Content Count

    6
  • Joined

  • Last visited

Community Reputation

258 Neutral

About Eruadan

  • Rank
    Newbie
  1. Hello everyone! My name is Gabe, I've been working on Kingdoms of Arborea, an Online Tactical Turn Based game for the past two months. Kingdoms of Arborea (KoA) is essentially a crossbreed between a Tactical Turn Based RPG (Final Fantasy Tactics and Tactics Arena Online) and a Kingdom Management Game (Kings of Chaos). These combined elements allow the player to enjoy a very strategic battle system coupled with an engaging meta game. "How does that work exactly?" The player represents a "Kingdom" in the vast world of Arborea. As the leader of a kingdom, the player chooses how to manage his/her resources, what to focus on expanding/producing next. The player can construct buildings which give certain perks, or send explorers on expeditions to find new resources, valuables, and even new troops. Troops are stored in a barracks. The player can choose twelve troops from his/her barracks to form his army. This army can be placed in any formation that the player chooses. If/When the player chooses to raid someone's kingdom the two armies go into a tactical-RPG battle mode. The victor marches off with pillaged loot and a boosted ego. While there are a bunch of other features I have in the back of my mind the above is the core basics of the game. "Nice idea! But how much do you have done so far?" Ideas are indeed a dime a dozen. So far, I have completed the login system, a basic user lobby, a match making system, and a prototype of the battle mode. Below is some screenshots: "Neat! So what are you looking for?" I can pretty much do 100% of the programming, and I have a friend of mine who is willing to do the concept art. What I am currently looking for is a 3D Artist/Animator who can create custom character models based off of concept art provided or come up with his/her own character ideas. Payment will be in the form of profit sharing and a small deliverable bonus when artwork is complete. If you are interested, feel free to reply to this thread or contact me via PM! Thank you! -Gabe
  2. Hey all! It's been a busy week between the World Cup and 4th of July, I haven't devoted as much time to progressing on my project, but I've picked up quite a bit in the past few days. Realistic Expectations It dawned on me this past weekend that I most likely won't have time to implement all the features and elements I want. The problem is, it takes only a few minutes to think of a cool feature to add to the game, but can take hours to actually code and implement said feature. And sadly my time is limited, once school starts up for me again in September my time to program will go down dramatically. Moreover, I personally suck at making art, models, and animation so I am extremely limited in what kind of graphics and art I can have. So while I still have the long-term goal of creating an excellent Sci-Fi Third Person Shooter MOBA that can compete with Dota 2, LoL and other large names in the scene, I have adapted a more achievable mid-term goal. I want to build a demo that has many of the elements of what I want my full-featured MOBA to have but on a much smaller scale. For instance, instead of having a 3v3, 5v5, and 10v10 map. I will have a simple 1v1 Map. Instead of having a unique player model for each combination of race and gender, I will have one generic model for all genders and races. The item system will not have cosmetic properties, but solely be stat modifiers. Models will be low poly and have simple or non-existent textures. Once I have a demo done, I will go around showcasing it on various websites/forums and hopefully will be able to recruit a few artists (and maybe another programmer) to help expand my small demo project into a full-featured game. Although, I'm not in this for profit or any compensation, it would be nice to one day have this publish through steam green light or another publishing platform. Anyways I'm getting ahead of myself... Check out the game updates below! Coding Updates Build 0.0.5: (July 3rd, 2014) Fixed a bug in the Character Creation process that required a client restart before being able to log in. Added users to the chat system... Build 0.0.6: (July 7th, 2014) Added a play button... Programmed server side extension to check if the player wants to "play". Searches for an open match, if none exists, creates a room and waits for an opponent. This is a very bare bones matchmaking system, but in the future will easily be scale-able to look for users with similar gear and skill level. Next build I will be finally able to dive into creating the game itself. Build 0.0.7: (July 8th, 2014) Designed a crude 1v1 Demo Level in Blender and imported into Unity Programmed basic 1v1 Match Script (Currently still bugged, game crashes when you try to exit) Fixed bug to allow players queued for a match to continue chatting in the lobby. Fixed weird bug where players would occasionally Join an existing match AND create their own. Rewrote some server-side code to make the lobby run smoother. (No cosmetic changes) Build 0.0.8: (July 9th, 2014) Purchased a low poly Sci-Fi art asset set that came with two fully animated prefabs and some environment models. This will hopefully be enough art until I can get a demo done and showcase it in hopes of recruiting some artists (If your an artist and interested in helping out with this project, feel free to contact me!) Imported the Assault Trooper asset into my build. Wrote a simple player controller to allow the player to move his character (and in the future will communicate with the server) Programmed a SpawnLocalPlayer method which dynamically adds a LocalPlayer game object using the Assault Troop Prefab and Player Controller. Programmed the LocalPlayer game object to play his run animation if he is moving Began programming the interpolation process that will be used in future builds, I'm not very confident in it as I've never done interpolation before [indent=1][media][/media]
  3. Eruadan

    Where to include map data etc.

      So I started replying to this, but I'm not sure what you mean by maps... How are you going to have a text based map? What exactly do you want to store?   I recently coded a 2D RPG in C# and stored 234 16x16 maps inside a text file. At the start of the game (or when a player loaded the game) the program would read all the map data to the RAM by storing it in an array of strings. My map consisted of 16x16 (256) strings for each tile pointer to a tile image, along with values that indicate it's map number, and adjacent maps. Here is an example of what would get stored: 228 //Map Number 220 //North Map 229 //East Map 999 //South Map (999 = No adjacent map, edge of game world) 227 //West Map GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/gedge5.bmp GFX/brock1.bmp GFX/brock1.bmp GFX/brock1.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/gedge2.bmp GFX/gedge1.bmp GFX/beach.bmp GFX/brock2.bmp GFX/brock2.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/gedge2.bmp GFX/gedge1.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/gedge2.bmp GFX/gedge3.bmp GFX/gedge3.bmp GFX/gedge1.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/grass.bmp GFX/gedge2.bmp GFX/gedge1.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/gedge3.bmp GFX/gedge3.bmp GFX/gedge3.bmp GFX/gedge3.bmp GFX/gedge3.bmp GFX/gedge3.bmp GFX/gedge1.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/bedge1.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/bedge1.bmp GFX/bedge2.bmp GFX/bedge3.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/bedge1.bmp GFX/bedge2.bmp GFX/bedge3.bmp GFX/water.bmp GFX/water.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/beach.bmp GFX/bedge1.bmp GFX/bedge3.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/bedge2.bmp GFX/bedge2.bmp GFX/bedge2.bmp GFX/bedge2.bmp GFX/bedge2.bmp GFX/bedge2.bmp GFX/bedge2.bmp GFX/bedge2.bmp GFX/bedge2.bmp GFX/bedge2.bmp GFX/bedge3.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp GFX/water.bmp And here is the MapData class   using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; namespace Arborea { class MapData { public int NumOfMap; public int MapNumber; public int AdjacentMapN; public int AdjacentMapE; public int AdjacentMapS; public int AdjacentMapW; public int[,] MapTile = new int[16, 16]; public int[,] MapCode = new int[16, 16]; public bool Paint; public string CurrentPaint; public string CurrentCode; public int CurrentTileBox; public bool CheckNPC; public int NPCNumber; public Label[,] CodeLabel = new Label[16, 16]; public string[] MapLines = new string[65250]; public string[] MapCodeLines = new string[65250]; public void CreateMap() { using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"DATA/maps.txt", true)) { int blankline; blankline = 0; while (blankline < 261) { file.WriteLine("."); blankline++; } } var lines = File.ReadAllLines(@"DATA/maps.txt"); lines[0] = Convert.ToString(NumOfMap); lines[(MapNumber - 1) * 261 + 0 + 1] = Convert.ToString(MapNumber); lines[(MapNumber - 1) * 261 + 1 + 1] = Convert.ToString(AdjacentMapN); lines[(MapNumber - 1) * 261 + 2 + 1] = Convert.ToString(AdjacentMapE); lines[(MapNumber - 1) * 261 + 3 + 1] = Convert.ToString(AdjacentMapS); lines[(MapNumber - 1) * 261 + 4 + 1] = Convert.ToString(AdjacentMapW); int x = 5; while (x <= 260) { lines[(MapNumber - 1) * 261 + x + 1] = "GFX/grass.bmp"; x++; } File.WriteAllLines(@"DATA/maps.txt", lines); // WRITE DEFAULT MAP CODE TO MAPCODE.TXT using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"DATA/mapcode.txt", true)) { int blankline; blankline = 0; while (blankline < 261) { file.WriteLine("."); blankline++; } } var codelines = File.ReadAllLines(@"DATA/mapcode.txt"); codelines[0] = Convert.ToString(NumOfMap); codelines[(MapNumber - 1) * 261 + 0 + 1] = Convert.ToString(MapNumber); codelines[(MapNumber - 1) * 261 + 1 + 1] = Convert.ToString(AdjacentMapN); codelines[(MapNumber - 1) * 261 + 2 + 1] = Convert.ToString(AdjacentMapE); codelines[(MapNumber - 1) * 261 + 3 + 1] = Convert.ToString(AdjacentMapS); codelines[(MapNumber - 1) * 261 + 4 + 1] = Convert.ToString(AdjacentMapW); int y = 5; while (y <= 260) { codelines[(MapNumber - 1) * 261 + y + 1] = "N"; y++; } File.WriteAllLines(@"DATA/mapcode.txt", codelines); } public void LoadAllMaps() { MapLines = File.ReadAllLines(@"DATA/maps.txt"); MapCodeLines = File.ReadAllLines(@"DATA/mapcode.txt"); } public System.Drawing.Image DrawMap(int N, System.Windows.Forms.PictureBox MapBox) { Bitmap MapBMP = new Bitmap (512, 512); MapBox.Invalidate(); Graphics g = Graphics.FromImage(MapBMP); int x = 0; int y = 0; while (y <= 15) { while (x <= 15) { Bitmap Piece = new Bitmap(MapLines[(N - 1) * 261 + (y * 16 + x) + 6]); g.DrawImageUnscaled(Piece, x * 32, y * 32); x++; } x = 0; y++; } MapBox.Image = MapBMP; MapBox.Refresh(); return MapBox.Image; } public System.Drawing.Image DrawTileBox(int N, System.Windows.Forms.PictureBox TileBox) { Bitmap TileBMP = new Bitmap(128, 512); TileBox.Invalidate(); Graphics g = Graphics.FromImage(TileBMP); int x = 0; int y = 0; while (y <= 15) { while (x <= 3) { Bitmap Piece = new Bitmap(File.ReadLines(@"DATA/tiles.txt").Skip((N - 1) * 64 + (y * 4 + x)).Take(1).First()); g.DrawImageUnscaled(Piece, x * 32, y * 32); x++; } x = 0; y++; } TileBox.Image = TileBMP; TileBox.Refresh(); return TileBox.Image; } public void SelectPaint (int X, int Y) { int iX = X/32; int iY = Y/32; CurrentPaint = File.ReadLines(@"DATA/tiles.txt").Skip((CurrentTileBox - 1) * 64 + (iY * 4 + iX)).Take(1).First(); } public void PaintMap (int X, int Y) { int iX = X / 32; int iY = Y / 32; MapLines[((MapNumber-1)*261 + (iY*16 + iX) + 6)] = CurrentPaint; File.WriteAllLines(@"DATA/maps.txt", MapLines); } public void CodeMap (int X, int Y) { int iX = X / 32; int iY = Y / 32; MapCodeLines[((MapNumber - 1) * 261 + (iY * 16 + iX) + 6)] = CurrentCode; File.WriteAllLines(@"DATA/mapcode.txt", MapCodeLines); } public void DrawCodeMap(int N, System.Windows.Forms.PictureBox MapBox) { int iX = 0; int iY = 0; while (iY <= 15) { while (iX <= 15) { if (CodeLabel[iX, iY] != null) { CodeLabel[iX, iY].Dispose(); } if (MapCodeLines[(N - 1) * 261 + (iY * 16 + iX) + 6] == "B") { CodeLabel[iX, iY] = new Label(); CodeLabel[iX, iY].Parent = MapBox; CodeLabel[iX, iY].BackColor = Color.Transparent; CodeLabel[iX, iY].Text = MapCodeLines[(N - 1) * 261 + (iY * 16 + iX) + 6]; CodeLabel[iX, iY].Location = new Point(iX * 32 + 10, iY * 32 + 10); CodeLabel[iX, iY].Width = 20; } iX++; } iX = 0; iY++; } } public void SetAdjacentMap(string North, string East, string South, string West) { MapLines[(MapNumber - 1) * 261 + 1 + 1] = North; MapLines[(MapNumber - 1) * 261 + 2 + 1] = East; MapLines[(MapNumber - 1) * 261 + 3 + 1] = South; MapLines[(MapNumber - 1) * 261 + 4 + 1] = West; File.WriteAllLines(@"DATA/maps.txt", MapLines); } public void LoadMap(int NewMap) { MapNumber = NewMap; AdjacentMapN = Convert.ToInt32(MapLines[(MapNumber - 1) * 261 + 1 + 1]); AdjacentMapE = Convert.ToInt32(MapLines[(MapNumber - 1) * 261 + 2 + 1]); AdjacentMapS = Convert.ToInt32(MapLines[(MapNumber - 1) * 261 + 3 + 1]); AdjacentMapW = Convert.ToInt32(MapLines[(MapNumber - 1) * 261 + 4 + 1]); } public void LoadNPC(PictureBox [] NPCPicBox, Character [] NPC, PictureBox MapPictureBox) { int n = 0; while (n <= 15) { if (NPC[n] != null) { NPCPicBox[NPC[n].ID].Hide(); if (NPC[n].Z_Location == MapNumber && NPC[n].Alive == true) { NPC[n].DrawCharacter(NPCPicBox[NPC[n].ID], MapPictureBox); } } n++; } } public bool CollisionCheck(int direction, int MapNum, Character Player, Character[] NPC) { CheckNPC = false; int iX, iY; if (direction == 0) { iX = Player.X_Location; iY = Player.Y_Location + 1; if (File.ReadLines(@"DATA/mapcode.txt").Skip((MapNum - 1) * 261 + (iY * 16 + iX) + 6).Take(1).First() == "B") { return false; } int n = 0; while (n <= 15) { if (NPC[n] != null && NPC[n].Alive == true) { if (NPC[n].Z_Location == MapNum && NPC[n].Y_Location == iY && NPC[n].X_Location == iX) { CheckNPC = true; NPCNumber = n; return false; } } n++; } return true; } if (direction == 1) { iX = Player.X_Location - 1; iY = Player.Y_Location; if (File.ReadLines(@"DATA/mapcode.txt").Skip((MapNum - 1) * 261 + (iY * 16 + iX) + 6).Take(1).First() == "B") { return false; } int n = 0; while (n <= 15) { if (NPC[n] != null && NPC[n].Alive == true) { if (NPC[n].Z_Location == MapNum && NPC[n].Y_Location == iY && NPC[n].X_Location == iX) { CheckNPC = true; NPCNumber = n; return false; } } n++; } return true; } if (direction == 2) { iX = Player.X_Location + 1; iY = Player.Y_Location; if (File.ReadLines(@"DATA/mapcode.txt").Skip((MapNum - 1) * 261 + (iY * 16 + iX) + 6).Take(1).First() == "B") { return false; } int n = 0; while (n <= 15) { if (NPC[n] != null && NPC[n].Alive == true) { if (NPC[n].Z_Location == MapNum && NPC[n].Y_Location == iY && NPC[n].X_Location == iX) { CheckNPC = true; NPCNumber = n; return false; } } n++; } return true; } if (direction == 3) { iX = Player.X_Location; iY = Player.Y_Location - 1; if (File.ReadLines(@"DATA/mapcode.txt").Skip((MapNum - 1) * 261 + (iY * 16 + iX) + 6).Take(1).First() == "B") { return false; } int n = 0; while (n <= 15) { if (NPC[n] != null && NPC[n].Alive == true) { if (NPC[n].Z_Location == MapNum && NPC[n].Y_Location == iY && NPC[n].X_Location == iX) { CheckNPC = true; NPCNumber = n; return false; } } n++; } return true; } return true; } public bool AggroCheck(Character Player, Character[] NPC) { int n = 0; while(n <= 15) { if(NPC[n] != null && NPC[n].Alive == true && NPC[n].Z_Location == Player.Z_Location && NPC[n].AggresiveState == true) { if(NPC[n].Direction == 0 && Player.X_Location == NPC[n].X_Location && Player.Y_Location > NPC[n].Y_Location) { NPCNumber = n; return true; } if (NPC[n].Direction == 1 && Player.X_Location < NPC[n].X_Location && Player.Y_Location == NPC[n].Y_Location) { NPCNumber = n; return true; } if (NPC[n].Direction == 2 && Player.X_Location > NPC[n].X_Location && Player.Y_Location == NPC[n].Y_Location) { NPCNumber = n; return true; } if (NPC[n].Direction == 3 && Player.X_Location == NPC[n].X_Location && Player.Y_Location < NPC[n].Y_Location) { NPCNumber = n; return true; } } n++; } return false; } } } This is just an example, and its for a C# 2D RPG, but hopefully it gives you an idea of how my process works. Hopefully that helps some. If you got any questions or need clarification on something, just ask! :D Best of luck with your game
  4. Hey Elmepo, I recently did something similiar with a 2D RPG I made... Below is entire code I used:   Create KeyDown Event Handler this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.GameForm_KeyDown); Create logic for KeyDown Event Handler: private void GameForm_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.A) // Player wants to move left { Player.Direction = 1; Player.DrawCharacter(CharacterPictureBox[Player.ID], MapPictureBox); //Ignore this for now if (Player.X_Location > 0) { if (Map.CollisionCheck(Player.Direction, Map.MapNumber, Player, NPC) == true) { PlayerAnimation.Start(); // <---- This is what you want to use to move your sprite } } } Now you have something that will "catch" your player's input and start a ticker... Here is what PlayerAnimation does.... (This function is trigger every  X ms until PlayerAnimation.stop() is called) private void PlayerAnimation_Tick(object sender, EventArgs e) { Player.Movement(Player.Direction, CharacterPictureBox[Player.ID], MapPictureBox); // <--- This is the important part if (Player.AnimationTicker == 4) { PlayerAnimation.Stop(); // This stops the ticker //////////////////////// Below is used to check if player entered LoS of an enemy////////////////// if (Map.AggroCheck(Player, NPC) == true) { ButtonState = 1.1; if (Player.Y_Location - NPC[Map.NPCNumber].Y_Location > 1 || Player.Y_Location - NPC[Map.NPCNumber].Y_Location < -1 || Player.X_Location - NPC[Map.NPCNumber].X_Location > 1 || Player.X_Location - NPC[Map.NPCNumber].X_Location < -1) { NPCAnimation.Start(); } else { DrawButtons(); CalculateTurns(Player.Companion[Player.ActiveCompanion], NPC[Map.NPCNumber].Companion[NPC[Map.NPCNumber].ActiveCompanion]); StartBattle(); } } Player.AnimationTicker = 0; } } Now to see what the movement function does public void Movement(int direction, PictureBox CharPictureBox, PictureBox MapPictureBox) { if (direction == 1) //Move West/Left { AnimationTicker++; CharPictureBox.Left -= 8; if (AnimationTicker == 1) { SetSpriteBMP(SelectSprite(GetSprite(), 0, direction)); CharPictureBox.Image = GetSpriteBMP(); } if (AnimationTicker == 2) { SetSpriteBMP(SelectSprite(GetSprite(), 2, direction)); CharPictureBox.Image = GetSpriteBMP(); } if (AnimationTicker == 3) { SetSpriteBMP(SelectSprite(GetSprite(), 0, direction)); CharPictureBox.Image = GetSpriteBMP(); } if (AnimationTicker == 4) { SetSpriteBMP(SelectSprite(GetSprite(), 1, direction)); X_Location--; DrawCharacter(CharPictureBox, MapPictureBox); } } } I know I just threw a bunch of code at you, but movement/sprite animation is one of the more complex aspects of a game, since you are essentially loading images fast enough to trick the player to think the character is walking/running across the screen. If you have any questions feel free to ask and I'll try to answer as fast as possible   Edit: Just realized this was necro'd oh well....
  5. So, I've decided from here on out, I'm going to format my Dev Blog updates to be broken down into two parts. One part will explain a bit more about the Game Design, I'll usually focus on one or two specific aspects that I've penned down either in a note pad or on paper. The second half will be tangible updates to the client and server. If any of you have questions or feedback regarding anything I discuss, feel free to comment and inquiry! Game Design - Item System Unlike other MOBAs, namely LoL and Dota 2, players do not buy items during a match. Instead all items are equipped by the player prior to starting the game. So how do you balance items if one player enters a match with Sword of Awesomeness and another with Wooden Sword of Lameness? Well ideally, players will be matched up with of similarly geared players. Moreover there isn't going to be a long process of itemization to obtain all the best gear in game. What matters more is how you itemize your character. What do you mean "how you itemize your character"? Items will be specifically designed to cater to different roles found in a MOBA. Most items will follow the formula: Value = Base + HeroKillMod*(HeroKills) + CreepKillMod*(CreepKills) and a ValueCap that Value can not exceed So two identical weapons may have a different attack later on in the match due to player performance. Additionally, this formula opens up different styles of play. Some items will have high Base, but low Hero/Creep modifier, a good choice for a support role who won't get lots of kills. Some items will have a higher Creep/Hero mod but lower ValueCap, a good choice for a early game lane pusher or ganker. Not to forget end game carries will want to go with items that have higher ValueCap even if that means they will need to get babysat by support and early game gankers/pusher. This item system offers a new twist to an old idea. Team will need to coordinate who will be geared with what, and who will be doing what role during the game. Combining this with the previously discussed barracks system, teams will need to devise a meta-game that takes into account item composition, role composition, as well as a strategy for where on the map to attack/push and how to counter their opponent's composition and strategy. Coding Updates Build 0.0.2: (June 27th, 2014) Added Character Name, Gender, and Species fields to character creation screen. Fixed a bug in the client updater. Build 0.0.3: (June 29th, 2014) Character Creation is functional. A player can create his/her character send it to the server which will in turn properly store it in the database. No visual update for this build, since most code was done server-side which is literally just a console box. Next build will be much more exciting, working on the lobby and chat system Build 0.0.3b: (July 1, 2014) Migrated Server to a Ubuntu VPS. Wiped local test database, and created a new DB on the VPS. Client now connects via the internet to a development VPS. This way come alpha testing, I'll be able to send out copies of the client to alpha testers. Tweaked Server-side Login Extension, and some database settings. Login, Registration, and Character Creation now work via remote connection. Build 0.0.4: (July 2, 2014) Programmed server-side extension to connect user to the game lobby Implemented server-side extension handler to properly update a basic chat system Quickly threw together a client-side chat system to send a user's chat to the server and receive and display chat updates from the server.
  6. Eruadan

    Unity 2D tiled maps

    Do you want to do anything specific with your tile map? Are these tiled sprites used for animation? Are these terrain? Different types of tile maps *should* be implemented differently... Here is a sprite tile map example from an old C# project of mine. private Bitmap SelectSprite(string imageloc, int x, int y) { // Create a Bitmap object from a file. Bitmap myBitmap = new Bitmap(imageloc); // Clone a portion of the Bitmap object. Rectangle cloneRect = new Rectangle(x * 32, y * 32, 32, 32); System.Drawing.Imaging.PixelFormat format = myBitmap.PixelFormat; Bitmap cloneBitmap = myBitmap.Clone(cloneRect, format); return cloneBitmap; } Here is it's usage: public void DrawCharacter(PictureBox CharPictureBox, PictureBox MapPictureBox) { SetSpriteBMP(SelectSprite(GetSprite(), 1, Direction)); CharPictureBox.Show(); CharPictureBox.Location = new Point(X_Location * 32, Y_Location * 32); CharPictureBox.Parent = MapPictureBox; CharPictureBox.Image = GetSpriteBMP(); }
  7. Silfro, I hate to be the bearer of bad news, but considering this is your 3rd topic within a short period about creating an MMORPG, I think you've bitten off more than you can chew. I would scale back your game to either and open world RPG, or a small scale online game, like an Online FPS. This way you could focus on getting down either the RPG/Open World elements down or the online components down. If you are stubborn here is the answer to your question:   Client Side (C#): public void OnProximityListUpdate(BaseEvent evt) { var addedUsers = (List<User>) evt.Params["addedUsers"]; var removedUsers = (List<User>) evt.Params["removedUsers"]; // Handle all new Users foreach (User user in addedUsers) { SpawnRemotePlayer ( (SFSUser) user, user.GetVariable("model").GetIntValue(), user.GetVariable("mat").GetIntValue(), new Vector3(user.AOIEntryPoint.FloatX, user.AOIEntryPoint.FloatY, user.AOIEntryPoint.FloatZ), Quaternion.Euler(0, (float) user.GetVariable("rot").GetDoubleValue() , 0) ); } // Handle removed users foreach (User user in removedUsers) { RemoveRemotePlayer((SFSUser) user); } } It shouldn't be too hard to replicate something similar in C++. On the server side, you want to be sending new updates to all clients with a list of NPC/User within a client's proximity. That said, I truly believe it'll be more beneficial for you to work on a smaller project, otherwise you are gonna keep getting bogged done and eventually quit in frustration, because MMORPGs are perhaps the hardest thing to program and usually require a minimum of 20 or more programmers/designers/artists/writers.
  8. Eruadan

    Saving player data

    I don't do too much C++ programming, but the overall concept is having your client send a request to the server to input data into the database. The server validates the data (makes sure it's not sent via a hack or other abusive way) and then executes a SQL query into the database. The server should also then update all relevant clients connected with the latest data.
  9. Hi again! So in my first journal, I talked about the tool sets I'd be using (Smartfox and Unity). It's been about a week since I've started working with both of these development tools and I can happily say I'm chugging right along. Granted in the grand scheme of things, I'm still a long way from my final design, but for me, it's not about having a polished final project, it's about the baby steps that I've taken to get their and learning along the way. Giant Strides (Design): So, I spent a good portion of this weekend playing a lot of different genre games, namely Starcraft 2, Dota 2, LoL, Civilization 5, Dragon Age: Origins, and while I obviously enjoy all of these games, that wasn't the reason I was playing them. I wanted to refresh myself on the core competencies that these games utilize in order to be considered successful. The e-sport games (SC2, D2, LoL) rely on a competitive scene and what is considered fairly balanced game play, all players at the start of the match have equal opportunity to win. Simply put, their success is limited entirely by their skill level and maybe internet speed but that's a different topic... The downside to this core competency is player frustration at losing several matches in a row. For me personally, I suck monkey balls at Starcraft 2, and after losing 4 1v1 matches in a row, I was no longer enjoying myself. I reasoned that this frustration could potentially be mitigated if the game had a meta game that allowed the user to progress regardless of the outcome of the match. That said, I wanted to make a new kind of Moba that involved strategy and tactics in the match as well as a meta game outside of individual matches that also had an element of persistence and progression for users. Furthermore, I didn't want to use Aeons of Strife map (Map used in HoN/LoL/Dota) and I also wanted to make "lanes" more dynamic than what they currently are. For today, let's talk about individual matches: As with most MOBAs, two sides, each with a base. The goal of the game is to destroy the opponent's base resulting in victory. However instead of predetermined lanes with creeps/minions spawning every 30 seconds, Project Anera utilizes a node-based system. These capture-able nodes, lets call them barracks, spawn X amount of soldiers every 30 seconds. The players can change the direction at which these troops move, creating truly unique lanes. 3v3/5v5/10v10 concept maps (Blue Circles are Bases, Green Triangles are Barracks) "Do you want to divert all barracks down the center for a one massive head-on attack?" "Would that strategy be weak to easy flanks?" "Are you going to keep an equal amount of troops along your entire front line?" "Can the enemy penetrate your front line easily?" "Where will you go as a hero?" In order to balance the snowball effect of one side owning more barracks (thus spawning more troops per 30 seconds) respawn time for players is increased for having more barracks, and reduced for having less barracks, thus allowing a team on the brink of losing to respawn quickly and continue defending their base. Baby Steps (Coding): The first thing I did was briefly look through the documentation of both Unity and Smartfox, luckily they both seemed fairly easy to grasp at a conceptual level. After watching a few video tutorials, I started to dig into the tools and begin my own project. I was able to quickly put together a Login/Registration screen using Unity's GUI class, which seems incredibly easy to utilize. The next step was connecting this screen to a server, which was definitely alot more complicated seeing as I haven't ever done networking code. However after a few hours of tutorials I understood how to setup a server, write custom extensions/event handlers and maintain a connection to the server. The last step was rigging up a database to the server and making sure users were logging in with the right credentials, which was easier than I thought as well (Smartfox comes with a Login assistant component ) So as of now Project Anera's 0.0.1 has a fully functional Register and Login screen that will let a new user register and an existing user to Login in. Furthermore it checks if the user has created a character yet, and will either send the user to a lobby or character creation depending on the result. In addition, I've begun working on the Client Launcher/Updater, and have it set up to access a web server to check if the user's client is up to date. Project Anera 0.0.1:
  10. Eruadan

    New Studio: Week 2 review

    Thanks for the update! I just wanted to say keep at it, I'm enjoying reading these weekly updates. In fact it prompted me to start my own journal as I work on my own indie project, albeit on a much more amateur level. I find it particularly interesting how our experiences parallel at certain times, I'm currently hammering down many of my project's game design specifics and elements while trying to learn two new tool-sets I never used before (Unity and Smartfox) so they are both presenting many of the same challenges you've talked about here.
  11. Eruadan

    Project Anera: An Introduction

    Hello everyone! A little about myself: I use to lurk on this site, as well as a site called DevMaster, a few years ago as I started learning how to program and code. Suffice to say a lot of my earliest games were rather poorly made as I never fully wrapped my head around OOP or how to program windows applications. My first game was a console based Tic-Tac-Toe followed by a console text-based adventure. Depressed at how hard it was for me to get into Direct X or windows programming, I stopped all together for about 2 years, focusing on learning some html and php instead of C++. It wasn't until a year ago that I came back to programming; I started learning C# and dived head first into creating a 2D graphical game. Since then I've programmed on and off, I recently finished a small 2D RPG built entirely with the C#.net library that has nearly all functions a proper RPG should have (NPCs, inventory, combat, skills, levels, map editor, load/save etc, etc). Now that I've got that more or less finished, I've decided to set my eyes on 3D game. A little about Project Anera: So the wheels only started churning in my head earlier this week. A large portion of close friends and online acquaintances that tested my 2D RPG stated that, while the game ran smoothly and it had the concepts of an RPG, it didn't do anything unique or different that a thousand other RPGs haven't already done. So at the forefront of conceptual design for Project Anera, I want to do something that hasn't been done, which is hard, because tons of new games come out every day on app stores, and sites like this. How does one make a game stand out amongst the horde of other indie games? That's the million dollar question. So what have I gotten hammered down thus far? I've decided that I want some online or multiplayer component. I believe player-to-player interaction is extremely important for building a unique experience as well as adding replay-ability. In addition, I needed to find a good 3D engine, ideally one that utilized C# for programming the client. In the end, I've settled on using Unity3D to develop the client, and SmartFox to build the server. Now comes the slow-paced part of the project where I need to learn how best to utilize these two toolsets in conjunction with C# to build what eventually will be Project Anera. Hope you enjoyed reading this, I know there isn't anything to show yet, but this is really just an introduction to my development journal, future updates will have more substance.
  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!