studio programacion móviles libros libro desarrollo desarrollar curso aprende aplicaciones c++ console codeblocks pixels

c++ - móviles - manual de programacion android pdf



C++ Pixels en la ventana de la consola (6)

La consola es un dispositivo de texto, por lo que, en general, no escribe en píxeles individuales. Puede crear una fuente especial y seleccionarla como fuente para la consola, pero será monocromática. Hay bibliotecas que simplifican la escritura de la interfaz de usuario de la consola (por ejemplo, Curses), pero creo que también tienes más funciones de juego en mente además de solo mostrar un sprite.

si quieres escribir un juego, te sugiero echar un vistazo a algunos de los gráficos / framework / libs del juego, por ejemplo, SDL

En C ++ usando Code :: Blocks v10.05, ¿cómo dibujo un solo píxel en la pantalla de la consola? ¿Es esto fácil en absoluto, o sería más fácil dibujar un rectángulo? ¿Cómo lo coloreo? Lo siento, pero simplemente no puedo obtener ningún código de SOF, HF o incluso cplusplus.com para trabajar. Esto es para una figura de Super Mario World en la pantalla. El juego creo que es de 16 bits, y es para el sistema SNES. C :: B dice que necesito SDK para C :: B. Dice que "afxwin.h" no existe. Descargar tal vez? Esto es lo que estoy tratando de hacer:


Dibujé la línea recta usando windows.h en code :: blocks. No puedo explicarlo en detalle, pero puedo proporcionarle un código y un procedimiento para compilarlo en code :: blocks.

  1. ve al menú de configuración y selecciona el compilador y el depurador.
  2. Haga clic en la pestaña del enlazador y agregue una biblioteca de enlaces libgdi32.a que se encuentra en el directorio C: / Archivos de programa / CodeBlocks / MinGW / lib.

Ahora compila este programa

#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; }

En este programa, he usado el algoritmo de dibujo de líneas DDA. Las tareas de dibujo de píxeles se realizan mediante la función setPixel (ROUND (x), ROUND (y)). Esta es la programación de Windows que puede aprender detalles aquí


windows.h proporciona una función SetPixel() para imprimir un píxel en la ubicación especificada de una ventana. La forma general de la función es

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

donde, xey son las coordenadas del píxel que se mostrarán y el color es el color del píxel.

Importante : para imprimir el píxel en su máquina con Code :: blocks IDE, agregue una biblioteca de enlaces libgdi32.a (generalmente está dentro de MinGW/lib ) en la configuración del enlazador.


Depende de tu sistema operativo. Supongo que estás programando en una plataforma de Windows, por lo tanto puedes usar SetPixel pero tienes que usar "windows.h" para obtener un manejador de consola, así que aquí un ejemplo para dibujar la función 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; }

También puede usar otras bibliotecas como: conio.h allegro.h sdl, etc.


Para usar en CodeBlocks encontré esto (tienes que agregar una opción del enlazador -lgdi32): // Bloques de código: Opciones de compilación del proyecto Configuraciones del enlazador Opciones del enlazador de Othoer: agrega -lgdi32

Lo olvidé: tienes que poner esto antes de incluir windows.h: #define _WIN32_WINNT 0x0500

El código entero del coseno otra vez. Listo para compilar

//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; }


Si está dispuesto a que la imagen se vea como un bloque, podría aprovechar los caracteres de bloque de la página de códigos de la consola .

  • = ''/ xDB'' = U + 2588 BLOQUE COMPLETO
  • = ''/ XDC'' = U + 2584 BLOQUE BAJO MEDIO
  • = ''/ xDF'' = U + 2580 BLOQUE SUPERIOR MEDIO
  • y espacio

Al usar los medios bloques en combinación con texto en color , puede convertir una ventana de consola de 80 × 25 en una pantalla de 16 colores de 80 × 50. (Este fue el enfoque utilizado por la versión QBasic de Nibbles ).

Luego, solo necesita convertir su imagen a la paleta de 16 colores y un tamaño razonablemente pequeño.