web-dev-qa-db-fra.com

C++ Pixels In Console Window

En C++, avec Code :: Blocks 10.05, comment dessiner un seul pixel sur l'écran de la console? Est-ce facile, ou serait-il plus facile de dessiner un rectangle? Comment puis-je le colorier? Je suis désolé, mais je ne parviens pas à obtenir le moindre code de la part de SOF, HF ou même de cplusplus.com Ceci est pour une figure de Super Mario World à l'écran. Je pense que le jeu est 16 bits, et est pour le système SNES. C :: B dit que j'ai besoin du SDK pour C :: B. Il dit "afxwin.h" n'existe pas. Télécharger peut-être? C'est ce que j'essaie de faire:

Image I'm trying to create

12
hCon

Cela dépend de votre système d'exploitation. Je suppose que vous programmez sur une plate-forme Windows, vous pouvez donc utiliser SetPixel mais vous devez utiliser "windows.h" pour obtenir un handle de console. Voici donc un exemple pour dessiner la fonction cos ():

#include<windows.h>
#include<iostream>
#include <cmath>

using namespace std;

#define PI 3.14

int main() 
{
    //Get a console handle
    HWND myconsole = GetConsoleWindow();
    //Get a handle to device context
    HDC mydc = GetDC(myconsole);

    int pixel =0;

    //Choose any color
    COLORREF COLOR= RGB(255,255,255); 

    //Draw pixels
    for(double i = 0; i < PI * 4; i += 0.05)
    {
        SetPixel(mydc,pixel,(int)(50+25*cos(i)),COLOR);
        pixel+=1;
    }

    ReleaseDC(myconsole, mydc);
    cin.ignore();
    return 0;
}

Vous pouvez également utiliser d'autres bibliothèques telles que: conio.h allegro.h sdl, etc.

16
FacundoGFlores

Si vous souhaitez que l’image apparaisse en bloc, vous pouvez tirer parti des caractères de blocage de la page de code console .

  • = '\ xDB' = U + 2588 BLOC COMPLET
  • = '\ xDC' = U + 2584 BLOC MOITIÉ INFÉRIEUR
  • = '\ xDF' = U + 2580 BLOC MOITIÉ SUPÉRIEUR
  • et de l'espace

En utilisant les demi-blocs en combinaison avec texte coloré , vous pouvez transformer une fenêtre de console 80 × 25 en un écran 80 × 50 16 couleurs. (C'était l'approche utilisée par la version QBasic de Nibbles .)

Ensuite, il vous suffit de convertir votre image en palette de 16 couleurs et en une taille relativement petite.

Mario in 8 lines and 10 columns of "text"

11
dan04

windows.h fournit une fonction SetPixel() pour imprimer un pixel à l'emplacement spécifié d'une fenêtre. La forme générale de la fonction est

SetPixel(HDC hdc, int x, int y, COLORREF& color);

où, x et y sont les coordonnées du pixel à afficher et la couleur est la couleur du pixel.

Important : pour imprimer le pixel sur votre machine avec Code :: blocks IDE, ajoutez une bibliothèque de liens libgdi32.a (elle se trouve généralement dans MinGW\lib) dans les paramètres de l'éditeur de liens.

1
Bibek Subedi

J'ai tracé la ligne droite en utilisant windows.h dans code :: blocks. Je ne peux pas l'expliquer en détail, mais je peux vous fournir un code et une procédure pour le compiler dans code :: blocks.

  1. allez dans le menu de configuration et sélectionnez le compilateur et le débogueur.
  2. Cliquez sur l'onglet lieur et ajoutez une bibliothèque de liens libgdi32.a située dans le répertoire C:\Program Files\CodeBlocks\MinGW\lib.

Maintenant, compilez ce programme 

#include <windows.h>

#include <cmath>

#define ROUND(a) ((int) (a + 0.5))

/* set window handle */

static HWND sHwnd;

static COLORREF redColor=RGB(255,0,0);

static COLORREF blueColor=RGB(0,0,255);

static COLORREF greenColor=RGB(0,255,0);


void SetWindowHandle(HWND hwnd){

sHwnd=hwnd;

}

/* SetPixel */

void setPixel(int x,int y,COLORREF& color=redColor){

if(sHwnd==NULL){

    MessageBox(NULL,"sHwnd was not initialized !","Error",MB_OK|MB_ICONERROR);

    exit(0);

}

HDC hdc=GetDC(sHwnd);

SetPixel(hdc,x,y,color);

ReleaseDC(sHwnd,hdc);

return;

// NEVERREACH //

}


