С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Rvach_01
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 32
#1

Движущийся человечек в консоли - C++

18.04.2014, 22:58. Просмотров 1368. Ответов 17
Метки нет (Все метки)

Доброго времени суток, уважаемые форумчане. Начал работать с графикой (Visual C++), постепенно изучаю и наткнулся на интересную программу. Движущийся человечек в консоли. Не могли бы вы прокомментировать код? Поскольку он содержит сведения о линиях, окружностях, пере и прочих атрибутах графики. Заранее благодарю.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <Windows.h>
 
void Circle(HWND hW, int xCenter, int yCenter, int radius, COLORREF borderColor, COLORREF fillColor)
{
    HDC hDC = GetDC(hW);
    HPEN hPen = CreatePen(PS_SOLID, 1, borderColor);
    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
    HBRUSH hBrush = CreateSolidBrush(fillColor);
    HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
 
    Ellipse(hDC, xCenter - radius, yCenter - radius, xCenter + radius, yCenter + radius);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    SelectObject(hDC, hOldBrush);
    DeleteObject(hBrush);
    ReleaseDC(hW, hDC);
}
 
void Line(HWND hW, int x0, int y0, int x1, int y1, COLORREF color)
{
    HDC hDC = GetDC(hW);
    HPEN hPen = CreatePen(PS_SOLID, 2, color);
    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
 
    POINT p = { 0, 0 };
    GetCurrentPositionEx(hDC, &p);
    MoveToEx(hDC, x0, y0, &p);
    LineTo(hDC, x1, y1);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    ReleaseDC(hW, hDC);
}
 
