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

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

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

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

23.02.2014, 18:48. Просмотров 1253. Ответов 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); // Печать кубика
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2014, 18:48     Консольная "графика", игра "Тетрис". Фигуры перестают прорисовываться на определенном этапе
Посмотрите здесь:
Консольная игра "Сапер" C++
Консольная игра "3 в ряд" C++
C++ Вставить пробел после каждого символа "." "," "!" или "?", если за этими символами не следует пробел
Наследование: "БГТУ", "Факультет", "Группа", "Подгруппа" C++
Написать функцию поиска человека по полю "фамилия" в массиве структур "Note" ("Персональная информация") C++
C++ В массиве структур студент с полями "ИМЯ" "ВОЗРАСТ" "УСПЕВАЕМОСТЬ" выполнить сортировку по успеваемости по возрастанию
C++ С++ консольное приложение win32, матерится на первое "pow" после "if", а на "system" говорит что неопределён.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,050
Записей в блоге: 3
Завершенные тесты: 1
23.02.2014, 18:52     Консольная "графика", игра "Тетрис". Фигуры перестают прорисовываться на определенном этапе #2
Освобождайте ресурсы после того как они Вам стали не нужны, иначе происходит утечка ресурсов GDI
A_V
0 / 0 / 0
Регистрация: 23.02.2014
Сообщений: 5
23.02.2014, 18:57  [ТС]     Консольная "графика", игра "Тетрис". Фигуры перестают прорисовываться на определенном этапе #3
К сожалению я не знаю как и где это делается.
Croessmah
Модератор
Эксперт CЭксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,050
Записей в блоге: 3
Завершенные тесты: 1
24.02.2014, 09:21     Консольная "графика", игра "Тетрис". Фигуры перестают прорисовываться на определенном этапе #4
DeleteObject function
ReleaseDC function
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);
Croessmah
Модератор
Эксперт CЭксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,050
Записей в блоге: 3
Завершенные тесты: 1
24.02.2014, 19:04     Консольная "графика", игра "Тетрис". Фигуры перестают прорисовываться на определенном этапе #6
C++
1
ReleaseDC(hWnd,hDC);//когда контекст более не нужен
и не надо второй раз цеплять перо BlackPen(строка 16)
A_V
0 / 0 / 0
Регистрация: 23.02.2014
Сообщений: 5
24.02.2014, 19:39  [ТС]     Консольная "графика", игра "Тетрис". Фигуры перестают прорисовываться на определенном этапе #7
Не заметил повторный выбор. Спасибо.
Как быть если ругается на hWnd в ReleaseDC(hWnd,hDC)?
Croessmah
Модератор
Эксперт CЭксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,050
Записей в блоге: 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);
Но вообще то желательно все операции проверять на успешность.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2014, 21:30     Консольная "графика", игра "Тетрис". Фигуры перестают прорисовываться на определенном этапе
Еще ссылки по теме:
После каждого знака препинания (".", ",", ";") вставить в строку пробел, если там его нет C++
C++ Необработанное исключение в "0x01082855" в "sort.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc"
Необработанное исключение в "0x775e15de" в "laba3.exe": 0xC0000005: Нарушение прав доступа при чтении "0xfdfdfdf9". C++
Даны три слова - "мама", "мыла", "раму". Задача - напечатать всевозможные варианты построения слов C++
C++ Необработанное исключение в "0x013f2b22" в "123.exe": 0xC0000005: Нарушение прав доступа при записи "0xfdfdfdfd"

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

Или воспользуйтесь поиском по форуму:
A_V
0 / 0 / 0
Регистрация: 23.02.2014
Сообщений: 5
24.02.2014, 21:30  [ТС]     Консольная "графика", игра "Тетрис". Фигуры перестают прорисовываться на определенном этапе #9
Спасибо! Все работает!
Yandex
Объявления
24.02.2014, 21:30     Консольная "графика", игра "Тетрис". Фигуры перестают прорисовываться на определенном этапе
Ответ Создать тему
Опции темы

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