| | |
Can you add pictures/sounds in a win32 console app?
![]() |
•
•
Join Date: May 2004
Posts: 217
Reputation:
Solved Threads: 0
Hi guys, im new to this forum but congratulations, i looks great
Im making a game for a TAFE class (which i will gladly send to any1). The game is a text based Role Playing Game. I am finished early so i am going to improve my current game. I was wondering whether i could add some sounds and pictures to my monsters.
struct monster
{
int strength;
int dexterity;
int hp;
char name[32];
};
That is my struct and i have an array of 4 monsters and a boss! Could i add something to the array, maybe monsterArray[].picture or monsterArray[].sound . Are there commands that allow pictures and sounds in a console application, if so can someone please tell me of them. Also feel free to get me to send you that game and/or source code!
Cheers, Peter :p
Im making a game for a TAFE class (which i will gladly send to any1). The game is a text based Role Playing Game. I am finished early so i am going to improve my current game. I was wondering whether i could add some sounds and pictures to my monsters.
struct monster
{
int strength;
int dexterity;
int hp;
char name[32];
};
That is my struct and i have an array of 4 monsters and a boss! Could i add something to the array, maybe monsterArray[].picture or monsterArray[].sound . Are there commands that allow pictures and sounds in a console application, if so can someone please tell me of them. Also feel free to get me to send you that game and/or source code!
Cheers, Peter :p
I think that is helpful to you .
C Syntax (Toggle Plain Text)
# Microsoft Developer Studio Project File - Name="Sarien" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # TARGTYPE "Win32 (x86) Console Application" 0x0103 CFG=Sarien - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "Sarien.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "Sarien.mak" CFG="Sarien - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "Sarien - Win32 Release" (based on "Win32 (x86) Console Application") !MESSAGE "Sarien - Win32 Debug" (based on "Win32 (x86) Console Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe RSC=rc.exe !IF "$(CFG)" == "Sarien - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MD /W3 /GX /Zi /O1 /I "..\src\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "NATIVE_WIN32" /FR /YX /FD /c # ADD BASE RSC /l 0x416 /d "NDEBUG" # ADD RSC /l 0x416 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 winmm.lib kernel32.lib user32.lib gdi32.lib winspool.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib /nologo /subsystem:windows /debug /machine:I386 /FIXED:NO # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "Sarien - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /Zi /Od /I "..\SRC\INCLUDE" /D "DEBUG" /D "WIN32" /D "_WINDOWS" /D "NATIVE_WIN32" /FR /FD /GZ /c # SUBTRACT CPP /YX # ADD BASE RSC /l 0x416 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib gdi32.lib winmm.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:no /debug /machine:I386 /pdbtype:sept /FIXED:NO # SUBTRACT LINK32 /pdb:none !ENDIF # Begin Target # Name "Sarien - Win32 Release" # Name "Sarien - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Group "CORE_AGI" # PROP Default_Filter "*.C" # Begin Source File SOURCE=..\src\core\agi.c # End Source File # Begin Source File SOURCE=..\src\core\agi_v2.c # End Source File # Begin Source File SOURCE=..\src\core\agi_v3.c # End Source File # Begin Source File SOURCE=..\SRC\CORE\AGI_V4.C # End Source File # Begin Source File SOURCE=..\src\core\checks.c # End Source File # Begin Source File SOURCE=..\src\core\console.c # End Source File # Begin Source File SOURCE=..\src\core\cycle.c # End Source File # Begin Source File SOURCE=..\src\core\font.c # End Source File # Begin Source File SOURCE=..\src\core\global.c # End Source File # Begin Source File SOURCE=..\src\core\graphics.c # End Source File # Begin Source File SOURCE=..\src\core\id.c # End Source File # Begin Source File SOURCE=..\SRC\CORE\INV.C # End Source File # Begin Source File SOURCE=..\src\core\keyboard.c # End Source File # Begin Source File SOURCE=..\src\core\logic.c # End Source File # Begin Source File SOURCE=..\src\core\lzw.c # End Source File # Begin Source File SOURCE=..\src\core\menu.c # End Source File # Begin Source File SOURCE=..\src\core\motion.c # End Source File # Begin Source File SOURCE=..\src\core\objects.c # End Source File # Begin Source File SOURCE=..\src\core\op_cmd.c # End Source File # Begin Source File SOURCE=..\src\core\op_dbg.c # End Source File # Begin Source File SOURCE=..\src\core\op_test.c # End Source File # Begin Source File SOURCE=..\src\core\patches.c # End Source File # Begin Source File SOURCE=..\src\core\picture.c # End Source File # Begin Source File SOURCE=..\src\core\picview.c # End Source File # Begin Source File SOURCE=..\src\core\rand.c # End Source File # Begin Source File SOURCE=..\src\core\savegame.c # End Source File # Begin Source File SOURCE=..\src\core\silent.c # End Source File # Begin Source File SOURCE=..\src\core\sound.c # End Source File # Begin Source File SOURCE=..\src\core\sprite.c # End Source File # Begin Source File SOURCE=..\SRC\CORE\TEXT.C # End Source File # Begin Source File SOURCE=..\src\core\view.c # End Source File # Begin Source File SOURCE=..\src\core\win32\winmain.c # End Source File # Begin Source File SOURCE=..\src\core\words.c # End Source File # End Group # Begin Group "CONSOLE" # PROP Default_Filter "*.c" # Begin Source File SOURCE=..\src\graphics\win32\win32.c # End Source File # End Group # Begin Group "SOUND" # PROP Default_Filter "*.C" # Begin Source File SOURCE=..\src\sound\win32\sound_win32.c # End Source File # End Group # Begin Group "FILESYS" # PROP Default_Filter "*.C" # Begin Source File SOURCE=..\src\filesys\win32\fileglob.c # End Source File # Begin Source File SOURCE=..\src\filesys\win32\path.c # End Source File # End Group # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\src\include\agi.h # End Source File # Begin Source File SOURCE=..\src\include\cli.h # End Source File # Begin Source File SOURCE=..\src\include\config.h # End Source File # Begin Source File SOURCE=..\src\include\console.h # End Source File # Begin Source File SOURCE=..\src\include\defines.h # End Source File # Begin Source File SOURCE=..\src\include\enums.h # End Source File # Begin Source File SOURCE=..\src\include\font.h # End Source File # Begin Source File SOURCE=..\src\include\getopt.h # End Source File # Begin Source File SOURCE=..\src\include\graphics.h # End Source File # Begin Source File SOURCE=..\src\include\id.h # End Source File # Begin Source File SOURCE=..\src\include\includes.h # End Source File # Begin Source File SOURCE=..\src\include\keyboard.h # End Source File # Begin Source File SOURCE=..\src\include\logic.h # End Source File # Begin Source File SOURCE=..\src\include\lzw.h # End Source File # Begin Source File SOURCE=..\src\include\machine.h # End Source File # Begin Source File SOURCE=..\src\include\menu.h # End Source File # Begin Source File SOURCE=..\src\include\objects.h # End Source File # Begin Source File SOURCE="..\src\include\op-cmd.h" # End Source File # Begin Source File SOURCE="..\src\include\op-dbg.h" # End Source File # Begin Source File SOURCE="..\src\include\op-misc.h" # End Source File # Begin Source File SOURCE="..\src\include\op-test.h" # End Source File # Begin Source File SOURCE=..\src\include\picture.h # End Source File # Begin Source File SOURCE=..\src\include\rand.h # End Source File # Begin Source File SOURCE=..\src\include\savegame.h # End Source File # Begin Source File SOURCE=..\src\include\sound.h # End Source File # Begin Source File SOURCE=..\src\include\typedef.h # End Source File # Begin Source File SOURCE=..\src\include\view.h # End Source File # Begin Source File SOURCE=..\src\include\win32.h # End Source File # Begin Source File SOURCE=..\src\include\words.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # Begin Source File SOURCE=..\src\core\win32\winres.rc # End Source File # End Group # End Target # End Project
Introduction
This article focuses on giving an example of using the DirectX API in PC game software development by using a DirectSound wrapper class.
The DirectSound wrapper class
The wrapper class has the functionality to handle various aspects of sound playback.
The structure of the wrapper class
The DirectSound object uses double buffers to manipulate the sound data processing and playback. The DirectSound object creates a single primary buffer to deal with output devices to play the sound data. The DirectSound object creates multiple second buffers to load, store various sound data, and configure sound data performance. The object loads and mixes sound data from the secondary buffers and sends the processed sound data to the primary buffer to play it through the output device.
The wrapper class contains a pointer to the DirectSound object, a primary buffer object (a pointer of type DirectSoundBuffer), and the secondary buffer array (DirectSoundBuffer object array)
DirectSound object in the wrapper class
DirectSound is a COM interface, so the DirectSound object is the COM component object (a pointer to DirectSound). The DirectSound object is the core of sound playback and all of buffers, both primary buffer and secondary buffers are created by it, so it must be instantiated before doing any sound play back.
Because the DirectSound object is a COM object, it can be instantiated by either the generic way of creation COM components, or by calling DirectSoundCreate. In my wrapper class, I find the generic method of creating a COM object is more reliable. Remember: The DirectX interfaces are a subset of the COM interfaces, so before you use them, call CoInitialize/ CoInitializeEx, and call CoUninitialize at the end of your application.
Primary Buffer
The primary buffer is a DirectSoundBuffer object, and its main task is to receive the processed sound data from the DirectSound object and send it to the output device to play. The primary’s format settings determine the sound play effect of the output device. The primary’s format is a WAVEFORMATEX structure and must be set before play.
Second Buffer
The second buffer loads sound data and sets the sound performance, then sends the sound to the DirectSound object. The second buffer is a DirectSoundBuffer object and is created by the DirectSound object.
In my library, I use a wrapper class of DirectSoundBuffer for the second buffer. This wrapper class has the DirectSoundBuffer object, and the methods to set sound performances, such as adjustment of volume, frequency and channel.
A special feature of the DirectSoundBuffer wrapper class is the special sound effect of Fade-In (volume up step by step) and Fade-Out (volume down step by step).
To avoid the concurrency of incoming function calls, a mutex object is used in the DirectSoundBuffer wrapper class to synchronize the function calls.
Timer Event
The DirectSound wrapper class needs a timer to monitor and manipulate the sound status and performance in a special time interval. The DirectSound wrapper class is a generic class, so it is hard to use a windows timer in the class. As an alternative, a waitable timer is used in the class. A thread is created to check the timer event when the class object is instantiated.
The test program
The test program is a Dialog box application written in MFC. It tests the various wrapper class features, such as volume, frequency, channel, looping, mixing and fade-in and fade-out, etc.
This article focuses on giving an example of using the DirectX API in PC game software development by using a DirectSound wrapper class.
The DirectSound wrapper class
The wrapper class has the functionality to handle various aspects of sound playback.
The structure of the wrapper class
The DirectSound object uses double buffers to manipulate the sound data processing and playback. The DirectSound object creates a single primary buffer to deal with output devices to play the sound data. The DirectSound object creates multiple second buffers to load, store various sound data, and configure sound data performance. The object loads and mixes sound data from the secondary buffers and sends the processed sound data to the primary buffer to play it through the output device.
The wrapper class contains a pointer to the DirectSound object, a primary buffer object (a pointer of type DirectSoundBuffer), and the secondary buffer array (DirectSoundBuffer object array)
DirectSound object in the wrapper class
DirectSound is a COM interface, so the DirectSound object is the COM component object (a pointer to DirectSound). The DirectSound object is the core of sound playback and all of buffers, both primary buffer and secondary buffers are created by it, so it must be instantiated before doing any sound play back.
Because the DirectSound object is a COM object, it can be instantiated by either the generic way of creation COM components, or by calling DirectSoundCreate. In my wrapper class, I find the generic method of creating a COM object is more reliable. Remember: The DirectX interfaces are a subset of the COM interfaces, so before you use them, call CoInitialize/ CoInitializeEx, and call CoUninitialize at the end of your application.
C Syntax (Toggle Plain Text)
// To start... BOOL CSoundManager::CoInitializeDSound(void) { HRESULT hr; GUID guID; // Clear the GUID ::memset(&guID, 0, sizeof(GUID)); // Initialize COM service, create STA hr = ::CoInitialize(NULL); ................................. ................................. // Create the IDirectSound object with the realiable way (create // standard COM object) hr = CoCreateInstance(CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, IID_IDirectSound, (void**)&m_pIDS); ................................. ................................ // Initialize the IDirectSound object hr = IDirectSound_Initialize(m_pIDS, &guID); ................................. ................................. return TRUE; } // To finish up... void CSoundManager::CoUnInitializeDSound(void) { if(m_pIDS) { m_pIDS->Release(); m_pIDS = NULL; ::CoUninitialize(); } }
Primary Buffer
The primary buffer is a DirectSoundBuffer object, and its main task is to receive the processed sound data from the DirectSound object and send it to the output device to play. The primary’s format settings determine the sound play effect of the output device. The primary’s format is a WAVEFORMATEX structure and must be set before play.
Second Buffer
The second buffer loads sound data and sets the sound performance, then sends the sound to the DirectSound object. The second buffer is a DirectSoundBuffer object and is created by the DirectSound object.
In my library, I use a wrapper class of DirectSoundBuffer for the second buffer. This wrapper class has the DirectSoundBuffer object, and the methods to set sound performances, such as adjustment of volume, frequency and channel.
A special feature of the DirectSoundBuffer wrapper class is the special sound effect of Fade-In (volume up step by step) and Fade-Out (volume down step by step).
To avoid the concurrency of incoming function calls, a mutex object is used in the DirectSoundBuffer wrapper class to synchronize the function calls.
Timer Event
The DirectSound wrapper class needs a timer to monitor and manipulate the sound status and performance in a special time interval. The DirectSound wrapper class is a generic class, so it is hard to use a windows timer in the class. As an alternative, a waitable timer is used in the class. A thread is created to check the timer event when the class object is instantiated.
The test program
The test program is a Dialog box application written in MFC. It tests the various wrapper class features, such as volume, frequency, channel, looping, mixing and fade-in and fade-out, etc.
Introduction
Loading images under windows can always be a painful process, especially if the image formats are like JPEG, GIF or PNG. There's always the Imgdecmp library, that does a good job, but its also a bit of a bother with the documentation being so thin and all that. The other day I was trying to load a bitmap from my device using LoadImage, but somehow I kept getting the dreaded "The handle is invalid" error. So I did a search on the MFC code that ships with the PPC SDK in hope of finding a piece of code that will help me solve the puzzle.
One thing led to another. I suddenly came across HBITMAP SHLoadImageFile(LPCTSTR pszFileName) in aygshell.h. Bingo! I had suddenly uncovered an undocumented API! No trace of it in MSDN, a search in Google produced nothing!! Since then, I've tried this API with gif's and bmp's also and I guess it will work fine for jpeg's and png's too. Here's a code sample...
That's all for now.
Loading images under windows can always be a painful process, especially if the image formats are like JPEG, GIF or PNG. There's always the Imgdecmp library, that does a good job, but its also a bit of a bother with the documentation being so thin and all that. The other day I was trying to load a bitmap from my device using LoadImage, but somehow I kept getting the dreaded "The handle is invalid" error. So I did a search on the MFC code that ships with the PPC SDK in hope of finding a piece of code that will help me solve the puzzle.
One thing led to another. I suddenly came across HBITMAP SHLoadImageFile(LPCTSTR pszFileName) in aygshell.h. Bingo! I had suddenly uncovered an undocumented API! No trace of it in MSDN, a search in Google produced nothing!! Since then, I've tried this API with gif's and bmp's also and I guess it will work fine for jpeg's and png's too. Here's a code sample...
C Syntax (Toggle Plain Text)
// assuming code is in the OnDraw method of a view.... CBitmap bitmap; // Attach the bitmap object to the HBITMAP returned by SHLoadImageFile bitmap.Attach(SHLoadImageFile(_T("/My Documents/mcdonalds.gif"))); BITMAP bmpInfo; bitmap.GetBitmap(&bmpInfo); CDC bitmapDC; bitmapDC.CreateCompatibleDC(pDC); CBitmap* pOldBitmap = bitmapDC.SelectObject(&bitmap); pDC->BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &bitmapDC, 0, 0, SRCCOPY); bitmapDC.SelectObject(pOldBitmap); bitmap.DeleteObject();
That's all for now.
•
•
Join Date: May 2004
Posts: 217
Reputation:
Solved Threads: 0
umm... THX a lot for trying mate but im not really that advanced at programming yet (im makinging a DOS 32 app thing). Ive included my source code (so far), if anyone could have a look and tell me if i could do this i would really appreciate it! Also any other suggestions to improve it would be greatly appreciated!
![]() |
Similar Threads
- how to stop methods running at the same time in a console app? (C#)
- Win32 Console Game Help... (Game Development)
- Please help!!! Winsock2/Sockets with C++ Console app? (C++)
- How to change icon of C++ console app (C++)
- CLR Console application vs Win32 Console application (C++)
Other Threads in the C Forum
- Previous Thread: I dont see any difference between these 2 functions, DO YOU?
- Next Thread: Image Handler
| Thread Tools | Search this Thread |
* ansi api array arrays binarysearch calculate centimeter changingto char character convert copyanyfile copypdffile creafecopyofanytypeoffileinc createcopyoffile createprocess() csyntax database directory dynamic fflush file floatingpointvalidation forloop frequency function getlasterror getlogicaldrivestrin givemetehcodez grade graphics gtkgcurlcompiling gtkwinlinux highest histogram homework i/o inches include infiniteloop input intmain() iso keyboard km linked linkedlist linux linuxsegmentationfault list logical_drives looping loopinsideloop. lowest match matrix microsoft mqqueue mysql oddnumber odf open opendocumentformat openwebfoundation pdf posix power program programming pyramidusingturboccodes radix read recursion recv recvblocked repetition reversing scanf scheduling segmentationfault send shape single socketprogramming stack standard strchr string suggestions test threads unix urboc user variable whythiscodecausesegmentationfault win32api windows.h windowsapi