void Picture(HWND hW, int dx, int dy, int mode)
{
    COLORREF border = RGB(255, 255, 0), fill = RGB(127, 127, 0), line = RGB(0, 255, 0), black = RGB(0, 0, 0);
    if (!mode)
        border = fill = line = black;
    int x0 = 50, y0 = 50, r = 10;
 
    Circle(hW, x0 + dx, y0 + dy, r, border, fill);
    Line(hW, x0 + dx, y0 + dy + r, x0 + dx, y0 + dy + r + 30, line);
    Line(hW, x0 + dx, y0 + dy + r + 30, x0 + dx - 10, y0 + dy + r + 70, line);
    Line(hW, x0 + dx, y0 + dy + r + 30, x0 + dx + 10, y0 + dy + r + 70, line);
    Line(hW, x0 + dx - 5, y0 + dy + r + 7, x0 + dx + 5, y0 + dy + r + 2, line);
    Line(hW, x0 + dx - 5, y0 + dy + r + 7, x0 + dx - 10, y0 + dy + r + 25, line);
    Line(hW, x0 + dx + 5, y0 + dy + r + 2, x0 + dx + 10, y0 + dy + r + 20, line);
}
 
 
int main()
{
    HWND hW = GetConsoleWindow();
    int step = -1;
    Sleep(1000);
 
    for (;; ++step)
    {
        Picture(hW, 5 * step, 0, 1);
        Sleep(200);
        Picture(hW, 5 * step, 0, 0);
        if (step > 100)
            step = -10;
    }
 
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2014, 22:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Движущийся человечек в консоли (C++):

Вывести в окне фигуры: домик, человечек, солнце - C++
Используя различные фигуры (точка, линия, эллипс, круг, прямоугольник и др.) вывести в окне фигуры: домик, человечек, солнце. Фигуры должны...

Клавиши F1-F12 в консоли, и работа с мышкой в консоли - C++
Я искал на сайте, но не нашел упоминания о том как обрабатывать и или узнавать где находится курсор мышки (и еще мне надо бы узнать нажатие...

считывание с консоли ( не с клавы, а именно с консоли) - C++
нужно написать функцию которая возвращает string в котором написано 500 символов которые были выведены в консоли от начала. среда :...

Реализовать движущийся графический объект с помощью статических и динамических объектов - C++
Добрый день. Решаю задачу из методички и поставлена она следующим образом: используя технологию объектно-ориентированного...

Как с использованием графических средств C++ сделать "движущийся самолёт"? - C++
Есть программный код этого &quot;самолёта&quot; (написан на dev-C++). Нужно изменить код так, чтобы он правильно передвигался в пространстве. Также...

Движущийся человечек.Анимация - C++ Builder
Движущийся человечек.Анимация

17
nmcf
5695 / 5006 / 1710
Регистрация: 14.04.2014
Сообщений: 20,443
18.04.2014, 22:59 #2
Что комментировать-то? Открой справочник по функциям WinAPI, там они все описаны.
0
Rvach_01
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 32
19.04.2014, 00:11  [ТС] #3
Ладно, приблизительно начал разбираться
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "stdafx.h"
#include <windows.h>
#include <iostream>
 
 
int main(int argc, char **argv, HWND hW)
{
    using namespace std;
 
 
 
    //hwnd - дескриптор окна, в которое будем рисовать
    HDC hdc = 0;
    HDC hDC = GetDC(hW);
 
    //hdc - дескриптор контекста устройства
    HPEN hWhitePen, hOldPen;
    HBRUSH hWhiteBrush, hOldBrush;
 
    hWhitePen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
    hWhiteBrush = CreateSolidBrush(RGB(255, 255, 255));
 
    POINT p = { 0, 0 };
    // нарисовать белый квадрат
    hOldPen = (HPEN)SelectObject(hdc, hWhitePen);
    MoveToEx(hdc, 10, 10, &p);
    LineTo(hdc, 100, 10);
    LineTo(hdc, 100, 100);
    LineTo(hdc, 10, 100);
    LineTo(hdc, 10, 10);
 
 
    // нарисовать белую окружность
    SelectObject(hdc, hWhitePen);
    hOldBrush = (HBRUSH)SelectObject(hdc, hWhiteBrush);
    Ellipse(hdc, 10, 10, 100, 100);
 
    system("pause>0");
}
Почему только в консоли ничего не рисуется?
0
IrineK
Заблокирован
19.04.2014, 06:40 #4
Цитата Сообщение от Rvach_01 Посмотреть сообщение
Почему только в консоли ничего не рисуется?
Верхняя строка в main должна быть:

C++
1
HWND hW = GetConsoleWindow();
0
Rvach_01
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 32
19.04.2014, 15:50  [ТС] #5
Спасибо, конечно.. Но у меня всё равно ничего не рисует.. Я уже три дня пытаюсь написать программу, которая просто рисует линию. В Visual C++. Просто линию. Из точки в точку. Однако я никак не могу найти работающей программы, что не программа - то ошибка.. Какие-то классы, структуры.. Мне нужна просто функция, рисующая отрезок из координаты в координату, я никак не могу разобраться .. Что нужно прописывать в начале программы, как нужно использовать LineToEx() (или LineTo() ) и MoveTo(), а также как нужно заканчивать программу.. Я уже перечитал кучу самоучителей и форумов, везде либо большие программы без комментариев, либо программы с кучей ошибок, которые отказывается компилировать Visual..
0
zss
Модератор
Эксперт С++
6580 / 6142 / 2024
Регистрация: 18.12.2011
Сообщений: 16,014
Завершенные тесты: 1
19.04.2014, 16:24 #6
Приведите текст, который получился.
0
IrineK
Заблокирован
19.04.2014, 16:26 #7
Rvach_01,
По-вашему получается, что картинка в блоге - это фейк?
И человечек не то что не двигается, а даже не возникает?
Даже если копипастите код?
0
Rvach_01
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 32
19.04.2014, 16:33  [ТС] #8
В программе с белыми квадратом и окружностью - компилирование завершается, открывается консоль с курсором и ожидание нажатия клавиши, после которого консоль закрывается. Всё. То есть пустая консоль

Добавлено через 1 минуту
А вот человечек возникает и двигается! Это красивое зрелище! Но я никак не могу разбить эту прогу на части - линии, окружность, движение...

Добавлено через 4 минуты
Вот пример программы, компилирующейся, с советами, прочитанными на разных форумах по устранению ошибок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "stdafx.h"
#include <windows.h>
#include <iostream>
 
using namespace std;
 
int main(int argc, char **argv)
{
    HWND hW = GetConsoleWindow();
 
    //hwnd - дескриптор окна, в которое будем рисовать
    HDC hdc = 0;
    HDC hDC = GetDC(hW);
 
    //hdc - дескриптор контекста устройства
    HPEN hWhitePen, hOldPen;
    HBRUSH hWhiteBrush, hOldBrush;
 
    hWhitePen = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
    hWhiteBrush = CreateSolidBrush(RGB(255, 255, 255));
 
    POINT p = { 0, 0 };
    // нарисовать белый квадрат
    hOldPen = (HPEN)SelectObject(hdc, hWhitePen);
    MoveToEx(hdc, 10, 10, &p);
    LineTo(hdc, 100, 10);
    LineTo(hdc, 100, 100);
    LineTo(hdc, 10, 100);
    LineTo(hdc, 10, 10);
 
    // нарисовать белую окружность
    SelectObject(hdc, hWhitePen);
    hOldBrush = (HBRUSH)SelectObject(hdc, hWhiteBrush);
    Ellipse(hdc, 10, 10, 100, 100);
 
    system("pause>0");
}
Добавлено через 1 минуту
Ни в коем случае, не копипаст кода, просто в той теме, которую именно Вы мне посоветовали, не было комментов, поэтому я спросил тут, не судите строго и прошу прощения, если я сделал ужасную вещь
0
IrineK
Заблокирован
19.04.2014, 17:00 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <Windows.h>
#include <iostream>
 
void Circle(HWND hW, int xCenter, int yCenter, int radius, COLORREF borderColor, COLORREF fillColor)
{
    HDC hDC = GetDC(hW);
    HPEN hPen = CreatePen(PS_SOLID, 1, borderColor);
    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
    HBRUSH hBrush = CreateSolidBrush(fillColor);
    HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
 
    Ellipse(hDC, xCenter - radius, yCenter - radius, xCenter + radius, yCenter + radius);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    SelectObject(hDC, hOldBrush);
    DeleteObject(hBrush);
    ReleaseDC(hW, hDC);
}
 
void Line(HWND hW, int x0, int y0, int x1, int y1, COLORREF color)
{
    HDC hDC = GetDC(hW);
    HPEN hPen = CreatePen(PS_SOLID, 2, color);
    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
 
    POINT p = { 0, 0 };
    GetCurrentPositionEx(hDC, &p);
    MoveToEx(hDC, x0, y0, &p);
    LineTo(hDC, x1, y1);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    ReleaseDC(hW, hDC);
}
 
int main()
{   HWND hW = GetConsoleWindow();
 
//линия 
    Line(hW, 100, 100, 200, 200, RGB(255,255,255));
//окружность
    Circle (hW, 350, 50, 100, RGB(255,0,0), RGB (127,0,0));
    
 
    std::cin.get();
    return 0;
}
Добавлено через 1 минуту
Не трогайте функции, просто оставьте их наверху.

В main "заказывайте" свои линии и круги.
1
zss
Модератор
Эксперт С++
6580 / 6142 / 2024
Регистрация: 18.12.2011
Сообщений: 16,014
Завершенные тесты: 1
19.04.2014, 17:37 #10
Цитата Сообщение от Rvach_01 Посмотреть сообщение
HDC hdc = 0;
HDC hDC = GetDC(hW);
Зачем два разных HDC?
Это основная ошибка.
И в конце рисования ресурсы надо освобождать,
см. пример IrineK
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.04.2014, 18:46 #11
есть древняя книга, в первом томе которой вся эта кухня с контекстами, окнами, перьями и прочими GDI объектами не плохо описана:
Программирование для Windows 95 (том 1,2)
Год выпуска: 1997
Автор: Чарльз Петзольд
Издательство: BHV - Санкт-Петербург
ISBN: 5-469-00005-2
0
IrineK
19.04.2014, 18:59
  #12

Не по теме:

Цитата Сообщение от DU Посмотреть сообщение
есть древняя книга
У меня оба тома, с дискеткой.

0
Rvach_01
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 32
20.04.2014, 01:23  [ТС] #13
IrineK, спасибо Вам большое! Попытаюсь разобраться, спасибо Вам!

Добавлено через 3 часа 4 минуты
Можно ещё вопрос?
Мне бы после рисунка очистить консоль, чтобы нарисовать ещё. system("cls"); почему-то не помогает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <stdlib.h>
#include <conio.h>
 
using namespace std;
 
void Circle(HWND hW, int xCenter, int yCenter, int radius, COLORREF borderColor, COLORREF fillColor)
{
    HDC hDC = GetDC(hW);
    HPEN hPen = CreatePen(PS_SOLID, 1, borderColor);
    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
    HBRUSH hBrush = CreateSolidBrush(fillColor);
    HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
 
    Ellipse(hDC, xCenter - radius, yCenter - radius, xCenter + radius, yCenter + radius);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    SelectObject(hDC, hOldBrush);
    DeleteObject(hBrush);
    ReleaseDC(hW, hDC);
}
 
void Line(HWND hW, int x0, int y0, int x1, int y1, COLORREF color)
{
    HDC hDC = GetDC(hW);
    HPEN hPen = CreatePen(PS_SOLID, 2, color);
    HPEN hOldPen = (HPEN)SelectObject(hDC, hPen);
 
    POINT p = { 0, 0 };
    GetCurrentPositionEx(hDC, &p);
    MoveToEx(hDC, x0, y0, &p);
    LineTo(hDC, x1, y1);
 
    SelectObject(hDC, hOldPen);
    DeleteObject(hPen);
    ReleaseDC(hW, hDC);
}
 
int main()
{
    HWND hW = GetConsoleWindow();
 
    Line(hW, 200, 10, 300, 10, RGB(5, 123, 217));                   //линия верхняя горизонтальная
    Line(hW, 250, 10, 250, 40, RGB(5, 123, 217));                   //линия средняя вертикальная
    Line(hW, 150, 40, 350, 40, RGB(5, 123, 217));                   //линия средняя горизонтальная
    Line(hW, 150, 40, 150, 130, RGB(5, 123, 217));                  //линия 
    Circle(hW, 150, 165, 35, RGB(5, 123, 217), RGB(100, 0, 0));     //окружность слева
    Line(hW, 350, 40, 350, 130, RGB(5, 123, 217));                  //линия 
    Circle(hW, 350, 165, 35, RGB(5, 123, 217), RGB(127, 0, 0));     //окружность справа
 
    system("pause>0");
    system("cls");
    Circle(hW, 250, 360, 10, RGB(255, 255, 0), RGB(255, 255, 0));
 
    system("pause>0");
    return 0;
}
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.04.2014, 01:45 #14
попробуйте так:
C++
1
2
3
4
...
//system("cls");
InvalidateRect(hW, NULL, true);
...
Хотя что-то после этого не рисуется ничего. можно попробовать черный закрашенный прямоугольник нарисовать.
0
Rvach_01
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 32
20.04.2014, 01:55  [ТС] #15
А мне необходимо после очистки консоли сделать рисунок Вот и ищу теперь
0
20.04.2014, 01:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.04.2014, 01:55
Привет! Вот еще темы с ответами:

Бедный человечек - C++ Builder
Всем привет! Возможно всем, известное приложение &quot;Человечек-мазохист&quot; в котором пользователь мышкой по экрану швыряет человечка и у него...

Задача (человечек) - Java SE
Всем добрый вечер. Необходима помощь в решении задачи. Суть такая: человечек - '|', дорога - '_'. Т.о., получается следующий массив: char...

Анимация, человечек - Pascal
Программа человек , нужно сделать программу чтоб мы могли управлять человеком с помощью стрелок.

Человечек, выполняющий приседания - Turbo Pascal
В рисованных мультфильмах иллюзия движения создается последовательной сменой кадров, каждый из которых фиксирует очередное положение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.