Как повернуть bmp картинку на n градусов (wingraph) - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Собственно как повернуть bmp картинку на n градусов (wingraph) в free pascal?

Решение задачи: «Как повернуть bmp картинку на n градусов (wingraph)»

textual
Листинг программы
uses windows,wingraph,wincrt,math;
 
type hero=record
        x,y,speed,maxspeed,incspeed,redspeed:real;
        ugol,povorot:integer;
        bp:animattype;  
        matr:array of array of DWord;      
     end;
     camera=record
        x,y:real;
     end;
     map_record=record
        size_x,size_y:integer;
     end;     
var
   map
:map_record;
   cam
:camera;
   h
:hero;
   mode,drive,
   i,j
:integer;
   tank1
:animattype;
 
procedure loadbmp;
var f:file;
    size:longint;
    go:pointer;
begin
   assign(f,'sprites\tank1.bmp');
   reset(f,1);
   size:=filesize(f);
   getmem(go,size);
   blockread(f,go^,size);
   close(f);
   putimage(1,1,go^,normalput);
   getanim(1,1,135,164,getrgbcolor(0,0,0),tank1);
end;
 
procedure obrabotka_hero;
   
   procedure hero_move; 
   var r,a:real;  
       s, c:extended;
   begin 
      
      if (getkeystate(ord('W')) and $8000 > 0) then 
      begin
         h.y:=h.y-h.speed;
         if h.speed<=h.maxspeed-h.incspeed then  h.speed:=h.speed+h.incspeed
                                           else  h.speed:=h.maxspeed;
         if (h.y>=getmaxy / 2) and (h.y<=map.size_y-getmaxy / 2) then cam.y:=cam.y-h.speed;
      end;
      
      if (getkeystate(ord('S')) and $8000 > 0) then 
      begin
         h.y:=h.y+h.speed;
         if h.speed<=h.maxspeed-h.incspeed then  h.speed:=h.speed+h.incspeed
                                           else  h.speed:=h.maxspeed;
         if (h.y>=getmaxy / 2) and (h.y<=map.size_y-getmaxy / 2) then cam.y:=cam.y+h.speed;
      end;
      if (getkeystate(ord('A')) and $8000 > 0) then 
      begin
         h.ugol:=h.ugol+h.povorot;         
         a := (pi*(h.ugol))/180; // угол поворота в радианах  
         setactivepage(1);
         putanim(1,1,tank1,transput);
         for i := 1 to 135 do       
            for j := 1 to 164 do
            begin               
               r := sqrt(sqr(i - 67.5) + sqr(j - 82));
               SinCos(a + arctan2((j - 82), (i - 67.5)), s, c);
               h.matr[i,j] := GetPixel(round(67.5 + r * c), round(82 + r * s));
            end;             
         for i := 1 to 135 do       
            for j := 1 to 164 do
               PutPixel(i+500,j+500,h.matr[i,j]);
         getanim(500+1,500+1,500+135,500+164,getrgbcolor(0,0,0),h.bp);
         
      end;
      
      if not (getkeystate(ord('W')) and $8000 > 0) and 
         not (getkeystate(ord('S')) and $8000 > 0) then 
         begin
            if h.speed>=h.redspeed then h.speed:=h.speed-h.redspeed
                                   else h.speed:=0;
         end;
      setactivepage(0);
   end;
   
begin
   hero_move;
end;
 
procedure obrabotka;
begin
   obrabotka_hero;
end;
 
procedure otrisovka;
var cam_x,cam_y:real;
   
   procedure inform;
   var s:string;
   begin      
      settextstyle(51,0,30);
      setcolor(getrgbcolor(255,255,255));
      str(h.speed:0:4,s);
      outtextxy(20,20,'Speed: '+s);
      str(h.x:0:4,s);
      outtextxy(20,50,'X: '+s);
      str(h.y:0:4,s);
      outtextxy(20,80,'Y: '+s); 
      str(h.ugol,s);
      outtextxy(20,110,'Ugol: '+s);     
      str(cam.x:0:4,s);
      outtextxy(200,50,'CAM X: '+s);
      str(cam.y:0:4,s);
      outtextxy(200,80,'CAM Y: '+s); 
   end;
   
