Здравствуйте. Подскажите, пожалуйста, правильно ли я делаю скроллинг фона? Собственно интересует, рационально ли здесь использовать метод DrawBitmap? При этом же прорисовывается вся канва. (И да, помещать картинку на TImage и двигать её я пробовал, так ГОРАЗДО медленнее.) Ведь даже на игровых приставках имелась аппаратная функция скроллинга экрана, реализовано ли это как-то в FMX? Пример я прилагаю, включая exe файл. Как видим, двигается не идеально плавно.
//---------------------------------------------------------------------------
#include <fmx.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;
TBitmap *MapBmImage = new TBitmap;
String InitialDirectory;
float MapVx=150; // скорость по X, пиксели в секунду
float MapOutX=0, MapOutY=0; // координаты левого верхнего угла, с которого выводится фон
float ScreenMapWidth, ScreenMapHeight; // ширина и высота фона на экране
float MapOutXLimit; //крайняя правая точка карты, которая может быть отражена
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
boolean LoadMapFile() //загрузка карты
{
String filename=InitialDirectory+"\\2dbackground_b.png";
if(!FileExists(filename)) return false;
MapBmImage->LoadFromFile(filename);
return true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
InitialDirectory=ExtractFileDir(ParamStr(0)); // the path and file name of the executing program
LoadMapFile();
}
//---------------------------------------------------------------------------
void DrawBackground()
{
TPaintBox *ScreenMap=Form1->PaintBox1; //где отрисовывается карта на экране
TRectF MapRect = TRectF(MapOutX, MapOutY, MapOutX+ScreenMapWidth, MapOutY+ScreenMapHeight);
TRectF ScreenRect = TRectF(0, 0, ScreenMapWidth, ScreenMapHeight);
ScreenMap->Canvas->BeginScene();
ScreenMap->Canvas->DrawBitmap(MapBmImage,MapRect,ScreenRect,255);
ScreenMap->Canvas->EndScene();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
ScreenMapWidth=PaintBox1->Width;
ScreenMapHeight=PaintBox1->Height;
MapOutXLimit=MapBmImage->Width-ScreenMapWidth;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (MapOutX>=MapOutXLimit) MapVx=-1* abs(MapVx);
else if (MapOutX<=0) MapVx=abs(MapVx);
static DWORD LastTick=0; //из-за неравномерного срабатывания таймера
DWORD Tick;
float step;
Tick=GetTickCount();
if(LastTick!=0)
{
step=(float)(Tick-LastTick)/1000; // столько секунд прошло
}
else
{
step=(float)Timer1->Interval/1000;
}
LastTick=Tick;
float dx; //на столько сдвигаем карту по X
dx=MapVx*step;
MapOutX+=dx;
if (MapOutX>MapOutXLimit) MapOutX=MapOutXLimit;
if (MapOutX<0) MapOutX=0;
PaintBox1->Repaint();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1Paint(TObject *Sender, TCanvas *Canvas)
{
DrawBackground();
}
//---------------------------------------------------------------------------
Вопрос
Letos
Здравствуйте. Подскажите, пожалуйста, правильно ли я делаю скроллинг фона? Собственно интересует, рационально ли здесь использовать метод DrawBitmap? При этом же прорисовывается вся канва. (И да, помещать картинку на TImage и двигать её я пробовал, так ГОРАЗДО медленнее.) Ведь даже на игровых приставках имелась аппаратная функция скроллинга экрана, реализовано ли это как-то в FMX? Пример я прилагаю, включая exe файл. Как видим, двигается не идеально плавно.
BackgroundScroll.zip
Ссылка на комментарий
Лучшие авторы в вопросе
6
4
7
33
Популярные дни
5 апр
12
2 март
11
7 апр
9
7 март
9
Лучшие авторы в вопросе
krapotkin 6 постов
#WAMACO 4 постов
Barbanel 7 постов
Letos 33 постов
Популярные дни
5 апр 2019
12 постов
2 март 2019
11 постов
7 апр 2019
9 постов
7 март 2019
9 постов
Популярные посты
Barbanel
Доброго времени. Я не могу вам сказать где именно ошибка (я даже не уверен что она есть), вы пишете я С++, а у меня лишь Delphi под руками. Я скачал ваш проект и запустил ехе. К сож. он не запуст
IVGSoft
Первым делом FMX пытается использовать аппаратное ускорение (DirectX на Windows), при невозможности - GDI+. Посмотрите исходники и увидите на каком канвасе все рисуется.
Letos
Помню, на Спектруме в ассемблере (Z80) была команда HALT, чтобы дождаться обратного хода луча на кинескопе (если успел прорисовать) и тем самым обеспечить плавность. Тут же, в FMX синхронизация с дисп
Изображения в теме
61 ответ на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.