Змінюй хід війни! Допомагай ЗСУ!

Бета тест

  • Автор теми Автор теми StyleT
  • Дата створення Дата створення
Статус: Офлайн
Реєстрація: 11.06.2009
Повідом.: 424
Бета тест

Наваял маленькую игрулю на досуге, и вот в чем проблема: платформа и бомба при перемещении мерцают, при чем на нетбуке с ХР почти не заметно а не компе с семеркой конкретно напрягает. Перемещение осуществляю добавлением числа к значениям координат.
Игра прилагается, протестите плз может это только на моем компе.
ПыСы: писалось на С++
 
Работает Билли.
 
Рекомендую изучить Си, на делфи игры не пишут ;)
По поводу мерцания - мерцает потому что ты неправильно организовал отрисовку. Чтобы не мерцало, всю отрисовку нужно производить в обработчике WM_PAINT. Отрисовка не должна ничего вычислять и анализировать - только рисовать. А чтобы запустить отрисовку после обновления состояния, нужно вызывать Invalidate для окна.
Подобные ошибки очень характерны для дельфистов :)

А вообще для игр лучше рисовать через DirectX - можно использовать DirectDraw, но он устарел, поэтому предпочтительнее Direct3D. Чтобы не мучиться опять-же лучше писать на Си.
 
StyleT, выкладывай не бинарник, а исходники.
 
зачем тебе исходники?? человек попросил только запустить прогу....
На ноуте с хр работает отлично.
 
Рекомендую изучить Си, на делфи игры не пишут ;)

читай внимательнее, я писал в С++, и не мог бы поподробнее рассказать про отрисовку? Пишу в Builder 2009 ссылочка на гайдик приветствуется.

Исходники вот, за кривое написание не бить ибо не успел подправить:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include <time.h>


#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int ms=0, ss=0, mm=0;
int vistrel, vistrelActive=1, levelVistrelov;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        
}
//---------------------------------------------------------------------------


void __fastcall TForm1::TimerTimer(TObject *Sender)
{
//перемещение картинки ТАЙМЕР
		Games->Left=random(411);
		Games->Top=random(200)+10;
		GamesKill->Left=Games->Left;
		GamesKill->Top=Games->Top;
		Timer->Enabled=false;

}
//---------------------------------------------------------------------------


