• 0
Letos

Скроллинг на канве

Вопросы

Здравствуйте. Подскажите, пожалуйста, правильно ли я делаю скроллинг фона? Собственно интересует, рационально ли здесь использовать метод 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();
}
//---------------------------------------------------------------------------


BackgroundScroll.zip

Изменено пользователем Letos

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

27 ответов на этот вопрос

  • 0

Не смотрел в код, просто пришло это в голову.
Сори.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
5 часов назад, Barbanel сказал:

Может использоваться GDI (это из другой области) либо ЦПУ.

Первым делом FMX пытается использовать аппаратное ускорение (DirectX на Windows), при невозможности - GDI+.

Посмотрите исходники и увидите на каком канвасе все рисуется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу