2012-09-11 135 views
11

在使用Code :: Blocks v10.05的C++中,如何在控制台屏幕上绘制单个像素?这很简单吗?还是仅仅画一个矩形会更容易?我如何为它着色?我很抱歉,但我无法从SOF,HF甚至cplusplus.com获取任何代码来工作。这是在屏幕上的超级马里奥世界的数字。我认为这款游戏是16位的,并且适用于SNES系统。 C :: B说我需要SDK for C :: B。它说“afxwin.h”不存在。也许下载?这就是我想要做:控制台窗口中的C++像素

Image I'm trying to create

+0

你能链接到你无法工作的代码吗? – Borgleader

+0

哇,这需要我回来......人们过去在DOS中这样做。你必须跳到存储字符集的内存中并对其进行修改(在DOS中几乎所有的常见操作,包括在其他图形模式下将字节写入视频卡),然后使用修改后的字符绘制你的精灵。显然你受限于256个可能的子图像。我不知道这是否仍然在Windows中发生。无法给出答案,对不起,除了说控制台窗口只是另一个窗口。我想知道你是否可以挂钩它的WM_PAINT消息。 – paddy

+0

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

回答

1

控制台是一个文本设备,所以一般你不写单个像素。您可以创建一个特殊的字体并将其选为控制台的字体,但它会是单色的。有些库可以简化编写控制台UI(例如Curses),但是我相信除了只显示一个精灵之外,你还会有更多类似于游戏的功能。

如果你想写游戏,我建议看看一些图形/游戏框架/库,例如, SDL

+0

所以我应该在窗口中显示一个精灵/图像?如果是这样,我该怎么做? – hCon

+0

你需要做什么,例如对于学校来说,自己做所有像素修改代码非常重要,或者您对结果更感兴趣?如果是前者,你使用的是什么环境(Win,Linux等 - 我猜Windows是基于afxwin.h)? 如果是后者,下面是一个教程:http://www.libsdl.org/intro.en/usingvideo.html –

16

这取决于您的操作系统。我想你是编程在Windows平台上,因此你可以使用SetPixel,但你必须使用“WINDOWS.H”得到一个控制台手柄,所以这里的例子绘制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; 
} 

您还可以使用其他一些库,例如:conio.h allegro.h sdl等。

+0

Gross:D但是,对于“解决方案”而言,+1。请注意,您不会处理'WM_PAINT',因此如果区域无效,它将被删除。正常的窗户强烈希望超过这个。 – tenfour

+0

代码::块错误:'GetConsoleWindow'未在此解决方案中声明。 – hCon

+1

@Mike是否包含“windows.h”头文件?记住你必须从微软获得它。您必须下载微软SDK:http://www.microsoft.com/en-us/download/details.aspx?id=3138 – FacundoGFlores

10

如果您愿意使图像显得块状,可以利用console code page中的块字符。

  • = '\ XDB'= U + 2588 FULL BLOCK
  • = '\ XDC'= U + 2584下半部BLOCK
  • = '\ XDF'= U + 2580上半部BLOCK
  • 和空间

通过组合使用半块与colored text,可以把一个80 × 25控制台窗口到80 × 50 16彩色显示。 (这是QBasic版本Nibbles使用的方法。)

然后,您只需要将图像转换为16色调色板和合理的小尺寸。

Mario in 8 lines and 10 columns of "text"

1

我画中的代码::块使用WINDOWS.H直线。我无法详细解释它,但我可以为您提供一个代码和过程,以便在code :: blocks中进行编译。

  1. 转到设置菜单并选择编译器和调试器。
  2. 单击链接器选项卡并添加链接库libgdi32.a,该链接库位于C:\ Program Files \ CodeBlocks \ MinGW \ lib目录中。

现在编译这个程序

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

} 

在这个节目,我已经使用DDA画线算法。像素绘图任务由setPixel(ROUND(x),ROUND(y))函数完成。 这是windows编程,你可以学习的细节here

1

windows.h提供了一个功能SetPixel()在窗口的指定位置打印像素。函数的一般形式是

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

其中,x和y是要显示的像素的坐标,color是像素的颜色。

重要:与代码::块打印像素机器IDE,添加一个链接库libgdi32.a(通常是内部MinGW\lib)的连接设置。

0

要在代码块,我发现这个使用(你必须添加一个连接器选项-lgdi32): //代码块:项目编译选项链接设置Othoer连接选项:添加-lgdi32

我忘了:你有在包含windows.h之前加上这个:#define _WIN32_WINNT 0x0500

整个余弦码再次出现。准备编译

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