web-dev-qa-db-ja.com

コンソールウィンドウのC ++ピクセル

Code :: Blocks v10.05を使用するC++では、コンソール画面に単一のピクセルを描画するにはどうすればよいですか?これはとても簡単ですか、それとも単に長方形を描くほうが簡単でしょうか?どうやって色を付けるの?申し訳ありませんが、SOF、HF、cplusplus.comからコードを取得できません。画面上のスーパーマリオワールドのフィギュアです。私が思うゲームは16ビットであり、SNESシステム用です。 C :: Bは、C :: B用のSDKが必要だと言っています。 「afxwin.h」が存在しないと表示されます。多分ダウンロード?これは私が作ろうとしていることです:

Image I'm trying to create

14
hCon

それはあなたのOSに依存します。 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など、他のライブラリを使用することもできます。

16
FacundoGFlores

画像をブロック状にしたい場合は、 コンソールコードページ のブロック文字を利用できます。

  • = '\ xDB' = U + 2588 FULL BLOCK
  • = '\ xDC' = U + 2584下半分ブロック
  • = '\ xDF' = U + 2580上半分ブロック
  • と空間

ハーフブロックを カラーテキスト と組み合わせて使用​​すると、80×25のコンソールウィンドウを80×50の16色ディスプレイに変えることができます。 (これは Nibbles のQBasicバージョンで使用されるアプローチでした。)

次に、画像を16色のパレットとかなり小さいサイズに変換するだけです。

Mario in 8 lines and 10 columns of "text"

13
dan04

_windows.h_は、ウィンドウの指定された位置にピクセルを出力する関数SetPixel()を提供します。関数の一般的な形式は次のとおりです。

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

ここで、xとyは表示するピクセルの座標で、colorはピクセルの色です。

重要:Code :: blocks IDEでマシンにピクセルを印刷するには、リンクライブラリ_libgdi32.a_(通常は_MinGW\lib_内にあります)をリンカー設定に追加します。

1
user1481317

Code :: blocksでwindows.hを使用して直線を描画しました。詳細については説明できませんが、code :: blocksでコンパイルするためのコードと手順を提供できます。

  1. 設定メニューに移動し、コンパイラとデバッガを選択します。
  2. リンカータブをクリックし、C:\ Program Files\CodeBlocks\MinGW\libディレクトリにあるリンクライブラリlibgdi32.aを追加します。

このプログラムをコンパイルします

#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プログラミングです ここ

1
Dinesh Subedi

コンソールはテキストデバイスであるため、通常、個々のピクセルに書き込むことはありません。特別なフォントを作成してコンソールのフォントとして選択できますが、単色になります。コンソールUI(Cursesなど)の記述を簡素化するライブラリがありますが、Spriteを表示するだけでなく、ゲームのような機能も考えていると思います。

ゲームを作成する場合は、グラフィックス/ゲームフレームワーク/ライブラリの一部を確認することをお勧めします。 [〜#〜] sdl [〜#〜]

1

CodeBlocksで使用するには、これを見つけました(リンカーオプション-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;
}
0
tripijb tripijb