Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

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

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

Консольная "графика", игра "Тетрис". Фигуры перестают прорисовываться на определенном этапе - C++

23.02.2014, 18:48. Просмотров 1285. Ответов 8
Метки нет (Все метки)

Доброго времени!
Написал на днях тетрис (в консоле) с использованием, кажется это называется WinApi.

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

Все классно работает до определенного момента, где то на 7 - 9 фигуре отрисовка отваливается и фигура становится неподвижной и не дорисованной, но программа продолжает работать, переменные меняются, на отладке все нормально. Может как нибудь освобождать память или еще что после каждой отрисовки?

вот "графический" фрагмент программы.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void printpos(int x, int y, bool key)
{
    HDC hdc = GetDC(GetConsoleWindow());
    HPEN BlackPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 0));
    HPEN  DelPen = CreatePen(PS_SOLID, 2, RGB(59, 68, 75));
    HPEN  DelPen = CreatePen(PS_SOLID, 2, RGB(242,243,244));
    HBRUSH hBrush1, hBrush2, hBrush3;
    hBrush1 = CreateSolidBrush(RGB(59, 68, 75));
    hBrush2 = CreateSolidBrush(RGB(254, 111, 94));
    hBrush3 = CreateSolidBrush(RGB(0, 168, 107));
 
    switch (key)
    {
    case 1: SelectObject(hdc, BlackPen); SelectObject(hdc, hBrush2);  break;
    case 0: SelectObject(hdc, DelPen); SelectObject(hdc, hBrush1); break;
    }
    Rectangle(hdc, x + 260, y + 10, x + 278, y + 28); // Печать кубика
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2014, 18:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Консольная "графика", игра "Тетрис". Фигуры перестают прорисовываться на определенном этапе (C++):

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс "вентилятор" содержащий в себе классы:...

Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата" - C++
определить тип данных запись имеющий поля фамилия пол зарплата. определить массив из 10 записей. в программе ввести в массив данные и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
23.02.2014, 18:52 #2
Освобождайте ресурсы после того как они Вам стали не нужны, иначе происходит утечка ресурсов GDI
0
A_V
0 / 0 / 0
Регистрация: 23.02.2014
Сообщений: 5
23.02.2014, 18:57  [ТС] #3
К сожалению я не знаю как и где это делается.
0
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
24.02.2014, 09:21 #4
DeleteObject function
ReleaseDC function
0
A_V
0 / 0 / 0
Регистрация: 23.02.2014
Сообщений: 5
24.02.2014, 18:20  [ТС] #5
Теперь отваливается на 20-21 фигуре, прогресс на лицо)
Кисть так же удаляется вместе с ручкой?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void printpos(int x, int y, bool key)
{
    HDC hDC = GetDC(GetConsoleWindow());
    int color;
    switch (key)
    {
    case 1: 
        color = 0;
        break;
    case 0:     
        color = 255;
        break;
    }
    HPEN BlackPen = CreatePen(PS_SOLID, 2, RGB(color, color, color));
    HPEN hOldPen = (HPEN) SelectObject(hDC, BlackPen); 
    SelectObject(hDC, BlackPen);
    Rectangle(hDC, x + 260, y + 10, x + 278, y + 28);
    SelectObject(hDC, hOldPen); 
    DeleteObject(BlackPen);
0
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
24.02.2014, 19:04 #6
C++
1
ReleaseDC(hWnd,hDC);//когда контекст более не нужен
и не надо второй раз цеплять перо BlackPen(строка 16)
0
A_V
0 / 0 / 0
Регистрация: 23.02.2014
Сообщений: 5
24.02.2014, 19:39  [ТС] #7
Не заметил повторный выбор. Спасибо.
Как быть если ругается на hWnd в ReleaseDC(hWnd,hDC)?
0
Croessmah
Эксперт CЭксперт С++
13237 / 7509 / 847
Регистрация: 27.09.2012
Сообщений: 18,448
Записей в блоге: 3
Завершенные тесты: 1
24.02.2014, 20:45 #8
Цитата Сообщение от A_V Посмотреть сообщение
Как быть если ругается на hWnd в ReleaseDC(hWnd,hDC)?
это:
C++
1
HDC hDC = GetDC(GetConsoleWindow());
меняем на это:
C++
1
2
HWND hWnd = GetConsoleWindow() ;
HDC hDC = GetDC(hWnd);
Но вообще то желательно все операции проверять на успешность.
0
A_V
0 / 0 / 0
Регистрация: 23.02.2014
Сообщений: 5
24.02.2014, 21:30  [ТС] #9
Спасибо! Все работает!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2014, 21:30
Привет! Вот еще темы с ответами:

Создать иерархию классов "Фирма", "Бухгалтер", "Сотрудник", "Зарплата" - C++
Само по себе понятие "зарплата" не особенно конкретное: оно включает и почасовую, и ставочную зарплату, и комиссионные, и процент с продаж....

Структура «Преподаватель» с полями "ФИО", "стаж", "категория", "нагрузка" - C++
Функция - расчёт зарплаты по нагрузке и оплате часа для определенной категории. Категория Оплата часа Вторая 150 Первая 200 ...

Реализовать структуру "Анкета" с полями "Фамилия", "Пол" и "Адрес" - C++
Здравствуйте. Проходим тему Структуры, не могу понять, как определить количество, само задание: #include <iostream> #include...

по строкам.замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно - C++
замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно Добавлено через 21 час 4 минуты неужели никто не знает...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.02.2014, 21:30
Ответ Создать тему
Опции темы

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