Перейти к содержанию
Fire Monkey от А до Я
  • 0

TPaintox+Tbitmap


Tot999

Вопрос

Добрый день! 

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

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

MeduzasBitmpAr : array [1..numofMeduzas] of TObjectList<Tbitmap>;

 

Спойлер



//загрузка медуз
  for i := 1 to numofMeduzas do begin
     MeduzasBitmpAr[i]:=  TObjectList<Tbitmap>.create;

      for k := 0 to TImageList(FindComponent('ImageListMedusa'+inttostr(i))).Count-1 do begin
       LoadedBitmap := tbitmap.Create;

       cx:=  settings.standartx* Power(settings.xprop, i);
       cy:=  settings.standarty* Power(settings.yprop, i);

       arectf.Top:= 0 ;
       arectf.left:= 0 ;
       arectf.width:= cx ;
       arectf.height:= cy ;

       LoadedBitmap.Assign(TImageList(FindComponent('ImageListMedusa'+inttostr(i))).Bitmap(arectf.Size,k));

       ResizeBitmap(LoadedBitmap, trunc(cx), trunc(cy));
       MeduzasBitmpAr[i].Add(LoadedBitmap);
      end;
  end;


 

Дальше рисую по таймеру в основном окне игры Tpaintbox.OnPaint:
         

Спойлер

 

 


srcrect.left:= 0  ;
           srcrect.top:= 0  ;
           srcrect.Width:= MeduzasBitmpAr[Creatures[i].level][Creatures[i].AnimationIndex].Width;
           srcrect.height:= MeduzasBitmpAr[Creatures[i].level][Creatures[i].AnimationIndex].height;

           dstrect.left:=Creatures[i].RectF.Location.x-mapdx;
           dstrect.top:= Creatures[i].RectF.Location.y-mapdy;
           dstrect.Width:=Creatures[i].RectF.Width;
           dstrect.height:=Creatures[i].RectF.height;

           bufbitmap.Assign(MeduzasBitmpAr[Creatures[i].level][Creatures[i].AnimationIndex]);

            if ((Creatures[i].angle < 90)and(Creatures[i].angle >= 0)) then begin
               angle:= 180 + Creatures[i].angle;
               end else begin

                  if ((Creatures[i].angle <= 360)and(Creatures[i].angle > 270))  then begin
                    angle:= 180+ Creatures[i].angle;
                  end else begin
                     if (Creatures[i].angle > 90)and(Creatures[i].angle <= 270) then begin
                        bufbitmap.FlipHorizontal;
                       angle:=  Creatures[i].angle;
                     end else begin
                         if (Creatures[i].angle = 90) then begin
                           angle:= 270;
                         end;
                     end;
                  end;
             end;

           PaintBoxMain.BeginUpdate;
           DrawBitmapRotate(PaintBoxMain.Canvas,bufbitmap , srcrect, dstrect, 1 , true, degtorad(angle));
           PaintBoxMain.EndUpdate;


 

В принципе, даже на слабеньких телефончиках, всё вроде бодро. Но может, опытные товарищи чего подскажут, а то я 3ий день в собственном соку варюсь, ничего толкового.

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...