|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Sunrise Mini JLI'ler
Anmeldedatum: 04.09.2005 Beiträge: 2
Medaillen: Keine
|
Verfasst am: 04.09.2005, 22:39 Titel: Bitmap anzeigen |
|
|
Hi ich übe mich noch nicht sehr lange mit Dx hab mir daher ein Buch gekauft und verstehe es auch ganz gut . Hab nun auf grund des wissens und des inhalts ein kleines prog gemacht das sounds ausgeben kann und eigentlich bitmaps nur gerade die will es nicht anzeigen und ich weis nicht warum. es bringt keine fehler meldung und nix des fenster ist einfach weis!
CPP: | # include <stdio.h>
# include <windows.h>
# include <ddraw.h>
# include <dsound.h>
# include "ddutil.h"
# include "dsutil.h"
# include "resource.h"
const int display_netto_breite = 700; // display breite innen Raum
const int display_netto_hoehe = 550; // display hoehe innen Raum
int display_breite; // Breite des gesamten Haupfensters (incl. Rahmen)
int display_hoehe; // Hohe des gesamten Haupfensters (incl. Rahmen)
HINSTANCE shadow_instance; // Instanz der Ultris Applikation
HWND shadow_window; // Das Hauptfenster von Ultris
HMENU shadow_menu; // Das Menu von Ultris
// V2 Beginn ### sound
const int sound_start = 0; // Sound fuer Spiel
const int anzahl_sounds = 1; // Anzahl Sounds
char *soundfiles[anzahl_sounds] =
{
"loop.wav"
};
class sounds
{
private:
CSoundManager smgr;
CSound *snd[anzahl_sounds];
public:
int on;
sounds();
int init( HWND wnd);
void play( int snr);
~sounds();
};
sounds::sounds()
{
int i;
for( i = 0; i < anzahl_sounds; i++)
snd[i] = 0;
on = 1;
}
int sounds::init( HWND wnd)
{
HRESULT ret;
int i;
ret = smgr.Initialize( wnd, DSSCL_PRIORITY, 2, 22050, 16);
if( ret < 0)
return ret;
for( i = 0; i < anzahl_sounds; i++)
{
ret = smgr.Create( snd+i, soundfiles[i]);
if( ret < 0)
return ret;
}
return S_OK;
}
sounds::~sounds()
{
int i;
for( i = 0; i < anzahl_sounds; i++)
{
if( snd[i])
delete snd[i];
}
}
void sounds::play( int i)
{
if( !on)
return;
if( snd[i]->IsSoundPlaying())
{
snd[i]->Stop();
snd[i]->Reset();
}
snd[i]->Play(0,0);
}
// Sound classe ersteellen
sounds shadow_sounds;
// V2 Ende
// V3 Beginn
class display
{
private:
CDisplay dsply;
CSurface *hgrnd;
public:
display();
void free_all();
~display() {free_all();}
HRESULT init( HWND wnd);
void hintergrund() { dsply.Blt( 0, 0, hgrnd);}
void update() { dsply.UpdateBounds();}
HRESULT cooperative(){ return dsply.GetDirectDraw()->TestCooperativeLevel();}
HRESULT restore();
HRESULT present();
};
display::display()
{
hgrnd = 0;
}
void display::free_all()
{
if( hgrnd)
delete hgrnd;
}
HRESULT display::init( HWND wnd)
{
HRESULT hr;
hr = dsply.CreateWindowedDisplay( wnd, display_netto_breite, display_netto_hoehe );
if( hr < 0)
return hr;
hr = dsply.CreateSurfaceFromBitmap( &hgrnd, "hgrnd.bmp", 700, 550);
if( hr < 0)
return hr;
return S_OK;
}
HRESULT display::restore()
{
HRESULT hr;
LPDIRECTDRAWPALETTE pal = 0;
hr = dsply.GetDirectDraw()->RestoreAllSurfaces();
if( hr < 0)
return hr;
hr = hgrnd->DrawBitmap( "hgrnd.bmp", 700, 550);
if( hr < 0)
return hr;
return S_OK;
}
HRESULT display::present()
{
HRESULT hr;
hr = dsply.Present();
if( hr == DDERR_SURFACELOST )
return restore();
return hr;
}
display shadow_display;
// V3 Ende
LRESULT CALLBACK shadow_windowhandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_COMMAND:
switch( LOWORD( wParam))
{
case IDM_EXIT:
PostMessage( hWnd, WM_CLOSE, 0, 0);
return 0;
// V2 Beginn
case IDM_GAME_SOUND:
shadow_sounds.on = !shadow_sounds.on;
CheckMenuItem( shadow_menu, IDM_GAME_SOUND, shadow_sounds.on ? MF_CHECKED:MF_UNCHECKED);
return 0;
// V2 Ende
}
break;
case WM_GETMINMAXINFO:
((MINMAXINFO *)lParam)->ptMinTrackSize.x = ((MINMAXINFO *)lParam)->ptMaxTrackSize.x = display_breite;
((MINMAXINFO *)lParam)->ptMinTrackSize.y = ((MINMAXINFO *)lParam)->ptMaxTrackSize.y = display_hoehe;
return 0;
case WM_DESTROY:
PostQuitMessage( 0);
return 0;
// V3 Anfang
case WM_MOVE:
shadow_display.update();
return 0;
case WM_PAINT:
shadow_display.hintergrund();
shadow_display.present();
break;
// V3 Ende
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow)
{
MSG msg;
HACCEL acc;
WNDCLASSEX wcx;
wcx.cbSize = sizeof( wcx);
wcx.lpszClassName = TEXT( "Shadow");
wcx.lpfnWndProc = shadow_windowhandler;
wcx.style = CS_VREDRAW | CS_HREDRAW;
wcx.hInstance = hInst;
wcx.hIcon = LoadIcon( hInst, MAKEINTRESOURCE( IDI_MAIN));
wcx.hIconSm = LoadIcon( hInst, MAKEINTRESOURCE( IDI_MAIN));
wcx.hCursor = LoadCursor( NULL, IDC_ARROW);
wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcx.lpszMenuName = MAKEINTRESOURCE( IDR_MENU);
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0;
if( !RegisterClassEx( &wcx))
return 0;
acc = LoadAccelerators( hInst, MAKEINTRESOURCE(IDR_ACCEL)); // Tastaturkürzel werden geladen ( Strg + A )
display_hoehe = display_netto_hoehe + 2 * GetSystemMetrics( SM_CYSIZEFRAME) + GetSystemMetrics( SM_CYMENU)
+ GetSystemMetrics( SM_CYCAPTION);
// Hohe ist die fenstergrösse (innen) + 2 mal rahmen + menue grösse
display_breite = display_netto_breite + 2 * GetSystemMetrics( SM_CXSIZEFRAME);
// Breite ist fensterbreite (innen) + 2 mal rahmen
if ( shadow_display.init( shadow_window ) < 0 )
{
MessageBox(shadow_window,"Fehler beim Initialisieren der Grafik","Shadow Fehlermeldung", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
return 0;
}
// Fenster erzeugen
shadow_window = CreateWindowEx( 0, TEXT( "Shadow"), TEXT( "Shadow"), WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT,
display_breite, display_hoehe, NULL, NULL, hInst, NULL);
// Wenn fehler bei der erzeugung dan prog ende
if( !shadow_window)
return 0;
shadow_menu = GetMenu( shadow_window);
// V2 Beginn
if( shadow_sounds.init( shadow_window) < 0)
{
MessageBox( shadow_window, "Fehler beim Initialisieren der Sounds", "Shadow-Fehlermeldung", MB_OK | MB_ICONERROR | MB_SETFOREGROUND);
return 0;
}
CheckMenuItem( shadow_menu, IDM_GAME_SOUND, shadow_sounds.on ? MF_CHECKED:MF_UNCHECKED);
// V2 Ende
// In die Mitte der Displays setzen
MoveWindow( shadow_window, (GetSystemMetrics(SM_CXSCREEN)-display_breite)/2,
(GetSystemMetrics(SM_CYSCREEN)-display_hoehe)/2,
display_breite, display_hoehe, TRUE);
// Fenster anzeigen
ShowWindow( shadow_window, nCmdShow);
// Zugriff auf die Insttance und auf des gobale menue wurde gesichert
shadow_instance = hInst;
shadow_menu = GetMenu( shadow_window);
// Endlos schleife
while( TRUE)
{
if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE)) // Ist eine nachricht vorhanden
{
if( GetMessage( &msg, NULL, 0, 0 ) == 0) // Hole die nachricht
return 0; // Message ist WM_QUIT
// Tastenkombi auslesen ( Strg + C )
if( TranslateAccelerator( shadow_window, acc, &msg) == 0)
{
TranslateMessage( &msg); // Tastenkombi ausführen
DispatchMessage( &msg); // Dam Handel zuweisen
}
}
else
{
// V3 Beginn
HRESULT hr;
hr = shadow_display.cooperative();
if( hr < 0)
{
switch( hr )
{
case DDERR_EXCLUSIVEMODEALREADYSET:
Sleep(10);
break;
case DDERR_WRONGMODE:
shadow_display.free_all();
shadow_display.init( shadow_window);
PostMessage( shadow_window, WM_PAINT, 0, 0);
break;
}
}
else
{
// Hier koennen wir uns um das Spiel kuemmern
}
// V3 Ende
}
}
} |
Sorry Code ist vll bischen lang aber steht halt alles drin (=
Ich hoffe ihr könnt mir helfen bin schon am verzweifeln und hab schon ewig alles rumprobiert usw...[/code] |
|
Nach oben |
|
|
JkerryZ JLI Master Trainee
Anmeldedatum: 18.05.2004 Beiträge: 575 Wohnort: Wolfsburg Medaillen: Keine
|
Verfasst am: 05.09.2005, 14:50 Titel: |
|
|
Nur als erste Frage: Die Bitmaps sind aber im richtigen Verzeichnis und haben auch die Namen die im Code angegeben sind? |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 05.09.2005, 15:44 Titel: |
|
|
hm, interessanter Code, vielleicht les ich den auch irgendwann mal komplett durch . Wenigstens das mitd en sounds hätte man wegmachen können, gelle? Spontan hätte ich noch ne Spriteklasse anzubeiten, aber das ist ja wahrscheinlich nicht das was du suchst. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Sunrise Mini JLI'ler
Anmeldedatum: 04.09.2005 Beiträge: 2
Medaillen: Keine
|
Verfasst am: 06.09.2005, 06:10 Titel: |
|
|
jed die bilder sind sowohl im code ordner als auch im release ordner.. sonst bringt er ja fehler das sie nicht init.... wurden.
jep sorry hätte icch vll machen können )=
also mir geht es nur darum ein fensgter zu erstellen und dan einen hintergrund für ein minni 2d rollenspiel zu machen. am besten so das man wenn mann noch obben läuft es mit scrollt... und halt ein player bild und bäume usw... (=
ich denk das des mit dem code wohln nicht gehen wird da ich denke das des mit den surface nicht scollbar ist oder ?
könntet mir auch ganz andere vorschläge bringen (=
thx |
|
Nach oben |
|
|
GreveN JLI Master
Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 06.09.2005, 06:50 Titel: |
|
|
Ja, vergiss das RPG und schreib erstmal ein Snake oder Tetris für den Anfang.
Nimm dazu nicht direkt D3D, OGL, DD oder sonstwas, sondern geh die Sache langsam an.
Ein Konsolenfenster + SDL dürfte für deine Zwecke mehr als ausreichen.
btw.:
Zudem würde ich heutzutage selbst für 2D-Grafik eine 3D-API, vorziehen. 4 Vertices, eine Textur draufkleben und du hast dein Sprite. Außerdem super easy scrollbar usw. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|