Перейти к содержанию
Fire Monkey от А до Я
  • 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
Ссылка на комментарий
  • Ответы 61
  • Создана
  • Последний ответ

Лучшие авторы в вопросе

Рекомендуемые сообщения

  • 0
13 часов назад, krapotkin сказал:

Я все равно не понимаю суть проблемы.

Суть проблемы в том, что в показанном  примере изображение двигается не плавно. (Если у вас не установлен C++, чуть выше я выкладывал скомпилированный exe)

Изменено пользователем Letos
Ссылка на комментарий
  • 0
2 часа назад, Letos сказал:

Суть проблемы в том, что в показанном  примере изображение двигается не плавно. (Если у вас не установлен C++, чуть выше я выкладывал скомпилированный exe)

Проблема не в графике а в таймере. В аттачменте exe с вашей картинкой собранный на FMX без таймера, мне кажется вполне плавно все.

imgscroll.zip

Ссылка на комментарий
  • 0
10 минут назад, asviridenkov сказал:

Проблема не в графике а в таймере. В аттачменте exe с вашей картинкой собранный на FMX без таймера, мне кажется вполне плавно все.

imgscroll.zip 3 \u041c\u0411 · 0 downloads

Да, вот тут в самом деле плавно. У меня так не получается.

Ссылка на комментарий
  • 0
21 минуту назад, asviridenkov сказал:

Проблема не в графике а в таймере. В аттачменте exe с вашей картинкой собранный на FMX без таймера, мне кажется вполне плавно все.

 

исходник можете скинуть?

Ссылка на комментарий
  • 0
16 минут назад, Letos сказал:

исходник можете скинуть?

Исходник вам не поможет, т.к. выглядит вот так

 

<style>
 div {position: absolute; width: 800px; height: 500px; overflow: hidden}
 img {position: absolute; left: 0px; transition: all 5s linear;}
 img:hover {left: -1300px}
</style>
<div>
<img src="2dbackground_b.png">
</div>

Но основной смысл в том что управляет анимацией не таймер а отдельный поток, хотя отрисовка естественно идет в основном.

Ссылка на комментарий
  • 0
1 минуту назад, Letos сказал:

Почему исходник дать не можете?

Я же дал исходник, там кроме приведенного кода больше ничего нет, только Htпанель на форме. Могу приложить проект, но у вас не скомпилится, т.к. используется сторонняя библиотека, просто так быстрее было проверить. Но вся отрисовка идет через FMX канвас.

Ссылка на комментарий
  • 0
11 минут назад, asviridenkov сказал:

Я же дал исходник, там кроме приведенного кода больше ничего нет, только Htпанель на форме. Могу приложить проект, но у вас не скомпилится, т.к. используется сторонняя библиотека, просто так быстрее было проверить. Но вся отрисовка идет через FMX канвас.

А можете так сделать? - покажете-таки исходник, но без применения сторонних средств. Вопрос-то ведь был в рамках стандартных средств.

Ссылка на комментарий
  • 0
9 часов назад, Letos сказал:

А можете так сделать? - покажете-таки исходник, но без применения сторонних средств. Вопрос-то ведь был в рамках стандартных средств.

Зачем? Отрисовка и так идет стандартными средствами, принцип я описал, то что он работает - показал. А писать сотню строк чтобы дать вам готовый результат, мне как-то лень.

Ссылка на комментарий
  • 0
18 часов назад, Letos сказал:

А можете так сделать? - покажете-таки исходник, но без применения сторонних средств. Вопрос-то ведь был в рамках стандартных средств.

начиная с Tokyo, BitMap стали потокобезопасными, поэтому формируйте их в доп.потоке, а выводите в основном, через синхронизацию и будет Вам счастье!

тоже делал так, все очень плавно и быстро. (исходники тяжело вытащить, т.к. выдергивать надо из проекта, но там все просто)

Ссылка на комментарий
  • 0
В 02.03.2019 в 18:22, Barbanel сказал:

Дался вам этот аппаратный скроллинг!!!

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

FM не игровая платформа и не использует фичи для приставок лохматых годов. Да и не будет, в силу своей архитектуры.

Забудьте о этом и живите дальше. Перепишите приложение либо разберитесь с тем что у вас происходит в момент фризов.

PS не защищаю никоим образом, просто неправильно ожидать от этой платформы того, для чего она не предназначена.

Полностью поддерживаю

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

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