void __fastcall TForm1::StartClick(TObject *Sender)
{
//старт игры
		float fIndex;
		//рандом при старте
		randomize();
		Games->Left=random(300);
		Games->Top=random(192)+10;
		//..
		fIndex=Level->ItemIndex;
		GamesKill->Visible=false;
		Games->Visible=true;
		Games->Enabled=true;
		Table->Visible=true;
		//таймер на 0
		mm=0;
		ms=0;
		ss=0;
		//смена сложности игры
		if (fIndex==0)
		{
		   Timer->Interval=130;
		   PosChange->Interval=1000;
		   levelVistrelov=7;
		}
		else
			if(fIndex==1)
			{
				Timer->Interval=120;
				PosChange->Interval=700;
				levelVistrelov=6;
			}
			else
				if(fIndex==2)
				{
					Timer->Interval=100;
					PosChange->Interval=600;
					levelVistrelov=5;
				}
				else
				{
					Timer->Interval=90;
					PosChange->Interval=500;
					levelVistrelov=3;
				}

		//ShowMessage(fIndex);
		PosChange->Enabled=true;
		Level->Enabled=false;
		Secundomer->Enabled =!(Secundomer->Enabled);
		PoleIgry->Cursor=crCross;
		//деактивируем кнопку старта
		Start->Enabled=false;
		vistrelActive=1;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StopClick(TObject *Sender)
{
//стоп игры
	   //отключаем таймеры
	   Timer->Enabled=false;
	   Secundomer->Enabled=false;
	   PosChange->Enabled=false;
	   FireMove->Enabled=false;
	   Fire->Visible=false;
	   //таймер на 0
	   mm=0;
	   ms=0;
	   ss=0;
	   Time->Caption=IntToStr(mm)+":"+IntToStr(ss)+":"+IntToStr(ms);
	   //невидимость Биллов
	   Games->Visible=false;
	   GamesKill->Visible=false;
	   Level->Enabled=true;
	   Start->Enabled=true;
	   PoleIgry->Cursor=crDefault;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::GamesClick(TObject *Sender)
{
//попадание
		Games->Visible=false;
		GamesKill->Visible=true;
		Secundomer->Enabled=false;
		PosChange->Enabled=false;
		FireMove->Enabled=false;
		Fire->Visible=false;
		Beep();
		ShowMessage("Билли подстрелен!!!\nВаш результат:  "+IntToStr(mm)+":"+IntToStr(ss)+":"+IntToStr(ms));
		Timer->Enabled=false;
		Start->Enabled=true;
		Level->Enabled=true;
		vistrelActive=1;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::GamesMouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{
//прыжок картинки
		Timer->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SecundomerTimer(TObject *Sender)
{
//секундомер
	if(ms<59)
	ms++;
	else
	{
	ms=0;
	if(ss<59)
	ss++;
	else
	{
	ss=0;
	mm++;
	}
	}
	Time->Caption=IntToStr(mm)+":"+IntToStr(ss)+":"+IntToStr(ms);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
//уровень сложности по умолчанию
	Level->ItemIndex=0;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::PosChangeTimer(TObject *Sender)
{
//таймер периодической смены местоположения
	Games->Left=random(300);
	Games->Top=random(214)+10;
	GamesKill->Left=Games->Left;
	GamesKill->Top=Games->Top;
	//выстрел
		if(vistrelActive==1)
		{
			vistrel=random(levelVistrelov);
			if(vistrel==2)
			{
			   vistrelActive=0;
			   Fire->Top=Games->Top + 20;
			   Fire->Left=Games->Left + 10;
			   FireMove->Enabled=true;
			   Fire->Visible=true;
			   vistrelActive=0;
			}
		}//if(vistrelActive==1)
}
//---------------------------------------------------------------------------
//супер аццко быстрый таймер перемещения файрбола и проигрыша
void __fastcall TForm1::FireMoveTimer(TObject *Sender)
{
	 vistrelActive=0;
	 Fire->Top+=4;
	 if(Fire->Top>335&&Fire->Left>=Table->Left&&Fire->Left<=Table->Left+95)
	 {
//проигрыш
		vistrelActive=1;
		//останавливаем таймеры
		FireMove->Enabled=false;
		Timer->Enabled=false;
		Secundomer->Enabled=false;
		PosChange->Enabled=false;
		//таймер на 0
		mm=0;
		ms=0;
		ss=0;
		Time->Caption=IntToStr(mm)+":"+IntToStr(ss)+":"+IntToStr(ms);
		//курсор по дефолту
		PoleIgry->Cursor=crDefault;
		//оповещение
		Games->Enabled=false;
		ShowMessage("Ты проиграл, и теперь Билли захватит мир!");
		//скрываем стол и бомбу и билли
		Fire->Visible=false;
		Table->Visible=false;
		Games->Visible=false;
		//активируем выбор уровня
		Level->Enabled=true;
		Start->Enabled=true;


     }
	 if(Fire->Top>355)
	 {
		 vistrelActive=1;
		 FireMove->Enabled=false;
		 Fire->Visible=false;
	 }
}
//---------------------------------------------------------------------------
//получение координат мыши
void __fastcall TForm1::PoleIgryMouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{
	if(X>408)
	{
		Table->Left=360;
	}
	if(X<54)
	{
		Table->Left=6;
	}
	if(X<408&&X>54)
	{
		Table->Left=X-48;
    }
}
//---------------------------------------------------------------------------

Кто подскажет как малой кровью избавиться от мерцания?
 
читай внимательнее, я писал в С++, и не мог бы поподробнее рассказать про отрисовку? Пишу в Builder 2009

хех, ну это почти тоже самое, я дельфовый код увидел и дальше смотреть не стал :)

По поводу отрисовки - смотри, реализовываешь структуру, которая позволит нарисовать текущее состояние в любой момент времени, в том числе и сколь-угодно много раз повторно.
Изменения этой структуры производишь к примеру по таймеру, ничего рисовать по таймеру не нужно! После каждого изменения вызываешь Invalidate, это приведет к тому что windows вызовет когда нужно отрисовку окна.
Саму отрисовку реализовываешь в обработчике WM_PAINT, не помню как этот метод в BCB называется, если не изменяет память OnFormPaint.

Кто подскажет как малой кровью избавиться от мерцания?

никак, избавиться можно только правильной отрисовкой. Из рекомендаций - постарайся не писать таких громадных методов а-ля "все делаем в обработчике нажатия кнопки", иначе это выставит тебя в дурном свете ;)
 
Останнє редагування:
Семуха 64 - ниче не мерцает.
 
мерцание в этом коде будет всегда, но если комп достаточно быстр, то его будет незаметно. Т.к. изображение достаточно простое, на мощных машинах его отрисовка будет происходить быстрее чем развертка изображения, если увеличить сложность изображения, тогда мерцание и на мощных компах станет видно.

Суть мерцания заключается в том что вначале окно заливается серым цветом, а потом поверх него рисуется картинка. Поэтому на дисплей не всегда будет попадать картинка - если картинка поверх фона еще не успела нарисоваться, то будет попадать серый фон, в результате получится мерцание.
Чтобы этот эффект не наблюдался, рисовать нужно по событию WM_PAINT и использовать двойную буферизацию
 
Кто подскажет как малой кровью избавиться от мерцания?
Попробуй код что то вроде
Код:
Form1.DoubleBuffered:=TRUE;
Может поможет.
 
ТС, не слушай юродивого.
Явление с которым ты столкнулся называется "фликер". Достаточно распростораненное явление, когда в окнах начинают выводить нечто динамическое.
Самое обычной решение - рисуй во внеэкранную битмапу, а ее уже отрисовывай на форме.
DoubleBuffered по идее делает тоже самое.
 
Явление с которым ты столкнулся называется "фликер". Достаточно распростораненное явление, когда в окнах начинают выводить нечто динамическое.

Совершенно верно, это достаточно распространненое явление среди тех кто не имеет опыта работы с графикой. При правильном подходе никаких фликеров не возникает! ;)
 
иди-ка перепиши под свои любимые MFC (mother ****ing classes)

ошибаешься, я сейчас полюбляю .NET Framework, а не MFC ;)
Кстати, по поводу графики, тут уже до этого спрашивали, и я приводил пример реализации игрушки

Самое обычной решение - рисуй во внеэкранную битмапу, а ее уже отрисовывай на форме.
DoubleBuffered по идее делает тоже самое.

сразу видно человека, который с графикой никогда не работал, зато советы раздавать и других критиковать горазд :)
 