void drawLineDDA(int xa, int ya, int xb, int yb){

   int dx = xb - xa, dy = yb - ya, steps, k;

   float xIncrement, yIncrement, x = xa, y = ya;

   if(abs(dx) > abs(dy)) steps = abs(dx);

   else steps = abs(dy);

   xIncrement = dx / (float) steps;

   yIncrement = dy / (float) steps;

   setPixel(ROUND(x), ROUND(y));

   for(int k = 0; k < steps; k++){

    x += xIncrement;

    y += yIncrement;

    setPixel(x, y);

 }

}

/* Window Procedure WndProc */

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){

 switch(message){

    case WM_Paint:

        SetWindowHandle(hwnd);

        drawLineDDA(10, 20, 250, 300);

        break;

    case WM_CLOSE: // FAIL THROUGH to call DefWindowProc

        break;

    case WM_DESTROY:

        PostQuitMessage(0);

        return 0;

    default:

    break; // FAIL to call DefWindowProc //

  }

 return DefWindowProc(hwnd,message,wParam,lParam);

}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int      iCmdShow){

static TCHAR szAppName[] = TEXT("Straight Line");

WNDCLASS wndclass;

wndclass.style         = CS_HREDRAW|CS_VREDRAW ;

wndclass.lpfnWndProc   = WndProc ;

wndclass.cbClsExtra    = 0 ;

wndclass.cbWndExtra    = 0 ;

wndclass.hInstance     = hInstance ;

wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;

wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;

wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;

wndclass.lpszMenuName  = NULL ;

wndclass.lpszClassName = szAppName ;

// Register the window //

if(!RegisterClass(&wndclass)){

    MessageBox(NULL,"Registering the class failled","Error",MB_OK|MB_ICONERROR);

    exit(0);

}

// CreateWindow //

HWND hwnd=CreateWindow(szAppName,"DDA - Programming Techniques",

            WS_OVERLAPPEDWINDOW,

             CW_USEDEFAULT,

             CW_USEDEFAULT,

             CW_USEDEFAULT,

             CW_USEDEFAULT,

             NULL,

             NULL,

             hInstance,

             NULL);

if(!hwnd){

    MessageBox(NULL,"Window Creation Failed!","Error",MB_OK);

    exit(0);

  }

  // ShowWindow and UpdateWindow //

  ShowWindow(hwnd,iCmdShow);

 UpdateWindow(hwnd);

 // Message Loop //

 MSG msg;

 while(GetMessage(&msg,NULL,0,0)){

    TranslateMessage(&msg);

    DispatchMessage(&msg);

 }

  /* return no error to the operating system */

  return 0;

}

Dans ce programme, j'ai utilisé l'algorithme de dessin au trait DDA. Les tâches de dessin de pixels sont effectuées par la fonction setPixel (ROUND (x), ROUND (y)) . Il s'agit d'une programmation Windows dont vous pouvez apprendre les détails ici

1
Dinesh Subedi

La console est un périphérique texte, vous ne pouvez donc pas écrire en pixels individuels. Vous pouvez créer une police spéciale et la sélectionner en tant que police pour console, mais elle sera monochromatique. Il existe des bibliothèques qui simplifient l’interface utilisateur de la console d’écriture (par exemple, Curses), mais j’estime que vous avez également davantage de fonctionnalités similaires à celles des gammes en plus du simple affichage d’un Sprite.

si vous voulez écrire un jeu, je vous suggère de jeter un coup d’œil à certains graphiques/frameworks de jeu/libs, par exemple. SDL

1
Zdeslav Vojkovic

Pour l'utiliser dans CodeBlocks, j'ai trouvé ceci (vous devez ajouter une option de l'éditeur de liens -lgdi32): // Code Blocks: Options de construction du projet Paramètres de l'éditeur de liens Autres options de l'éditeur de liens: add -lgdi32

J'ai oublié: vous devez mettre cela avant d'inclure windows.h: #define _WIN32_WINNT 0x0500

Le code de cosinus entier à nouveau. Prêt à compiler

//Code Blocks: Project Build Options Linker settings Othoer linker options: add -lgdi32
#define _WIN32_WINNT 0x0500
#include "windows.h"
#include <iostream>
#include <cmath>
using namespace std;
#define PI 3.14
int main(){
    HWND myconsole = GetConsoleWindow();
    HDC mydc = GetDC(myconsole);
    int pixel =0;
    COLORREF COLOR= RGB(255,255,255);

    //Draw pixels
    for(double i = 0; i < PI * 4; i += 0.05)
    {
        SetPixel(mydc,pixel,(int)(50+25*cos(i)),COLOR);
        pixel+=1;
    }

    ReleaseDC(myconsole, mydc);
    cin.ignore();
    return 0;
}
0
tripijb tripijb