Grafica su C++

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Salve ragazzi, devo realizzare un programma in C++ che utilizzi delle semplici linee e cerchi (se riesco a implementare figure come X pure quelle). In particolare deve essere rappresentata una scacchiera da Tris.
Il professore dice di utilizzare winbgim ma sinceramente mi rifiuto di utilizzare una libreria che:
1. Non riesco ad installare
2. Mi costringe ad utilizzare Dev C++
3. Ultimo aggiornamento del 2004?!

Che altre librerie, non troppo ostiche, permettono di realizzare simile grafica?
Grazie
 

Andretti60

Utente Èlite
6,440
5,091
Le librerie grafiche dipendono dalla piattaforma e dal linguaggio che si usa.
Una che va molto forte adesso è Allegro, ma io non la ho mai provata.
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Le librerie grafiche dipendono dalla piattaforma e dal linguaggio che si usa.
Una che va molto forte adesso è Allegro, ma io non la ho mai provata.
Fai conto che uso VisualStudio. Lunguaggio C/C++. Come ho detto il secondo mi sarebbe molto meglio (anche perché non c’è su Visual).
 

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Salve ragazzi, devo realizzare un programma in C++ che utilizzi delle semplici linee e cerchi (se riesco a implementare figure come X pure quelle). In particolare deve essere rappresentata una scacchiera da Tris.
Il professore dice di utilizzare winbgim ma sinceramente mi rifiuto di utilizzare una libreria che:
1. Non riesco ad installare
2. Mi costringe ad utilizzare Dev C++
3. Ultimo aggiornamento del 2004?!

Che altre librerie, non troppo ostiche, permettono di realizzare simile grafica?
Grazie
Devono essere per forza delle immagini linee e cerchi?
Dai un occhio ad SFML anche.

Io ti posso linkare uno dei mei "progetti", magari se non altro ti darà uno spunto: https://github.com/DispatchCode/T3C/blob/master/README.md ( sources).

Si tratta di TicTacToe (Tris) scelto per implementare MiniMax con Alpha Beta pruning. Nel mio caso avevo scelto SDL, ma avevo creato delle immagini (se si possono definire immagini quelle cose che ho creato...).

Inviato da ONEPLUS A5000 tramite App ufficiale di Tom\'s Hardware Italia Forum
 
  • Mi piace
Reazioni: _Achille

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Devono essere per forza delle immagini linee e cerchi?
Dai un occhio ad SFML anche.

Io ti posso linkare uno dei mei "progetti", magari se non altro ti darà uno spunto: https://github.com/DispatchCode/T3C/blob/master/README.md ( sources).

Si tratta di TicTacToe (Tris) scelto per implementare MiniMax con Alpha Beta pruning. Nel mio caso avevo scelto SDL, ma avevo creato delle immagini (se si possono definire immagini quelle cose che ho creato...).

Inviato da ONEPLUS A5000 tramite App ufficiale di Tom\'s Hardware Italia Forum
Ho iniziato a guardare il tuo e sembra davvero complesso a livello di funzioni. Io molto probabilmente farò una cosa “da schifo” perché non ho molto tempo.
Quindi vedo cosa SFML mi propone. È complessa da capire e utilizzare?

Anche perché già implementare MiniMax sarà una impresa ahahha
 
  • Mi piace
Reazioni: DispatchCode

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Grazie per l'apprezzamento.
In realtà MiniMax non sei costretto ad implementarlo, anzi.

SFML è piuttosto semplice e comunque un po' meno a "basso livello" di SDL. Un ulteriore vantaggio, se necettssiti della geometria, è il supporto ad essa. Qui puoi averne un esempio: https://www.sfml-dev.org/tutorials/2.5/graphics-shape.php

Magari ne esistono di più semplici, ma dubito...
A parte le Qt, SFML per certe cose è utilizzata. Riguardo un supporto discreto alla geometria, SDL ad esempio ne è sprovvista, e dovresti "faticare" un po' di più.
 
  • Mi piace
Reazioni: _Achille

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Grazie per l'apprezzamento.
In realtà MiniMax non sei costretto ad implementarlo, anzi.

SFML è piuttosto semplice e comunque un po' meno a "basso livello" di SDL. Un ulteriore vantaggio, se necettssiti della geometria, è il supporto ad essa. Qui puoi averne un esempio: https://www.sfml-dev.org/tutorials/2.5/graphics-shape.php

Magari ne esistono di più semplici, ma dubito...
A parte le Qt, SFML per certe cose è utilizzata. Riguardo un supporto discreto alla geometria, SDL ad esempio ne è sprovvista, e dovresti "faticare" un po' di più.
Il problema è che non c'è una versione per Visual Studio 2017 e non riesco a fare funzionare il linker alle librerie. Dovrei provare SDL allora, ma inizio ad essere veramente stanco...
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Il problema è che non c'è una versione per Visual Studio 2017 e non riesco a fare funzionare il linker alle librerie. Dovrei provare SDL allora, ma inizio ad essere veramente stanco...
Riposati allora. SDL ha supporto per VC ed anche MinGw.
Per dare uno sguardo ad SDL, puoi seguire questo tutorial: http://lazyfoo.net/tutorials/SDL/

Come alternative, ci sono anche le FLTK. Oppure la più conosciuta WxWidgets (ma a questo punto, le Qt anche...).
Esiste pure http://nanapro.org/en-us/, ma non la conosco, quindi non saprei darti nemmeno pareri personali.

Inviato da ONEPLUS A5000 tramite App ufficiale di Tom\'s Hardware Italia Forum
 
  • Mi piace
