2012-09-11 28 views
11

En C++ usando Code :: Blocks v10.05, ¿cómo dibujo un único 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:C++ Pixels In Console Window

Image I'm trying to create

+0

¿Se puede vincular al código que no se pudo obtener para trabajar? – Borgleader

+0

Wow, esto me lleva de vuelta ... La gente solía hacer esto en DOS. Debes saltar a la memoria donde se almacenó el conjunto de caracteres y modificarlo (práctica común para casi todo en DOS, incluyendo escribir bytes en la tarjeta de video en otros modos gráficos), luego dibuja tus sprites usando los caracteres modificados. Obviamente, usted estaba obligado a 256 posibles subimágenes. No sé si esto sigue siendo lo que sucede en Windows. No puedo dar una respuesta, lo siento, excepto para decir que la ventana de la consola es solo otra ventana. Me pregunto si puedes conectar su mensaje WM_PAINT. – paddy

+0

http://stackoverflow.com/questions/4576019/c-drawing-pixels-question – hCon

Respuesta

1

consola es un dispositivo de texto, lo que en general no se escribe a 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 frameworks de juegos/libs, por ej. SDL

+0

¿Debo mostrar un sprite/imagen en la ventana? Si es así, ¿cómo lo hago? – hCon

+0

¿Necesita hacerlo, p. para la escuela, entonces ¿es importante que hagas todo el código de modificación de píxel tú mismo, o estás más interesado en los resultados? si es anterior, ¿qué entorno usa (Win, Linux, etc., creo que Windows, basado en afxwin.h)? si es el último, aquí hay un tutorial: http://www.libsdl.org/intro.en/usingvideo.html –

16

Depende de su sistema operativo. Supongo que está programando en una plataforma Windows, por lo tanto, se puede utilizar SetPixel pero hay que usar "windows.h" para obtener un identificador de la consola, así que aquí un ejemplo para la elaboración de los cos() Función:

#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.

+0

Bruto: D pero +1 para una "solución". Tenga en cuenta que no manejará 'WM_PAINT', por lo que si la región deja de ser válida, se borrará. Ventanas normales fuertemente favorecidas por esto. – tenfour

+0

Código :: Error de bloques: 'GetConsoleWindow' no se declaró en esta solución. – hCon

+1

@Mike ¿ha incluido el encabezado "windows.h"? Recuerde que debe obtenerlo de Microsoft. Debe descargar microsoft sdk: http://www.microsoft.com/en-us/download/details.aspx?id=3138 – FacundoGFlores

10

Si desea que la imagen se vea como un bloque, puede aprovechar los caracteres de bloque del console code page.

  • = '\ xDB' = U + 2588 COMPLETO DEL BLOQUE
  • = '\ xDC' = U + 2584 la mitad inferior BLOQUE
  • = '\ xdf' BLOQUE = U + 2580 la mitad superior
  • y el espacio

mediante el uso de las medias bloques en combinación con colored text, puede activar una ventana de 80 × 25 de la consola en un 80 × 50 16 -pantalla a color. (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.

Mario in 8 lines and 10 columns of "text"

1

he dibujado 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: \ Program Files \ 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 que he utilizado la línea DDA algoritmo de dibujo. Las tareas de dibujo de píxeles se realizan mediante la función setPixel (ROUND (x), ROUND (y)). Esta es la programación de ventanas que se pueden conocer los detalles here

1

windows.h proporciona una función de 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, x e y son coordenadas de pixel a la pantalla y el color es el color de pixel.

Importante: para imprimir el píxel de la máquina con Code :: Blocks IDE, añadir una librería de enlace libgdi32.a (por lo general dentro de MinGW\lib) en la configuración de enlace.

0

Para utilizar en CodeBlocks he encontrado este (hay que añadir una opción de vinculador -lgdi32): // bloques de código: Proyecto de opciones de creación configuración del vinculador Othoer opciones de vinculador: añadir -lgdi32

me olvidaba: Usted tiene para poner esto antes de incluir windows.h: #define _WIN32_WINNT 0x0500

Todo el código del coseno nuevamente. 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; 
}