2012-09-11 27 views
11

कोड :: ब्लॉक v10.05 का उपयोग कर सी ++ में, मैं कंसोल स्क्रीन पर एक पिक्सेल कैसे आकर्षित करूं? क्या यह बिल्कुल आसान है, या सिर्फ एक आयताकार बनाना आसान होगा? मैं इसे कैसे रंग करूं? मुझे खेद है, लेकिन मुझे बस काम करने के लिए एसओएफ, एचएफ, या यहां तक ​​कि cplusplus.com से कोई कोड नहीं मिल सकता है। यह स्क्रीन पर एक सुपर मारियो वर्ल्ड आकृति के लिए है। मुझे लगता है कि गेम 16-बिट है, और एसएनईएस सिस्टम के लिए है। सी :: बी का कहना है कि मुझे सी :: बी के लिए एसडीके चाहिए। यह कहता है "afxwin.h" मौजूद नहीं है। शायद डाउनलोड करें? यह है कि मैं क्या करने की कोशिश कर रहा हूँ है:कंसोल विंडो में सी ++ पिक्सेल

Image I'm trying to create

+0

क्या आप उस कोड से लिंक कर सकते हैं जिसे आप काम नहीं कर पाए? – Borgleader

+0

वाह यह मुझे वापस ले जाता है ... लोग इसे डॉस में करते थे। आपको स्मृति में कूदना था जहां चरित्र सेट को संग्रहीत किया गया था और इसे बदल दिया गया था (डीओएस में बस सबकुछ के लिए सामान्य अभ्यास, जिसमें अन्य ग्राफिक्स मोड में वीडियो कार्ड पर बाइट्स लिखना शामिल है), फिर संशोधित वर्णों का उपयोग करके अपने sprites खींचें। जाहिर है आप 256 संभावित उपनिवेशों तक सीमित थे। मुझे नहीं पता कि यह अभी भी विंडोज में क्या होता है। जवाब नहीं दे सकता, क्षमा करें, यह कहने के अलावा कि कंसोल विंडो सिर्फ एक और विंडो है। मुझे आश्चर्य है कि क्या आप इसके WM_PAINT संदेश को हुक कर सकते हैं। – paddy

+0

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

उत्तर

1

कंसोल, एक पाठ डिवाइस है, तो सामान्य रूप में आप अलग-अलग पिक्सेल के लिए नहीं लिखते। आप एक विशेष फ़ॉन्ट बना सकते हैं और इसे कंसोल के लिए फ़ॉन्ट के रूप में चुन सकते हैं, लेकिन यह मोनोक्रोमैटिक होगा। ऐसे पुस्तकालय हैं जो लेखन कंसोल यूआई (उदाहरण के लिए शापित) को सरल बनाते हैं, लेकिन मेरा मानना ​​है कि आपके पास स्प्राइट दिखाने के अलावा दिमाग में अधिक Gamelike कार्यक्षमता भी है।

यदि आप कोई गेम लिखना चाहते हैं, तो मैं सुझाव देता हूं कि कुछ ग्राफिक्स/गेम फ्रेमवर्क/libs, जैसे उदा। SDL

+0

तो क्या मुझे खिड़की में एक स्प्राइट/छवि दिखाना चाहिए? यदि ऐसा है, तो मुझे इसे कैसे करना है? – hCon

+0

क्या आपको इसे करने की ज़रूरत है उदा। स्कूल के लिए, इसलिए सभी पिक्सेल संशोधित कोड स्वयं करना महत्वपूर्ण है, या आप परिणामों में अधिक रुचि रखते हैं? यदि पूर्व, आप किस पर्यावरण का उपयोग करते हैं (विन, लिनक्स, आदि - मुझे लगता है कि विंडोज़, afxwin.h पर आधार)? यदि बाद में, यहां एक ट्यूटोरियल है: http://www.libsdl.org/intro.en/usingvideo.html –

16

