• 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

536 Good

About deadstar

  • Rank
    Advanced Member

Personal Information

  • Location
    Manchester, England
  1. Hey there! None of the earlier examples on my blog work on real hardware (I didn't get a development kit until later on in the project), I plan to revisit them and correct them all eventually - it's been 5 years since I wrote some of them and my code and knowledge are now a lot better! Here's the improved Hello World example, tidied up and corrected for use on real hardware: https://pastebin.com/kJC99PA7 and here's the workshop I ran which should help explain every single step: https://docs.google.com/presentation/d/1xCFrrsfpcuXVQsfBk8OgGJrbQ4aAiENjPjEny3xu5zQ/edit?usp=sharing Matt
  2. I don't understand this fascination either. It would drive me insane having to create a logging object everywhere I needed to add an entry, or passing a logger reference to all my functions, let alone having to manually enter the filename to write to. In my opinion the single most useful and quickest to use logging method is: [code]#define Log(msg) SomeFreeLoggingFunction(msg, __FILE__, __LINE__)[/code] Now go and worry about writing the game instead.
  3. Hi all, I have a Visual C++ 2010 solution set up with an 'Engine' project, which depends on Ogre3D. I'm using this Engine project as a dependency for a 3d Studio Max exporter plugin project, which makes use of the 3D mesh file format reader/writer (one .h and one .cpp file) contained within the Engine project. The problem I'm having is that when I build the Exporter project, it fails to resolve linker dependencies for bits of Ogre, even though none of that stuff is used in the Exporter project (I literally only make use of a 'Mesh' class and its Mesh::Write() function, which just opens a file and dumps data). How can I set up my solution so that only the required dependencies from the Engine project are linked with the Exporter project? I've tried #ifndef'ing away anything that depends on Ogre with a '3DS_PLUGIN' preprocessor definition, which I've added to the project's settings, but it seems to be ignored when the Exporter project auto-builds Engine as a dependency (I've tested this by added '#error' inside the #ifndef). Does anyone have ideas how I can achieve this?
  4. If I have to paste some code in an email I quite often doctor it there-and-then to make it look its best, especially if the destination is external to the company. Just habit I suppose, but certainly not a bad habit to get into. The fact that you actually care how others read and understand your code is a marvellous thing, though.
  5. Depending on which platforms/languages you're aiming to support, Microsoft's XACT might be something to look at (http://msdn.microsoft.com/en-us/library/ee416188%28v=VS.85%29.aspx). It's an audio API plus set of UI tools for creating sound waves, banks, events and effects, with a data-driven API to get the stuff working in game exactly how you authored it. Documentation is excellent, sample code is plentiful and since it's mostly aimed towards the XNA community the support forums are lively.
  6. [quote name='AutoBot' timestamp='1308256816' post='4824219'] I've been thinking about using OpenAL for my audio engine just due to its similar model to OpenGL, which is the graphics API I'm using, but I can't be sure since I don't have much experiance in terms of implementing audio in my applications. Any suggestions on a good sound API for C++ and FL Studio? [/quote] I've had an excellent experience with FMOD (www.fmod.org), but it does depend on how complex the audio design for your game will be. If you want your game to make some noise and play music tracks, then OpenAL is quick and simple to set up and supports a variety of platforms, but if you want an all-singing-all-dancing event-based audio subsystem with UI tools and advanced effects then OpenAL has been a little outdated for years. What would you like to achieve?
  7. Your poll only allows the selection of one format - there is no 'one size fits all' in [i]most[/i] cases (some consoles have decoding-on-chip which allows a single format to be used for short sound effects AND long streaming tracks). For PC I generally use WAV (PCM16) for sound effects, and OGG for streaming tracks. As for MP3 licensing: [quote] [b]Do I need a license to use mp3 or mp3surround in games?[/b] [b]Yes.[/b] Games using mp3 encoded content are licensed on a per-title basis. However, no license fees are due if less than 5 000 copies of a particular game title are distributed. [/quote] From: http://mp3licensing.com/help/developers.html#59 License prices: http://mp3licensing.com/royalty/games.html
  8. [quote name='ryan20fun' timestamp='1308070943' post='4823270'] Thanks for posting that. just one proble, i emailed them and they have not responed yet. i emailed them when you posted it or same day. any idea on what is going on or did i miss it ? [/quote] I got my reply about 24 hours later, if this helps
  9. Half-Life and its sequels. Pick any First-Person Shooter and analyse the protagonist - I reckon he'll be a Marine or some super goverment based bad-ass with guns wired to his teeth. Gordon Freeman is just a regular, he had a pretty bad day at work and now he just happens to be trawling through some science complex keeping himself alive with whatever weaponry he can find. The guy's probably never held a gun before. I can relate, and I love that. He doesn't talk in the game, it's first-person, and he's rarely seen, therefore that's me right there shitting bricks and running around like a headless chicken. Complete immersion. I love the characters, the story, the Black Mesa vs. Aperture Science thing up in the air, the weapons, the technology, the enemies, the creatures and monsters, the deserted and lonely middle-of-nowhere sections, the familiar chirp of a dead Combine's radio, Dr Breen's face lighting up every screen, the absolutely gorgeous scenery and right down to the very engine it was written with. ...which is why that Timeshift game p**sed me off so much. Ripped off every little piece I loved.
  10. WAV files contain uncompressed PCM audio, which can be opened, read and fed straight to the sound chip with no data conversion. If you have a scene in your game with 40+ sound effects playing simultaneously, this is ideal, since there's little CPU time involved and the sound chip does all of the work. OGG files require a lot more work from the CPU to decode on the fly. Data must be decoded - in realtime - into packets of PCM data, which is all done using the CPU. If you try to do this with 40+ simultaneous files, your system will choke. There's no "one size fits all" audio format, UNLESS the hardware supports the decoding on the fly. On the Xbox 360 for example, the sound chip is custom designed to handle the decoding of XMA2 data, so that one format can be used for one-shot sound effects, long dialogue or to stream in music tracks. It is possible to open all the necessary OGG files at load time, decode them and have the PCM data sit there in memory ready for use, but that all depends on your target platform - I wouldn't consider a method like this for iPhone, for example. Since I try my best to code cross-platform, I find using WAVs for sound effects and OGG for long tracks to suit the majority of devices just fine.
  11. Your post is titled "Which programming language is better in terms of creating a game engine?" yet your poll is titled "Which language do you find easier?" I find C++ easier, because my programming and thinking is very object oriented, and although [i]anything [/i]I program could also be done with C, I find classes, templates and new/delete memory management to be invaluable tools for knocking up projects quickly, efficiently and with minimal amount of bugs. As for which is better for a game engine, that's way too broad a question. Which type of game is the engine suited for? Which platforms are you targeting? Who will be using the engine? What compiler and version(s) will be in your toolchain? Which external libraries are you hoping to use along the way? Which language do you know more of? That's just a few of a thousand questions I could ask, but it all boils down to "with which language could you get a game finished quicker?" ...and don't make engines, make games.
  12. Step 1 - familiarise yourself with some basic 3D maths. For your particular case, look up 3D Vectors - find out what they are, how to add them together, how to use them to represent a position in 3D space Step 2 - make a basic structure to represent your Vector3. In C++, this would look something like: [code] class Vector3 { public: Vector3() { x = y = z = 0.0f; } float x; float y; float z; }; [/code] Step 2 - figure out how to apply a desired translation before rendering your 3D object : - Create a Vector3 to represent your object's position - Add/subtract to/from your vector depending on keyboard input - Use OpenGL's glTranslatef() function to apply the translation before your render you object In its very basic form, your rendering loop will need to look something like: [code] //Push an identity matrix to the stack //(any glTranslate operation you do operates on the current matrix - you'll need a blank slate to work with. Look up 'world space' and 'object space' to see what we're doing here) glPushMatrix(); //Apply the desired translation glTranslatef(myVector.x, myVector.y, myVector.z); //Render your object, as you're already doing //Pop the matrix stack glPopMatrix(); [/code] Once you've grasped the basics, I recommend reading up on 3D Matrix - what they are, how to use them to represent a position and rotation in 3D space, how to add/multiply them together, and how they apply to OpenGL.
  13. Hi, Our audio app is using AUGraphs containing a mixer unit, a converter unit and an output unit. It's a realtime app, so performance is a high concern. An issue has been flagged up where AUGraphStop() takes 25 milliseconds to complete on the main thread, and our profiler shows that it spends this time sleeping. Could anyone explain why this happens? Is it waiting for the next zero crossover point, or waiting for one more buffer to render? I've tried several workarounds, including sending one render frame of silence (and setting the kAudioUnitRenderAction_OutputIsSilence flag) before attempting to stop, and calling AUGraphStop() inside the kAudioUnitRenderAction_PostRender notify callback (this has mixed results, and after reading around it doesn't seem a recommended approach). Here's how we are initialising the graph: [code] //Configure converter/mixer/output unit descriptors AudioComponentDescription OutputUnitDesc = { kAudioUnitType_Output ,kAudioUnitSubType_DefaultOutput, kAudioUnitManufacturer_Apple }; AudioComponentDescription MixerUnitDesc = { kAudioUnitType_Mixer, kAudioUnitSubType_MatrixMixer, kAudioUnitManufacturer_Apple }; AudioComponentDescription ConverterUnitDesc = { kAudioUnitType_FormatConverter, kAudioUnitSubType_AUConverter, kAudioUnitManufacturer_Apple }; //Create graph CA_ERR(NewAUGraph(&mAudioGraph)); //Add converter/mixer/output nodes CA_ERR(AUGraphAddNode(mAudioGraph, &OutputUnitDesc, &mOutputNode)); CA_ERR(AUGraphAddNode(mAudioGraph, &MixerUnitDesc, &mMixerNode)); CA_ERR(AUGraphAddNode(mAudioGraph, &ConverterUnitDesc, &mConverterNode)); //Connect nodes CA_ERR(AUGraphConnectNodeInput(mAudioGraph, mConverterNode, 0, mMixerNode, 0)); CA_ERR(AUGraphConnectNodeInput(mAudioGraph, mMixerNode, 0, mOutputNode, 0)); //Open the graph (instantiates the units) CA_ERR(AUGraphOpen(mAudioGraph)); //Get the created units CA_ERR(AUGraphNodeInfo(mAudioGraph, mOutputNode, NULL, &mOutputUnit)); CA_ERR(AUGraphNodeInfo(mAudioGraph, mMixerNode, NULL, &mMixerUnit)); CA_ERR(AUGraphNodeInfo(mAudioGraph, mConverterNode, NULL, &mConverterUnit)); //Setup stream format description mStreamDesc.mFormatID = kAudioFormatLinearPCM; mStreamDesc.mFormatFlags = kLinearPCMFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger; mStreamDesc.mChannelsPerFrame = Header->nChannels; mStreamDesc.mSampleRate = (Float64)Header->nSamplesPerSec; mStreamDesc.mBitsPerChannel = Header->wBitsPerSample; mStreamDesc.mBytesPerFrame = (Header->wBitsPerSample >> 3) * Header->nChannels; mStreamDesc.mFramesPerPacket = 1; mStreamDesc.mBytesPerPacket = mStreamDesc.mBytesPerFrame * mStreamDesc.mFramesPerPacket; mStreamDesc.mReserved = 0; //Set data endianness according to file type - TODO: Get endianness from header AudioSystem::FileType FileType = mSample->GetFiletype(); if(FileType == AudioSystem::WAV) mStreamDesc.mFormatFlags |= kAudioFormatFlagsNativeEndian; else if(FileType == AudioSystem::OGG) mStreamDesc.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian; //Configure number of input/output busses for mixer unit int NumChannelsIn = Header->nChannels; int NumChannelsOut = (int)AudioSystem::GetOutputChannelConfig(); CA_ERR(AudioUnitSetProperty(mMixerUnit, kAudioUnitProperty_BusCount, kAudioUnitScope_Input, 0, &NumChannelsIn, sizeof(u32))); CA_ERR(AudioUnitSetProperty(mMixerUnit, kAudioUnitProperty_BusCount, kAudioUnitScope_Output, 0, &NumChannelsOut, sizeof(u32))); //Set render callback AURenderCallbackStruct callback = { AudioRenderCallback, this }; CA_ERR(AUGraphSetNodeInputCallback(mAudioGraph, mConverterNode, 0, &callback)); //Set stream format to something native to CoreAudio AudioStreamBasicDescription OutputDesc = {0}; UInt32 Size = sizeof(AudioStreamBasicDescription); CA_ERR(AudioUnitGetProperty(mMixerUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &OutputDesc, &Size)); //Set num output channels OutputDesc.mChannelsPerFrame = (int)AudioSystem::GetOutputChannelConfig(); //Set stream format CA_ERR(AudioUnitSetProperty(mConverterUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &mStreamDesc, sizeof(AudioStreamBasicDescription))); CA_ERR(AudioUnitSetProperty(mConverterUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &OutputDesc, sizeof(AudioStreamBasicDescription))); CA_ERR(AudioUnitSetProperty(mMixerUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &OutputDesc, sizeof(AudioStreamBasicDescription))); CA_ERR(AudioUnitSetProperty(mMixerUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &OutputDesc, sizeof(AudioStreamBasicDescription))); CA_ERR(AudioUnitSetProperty(mOutputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &OutputDesc, sizeof(AudioStreamBasicDescription))); //Initialise graph CA_ERR(AUGraphInitialize(mAudioGraph)); //Set notification callback CA_ERR(AUGraphAddRenderNotify(mAudioGraph, AudioNotifyCallback, this)); //Set global mixer volume CA_ERR(AudioUnitSetParameter(mMixerUnit, kMatrixMixerParam_Volume, kAudioUnitScope_Global, 0xFFFFFFFF, 1.0, 0)); //Set input channel volumes for(int i = 0; i < Header->nChannels; i++) { CA_ERR(AudioUnitSetParameter(mMixerUnit, kMatrixMixerParam_Volume, kAudioUnitScope_Input, i, 1.0, 0)); } //Set output channel volumes for(int i = 0; i < (int)AudioSystem::GetOutputChannelConfig(); i++) { CA_ERR(AudioUnitSetParameter(mMixerUnit, kMatrixMixerParam_Volume, kAudioUnitScope_Output, i, 1.0, 0)); } [/code] The graph is started and stopped using AUGraphStart() and AUGraphStop(), nothing special. Here's the callstack captured using Shark Profiler: [code] | | | | | | | | | + 1.3%, AudioUnitGraph::Stop(), AudioToolbox | | | | | | | | | | + 1.3%, AudioOutputUnitStop, AudioUnit | | | | | | | | | | | + 1.3%, CallComponentDispatch, CarbonCore | | | | | | | | | | | | + 1.3%, DefaultOutputAUEntry, CoreAudio | | | | | | | | | | | | | + 1.3%, AUHALEntry, CoreAudio | | | | | | | | | | | | | | + 1.3%, usleep$UNIX2003, libSystem.B.dylib | | | | | | | | | | | | | | | + 1.3%, nanosleep$UNIX2003, libSystem.B.dylib | | | | | | | | | | | | | | | | 1.3%, __semwait_signal, libSystem.B.dylib [/code] It spends the entirety of AUGraphStop() just sleeping! I've tried lowering the number of frames per slice, but it doesn't seem to make a difference. I've also tried removing all audio units except the output node, in an attempt to narrow the problem down to a specific unit, but the cost of AUGraphStop() still stands at 25ms. Any clues?
  14. Haveyou heard of people trying to get into the film industry doing re-scores? How about trying that with a game? Strip out all the audio and recreate it from scratch - the soundtrack, every sound effect, including the placement of sounds in levels and on character animation, effective use of reverb areas and low pass filters. If you did a whole game, that would look insanely good on your demo reel!
  15. This is the third title released with my name in the credits, and I'm so excited I'm almost shaking! It's out now on Xbox Live (Gold exclusive) - go to Game Marketplace -> Explore -> Games & Demos -> Demos. [img]http://download.xbox.com/content/images/66acd000-77fe-1000-9115-d8024c4187f6/1033/screenlg2.jpg[/img] [img]http://download.xbox.com/content/images/66acd000-77fe-1000-9115-d8024c4187f6/1033/screenlg3.jpg[/img] [quote]Laugh your way through an all-new story with the LEGO Star Wars III demo. This demo includes both space and ground levels from the most action-packed LEGO Star Wars game to date. In the full version, the story takes you through 16 different systems and experience brand new features like massive ground battles, boss fights, and multi-layered space combat. Other enhancements include expanded Force abilities, brand new weapons, characters, environments, and over 20 story-based missions.[/quote] Eeeeeeeeeeeeeeeeee I can't wait to see it on the shelves!!