begin
   updategraph(updateoff);
   cleardevice;
   //
   cam_x:=-(cam.x - getmaxx / 2);
   cam_y:=-(cam.y - getmaxy / 2);
   //
   setfillstyle(1,getrgbcolor(180,80,0));
   bar(0,0,getmaxx,getmaxy);
   //
   setcolor(getrgbcolor(0,255,0));
   for i:=1 to map.size_x div 200 +1  do
      line((i-1)*200+round(cam_x),0+round(cam_y),(i-1)*200+round(cam_x),map.size_y+round(cam_y));
   for i:=1 to map.size_y div 200 +1  do
      line(0+round(cam_x),(i-1)*200+round(cam_y),map.size_x+round(cam_x),(i-1)*200+round(cam_y));
   //
   inform;
   //
   putanim(round(h.x)+round(cam_x),round(h.y+round(cam_y)),h.bp,transput); 
   updategraph(updatenow); 
end;
 
begin
   //
   drive:=nopalette;
   mode:=mfullscr;
   initgraph(drive,mode,'Tanks');
   //
   loadbmp;
   //
   h.x:=500;
   h.y:=500;
   h.maxspeed:=3;
   h.speed:=0;
   h.incspeed:=0.01;
   h.redspeed:=0.02;
   h.bp:=tank1;
   h.ugol:=0;
   h.povorot:=1;
   SetLength(h.matr,135*2,164*2);
     ///
   cam.x:=getmaxx / 2;
   cam.y:=getmaxy / 2; 
     ///
   map.size_x:=1920*3;
   map.size_y:=1080*3;
   //
   repeat       
      delay(10);
      otrisovka;
      obrabotka;
   until mode<-1000;
   //
   closegraph;
end.

Объяснение кода листинга программы

  1. Установка начальных значений переменных:
    • h.x, h.y, h.maxspeed, h.speed, h.incspeed, h.redspeed устанавливаются в нужные значения.
    • h.bp, h.ugol, h.povorot устанавливаются в начальные значения.
    • cam.x, cam.y устанавливаются в центр экрана.
    • map.size_x, map.size_y устанавливаются в размер карты.
  2. Загрузка BMP изображения:
    • assign(f, 'sprites\tank1.bmp');
    • reset(f, 1);
    • size := filesize(f);
    • getmem(go, size);
    • blockread(f, go^, size);
    • close(f);
    • putimage(1, 1, go^, normalput);
    • getanim(1, 1, 135, 164, getrgbcolor(0, 0, 0), h.bp);
  3. Основной цикл игры:
    • repeat
      • delay(10);
      • otrisovka;
      • obrabotka;
    • until mode <- 1000;
  4. Процедура obrabotka_hero:
    • hero_move;
  5. Процедура hero_move:
    • if (getkeystate(ord('W')) and $8000 > 0) then
      • begin
      • if h.speed <= h.maxspeed - h.incspeed then
        • begin
        • h.speed := h.speed + h.incspeed;
        • if (h.y >= getmaxy / 2) and (h.y <= map.size_y - getmaxy / 2) then
          • begin
          • cam.y := cam.y - h.speed;
          • end;
        • end;
      • end;
      • if (getkeystate(ord('S')) and $8000 > 0) then
        • begin
        • if h.speed <= h.maxspeed - h.incspeed then
          • begin
          • h.speed := h.speed + h.incspeed;
          • if (h.y >= getmaxy / 2) and (h.y <= map.size_y - getmaxy / 2) then
            • begin
            • cam.y := cam.y + h.speed; \endcode

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы