|
i'm new to game programming so this would be a good knowledge.
i would love to know:
1. how the music files are being handled in a game using c++?
2. how an array are used to encapsulate a sound buffer?
3. how the array is used to create a sound buffer?
4. how a pointer to DirectSound will be obtained?
5. how the class provide method how to load the sound data (*.wav or *.pcm or *.midi files)?
Is there any article regrading this that might answer my question?
pls help!!!
|
|
|
|
|
There is sample code in the DirectX SDK to do all these things.
If you need to ask 1 through 4, I wonder if you've even seen the SDK.
Microsoft DirectX Downloads[^]
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Currently, I'm working on COM Interoperability project. In that client application (in vb 6.0) need to launch my application developed in .net.
Now the problem is the assemblies referenced by my .net application is spread across 2-3 folders and not in the same folder where my .net executable is placed. Also, the client application is also not in the same path where my .net executable is. If I keep everything (i.e. .net executable and client application) in same location everything works fine but if I move my client application to location different than my .net executable path, client application fails to load.
I register the assembly into the registry withoug codebase. Also, I tried setting the private path in probing attribute in app.config file but it didn't work.
Can any one pls help in how I can resolve the assembly reference issue?
Thanks...
|
|
|
|
|
Have you included the paths of the files in the computer's "PATH" environment variable?
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
Hi, I'm using Visual Studio 2005 C++/CLI. I have some text and graphics that I both need to display and print. For the Form1 object I used 'graphics = this->CreateGraphics();' in the Form1 constructor and then used graphics->DrawString('aCharacter', drawFont, blackBrush, x_coord, y_coord) in various functions to output text characters onto the screen so that the information fits perfectly on the screen. What I have been reading about the GDI+ is that it was designed to insulate the programmer from a lot of the printer details by using the printer drivers. When I try to print or use print preview the graphics is scaled too large. Simply using 'e->Graphics->PageScale::set((float)0.85);' will get it to fit on the printed page but things (characters) are squished together. I figured out how to obtain the Font Metrics but they are read only. I have tried changing the printDocument1->DefaultPageSettings->PrinterResolution->X (and Y) with no effect. Tried changing margins too. Spending way too much time (20 hours so far) trying to figure this out. Any information that will point me in the right direction would be helpful.
Thanks,
Buck
|
|
|
|
|
Hi Buck, me again. If you haven't already, you should take a look at my approach
for this in the Sokoban article. It shows a board game that fits on a monitor,
and it fits on one printed page (whatever the print dimensions would be).
It does, however not really have text (except for a title line when printing).
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Thanks Luc,
I must have been really tired or hung over because the first time I looked over the Sokoban code I didn't see what you were doing. At least now I think I can replicate some of this but I am having a problem that may be a C++ vs. C# thing. In the Board.cs file there is a class called PrintableBoard. The first line of the constructor is 'this.board = board;' (this->board = board; in CLI). If I try to do this I get the following compiler error...
error C2582: 'operator =' function is unavailable in 'System::Windows::Forms::Form'
The next line is 'PrintPage += new PrintPageEventHandler(PrintableBoard_PrintPage);' or in CLI use PrintPage^ += gcnew PrintPageEventHandler(PrintableBoard_PrintPage). If I don't use the ^ then the compiler complains that the PrintPageEventHandler needs 2 arguments not just 1. If I do include the ^ then I get 'error C2059: syntax error : +='. Is this a C++ vs. C# issue?
Buck
Buck
|
|
|
|
|
Hi Buck,
the PrintableBoard class has a class member "private Board board;" in C#.
I believe you would need a "private: Board^ board;" in C++.
and then the "this->board=board;" should work AFAIK.
i.e. in C++, the way I understand it, all reference types need a ^ when defined
and good old -> where I gladly use a simple . in C#
Hope this helps.
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Hi Luc,
Actually there is a difference in the structure of the definition of 'PrintPage^ += gcnew PrintPageEventHandler(PrintableMap_PrintPage);' I did a search on the entire Sokoban solution for PrintPage and there was only the 1 occurrance. How and where is PrintPage defined?
Buck
|
|
|
|
|
Hi Buck,
When there is a PrintDocument that .NET wants to print, it does two things:
- it invokes OnPrintPage() which is empty by default, but you could override it;
- it fires the PrintPage event which is also empty, but you could add delegates
to it (with the += syntax in C# and C++).
BTW: the method that you should pass to the new delegate takes two arguments
(object sender, XXXeventArgs e) whereas the OnXXX method only takes the latter.
All the same is true for the Paint event of a Control; that's why you were looking for
an OnPaint() but did not find one in Sokoban, it has a Paint+=new ... statement instead.
This is a C++ example straight from MSDN:
pictureBox1->Paint += gcnew System::Windows::Forms::PaintEventHandler(
this, &Form1::pictureBox1_Paint );
Hope this helps.
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
I still can't get the SOB to compile. I get an...
error C3924: error in argument #2 of delegate constructor call 'System::Drawing::Printing::PrintPageEventHandler
I guess I'll have to take the next week (Ha! more like the next couple of months) and learn about delegates.
Buck
|
|
|
|
|
showing the code would give us a chance to suggest a fix.
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Yes, yes, yes! I have verified this by making a copy of the board.cs file and renaming it board.cpp. Then I included it into the VS solution and remarked out all of the code. The I unremarked the code compiling as I went. Propblems did not occur until the line...
PrintPage += gcnew PrintPageEventHandler(PrintableBoard_PrintPage);
I had tried ...
PrintPage += gcnew PrintPageEventHandler(PrintableBoard_PrintPage);
PrintPage += gcnew PrintPageEventHandler(this, PrintableBoard_PrintPage);
PrintPage += gcnew PrintPageEventHandler(&PrintableBoard_PrintPage);
PrintPage += gcnew PrintPageEventHandler(this, &PrintableBoard_PrintPage);
PrintPage += gcnew PrintPageEventHandler(Namespace::PrintableBoard::PrintableBoard_PrintPage);
PrintPage += gcnew PrintPageEventHandler(&Namespace::PrintableBoard::PrintableBoard_PrintPage);
PrintPage += gcnew PrintPageEventHandler(this, Namespace::PrintableBoard::PrintableBoard_PrintPage);
but I missed...
PrintPage += gcnew PrintPageEventHandler(this, &Namespace::PrintableBoard::PrintableBoard_PrintPage);
Which is the correct syntax because now it will compile. The other combinations just give similar error messages.
Thanks a lot, chances are that I would not have gone back and realized that there was one combination of arguments that I had not tried.
Buck
|
|
|
|
|
Hi Buck,
the fact is I never did any C++/CLI so I gave it a single try which obviously
failed, then read the MSDN page on Paint event, and copied what was in the example.
It is good to do some experiments, it is even better to combine them with
reading some documentation. And when new at a language it really pays to buy
and study a book on it (I have the book, just haven't read it yet).
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Hi Luc,
Trust me, I spend half my day reading documentation. I do have a little issue that may be a circular dependency. Taking the Sokoban projects Board.cs file and modifying it to be C++ code I have remarked out the guts of the functions and everything compiles just fine. In the 'Board' class there is a function named
public: void Print() {
PrintDocument^ printDoc = gcnew PrintableBoard(this) // unremark out this one line
};
The class 'PrintableBoard' is defined after the 'Board' class. If I leave the single line in the Print() function I get an "error C2061: syntax error : identifier 'PrintableBoard'". Is this a C++ vs. C# issue?
Thanks
Buck
|
|
|
|
|
Okay, I had been trying to use a forward declaration with no luck but I must have gotten the location of the forward decalration in the right place because now it will compile.
Buck
|
|
|
|
|
So I can ignore both messages then?
I am unaware of any circular reference stuff, I never had such a problem in C#;
I do recall C needed forward declarations once in a while, I trust C++ is the same.
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Hi Buck,
I just learned C++ needs two arguments ina delegate constructor, the first one
being "this".
The following code compiles:
namespace test3 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Drawing::Printing;
public ref class PD : public System::Drawing::Printing::PrintDocument {
public:
PD(void) {
this->PrintPage+=gcnew PrintPageEventHandler(
this, &test3::PD::pdm);
}
void pdm(Object^ sender, PrintPageEventArgs^e) {
}
};
}
That's my longest C++/CLI program ever. Hope it helps.
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Hi,
I have an application in C# which allocates 200MB of data from the unmanaged heap using the
[DllImport("kernel32")]
static extern void* HeapAlloc(int hHeap, int flags, int size);
I have another fucntion
[DllImport("cppwrapper.dll")]
private extern static int test(IntPtr DataOut, out string ErrorOut);
I want to pass the the pointer returned by HeapAlloc into the test function using the parameter DataOut instead of string as I run into OutofmemoryException randomly(There is a limitation on the managed heap). But I am constantly getting the system.accessviolation exception.
The body of test method looks like
SOME_API int test(LPSTR* DataOut, LPSTR* ErrorOut)
{
return _lpsomefunction(DataOut, ErrorOut);
}
Can someone guide me in the right direction...
|
|
|
|
|
Hi,
it would be more accurate to use:
[DllImport("kernel32")]<br />
static extern IntPtr HeapAlloc(IntPtr hHeap, int flags, int size);
since both hHeap and the return value are pointers (hence 4B on Win32 and 8B on Win64,
exactly what IntPtr gives you).
As such you can pass the return value to your test method.
But then I am puzzled as to why you would use HeapAlloc at all.
You could allocate a byte array of the same size, and use GCHandle class
to "pin" it in memory, then get its pointer (which is an IntPtr obviously).
That way you get managed memory that will not move, and will live until
you Free the GCHandle.
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Hi Luc,
Is this the C# board now?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Sorry if this bothered you. Since there was some C++ involved in the problem so I posted this question.
|
|
|
|
|
No problem I was just giving Luc a hard time.
Cheers,
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi Mark,
no we are not colonizing the C++/CLI forum ; I just copied and improved two lines
of code from the OP and introduced some .NET stuff that exists for all CLR
languages AFAIK.
If, however I had known at that time that the identical question was posted
in the C# forum, I would have answered it there (identically). As it is, I told him
overthere not to duplicate stuff...
Please feel free to adjust whatever I may have messed up language wise.
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|