C ++ Pixels In Console Window

В C ++, используя Code :: Blocks v10.05, как нарисовать один пиксель на экране консоли? Это вообще легко или просто нарисовать прямоугольник? Как мне это покрасить? Извините, но я просто не могу заставить работать какой-либо код с SOF, HF или даже cplusplus.com. Это для фигуры Супер Марио на экране. Я думаю, что игра 16-битная и предназначена для системы SNES. C :: B говорит, что мне нужен SDK для C :: B. Там написано, что «afxwin.h» не существует. Скачать возможно? Вот что я пытаюсь сделать:

Изображение я'm trying to create

12

Решение

Это зависит от вашей ОС. Я полагаю, вы программируете на платформе 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

Другие решения

Если вы хотите, чтобы изображение выглядело блочным, вы можете воспользоваться блочными символами из кодовая страница консоли.

  • = ‘\ xDB’ = U + 2588 ПОЛНЫЙ БЛОК
  • = ‘\ xDC’ = U + 2584 НИЖНЯЯ ПОЛОВИНА БЛОКА
  • = ‘\ xDF’ = U + 2580 ВЕРХНЯЯ ПОЛОВИНА БЛОКА
  • и пространство

Используя полублоки в сочетании с цветной текст, Вы можете превратить консольное окно 80 × 25 в 16-цветной дисплей 80 × 50. (Этот подход использовался версией QBasic Nibbles.)

Затем вам просто нужно конвертировать изображение в 16-цветную палитру и достаточно маленький размер.

Марио в 8 строк и 10 столбцах «текста»

11

Консоль — это текстовое устройство, поэтому обычно вы не пишете в отдельные пиксели. Вы можете создать специальный шрифт и выбрать его в качестве шрифта для консоли, но он будет монохромным. Существуют библиотеки, которые упрощают написание консольного пользовательского интерфейса (например, Curses), но я считаю, что вы также имеете в виду больше игровой функциональности, помимо простого показа спрайта.

если вы хотите написать игру, я предлагаю взглянуть на некоторые графические / игровые рамки / библиотеки, например, SDL

1

Я нарисовал прямую линию, используя windows.h в code :: blocks. Я не могу объяснить это в деталях, но я могу предоставить вам код и процедуру для его компиляции в 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-программирование, которое вы можете узнать подробнее Вот

1

windows.h обеспечивает функцию SetPixel() распечатать пиксель в указанном месте окна. Общая форма функции

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

где x и y — это координаты пикселя, который нужно отобразить, а color — это цвет пикселя.

Важный: чтобы распечатать пиксель на вашем компьютере с IDE Code :: blocks, добавьте библиотеку ссылок libgdi32.a (обычно внутри MinGW\lib ) в настройке компоновщика.

1

Для использования в CodeBlocks я нашел это (вы должны добавить опцию компоновщика -lgdi32):
// Блоки кода: параметры компоновки проекта Параметры компоновщика Другие параметры компоновщика: add -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
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector