Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2010, 17:19   #1
Alexcomeback
Пользователь
 
Регистрация: 03.04.2009
Сообщений: 59
По умолчанию Анимация c использованием GDI

Здравствуйте уважаемые программисты!
Недавно взялся за написание небольшой игры, причём делаю это с использованием средств GDI.
В процессе создания возникли следующие вопросы: 1)как можно буферезировать ещё не отрисованные элементы, с целью последующего вывода в поле, дабы избежать эффект "мерцания"? Например, пользователь нажал клавишу вниз - в окне должна отрисоваться линия, однако прорисовка должна осуществляться из буфера. Возможно ли это?
2)Хотел бы спросить насчёт правильности организации функции, отвечающей за вывод графики:
Код:
void Graphic(..., wparam GameComand) {
    //Отрисовка статических элементов
    ....
    ....
    switch(GameComand) { 
   //Динамические элементы, в зависимости от поступаемых комманд
                                   }
Логична ли структура функции? Или же стоит создать отдельные функции для разных элементов графики (статич. и динамических)
Кто имеет опыт создания игр, подскажите пожалуйста.
Заранее благодарю
Alexcomeback вне форума Ответить с цитированием
Старый 08.04.2010, 13:29   #2
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Вообще, самый фундаментальный и "правильный" способ избавиться от мерцания раз и навсегда - использовать графический ускоритель. Тем более, если занимаешься играми - по мере усложнения программы мерцание будет всё сильнее.

На сколько я знаю, раньше мерцания избегали, перерисовывая только те пиксели, которые должны измениться. Но определение этих пикселей - задача сама по себе непростая.

По поводу организации функции - это зависит от размера игры. Если она планируется расширяться до N тысяч строк, то лучше заранее вложить в код возможность расширения. Но без самого кода перед глазами точнее посоветовать не смогу.
ds.Dante вне форума Ответить с цитированием
Старый 10.04.2010, 21:48   #3
Alexcomeback
Пользователь
 
Регистрация: 03.04.2009
Сообщений: 59
По умолчанию

Цитата:
Сообщение от ds.Dante Посмотреть сообщение
По поводу организации функции - это зависит от размера игры. Если она планируется расширяться до N тысяч строк, то лучше заранее вложить в код возможность расширения. Но без самого кода перед глазами точнее посоветовать не смогу.
Игра совсем небольшая, по уровню сопоставимая с обычным тетрисом (пишу в учебных целях).

Код:
//Здесь происходит отрисовка графических элементов сцены.

#include <windows.h>
#include "GBDefines.h"

//-------------------------------------------------------
//Функция для отрисовки графических элементов
void GraphEngine (HDC MainDC, HWND hwnd, WPARAM GameCom) {

	// Положение руки по оси Х
	static int x=10;

	//Прорисовка статических элементов сцены:
	
	//Дескриптор пера статич. изображений
	HPEN hPenForStatic;
	//Дескриптор пера динамич. изображений
	HPEN hPenForDynamic;

	//Определение параметров пера
	hPenForStatic = CreatePen(PS_SOLID, 4, RGB(70,30,90));
	//Рисование элементов

	SelectObject(MainDC, hPenForStatic);
        //И так далее
	//И много кода тут=)
	
	//Прорисовка динамических элементов сцены:
	switch (GameCom) {
						case VK_DOWN : { //Много кода
									 }

	//Высвобождаем контекст устройства 
	ReleaseDC(hwnd, MainDC);

	return;	

}

//--------------------------------------------------------
//Функция для отрисовки текстовой информации
void TextEngine (HDC MainDC, HWND hwnd, LPCWSTR VString) {
	
	//Статические текстовые элементы сцены:

	//Переменная для хранения координаты бегущего текста
	static float i=0;
        //Цвет текста
	SetTextColor(MainDC, RGB(100,180,200));
	//ВЫвод бегущей строки
	TextOut(MainDC, i, 5, VString, wcslen(VString));

	//Освобождаем контекст устройства
	ReleaseDC(hwnd, MainDC);
	//Проверка, ушёл ли текст за границы
	if (i!=520.0) i+=0.01; else i=1;

	return;
}
Разумеется, код не весь, но идея я думаю в общих чертах понятна.

Последний раз редактировалось Alexcomeback; 10.04.2010 в 21:51.
Alexcomeback вне форума Ответить с цитированием
Старый 12.04.2010, 12:05   #4
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Если игра правда небольшая, и если две функции всегда вызываются одна за другой, я бы объединил эти функции.

Хотя тут однозначности быть не может - нужно хорошо предвидеть будующее развитие проекта, а также выбор зависит от личного опыта и характера программиста.
ds.Dante вне форума Ответить с цитированием
Старый 16.04.2010, 22:53   #5
Alexcomeback
Пользователь
 
Регистрация: 03.04.2009
Сообщений: 59
По умолчанию

Личного опыта почти нет, характер... А он влияет на программы?))
Спасибо за совет, буду думать, решать.
Alexcomeback вне форума Ответить с цитированием
Старый 16.04.2010, 23:10   #6
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Я бы тоже всё в одну загнал. Если программа простая, то дробить смысла особенного не вижу.
Что не понравилось в ваших функциях - они получают hDC снаружи (это либо контекст устройства, либо контекст в памяти [т.н. совместимый констекст]). А внутри делают ему Release. Как по мне, так это неправильно. Если вы передаёте в функцию контекст из вне, то и освобождайте его тоже вне функции.
По поводу мерцания - попробуйте рисовать всё на битмар. А после того, как отрисовали всю сцену в этот битмап, BitBlt его на контекст device.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С# : GDI+ TextBox Natok Помощь студентам 2 17.05.2009 19:53
GDI EdNovice Win Api 4 12.02.2008 09:14
литература GDI+ studenth Win Api 3 16.10.2007 17:11
GDI plus API delphi_coder Win Api 1 28.09.2007 12:41