यह आपके ओएस पर निर्भर करता है। मैं तुम्हें एक विंडोज मंच में प्रोग्रामिंग कर रहे हैं, इसलिए आप SetPixel उपयोग कर सकते हैं लगता है, लेकिन आप (क्योंकि बैठक के लिए "windows.h" एक उदाहरण का उपयोग करने के लिए एक सांत्वना संभाल पाने के लिए है, तो यहाँ है) समारोह:

#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

सकल: डी लेकिन "समाधान" के लिए +1। ध्यान दें कि आप 'WM_PAINT' को संभालने नहीं देंगे, इसलिए यदि क्षेत्र अमान्य हो जाता है, तो इसे मिटा दिया जाएगा। सामान्य खिड़कियां इस पर दृढ़ता से अनुकूल थीं। – tenfour

+0

कोड :: ब्लॉक त्रुटि: इस समाधान में 'GetConsoleWindow' घोषित नहीं किया गया था। – hCon

+1

@ माइक आपने "windows.h" हेडर शामिल किया है? याद रखें कि आपको इसे माइक्रोसॉफ्ट से प्राप्त करना है। आपको माइक्रोसॉफ्ट एसडीके डाउनलोड करना होगा: http://www.microsoft.com/en-us/download/details.aspx?id=3138 – FacundoGFlores

10

यदि आप छवि को अवरुद्ध दिखाना चाहते हैं, तो आप console code page से ब्लॉक वर्णों का लाभ उठा सकते हैं।

  • = '\ xDB' = U + 2588 पूर्ण ब्लॉक
  • = '\ xDC' = U + 2584 निचले आधे ब्लॉक
  • = '\ xDF' = U + 2580 ऊपरी आधा ब्लॉक
  • और अंतरिक्ष

colored text के साथ संयोजन में आधा ब्लॉक का उपयोग करके आप एक 80 × 50 16 में एक 80 × 25 कंसोल विंडो बंद कर सकते हैं रंगीन प्रदर्शन। (यह Nibbles के क्यूबासिक संस्करण द्वारा उपयोग किया गया दृष्टिकोण था।)

फिर, आपको बस अपनी छवि को 16-रंग पैलेट और एक उचित आकार में बदलने की आवश्यकता है।

Mario in 8 lines and 10 columns of "text"

1

मैं कोड :: ब्लॉकों में windows.h का उपयोग कर सीधी रेखा तैयार की है। मैं इसे विवरण में समझा नहीं सकता, लेकिन मैं आपको कोड :: ब्लॉक में संकलित करने के लिए एक कोड और प्रक्रिया प्रदान कर सकता हूं।

  1. मेनू सेट करने के लिए जाएं और कंपाइलर और डीबगर का चयन करें।
  2. लिंकर टैब पर क्लिक करें और एक लिंक लाइब्रेरी libgdi32.a जोड़ें जो सी: \ प्रोग्राम फ़ाइलें \ 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; 

} 

। पिक्सेल ड्राइंग कार्य सेट पिक्सेल (राउंड (एक्स), राउंड (वाई)) फ़ंक्शन द्वारा किया जाता है। यह विंडोज़ कार्यक्रमों की जो आपको जानकारी here

1

windows.h एक खिड़की के निर्दिष्ट स्थान पर एक पिक्सेल मुद्रित करने के लिए एक समारोह SetPixel() प्रदान करता है सीख सकते हैं। फंक्शन का सामान्य रूप

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

जहां, एक्स और वाई प्रदर्शित होने के लिए पिक्सेल के निर्देशांक हैं और रंग पिक्सेल का रंग है।

महत्वपूर्ण: कोड :: ब्लॉक के साथ अपने मशीन में पिक्सेल मुद्रित करने के लिए आईडीई, एक लिंक लायब्रेरी libgdi32.a (यह MinGW\lib अंदर आमतौर पर है) लिंकर की स्थापना में जोड़ें।

0

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