С++ пикселей в окне консоли
В С++ с использованием Code:: Blocks v10.05 как рисовать один пиксель на экране консоли? Легко ли это, или было бы проще просто нарисовать прямоугольник? Как его покрасить? Извините, но я просто не могу получить код из SOF, HF или даже cplusplus.com для работы. Это для фигуры Super Mario World на экране. Игра, я думаю, 16-бит, и для системы SNES. C:: B говорит, что мне нужен SDK для C:: B. В нем говорится, что "afxwin.h" не существует. Скачать, может быть? Это то, что я пытаюсь сделать:
![Image I'm trying to create]()
Ответы
Ответ 1
Это зависит от вашей ОС. Я предполагаю, что вы программируете на платформе 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 и т.д.
Ответ 2
Если вы хотите, чтобы изображение выглядело нечетким, вы могли бы воспользоваться символами блока из кодовой страницы консоли.
-
█
= '\ xDB' = U + 2588 FULL BLOCK
-
▄
= '\ xDC' = U + 2584 LOWER HALF BLOCK
-
▀
= '\ xDF' = U + 2580 UPPER HALF BLOCK
- и пробел
Используя полублоки в сочетании с цветным текстом, вы можете превратить консольное окно 80 и times; 25 в 80-кратное и 50-цветное 16-цветные дисплеи. (Это был подход, используемый QBasic-версией Nibbles.)
Затем вам просто нужно преобразовать изображение в 16-цветную палитру и достаточно маленький размер.
![Mario in 8 lines and 10 columns of "text"]()
Ответ 3
Консоль - это текстовое устройство, поэтому, как правило, вы не записываете отдельные пиксели. Вы можете создать специальный шрифт и выбрать его как шрифт для консоли, но он будет монохроматическим. Существуют библиотеки, которые упрощают создание пользовательского интерфейса консоли управления (например, Curses), но я считаю, что у вас также есть более функциональная функциональность, а просто показывается спрайт.
Если вы хотите написать игру, я предлагаю взглянуть на некоторые из графических/игровых фреймворков /libs, например. SDL
Ответ 4
Я нарисовал прямую линию, используя windows.h в code:: blocks. Я не могу объяснить это подробно, но я могу предоставить вам код и процедуру для его компиляции в code:: blocks.
- перейдите в меню настроек и выберите компилятор и отладчик.
- Перейдите на вкладку компоновщика и добавьте библиотеку ссылок 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, в которой вы можете узнать подробности здесь
Ответ 5
windows.h
предоставляет функцию SetPixel()
для печати пикселя в указанном месте окна. Общий вид функции
SetPixel(HDC hdc, int x, int y, COLORREF& color);
где, x и y - координаты пикселя для отображения, а цвет - цвет пикселя.
Важно. Чтобы напечатать пиксель на вашем компьютере с помощью Code:: blocks IDE, добавьте библиотеку ссылок libgdi32.a
(обычно внутри MinGW\lib
) в настройках компоновщика.
Ответ 6
Для использования в CodeBlocks я нашел это (вы должны добавить опцию компоновщика -lgdi32):
// Блоки кода: параметры сборки проекта Параметры компоновщика Опции компоновщика Othoer: 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;
}