Останнє редагування:
ошибаешься, я сейчас полюбляю .NET Framework, а не MFC ;)
хех, ну это почти тоже самое... что и VCL.
вы бы хоть почитали, откуда у .NET ноги растут..

сразу видно человека, который с графикой никогда не работал, зато советы раздавать и других критиковать горазд :)
имеете что-то против off-screen bitmaps?

в проклятом интернете слишком много информации..

Anders Hejlsberg (born December 1960)[2] is a prominent Danish software engineer who co-designed several popular and commercially successful programming languages and development tools. He was the original author of Turbo Pascal, the chief architect of Delphi
...
In 1996, Hejlsberg left Borland and joined archrival Microsoft. One of his first achievements was the J++ programming language and the Windows Foundation Classes; he also became a Microsoft Distinguished Engineer and Technical Fellow. Since 2000, he has been the lead architect of the team developing the C# programming language.
https://en.wikipedia.org/wiki/Anders_Hejlsberg

пи*дец, понаехали из забитых деревень, начитались Фигурнова, нахватались программирования в техникуме
и теперь считают своим долгом награждать нубов собственными измышлениями.
 
Останнє редагування:
хех, ну это почти тоже самое... что и VCL.
вы бы хоть почитали, откуда у .NET ноги растут..

да ну! И каким-же образом у дотнета ноги растут из VCL? Может в делфи тоже IL код используется или хотябы Java байт-код? :D
Может ты считаешь что если ключевые архитекторы ушли из борланда в майкрософт, то они в недрах фреймворка спрятали делфи? :D


имеете что-то против off-screen bitmaps?

я имею против непонимания сути проблемы ;) Двойная буферизация не поможет, если отрисовка будет производиться не из обработчика WM_PAINT.
 
Может в делфи тоже IL код используется
причем легко: https://ru.wikipedia.org/wiki/Delphi_(среда_разработки)#Delphi_for_.NET

Может ты считаешь что если ключевые архитекторы ушли из борланда в майкрософт, то они в недрах фреймворка спрятали делфи?
я считаю, что классы .NET Framework до колик напоминают классы VCL..
а Вы видно считаете, что майкрософт внезапно приучил разработчиков к порядку? )))
ей Богу, поучайте нубов у себя на работе, может быть они не сразу плюнут Вам в лицо.

если отрисовка будет производиться не из обработчика WM_PAINT.
с чего вдруг?
 
поставил форме и GroupBox параметр DoubleBuffered в true. Стало лучше. Как ещё можно поступить чтоб оптимизировать работу, а то не очень хочется разбираться в работе WM_PAINT.
 

ну вообще-то говоря это у Delphi for .NET ноги ростут из дотнета, а не наоборот :)


я считаю, что классы .NET Framework до колик напоминают классы VCL..

X-Windows с соответствующими менеджерами, тоже до колик напоминает MS Windows и что из этого следует что это одно и тоже?


лень рассказывать - попробуй, поймешь ;) Когда пробовать будешь, не забудь еще сверху окошком повозюкать, посмотришь на эффект :)
 
Сменил частоту обновления бомбы, почти не мерцает. Новая версия прилагается

Про WM_PAINT полазив в инете так толком ничего и не понял, как его применять то?
 
Назад
Зверху Знизу