Navigation

    cpp-logo

    C++ Community

    • Registrieren
    • Anmelden
    • Suche
    • Kategorien
    • Aktuell
    • Tags
    • Beliebt
    • Gruppen
    1. Übersicht
    2. Beliebt
    Melde dich an, um einen Beitrag zu erstellen
    • Alle Kategorien
    • Ankündigungen
    •      Die Artikel
    • C++ (alle ISO-Standards)
    •      MFC
    •      VCL (C++ Builder)
    •      C++/CLI mit .NET
    •      Andere GUIs - Qt, GTK+, wxWidgets
    • Sonstige Programmiersprachen
    •      C (alle ISO-Standards)
    •      C# und .NET
    •      Java
    •      Assembler
    •      Webzeugs
    • Betriebssysteme
    •      WinAPI
    •      Linux/Unix
    •      Projekt: OS-Development
    •      DOS und Win32-Konsole (nur Lesen)
    • Weitere Fachbereiche
    •      Mathematik und Physik
    •      Spiele-/Grafikprogrammierung
    •      Datenbanken
    •      Compiler- und IDE-Forum
    •      Projekte
    • Jenseits der Programmierung
    •      Beruf und Ausbildung
    •      Stellenangebote
    •      Themen rund um die IT
    •      Gaming-Corner
    • Forentechnik
    • Archiv
    •      Das C++ Magazin
    •          Die Redaktion
    •          Die Autoren
    •          Allgemeines zum Magazin
    •          Archiv
    •      Organisation des Forumtreffens
    •      FAQs - Frequently Asked Questions
    •          FAQ - C (C89, C99 und C11)
    •          FAQ - Assembler
    •          FAQ - C++ (auch C++0x, C++11)
    •          FAQ - C++/CLI
    •          FAQ - C++ Builder (VCL/CLX)
    •          FAQ - C# und .NET
    •          FAQ - Compiler & IDEs
    •          FAQ - Datenbanken
    •          FAQ - DOS und Win32-Konsole
    •          FAQ - Grafik-/Spieleprogrammierung
    •          FAQ - GUIs
    •          FAQ - Java
    •          FAQ - Linux/Unix
    •          FAQ - Mathematik und Physik
    •          FAQ - MFC
    •          FAQ - Rund um die Programmierung
    •          FAQ - Sonstiges
    •          FAQ - Webzeugs
    •          FAQ - WinAPI
    •          FAQ - Forentechnik
    • Alle Themen
    • Neue Themen
    • Beobachtete Themen
    • Unbeantwortete Themen
    • Gesamter Zeitraum
    • Tag
    • Woche
    • Monat

    • B

      Forum weiterhin ?
      Forentechnik • • biter  

      8
      0
      Stimmen
      8
      Beiträge
      223
      Aufrufe

      F

      @Dravere Auch ein interessanter Nebeneffekt: Habe schon mehr als einmal, als ich der KI erklärt habe, warum der als fehlerhaft angekreidete Code dennoch korrekt ist, selbst nochmal richtig darüber nachgedacht und ein ganz anderes Problem entdeckt, das wir beide nicht gesehen haben. Auch wenn das etwas ist, das auch ein Kollege liefern kann: der hat halt auch nicht immer Zeit für die Probleme anderer. Und es zeigt aber auch, wie nützlich ein Review selbst dann ist, wenn der Reviewer nicht den besten Durchblick hat.
    • *

      GCC 16.1.0 und Modules
      C++ (alle ISO-Standards) • • *john 0  

      3
      0
      Stimmen
      3
      Beiträge
      115
      Aufrufe

      *

      Ah, das war es. Vielen Dank für den Hinweis!
    • S

      Re: [IntelliJ: externes Tool oder Skript direkt vor einem Build ausführen?
      Java • • SiegfriedFeuer  

      2
      0
      Stimmen
      2
      Beiträge
      72
      Aufrufe

      I

      Was ist das denn für ein komischer Fred, der mit einer Antwort anfängt?
    • E

      Buchempfehlung "Expedition Chaos: Vom Fixpunkt zur Feigenbaum-Konstante - Experimente mit dem Chaos Labor in C#"
      Mathematik und Physik • • Erhard Henkes  

      2
      0
      Stimmen
      2
      Beiträge
      76
      Aufrufe

      Cool! Ein Buch zur Chaostheorie im Bücherschrank meiner Eltern hat mich mit zu einem meiner ersten ernsthaften, guten Computerprogramme inspiriert, als ich eben genau das Bifurkationsdiagramm von deinem Titelbild nachprogrammiert habe. Hat mir sicher nicht geschadet Leider hat die Mandelbrotmenge im Anschluss nicht funktioniert, weil ich als 13-jähriger nicht so recht wusste, wie man mit komplexen Zahlen rechnet (QBasic hatte auch keinen eingebauten Typ dafür), und meine Versuche das anhand von Lexikonartikeln zu lernen (Damals gab es noch nicht wirklich Internet für Normalleute zuhause) waren nicht so erfolgreich.
    • SDL2 Input Handling
      C++ (alle ISO-Standards) • • zeropage  

      1
      0
      Stimmen
      1
      Beiträge
      62
      Aufrufe

      Hallo, Sorry, das ich so lange weg war, aber ich hatte Schwierigkeiten mich anzumelden, bis ich mitbekommen hatte, das ich hier ne andere Mail Adresse hatte.Aber nun gut. Ich beschäftige micht gerade mit SDL2 und fand das Input Handling etwas irritierend. Einerseits scheint es nach meinen rudimentären Recherchen unterschiedliche Vorgehensweisen für gedrückte und gehaltene Tasten zu geben, andererseits will ich keine EventLoop für Tastendrücke haben. So kam ich zu einer für mich zufriedenstellenden Lösung, die ich hier gerne vorstellen möchte. Diese ist natürlich nur in meinem Horizont, es mag bestimmt besserere Lösungen geben, die ich nur noch nicht gesehen habe. Ich finde meine Lösung aber recht intuitiv, weil es nur zwei Bedingungen gibt. Man muss eine 'Mouse Update' Methode vor einem Frame setzen und eine "Key Update" nach jedem Frame. Außerdem werden drei Tastenzustände registriert; Pressed, Held, Released. Das Ganze sieht dann so aus: #pragma once #include <zp/Core/Common.h> namespace zp { struct KeyState { bool Pressed = false; bool Released = false; bool Held = false; }; } namespace zp { class SDLInput { public: SDLInput(); void updateKeyInput(); void updateMouseInput(); private: const Uint8* m_CurrentKeyStates; Uint8 m_PreviousKeyStates[SDL_NUM_SCANCODES]; KeyState m_KeyState; static constexpr Uint32 MOUSE_KEY_BUFFER = 5; Uint32 m_CurrentMouseStates[MOUSE_KEY_BUFFER]; Uint32 m_PreviousMouseStates[MOUSE_KEY_BUFFER]; KeyState m_MouseState[MOUSE_KEY_BUFFER]; ivec2 m_MousePos; public: const KeyState& getKey(const SDL_Scancode key); const KeyState& getKey(const KeyCode key); const KeyState& getMouse(const MouseButton button) const; const ivec2& getMousePos() const; private: void updateKeyState(const SDL_Scancode key); void updateMouseState(); }; } Hier die cpp: #include <zp/Input/SDLInput.h> zp::SDLInput::SDLInput() : m_CurrentKeyStates(SDL_GetKeyboardState(nullptr)) { updateKeyInput(); } void zp::SDLInput::updateKeyInput() // set after frame { // Update previous states memcpy(m_PreviousKeyStates, m_CurrentKeyStates, SDL_NUM_SCANCODES); } void zp::SDLInput::updateMouseInput() // set before frame { updateMouseState(); } const zp::KeyState& zp::SDLInput::getKey(const SDL_Scancode key) { updateKeyState(key); return m_KeyState; } const zp::KeyState& zp::SDLInput::getKey(const KeyCode key) { updateKeyState(static_cast<SDL_Scancode>(key)); return m_KeyState; } const zp::KeyState& zp::SDLInput::getMouse(const MouseButton button) const { return m_MouseState[static_cast<Uint32>(button)]; } const zp::ivec2& zp::SDLInput::getMousePos() const { return m_MousePos; } /* private */ void zp::SDLInput::updateKeyState(const SDL_Scancode key) { if (m_CurrentKeyStates[key]) { if (!m_PreviousKeyStates[key]) { m_KeyState.Pressed = true; m_KeyState.Held = true; m_KeyState.Released = false; } else { m_KeyState.Pressed = false; m_KeyState.Held = true; m_KeyState.Released = false; } } else { if (m_PreviousKeyStates[key]) { m_KeyState.Pressed = false; m_KeyState.Held = false; m_KeyState.Released = true; } else { m_KeyState.Pressed = false; m_KeyState.Held = false; m_KeyState.Released = false; } } } void zp::SDLInput::updateMouseState() { int x, y; auto mouseState = SDL_GetMouseState(&x, &y); m_MousePos = ivec2(x, y); for (auto i = 0; i < MOUSE_KEY_BUFFER; ++i) { m_CurrentMouseStates[i] = mouseState & SDL_BUTTON(i); m_MouseState[i].Pressed = false; m_MouseState[i].Released = false; if (m_CurrentMouseStates[i] != m_PreviousMouseStates[i]) { if (m_CurrentMouseStates[i]) { m_MouseState[i].Pressed = true; m_MouseState[i].Held = true; } else { m_MouseState[i].Released = true; m_MouseState[i].Held = false; } } m_PreviousMouseStates[i] = m_CurrentMouseStates[i]; } } Ich habe dann auch eigene enums, die ich auch intuitiver finde. Die KeysCodes habe ich einfach von der sdl2 wiki kopiert. enum class MouseButton : Uint32 { LEFT = SDL_BUTTON_LEFT, MIDDLE = SDL_BUTTON_MIDDLE, RIGHT = SDL_BUTTON_RIGHT, X1 = SDL_BUTTON_X1, X2 = SDL_BUTTON_X2 }; enum class KeyCode : Uint32 { A = 4, B = 5, C = 6, D = 7, E = 8, F = 9, G = 10, H = 11, I = 12, J = 13, K = 14, L = 15, M = 16, N = 17, O = 18, P = 19, Q = 20, R = 21, S = 22, T = 23, U = 24, V = 25, W = 26, X = 27, Y = 28, Z = 29, D1 = 30, D2 = 31, D3 = 32, D4 = 33, D5 = 34, D6 = 35, D7 = 36, D8 = 37, D9 = 38, D0 = 39, RETURN = 40, ESCAPE = 41, BACKSPACE = 42, TAB = 43, SPACE = 44, F1 = 58, F2 = 59, F3 = 60, F4 = 61, F5 = 62, F6 = 63, F7 = 64, F8 = 65, F9 = 66, F10 = 67, F11 = 68, F12 = 69, HOME = 74, PAGEUP = 75, DELETE = 76, END = 77, PAGEDOWN = 78, RIGHT = 79, LEFT = 80, DOWN = 81, UP = 82 }; Sorry, das ich wieder kaum kommentiert habe, aber da habe ich echt noch Schwierigkeiten. Zwar bin ich nicht besonders kritikreselient aber wer mag, kann gerne seine Gedanken dazu schreiben. LG