Reazioni: _Achille

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Riposati allora. SDL ha supporto per VC ed anche MinGw.
Per dare uno sguardo ad SDL, puoi seguire questo tutorial: http://lazyfoo.net/tutorials/SDL/

Come alternative, ci sono anche le FLTK. Oppure la più conosciuta WxWidgets (ma a questo punto, le Qt anche...).
Esiste pure http://nanapro.org/en-us/, ma non la conosco, quindi non saprei darti nemmeno pareri personali.

Inviato da ONEPLUS A5000 tramite App ufficiale di Tom\'s Hardware Italia Forum
Sono riuscito a farlo fungere!
Ora però devo capire come disegnare linee e oggetti in certe posizioni :sisi:
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Se hai qualche domanda o vuoi dritte, posta pure il codice e chiedi senza problemi. ;)
 
  • Mi piace
Reazioni: _Achille

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Se hai qualche domanda o vuoi dritte, posta pure il codice e chiedi senza problemi. ;)
Ho lavorato un pochino e ora devo andare fuori, questo è il risultato: (i commenti servono perché la mia povera classe dovrà impararsi il codice...)
C++:
void main_loop();
void set_X(const Vector2i&);

int main()
{
    main_loop();
}

void main_loop()
{
    RenderWindow window(sf::VideoMode(510, 510), "Tris", Style::Close); //Finestra 510x510
    window.setVerticalSyncEnabled(true); //VSync
    Image icon;
    if (!icon.loadFromFile("icon.png")) //Icona
    {
        cerr << "Immagine icon non caricata!" << endl;
    }
    window.setIcon(225, 225, icon.getPixelsPtr());

    Texture map;
    if (!map.loadFromFile("map.jpg")) //Sprite principale (scacchiera)
    {
        cerr << "Immagine map non caricata!" << endl;
    }
    Sprite mapSprite;
    mapSprite.setTexture(map);

    while (window.isOpen()) //Loop
    {
        Event event;
        while (window.pollEvent(event)) //Evento
        {
            switch (event.type) //Switch del tipo di evento
            {
                case Event::Closed: //Chiusura della finestra
                    window.close();
                    break;
                case Event::MouseButtonPressed: //Bottone del mouse qualsiasi premuto
                    set_X(Mouse::getPosition(window)); //Passaggio della posizione come vettore
                    break;
         
            }
        }

        window.draw(mapSprite);
        window.display();
    }

}

void set_X(const Vector2i& position)
{
 
}
In set_X (che è la funzione che disegna uno sprite X nella casella) devo discriminare la posizione del mouse. Potrei farlo al "vecchio modo": discrimino prima x e poi y, disegnando poi lo sprite con una posizione che viene moltiplicata a seconda di come viene discriminato. Ho pensato certamente che deve esistere un metodo più semplice, mi sbaglio?
Per quanto riguarda la logica pensavo di utilizzare una matrice 3x3.

PS: ho notato che devo passare pure la finestra come parametro a set_X
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Devi passare la finestra in quanto le coordinate, in quel caso, sono relative alla finestra. Se non passi niente sono relative al desktop.

Ti riferisci al come/dove posizionare l'elemento determinando in sostanza quale quadrato è stato clickato? Se è così, puoi determinare la posizione utilizzando proprio x ed y, visto che conosci la dimensione della tua finestra e di ogni tuo quadrato.

Nel mio caso ho una finestra di 600x600 ed ho anche io una matrice 3x3 (ma internamente è un array); questo significa che ogni quadrato è grande 200x200. Proseguendo con il ragionamento: da 0 a 200 è il quadrato 1; da 200 a 400 è il secondo e così via. Il calcolo avviene semplicemente in questo modo: 3 * (y/200) + (x/200). In questo modo ottengo l'indice dell'array. Per ottenere le coordinate (x,y) chiamo questa funzione:

C:
inline spatial_coords index_to_xy(int index)      
{       
    spatial_coords coords;       
    coords.x = index / 3;       
    coords.y = index % 3;       
    return coords;      
 }
 
  • Mi piace
Reazioni: _Achille

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
Devi passare la finestra in quanto le coordinate, in quel caso, sono relative alla finestra. Se non passi niente sono relative al desktop.

Ti riferisci al come/dove posizionare l'elemento determinando in sostanza quale quadrato è stato clickato? Se è così, puoi determinare la posizione utilizzando proprio x ed y, visto che conosci la dimensione della tua finestra e di ogni tuo quadrato.

Nel mio caso ho una finestra di 600x600 ed ho anche io una matrice 3x3 (ma internamente è un array); questo significa che ogni quadrato è grande 200x200. Proseguendo con il ragionamento: da 0 a 200 è il quadrato 1; da 200 a 400 è il secondo e così via. Il calcolo avviene semplicemente in questo modo: 3 * (y/200) + (x/200). In questo modo ottengo l'indice dell'array. Per ottenere le coordinate (x,y) chiamo questa funzione:

C:
inline spatial_coords index_to_xy(int index)     
{      
    spatial_coords coords;      
    coords.x = index / 3;      
    coords.y = index % 3;      
    return coords;     
}
Ho ben capito il ragionamento! Grazie. Ora però metto totalmente di parte la parte grafica e creo la logica vera e propria. Quel che mi chiedo è se posso usare variabili globali o se devo passare parametri. Ad esempio devo passare come parametro l'array che contiene le caselle?
Oppure creo una classe? Quest'ultima mi rendcerebbe il lavoro molto più facile.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili