Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Anonymous
unregistriert
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
void input::update (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { // Nur WM_KEYDOWN und WM_KEYUP wird beachtet. if (message != WM_KEYDOWN || message != WM_KEYUP) return; // TODO: verarbeite. } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { // Input-Manager updaten. input::get_instance (). update (hwnd, message, wParam, lParam); // Weitere Nachrichtenverarbeitung. switch (message) { // [...] } return (::DefWindowProc (hwnd, message, wParam, lParam)); } |
Anonymous
unregistriert
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
// Basisklasse für alle Services class service { public: virtual void update (HWND hwnd, UINT message, WPARAM wParam, lParam) = 0; void set_done (bool done) { done_ = done; } bool is_done (void) { return done_; } private: bool done_; // = false }; // Service für die Grafikausgabe, NICHT DAS DEVICE!!! Diese Klasse benutzt nur das Device! class graphic : public service { public: void update (HWND hwnd, UINT message, WPARAM wParam, lParam) { if (message == WM_SIZE) { // WM_SIZE kommt u.A. wenn ein Restore vollzogen werden muss, drum hier Sachen für Restore einfügen, } if (message == WM_PAINT) { // Bei WM_PAINT 1x Zeichnen. } // Andere Messages die zum Zeichnen benötigt oder relevant sind verarbeiten. } }; // Service für die Input-Verarbeitung. KEIN INPUT-MANAGER! Die Klasse benutzt den Input-Manager. class input : public service { public: void update (HWND hwnd, UINT message, WPARAM wParam, lParam) { if (message == WM_KEYDOWN || message == WM_KEYUP) { // Tastatur-Daten an den Input-Manager weiterleiten. // z. B. // this->manager_.set_key (taste aus params, wert aus params); } // Messages für Joystick, Maus usw verarbeiten. } }; // Service für die Timer-Verarbeitung. KEIN INPUT-MANAGER! Die Klasse benutzt den Framework-weiten Timer. class input : public service { public: void update (HWND hwnd, UINT message, WPARAM wParam, lParam) { // Normaler Timer wird aktuallisiert. if (message == WM_TIMER) { // [...] } // Interessanter Fall und generell Schwer zu handhaben in Spielen, // aber so sehr easy: WM_TIMECHANGE (Systemzeit wurde // geändert z. B. automatische Umstellung von Sommer auf Winterzeit. if (message == WM_TIMECHANGE) { // Alle Timer mit der Zeitdifferenz aktuallisieren. } } }; // kernel class kernel { public: // hinzufügen eines services. void add_service (service* my_service) { service_.push_back (my_service); } // aktuallisieren des kernels. void update (HWND hwnd, UINT message, WPARAM wParam, lParam) { for (std::vector<service*>::iterator it = service_.begin (); it != service_.end (); ) { // Service aktuallisieren. (*it)->update (hwnd, message, wParam, lParam); // freigegebene Services löschen. if ((*it)->is_done ()) it = service_.erase (it); else ++it; } } }; void init (void) { // Services hinzufügen. kernel::get_instance ().add_service (new graphic ()); kernel::get_instance ().add_service (new input ()); kernel::get_instance ().add_service (new timer ()); } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { // Services aktuallisieren. kernel::get_instance (). update (hwnd, message, wParam, lParam); // Weitere Nachrichtenverarbeitung. switch (message) { // [...] } return (::DefWindowProc (hwnd, message, wParam, lParam)); } |
Anonymous
unregistriert
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
void Input::update(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { DEBUG_STACK; if(message == WM_KEYDOWN) { // Bereichsüberschreitung verhindern if(wParam > 255) EXCEPTION(TEXT("Virtual Key Code außerhalb des erlaubten Bereichs.")); currentKeys_[wParam] = true; oldKeys_[wParam] = lParam & (1<<30); } else if(message == WM_KEYUP) { // Bereichsüberschreitung verhindern if(wParam > 255) EXCEPTION(TEXT("Virtual Key Code außerhalb des erlaubten Bereichs.")); currentKeys_[wParam] = false; oldKeys_[wParam] = true; } } |
C-/C++-Quelltext |
|
1 2 3 4 |
bool Input::keyDown(unsigned int key, bool checkFirst) { return currentKeys_[key] && (!checkFirst || !oldKeys_[key]); } |
Anonymous
unregistriert
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 |
// Wenn das Direct3D-Device resettet werden muss und kann if(Direct3D::getInstance().deviceLost()) { if(Direct3D::getInstance().readyToReset()) { StateManager::getInstance().prepareReset(); // Reset vorbereiten (Ressourcen freigeben) Direct3D::getInstance().reset(); // Direct3D-Device resetten StateManager::getInstance().reset(); // Ressourcen wieder neu laden } } |
Werbeanzeige