• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.


  • Content count

  • Joined

  • Last visited

Community Reputation

188 Neutral

About SoundFX

  • Rank
  1.   It looks good. I wanted to suggest maybe getting a copy of super meat boy if you haven't already played it. While it's arguable its sort of in a genre on its own, the platformer is still a vast majority of it. The mechanics in the game led to some very intricate level design mainly through the placement of things that will kill you. I mention SMB because I for one absolutely loved the levels, and the way in which they ramp up the difficulty as you progress and perfect old moves.   With that said, your game will most undoubtedly have its own nuances in which you can design your levels around your mechanics. In addition you can always put, say extra lives, in tricky and/or dangerous spots. Tempation is a good motivator.
  2. I completely disagree. I feel Relic has a far superior system seen in Company of Heroes and the Dawn of Wars. I will touch on what I love about them below and what I feel is necessary as well. Don't get me wrong SC2 has a tremendous following, but that doesn't mean it's the best RTS available.   I love Dawn of War and Company of Heroes over say Starcraft for two reasons. Simpler micro managing and no gatherers. The gathering is based off of territorial control which in turn forces combat. Simple micro managing lowers the skill base while still allowing room for expertise. By forcing combat and lowering the skill level required to compete you have now turned a time-sink RTS into a Thinking RTS, which is where I think most RTS' lack.   Other things like cover are just icing on the cake.   With that said here are some things I think are necessary for RTS: Two (or more) Resource System Objectives to force combat/taking actions An easy to understand Rock-Paper-Scissors unit approach (Doesn't have to be direct counters, For example AA guns hurt tanks in Company of Heroes but they do extra damage in the rear, Self Explanatory really but it makes you want to get behind them, but you don't have to and can still be effective) Keep the "racing to perform actions" to a minimum and the choice of "what actions do I take" at the forefront   Like another poster said I too also enjoy a limited number of unit choices but I don't mind if I have a small army (Company of Heroes) or a giant one (Homeworld). I
  3. Why dont you just store them in a vector? Essentially you could just call the ID number by index number, starting at 0 of course.
  4. I personally like the MingW Developer Studio or Dev C++ to do my coding. I would highly recommend "Accelerated C++" which you can find in GameDev's book section.
  5. why cant it just be the camel eats 5 apples every 10 miles forward or backward...
  6. This is a hard problem to describe... Im using DEV C++ v4.9.9.2 in conjunction with "Programming role-playing games with directX" 2nd edition by Jim Adams. (Pages 35-41 if anyone happens to have the book) I believe I have the project set-up right with the include files and library files contained in the DirectXSDK I have installed. Anyway, I wrote out the code and I dont get any compile errors that makes it fail...i just get this permission denied thing and I am not sure how to fix it. This is my compile log: Quote:Compiler: Default compiler Building Makefile: "C:\Dev-Cpp\Makefile.win" Executing make... make.exe -f "C:\Dev-Cpp\Makefile.win" all g++.exe DirectXProject/WinMain.o -o "DirectXProject.exe" -L"C:/Dev-Cpp/lib" -L"E:/DX90SDK/Lib" -L"E:/DX90SDK/Lib" -mwindows E:/DX90SDK/Lib/strmiids.lib E:/DX90SDK/Lib/amstrmid.lib E:/DX90SDK/Lib/d3d8.lib E:/DX90SDK/Lib/d3d9.lib E:/DX90SDK/Lib/d3dx.lib E:/DX90SDK/Lib/d3dx8.lib E:/DX90SDK/Lib/d3dx8d.lib E:/DX90SDK/Lib/d3dx8dt.lib E:/DX90SDK/Lib/d3dx9.lib E:/DX90SDK/Lib/d3dx9d.lib E:/DX90SDK/Lib/d3dx9dt.lib E:/DX90SDK/Lib/d3dxd.lib E:/DX90SDK/Lib/d3dxof.lib E:/DX90SDK/Lib/ddraw.lib E:/DX90SDK/Lib/dinput.lib E:/DX90SDK/Lib/dinput8.lib E:/DX90SDK/Lib/dmoguids.lib E:/DX90SDK/Lib/dplayx.lib E:/DX90SDK/Lib/dsetup.lib E:/DX90SDK/Lib/dsound.lib E:/DX90SDK/Lib/DxErr8.lib E:/DX90SDK/Lib/DxErr9.lib E:/DX90SDK/Lib/dxguid.lib E:/DX90SDK/Lib/dxtrans.lib E:/DX90SDK/Lib/encapi.lib E:/DX90SDK/Lib/ksproxy.lib E:/DX90SDK/Lib/ksuser.lib E:/DX90SDK/Lib/msdmo.lib E:/DX90SDK/Lib/quartz.lib C:\Dev-Cpp\Bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot open output file DirectXProject.exe: Permission denied collect2: ld returned 1 exit status make.exe: *** [DirectXProject.exe] Error 1 Execution terminated And this is my code if it is helpful: #include <windows.h> #include <stdio.h> #include <stdarg.h> //Main application instances HINSTANCE g_hInst; //global instance handle HWND g_hWnd; //Global window handle //application window dimensions, type, class and window name #define WNDWIDTH 400 #define WNDHEIGHT 400 #define WNDTYPE WS_OVERLAPPEDWINDOW const char g_szClass[] = "FrameClass"; const char g_szCaption[] = "FrameCaption"; //Main application prototypes //Entry point int pascal WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int nCmdShow); //Function to display an error message void AppError(bool Fatal, char *Text, ...); //Message procedure long far pascal WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); //Functions to register and unregister windows' classes bool RegisterWindowClasses(HINSTANCE hInst); bool UnregisterWIndowsClasses(HINSTANCE hInst); //Function to create the application window HWND CreateMainWindow(HINSTANCE hInst); //Functions to init, shutdown, and handle per-frame functions bool DoInit(); bool DoShutdown(); bool DoPreFrame(); bool DoFrame(); bool DoPostFrame(); bool RegisterWindowClasses(HINSTANCE hInst) { WNDCLASSEX wcex; //create the window size here and register it wcex.cbSize = sizeof(wcex); wcex.style = CS_CLASSDC; wcex.lpfnWndProc = WindowProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInst; wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = NULL; wcex.lpszMenuName = NULL; wcex.lpszClassName = g_szClass; wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClassEx(&wcex)) return false; return true; } bool UnregisterWindowsClasses(HINSTANCE hInst) { //unregister the window class UnregisterClass(g_szClass, hInst); return true; } HWND CreateMainWindow(HINSTANCE hInst) { HWND hWnd; //create the main window hWnd = CreateWindow(g_szClass, g_szCaption, WNDTYPE, 0, 0, WNDWIDTH, WNDHEIGHT, NULL, NULL, hInst, NULL); if(!hWnd) return NULL; //show and update the window ShowWindow(hWnd, SW_NORMAL); UpdateWindow(hWnd); //return the window handle return hWnd; } void AppError(bool Fatal, char *Text, ...) { char CaptionText[12]; char ErrorText[2048]; va_list valist; //build the message box caption based on fatal flag if (Fatal == false) strcpy(CaptionText, "Error"); else strcpy(CaptionText, "Fatal Error"); //build variable text buffer va_start(valist, Text); vsprintf(ErrorText, Text, valist); va_end(valist); //display the message box MessageBox(NULL, ErrorText, CaptionText, MB_OK | MB_ICONEXCLAMATION); //Post a quit message if error was fatal if(Fatal == true) PostQuitMessage(0); } //the message procedure empty except destroy message long FAR pascal WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; } //end switch return DefWindowProc(hWnd, uMsg, wParam, lParam); } bool DoInit() { //perform application intialization functions here //such as those that set up graphics, sound, network, etc... //return true for success, false otherwise return true; } bool DoShutdown() { //perform application shutdown functions here //such as those that shut down the graphics sound etc.. return true; } bool DoPreFrame() { //perform preframe processing such as setting up a timer return true; } bool DoFrame() { //perform per frame processing such as rendering return true; } bool DoPostFrame() { //perform post frame processing such as time syncing etc return true; } int pascal WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int nCmdShow) { MSG Msg; //Save application instanec g_hInst = hInst; //Register window classes = return on false if(RegisterWindowClasses(hInst) == false) { return false; }//end if //Do application initialization = return on false if(DoInit() == true) { ZeroMemory(&Msg, sizeof(MSG)); while(Msg.message != WM_QUIT) { //Handle windows messages if any if(PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } else { //Do pre-frame processing, break on false return value if(DoPreFrame() == false) break; //do per-frame processing if(DoFrame() == false) break; //do post-frame processing if(DoPostFrame() == false) break; } //if-else end }//whle end } //if end //do shutdown functions DoShutdown(); //unregister window UnregisterWindowsClasses(hInst); return true; } EDIT: I just checked my processes and apparently I have a ton of my programs running which could possibly explain my error... but why cant I see it?
  7. good work both of you, I now understand it, hopefully that helps the thread creator.
  8. Dark Cloud (PS2) has a system where your weapons would "absorb" magical properties when you killed a monster. For the most part your weapon was "alive" and leveled up when it had absorbed enough. There were certain gems or rune type things you could apply and it would affect in which way it would evolve, like a techtree of sorts.
  9. In my opinion, I think its just a visual thing in which I would just rotate the planet. I think this would be the easiest approach instead of rotating many objects around...
  10. If you are really interested in Text-based games I suggest you look at the D&D players guide. Like Kylotan said, many older games were based off this one. You can either buy it (I think its like 30 dollars...) or just go read it in your closest bookstore (not all carry them) or hobby shop. But if you are lazy, the mechanics for attacking someone are what they call an Attack Roll. You attack roll is compared against your targets Armor Class, both of which can be modified with stats, spells, armor, and miscellaneous happenings. You can see it in action here http://www.wizards.com/playdnd/playdnd.asp
  11. Thanks for all the tips. Ive got a few chapters each in a couple books Ill be reading over and over (I have a few of the beginners books recommended from this site :]) and hopefully I can learn why or whynot pointers and how to actually use public and private correctly... Just a heads up, this wont be released probably ever. I wanted a project that could help me learn, for some reason the 7 books I have just cant keep me doing their work, if you know what I mean. So, as it happened, my friend and I were already designing a D&D spinoff, so this program is like a testing program for our design. It'll allow you to fight monsters and level and stuff, but its just not the same when in a party ;)
  12. Heh, its already unchecked. I do however spend lots of time re-tabbing everything! Its just when im trying to solve problems I tend not to care how it looks, and from commenting out, uncommenting, adding new things, moving things, its gets messy, and I want it to work before it looks good. :] To point out, I used the same name myJob in the selectJob function and in the character_info. Probably a bad idea, but I *knew*(aka was hoping) that they are two different objects. Ill play with your suggestion on making character_info handle all the switching, Im still learning so Im not sure what works best, faster, or easier. I was trying to start basic (the job) and work my way up (the fight sequence). Yay, on to weapon coding. Anyway, how do you delete a pointer?
  13. The pointer seems like a good idea. I dont want the default constuctor to be used, and from what I read, as long as I specify to use my constuctor I should be ok. That makes sense that when it wants to make 'myJob' is has no default to work with. Time to go read up on pointers, feel free to drop me any links. *Thanks man: this did the trick right here paired with the job_info* myJob in the header! * //ask to choose a job cout << "\nPlease choose a class by selecting its corresponding number:\n0. Black Mage" << endl; int choice; cin >> choice; myJob = new job_info(choice);
  14. Hello, somewhat new here, but Ill skip the introductions and get on with my problem. I am creating a text-based rpg (yea I know, not another one), but I am having a few problems. I have a job class, which holds all my spells and hit die and attack bonuses and such. I can create one of those on its own fine using my own constructor. job_info.h #ifndef job_info_H #define job_info_H #include <string> #include <vector> class job_ability { public: std::string name; //the name of our spell //when using an ability deal direct damage(melee or a spell) then do the damage boost //directDamage + damageBoost = totalDamage; ??? int directDamage; //the dice it will roll for damage (xd4-xd20) int damageBoost; //my damage boost double multiplier; //incase we need to do 2 or more dice int manaCost; //mana consumed upon using int levelReq; //level required before gaining it std::string preReq; //pre-requisites? //skills with buffs/debuffs/and round-lasting effects (like bleeding/poison) int myAttackMod; //if the ability boosts my attack mod int myDefenseMod; //if the ability boosts my defense mod int enemyAttackMod; //if the ability lowers enemy attack mod int enemyDefenseMod; //if the ability lowers enemy defense mod int rounds; //the number of rounds an ability will last (0 is forever, like an Aura) int actions; //number of actions this will take int mpDrain; //for use with mpDrain skills int hpDrain; //for use with hpDrain skills //Auras int on; //1 yes || 0 no //Stealth/Jump Stealth can be seen through (Theif/Ninja), Jump you cannot be hit (Dragoon) int stealthMod; // 100 is cannot be hit }; class job_info { public: job_info(int choice); //this will allow us to choose our class via a prompt. std::string name; int hitDie; int manaDie; int attackBonus; int spellDefense; //store all of our abilities in this vector for use //they will be filled by the becomeClass functions std::vector<job_ability> myAbilities; //functions //void Berserker(); //void BlackKnight(); void BlackMage(); //void BlueMage(); //void Dragoon(); //void Engineer(); //void Fighter(); //void Marksman(); //void Monk(); //void Ninja(); //void Summoner(); //void Thief(); //void WhiteKnight(); //void WhiteMage(); }; #endif job_info.cpp #include "job_info.h" #include <string> #include <vector> #include <iostream> using std::string; using std::vector; job_info::job_info(int choice) { switch (choice) { case 0: job_info::BlackMage(); break; //more classes later }; } void job_info::BlackMage() { name = "Black Mage"; hitDie = 4; manaDie = 12; attackBonus = 0; spellDefense = 0; //Fire spell job_ability Fire; Fire.name = "Fire"; Fire.directDamage = 8; Fire.multiplier = 1; Fire.manaCost = 4; Fire.levelReq = 1; Fire.actions = 1; //Start filling our container myAbilities.push_back(Fire); /*note to Gamedev, i took out the other 20+ skills to save space :O */ } As you can see I can ask for a choice of input, but only 1 option is available at the moment. The important part is that it works. If I try to create a character though, similary named 'character_info' with a member of type job_info, called 'myJob'. I cannot figure out how to be able to instantiate (that the right word?) a job_info inside my character_info's constructor. Sorry for the mess of comments inside the following code, im trying to figure out how to get it to work, its an uphill battle, my latest attempt was to return a value with a function and use it to create 'myJob'. character_info.cpp #include <string> #include <iostream> #include <vector> #include "job_info.h" #include "character_info.h" //#include "weapon_info.h" //#include "race_info.h" using std::cout; using std::cin; using std::string; using std::endl; using std::vector; int character_info::selectJob() { cout << "\nPlease choose a class by selecting its corresponding number:\n0. Black Mage" << endl; int choice; cin >> choice; //job_info myJob(choice); //cout << "\nCongratulations, you are a: " << myJob.name << endl; //cout << "You have these abilities: \n"; //for (vector<job_ability>::const_iterator it = myJob.myAbilities.begin(); // it != myJob.myAbilities.end(); ++it) //{ // cout << (*it).name << endl; //}; return choice; } void character_info::setAttributes() { //we need to set all our attributes here as well as change the modfier accordingly while (attributePoints > 0) { cout << "\nPlease spend your attribute points. You have " << attributePoints << " to spend." << endl; cout << "\nPlease choose an attribute to add points to: " << "\n1: Strength" << "\n2: Dexterity" << "\n3: Vitality" << "\n: Energy" << "\n: Spirit"; int choice; switch (choice) { case 1: ++strength, --attributePoints; break; case 2: ++dexterity, --attributePoints; break; case 3: ++vitality, --attributePoints; break; case 4: ++energy, --attributePoints; break; case 5: ++spirit, --attributePoints; break; default: cout << "\nThat is not a valid option please choose again." << endl; break; }; }; cout << " You have " << attributePoints << " to spend" << endl; } void character_info::selectRace() { //choose our race and change the attribute the racial bonus gives } void character_info::selectAbilities() { //show the a list of available abilties by level = 1 and pre-requisite == none } character_info::character_info() { //ask for name cout << "Please enter your characters name: " << endl; cin >> name; //set all defaults strength = 10; dexterity = 10; vitality = 10; energy = 10; spirit = 10; luck = 10; currentExp = 0; nextExp = 1000; level = 1; actions = 1; attributePoints = 15; abilityPoints = 3; isPoisoned = false; isBleeding = false; //ask to choose a job myJob(selectJob()); //ask to plug in attribute points setAttributes(); //ask for a race //setRace(); //ask for abilities //selectAbilities(); } character_info.h #ifndef character_info_H #define character_info_H #include <string> #include "job_info.h" //#include "weapon_info.h" //#include "race_info.h" class character_info { public: //Our default constructor will handle the name entry as well as set all the defaults for our character character_info(); std::string name; job_info myJob; //weapon_info myWeapon; //race_info myRace; int level; double currentExp, nextExp; int currentHealth, maxHealth, currentMana, maxMana; int strength, dexterity, vitality, energy, spirit, luck, strMod, dexMod, vitMod, engMod, sprMod; int actions, attributePoints, abilityPoints; bool isPoisoned, isBleeding; //Will allow us to perform DoT() checks //We need to select a job int selectJob(); //We need to spend our attribute points first void setAttributes(); //We then need a race void selectRace(); //Lastly, choose our abilities void selectAbilities(); }; #endif main #include <iostream> #include <vector> #include "job_info.h" #include "character_info.h" using namespace std; int main() { character_info myInfo; //give us a character system("PAUSE"); return 0; } Anyway, if someone could hint at what im doing wrong, that would be swell. For reference I am using MinGW Studio and DEV C++, fully updated. (I like them both :D) *Edit: The reason I know its with the job_info stuff is from the compiler. I can also make a jobless character with ease by commenting out the job stuff, but no one likes a plain character*