Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 23.02.2014
Сообщений: 5
1

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

23.02.2014, 18:48. Просмотров 2238. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2014, 18:48
Ответы с готовыми решениями:

"Тетрис": как создать конец игры? Игра не заканчивается и фигуры появляются друг над другом
#include <SFML/Graphics.hpp> #include <time.h> using namespace sf; const int M = 20; const...

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

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов), которые разделяются...

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

8
Грамотный. Безпорно.
16790 / 9686 / 1869
Регистрация: 27.09.2012
Сообщений: 24,045
Записей в блоге: 2
23.02.2014, 18:52 2
Освобождайте ресурсы после того как они Вам стали не нужны, иначе происходит утечка ресурсов GDI
0
0 / 0 / 0
Регистрация: 23.02.2014
Сообщений: 5
23.02.2014, 18:57  [ТС] 3
К сожалению я не знаю как и где это делается.
0
Грамотный. Безпорно.
16790 / 9686 / 1869
Регистрация: 27.09.2012
Сообщений: 24,045
Записей в блоге: 2
24.02.2014, 09:21 4
DeleteObject function
ReleaseDC function
0
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
Грамотный. Безпорно.
16790 / 9686 / 1869
Регистрация: 27.09.2012
Сообщений: 24,045
Записей в блоге: 2
24.02.2014, 19:04 6
C++
1
ReleaseDC(hWnd,hDC);//когда контекст более не нужен
и не надо второй раз цеплять перо BlackPen(строка 16)
0
0 / 0 / 0
Регистрация: 23.02.2014
Сообщений: 5
24.02.2014, 19:39  [ТС] 7
Не заметил повторный выбор. Спасибо.
Как быть если ругается на hWnd в ReleaseDC(hWnd,hDC)?
0
Грамотный. Безпорно.
16790 / 9686 / 1869
Регистрация: 27.09.2012
Сообщений: 24,045
Записей в блоге: 2
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
0 / 0 / 0
Регистрация: 23.02.2014
Сообщений: 5
24.02.2014, 21:30  [ТС] 9
Спасибо! Все работает!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2014, 21:30

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

Консольная игра "Андроид случайно потерялся в консоле windows"
В архив добавил исходник и exe файл! Кто скажет чего не хватает. Что можно добавить или отнять?


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

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

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