 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Dofter Junior JLI'ler

Alter: 34 Anmeldedatum: 13.03.2005 Beiträge: 99 Wohnort: Ebermannstadt Medaillen: Keine
|
Verfasst am: 06.05.2005, 15:40 Titel: |
|
|
so etzt wirds länger
CPP: | /*
// Headerdateien
#include "Direct3D.h"
#include "Sprite.h"
#include "ResourceManager.h"
#include "InputManager.h"
// Anwendungsfenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance);
// Callback Funktion zur Nachrichtenbehandlung
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
// Das Fensterhandle und Instanz der Anwendung
HWND hWnd = 0;
HINSTANCE hInst = 0;
// Instanz der Klasse CDirect3D
CDirect3D Direct3D;
// Instanz der Klasse ResourceManager
CResourceManager ResourceManager;
// Klasse zur Verwaltung der Benutzereingaben
CInputManager InputManager;
// das Sprite der Spieler
CSprite Player;
// Statusbuffer zur Ausgabe der Framerate, Leben, Punkte
char StatusBuffer[256];
// Textbuffer zur Ausgabe des Textes (Game Over, Neu Starten, Pause)
char TextBuffer[256];
// Programm im Fenster oder Vollbildmodus starten
BOOL bWindowed = TRUE;
// Texturen laden und Objekte initialisieren
BOOL InitGame(void);
// Windows main-Funktion
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// Fenster erzeugen und Handle speichern
hWnd = CreateMainWindow(hInstance);
hInst = hInstance;
// Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
if(0 == hWnd)
{
MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
return -1;
}
// Spiel intialisieren
InitGame();
// Struktur, in der Informationen zur Nachricht gespeichert werden
MSG msg = { 0 };
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
// In jedem Schleifendurchlauf muss die Methode Update() aufgerufen
// werden, da in dieser Methode die Framerate berechnet wird.
ResourceManager.Update();
Direct3D.BeginScene();
// Eingabe holen
int Key = InputManager.GetInput();
// auf Tasten reagieren
Player.Move(Key);
// Spieler zeichnen
Player.Draw();
// und animieren
Player.Animate();
Direct3D.EndScene();
}
}
// Rückgabewert an Windows
return 0;
}
// Fenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance)
{
WNDCLASSEX wndClass =
{
sizeof(WNDCLASSEX), // Größe angeben
CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW, // Standardstile
MessageHandler, // Callback-Funktion
0, // Zusätzliche Angaben
0, // nicht benötigt
hInstance, // Anwendungsinstanz
LoadIcon(NULL, IDI_WINLOGO), // Windows-Logo
LoadCursor(NULL, IDC_ARROW), // Normaler Cursor
(HBRUSH)GetStockObject(WHITE_BRUSH), // Weißer Pinsel
NULL, // kein Menü
"WindowClass", // Der Name der Klasse
LoadIcon(NULL, IDI_WINLOGO) // Windows Logo
};
// Klasse registrieren
RegisterClassEx(&wndClass);
return CreateWindowEx(NULL, // Keine erweiterten Stile nutzen
"WindowClass", // Klassenname
"The Master Sword", // Fenstertitel
WS_OVERLAPPEDWINDOW | // Fenster
WS_VISIBLE, // Eigenschaften
0, 0, // Anfangsposition
SCR_WIDTH, SCR_HEIGHT, // und Größe des Fensters
NULL, // Handle des Elternfensters
NULL, // Handle des Menüs
hInstance, // Anwendungsinstanz
NULL); // wird nicht benötigt
}
// Diese Funktion wird von Windows aufgrufen, wenn
// eine Nachricht für Ihr Programm vorliegt
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// testen, um welche Nachricht es sich handelt
switch(msg)
{
// Programm beenden, wenn das Fenster
// geschlossen wird
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYDOWN:
switch(wParam)
{
// Bei F1 einen Screenshot speichern
case VK_F1:
Direct3D.CreateScreenshot("c:\\screenshot.bmp");
break;
// Wenn ESC gedrückt, Programm beenden
case VK_ESCAPE:
DestroyWindow(hWnd);
break;
}
break;
}
// Standardnachrichtenverarbeitung von Windows
return DefWindowProc(hwnd, msg, wParam, lParam);
}
// Spiel initialisieren
BOOL InitGame(void)
{
// Zufallsgenerator initialisieren
srand(timeGetTime());
// Direct3D initialisieren
if(!Direct3D.Init(hWnd,bWindowed))
{
return FALSE;
}
Direct3D.SetBackground(BACKGROUND);
ShowCursor(FALSE);
// ResourceManager initialisieren
if(!ResourceManager.Init(Direct3D.GetDevice()))
{
return FALSE;
}
// InputManager initialisieren
if(!InputManager.Init(hWnd,hInst))
{
return FALSE;
}
Player.Create(Direct3D.GetDevice(),&ResourceManager,48);
Player.SetPosition(64 , SCR_HEIGHT - 256);
int i;
char Filename[256];
// Grafiken für die Spieler laden
for(i=0;i<16;i++)
{
sprintf(Filename,LAUF,"Right",i+1);
ResourceManager.AddTexture(Filename);
Player.AddTexture(WALK_LEFT,ResourceManager.GetTexture(Filename));
sprintf(Filename,LAUF,"Right",i+1);
ResourceManager.AddTexture(Filename);
Player.AddTexture(WALK_RIGHT,ResourceManager.GetTexture(Filename));
sprintf(Filename,LAUF,"Up",i+1);
ResourceManager.AddTexture(Filename);
Player.AddTexture(WALK_UP,ResourceManager.GetTexture(Filename));
sprintf(Filename,LAUF,"Down",i+1);
ResourceManager.AddTexture(Filename);
Player.AddTexture(WALK_DOWN,ResourceManager.GetTexture(Filename));
}
sprintf(Filename,LAUF,"Up",1);
ResourceManager.AddTexture(Filename);
Player.AddTexture(STAND,ResourceManager.GetTexture(Filename));
return TRUE;
} |
@PeaceKiller im Asterois funktioniert auch bloß der fenstemodus. |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
Dofter Junior JLI'ler

Alter: 34 Anmeldedatum: 13.03.2005 Beiträge: 99 Wohnort: Ebermannstadt Medaillen: Keine
|
Verfasst am: 06.05.2005, 16:51 Titel: |
|
|
Wie meinst du des? |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 06.05.2005, 19:33 Titel: |
|
|
@Dofter
Ach du scheiße, ich glaub, ich guck mir den Rest gar net erst an... Versteh mich jetzt bitte net falsch, aber da fehlen Unmengen an Befehlen. z.B.
Es gibt nur einen Player, wo ist denn der 2. ?
Also irgendwie kann ich dir 2 Sachen net glauben:
Dass das der Code 1. von der CD ist und 2. dass der im Fenstermodus funktionieren soll...
Also, WAS WILLST DU DA MIT DEINEM CODE BEZWECKEN?
Außerdem lädst du hier: Dofter hat Folgendes geschrieben: | CPP: | :arrow: sprintf(Filename,LAUF,"Right",i+1);
ResourceManager.AddTexture(Filename);
Player.AddTexture(WALK_LEFT,ResourceManager.GetTexture(Filename));
:arrow: sprintf(Filename,LAUF,"Right",i+1);
ResourceManager.AddTexture(Filename);
Player.AddTexture(WALK_RIGHT,ResourceManager.GetTexture(Filename)); |
|
2 mal die selben Animationen...
Ich weiß ehrlich net, was ich davon halten soll
Wenn du mir eklärt hast, was das soll, poste doch bitte die BeginScene, EndScene und Draw-Methode
Gruß DirectXer, der irgendwie doof aus der Wäsche guckt  |
|
Nach oben |
|
 |
Dofter Junior JLI'ler

Alter: 34 Anmeldedatum: 13.03.2005 Beiträge: 99 Wohnort: Ebermannstadt Medaillen: Keine
|
Verfasst am: 06.05.2005, 20:01 Titel: |
|
|
Des is ja auch net genau der code.
und des mit Zitat: | Dofter hat folgendes geschrieben:
CPP:
sprintf(Filename,LAUF,"Right",i+1);
ResourceManager.AddTexture(Filename);
Player.AddTexture(WALK_LEFT,ResourceManager.GetTexture(Filename));
sprintf(Filename,LAUF,"Right",i+1);
ResourceManager.AddTexture(Filename);
Player.AddTexture(WALK_RIGHT,ResourceManager.GetTexture(Filename));
|
des sin meine sprites und ich hab noch keine animation für walk_left[/cpp] |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 06.05.2005, 20:11 Titel: |
|
|
aha, dann is ja ok. Aber ich dachte, dass der Code von der CD bei JLI-Fighter net funzt, net dass dein eigenes Game net funzt. Hmmh , das macht die Sache en bisschen schwieriger, aber naja.
Also poste doch jetzt mal die 3 Funktionen.
Ach ja, zeig mir bitte auch mal deine Init-Methode von Direct3d, hab da nämlich so ne ganz dunkle Ahnung...
Gruß DirectXer |
|
Nach oben |
|
 |
Dofter Junior JLI'ler

Alter: 34 Anmeldedatum: 13.03.2005 Beiträge: 99 Wohnort: Ebermannstadt Medaillen: Keine
|
Verfasst am: 06.05.2005, 20:31 Titel: |
|
|
CPP: | // Methoden zum Start/Beenden der Szene
void CDirect3D::BeginScene(void)
{
m_lpD3DDevice->BeginScene();
// aktuellen Bereich in den Backbuffer kopieren
m_lpD3DDevice->StretchRect(m_lpSurface,
NULL,
m_lpBackBuffer,
0,
D3DTEXF_NONE);
}
void CDirect3D::EndScene(void)
{
m_lpD3DDevice->EndScene();
m_lpD3DDevice->Present(0,0,0,0);
}
// Direct3D initialisieren
BOOL CDirect3D::Init(HWND hWnd, BOOL bWindowed)
{
// Direct3D-Objekt erzeugen
m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(NULL == m_lpD3D)
{
// Fehler, D3D-Objekt wurde nicht erzeugt
return FALSE;
}
// Parameter für den Modus festlegen
D3DPRESENT_PARAMETERS PParams;
ZeroMemory(&PParams,sizeof(PParams));
PParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
PParams.hDeviceWindow = hWnd;
PParams.Windowed = bWindowed;
PParams.BackBufferWidth = SCR_WIDTH;
PParams.BackBufferHeight = SCR_HEIGHT;
PParams.BackBufferFormat = D3DFMT_A8R8G8B8;
HRESULT hr;
// Direct3D-Gerät anlegen
if(FAILED(hr = m_lpD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&PParams,
&m_lpD3DDevice)))
{
// Fehler, Gerät kann nicht angelegt werden
const char* Err = DXGetErrorDescription9(hr);
DXTRACE_MSG(Err);
return FALSE;
}
// Schrift erzeugen
CreateFont();
// Zeiger auf dem Hintergrundpuffer holen
m_lpD3DDevice->GetBackBuffer(0,0,
D3DBACKBUFFER_TYPE_MONO,
&m_lpBackBuffer);
return TRUE;
}
// Sprite zeichnen
void CSprite::Draw(void)
{
float m_TempRot = m_Rotation * D3DX_PI / 180.0f;
// Sprite in der passenden Animationsstufe zeichnen
m_lpSprite->Draw(m_vAnimationSequences[m_CurrentAnimation][m_CurrentImage],
0,
&m_vScale,
&m_vRotationCenter,
m_TempRot,
&m_vPosition,
0xFFFFFFFF);
} |
|
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 06.05.2005, 20:46 Titel: |
|
|
hmm, auf die ersten Blicke kann ich da keinen Fehler erkennen. Also, ähme, deshalb :
1. poste die Animate-Methode(wobei ich net glaube, dass es daran liegt)
2. Sag mir bitte GENAU bei welchen Programmen(egal ob von CD oder net) welcher Fehler auftritt und ob du jeweils etwas und wenn, was, verändert hast.
Ansonsten, naja ma gucken.
Gruß DirectXer |
|
Nach oben |
|
 |
Dofter Junior JLI'ler

Alter: 34 Anmeldedatum: 13.03.2005 Beiträge: 99 Wohnort: Ebermannstadt Medaillen: Keine
|
Verfasst am: 06.05.2005, 20:52 Titel: |
|
|
CPP: | #define WALK_SEQUENCE_MIN 3
#define WALK_SEQUENCE_MAX 11
// ggf. nächste Animation anzeigen
void CSprite::Animate(void)
{
int Framerate = m_ResManager->GetFramerate();
// m_CurrentImage in Abhängigkeit der Framerate erhöhen
m_CurrentImage += m_AnimationSpeed / (float)Framerate;
// wenn es sich um die Laufanimation handelt, besondere Behandlung, s.o.
if(m_CurrentAnimation == WALK_LEFT || m_CurrentAnimation == WALK_RIGHT || m_CurrentAnimation == WALK_UP || m_CurrentAnimation == WALK_DOWN)
{
if(m_CurrentImage >= WALK_SEQUENCE_MAX)
{
m_CurrentImage = WALK_SEQUENCE_MIN;
}
}
else
{
// ansonsten mit der Anzeige wieder beim ersten Bild beginnen
if(m_CurrentImage >= m_vAnimationSequences[m_CurrentAnimation].size())
{
m_CurrentImage = 0;
}
}
} |
Also bei dem, dann Bei Fighter und asteroids. Aber nur in VOLLBILDMODUS |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 06.05.2005, 21:02 Titel: |
|
|
hmm, dann kann ich mir das im Moment wirklich net eklären. Wennde die Bsp. net verändert hast, müsste das eigentlich bei uns auch net funzen. Daraus kann man schließen, dass irgendwas in deinem Computer mit irgendwas in deinem Programm net klar kommt. Das könnte an deiner GraKa liegen.
Nebenbei: Bei CityHunter und mir kam auch mal en Problem vor, bei dem unser PC anders wollte als der PC der meisten anderen Member hier. Aber das war was anderes...
Gruß DirectXer |
|
Nach oben |
|
 |
Dofter Junior JLI'ler

Alter: 34 Anmeldedatum: 13.03.2005 Beiträge: 99 Wohnort: Ebermannstadt Medaillen: Keine
|
Verfasst am: 06.05.2005, 21:04 Titel: |
|
|
Dake für die Bemühungen. Mach ich halt weiter in fenstermodus.
Dofter |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 06.05.2005, 21:27 Titel: |
|
|
ähm, du könntest ja noch mal folgendes probieren:
setze in deine Init-Funktion von Direct3d bei den PParams vor dein bwindowed ein !; also
CPP: | PParams.Windowed = !bWindowed | oder so.
Wenn du dann auch nur den Hintergrund und keine Figuren siehst, sags mir bitte
Gruß DirectXer |
|
Nach oben |
|
 |
Dofter Junior JLI'ler

Alter: 34 Anmeldedatum: 13.03.2005 Beiträge: 99 Wohnort: Ebermannstadt Medaillen: Keine
|
Verfasst am: 06.05.2005, 21:33 Titel: |
|
|
Dann is es aba ka vollbildmodus mehr
Aber ich seh das sprite wieda!  |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 06.05.2005, 21:37 Titel: |
|
|
Dofter hat Folgendes geschrieben: | Dann is es aba ka vollbildmodus mehr
Aber ich seh das sprite wieda!  |
nee, ich meinte, das du dein Windowed auf TRUE setzt und nur da den !-operator vortust. Wenns dann nämlich wieder so is, hätte ich noch ne idee...
Gruß DirectXer |
|
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
|