Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    [C] Gestione input Game Engine 2D Game

    Ragazzi, stò creando un piccolissimo engine per un giochino 2D, ho iniziato a introdurre le funzioni basilari che serviranno per il giochino:

    Engine.h:

    codice:
    #ifndef _ENGINE_H
    #define _ENGINE_H
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define TICKGAME 1000                    // FPS ( Frame Per Second )
    
    typedef void (*GAMELOOP)(void);
    typedef void (*RENDERFRAME)(void);
    typedef void (*PROCESSINPUT)(void);
    typedef void (*UPDATE)(void);
    
    typedef struct _engine
    {
        int TickGame;
        GAMELOOP        GameLoop;
        RENDERFRAME        RenderFrame;
        PROCESSINPUT    ProcessInput;
        UPDATE            Update;
    } ENGINE;
    
    ENGINE* Init();
    void    GameLoop();                // Main Game Loop
    void    RenderFrame();            // Renderizza un frame
    void    ProcessInput();            // Processa l'input dell'utente
    void    Update();                // Aggiorna tutti i componenti interni dell'Engine
    
    #endif
    Engine.c
    codice:
    #include "Engine.h"
    
    ENGINE* Init() {
        ENGINE *engine = malloc(sizeof(ENGINE));
        engine->GameLoop        = &GameLoop;
        engine->RenderFrame        = &RenderFrame;
        engine->ProcessInput    = &ProcessInput;
        engine->Update            = &Update;
    
        return engine;
    }
    
    void GameLoop()
    {
        int TickGameBefore, TickGameAfter;
        // Clock attuale
        TickGameBefore = clock();
        do {
            // Clock all'inizio del gameloop
            TickGameAfter = clock();
            // Se sono passati TICKGAME( millisecondi ) allora eseguo il tick di gioco
            if (TickGameAfter - TickGameBefore > TICKGAME) 
            {
                ProcessInput();
                Update();
                RenderFrame();
                // Clock alla fine di un tick di gioco
                TickGameBefore = TickGameAfter;
            }
        } while (1); // Continuo fino a quando non clicco ESC
    }
    
    void RenderFrame()
    {
        printf("RenderFrame Function\n");
    }
    
    void ProcessInput()
    {
        printf("ProcessInput Function\n");
    }
    
    void Update() 
    {
        printf("Update Function\n");
    }
    main.c

    codice:
    #include "Console.h"
    #include "Engine.h"
    
    int main()
    {
        printf("Benvenuti nel gioco\n");
        printf("***********************\n\n");
        ENGINE *engine = Init();
        engine->GameLoop();
    
        return 0;
    }
    Ora mi è sorto un dubbio:

    Le funzioni che sono all'interno del GameLoop, cioè "ProcessInput", "Update" e "RenderFrame", a loro volta cosa faranno precisamente? Per intenderci. Ora vorrei fare in modo che quando clicco "ESC", devo uscire dal gameloop e quindi terminare il gioco, questa cosa va gestita all'interno della funzione ProcessInput?

    premetto che in "Console.c", ho un metodo LeggiTasto che è il seguente:

    codice:
    int LeggiTasto
    (   int Wait           // Input: attesa massima in millesimi di secondo
    )                      //        -1 attesa infinita;  0 non attende
    {   int Prima, Dopo,
            Tasto = 0;
    
        Prima = clock();   // lettura in millesimi di secondo
        if (Wait<0) Wait = 0x7FFFFFFF;      // circa 25 giorni
    
        do Dopo = clock(); while (Dopo-Prima<Wait && !_kbhit());
    
        if (_kbhit())
        {   Tasto = _getch();
            if (Tasto == 0 || Tasto == 224) Tasto = _getch() + 256;
        }
        return ( Tasto );
    }
    Io credo che l'input debba essere qualcosa di globale nel gioco, non credete?

    In definitiva chiedo, come mi consigliate di gestire l'input ?
    Con i sogni possiamo conoscere il futuro...

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Essendo il tuo game engine organizzato a callbacks ogni callback dovrà svolgere una singola funzione, inoltre ogni callback dovrà accettare dei parametri contestuali.
    Ad esempio per la gestione dell'input avrai una callback che accetta l'input da gestire e decide cosa fare, ma sarà il game engine a occuparsi di accettare l'input e passare i dati alla callback che lo gestisce.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Essendo il tuo game engine organizzato a callbacks ogni callback dovrà svolgere una singola funzione, inoltre ogni callback dovrà accettare dei parametri contestuali.
    Ad esempio per la gestione dell'input avrai una callback che accetta l'input da gestire e decide cosa fare, ma sarà il game engine a occuparsi di accettare l'input e passare i dati alla callback che lo gestisce.
    Utilizzando il C, per "simulare" la OOP stò cercando di usare le funzioni di callback e l'idea è creare una struttura ENGINE che abbia tutti i metodi di cui necessito... come giustamente dicevi , ogni funzione si occuperà di qualcosa. Potresti illustrarmi un esempio su come far gestire l'input all'engine.. te ne sarei grato.
    Con i sogni possiamo conoscere il futuro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.