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

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

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

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

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

textual
Листинг программы
  1. uses windows,wingraph,wincrt,math;
  2.  
  3. type hero=record
  4.         x,y,speed,maxspeed,incspeed,redspeed:real;
  5.         ugol,povorot:integer;
  6.         bp:animattype;  
  7.         matr:array of array of DWord;      
  8.      end;
  9.      camera=record
  10.         x,y:real;
  11.      end;
  12.      map_record=record
  13.         size_x,size_y:integer;
  14.      end;    
  15. var
  16.    map
  17. :map_record;
  18.    cam
  19. :camera;
  20.    h
  21. :hero;
  22.    mode,drive,
  23.    i,j
  24. :integer;
  25.    tank1
  26. :animattype;
  27.  
  28. procedure loadbmp;
  29. var f:file;
  30.     size:longint;
  31.     go:pointer;
  32. begin
  33.    assign(f,'sprites\tank1.bmp');
  34.    reset(f,1);
  35.    size:=filesize(f);
  36.    getmem(go,size);
  37.    blockread(f,go^,size);
  38.    close(f);
  39.    putimage(1,1,go^,normalput);
  40.    getanim(1,1,135,164,getrgbcolor(0,0,0),tank1);
  41. end;
  42.  
  43. procedure obrabotka_hero;
  44.    
  45.    procedure hero_move;
  46.    var r,a:real;  
  47.        s, c:extended;
  48.    begin
  49.      
  50.       if (getkeystate(ord('W')) and $8000 > 0) then
  51.       begin
  52.          h.y:=h.y-h.speed;
  53.          if h.speed<=h.maxspeed-h.incspeed then  h.speed:=h.speed+h.incspeed
  54.                                            else  h.speed:=h.maxspeed;
  55.          if (h.y>=getmaxy / 2) and (h.y<=map.size_y-getmaxy / 2) then cam.y:=cam.y-h.speed;
  56.       end;
  57.      
  58.       if (getkeystate(ord('S')) and $8000 > 0) then
  59.       begin
  60.          h.y:=h.y+h.speed;
  61.          if h.speed<=h.maxspeed-h.incspeed then  h.speed:=h.speed+h.incspeed
  62.                                            else  h.speed:=h.maxspeed;
  63.          if (h.y>=getmaxy / 2) and (h.y<=map.size_y-getmaxy / 2) then cam.y:=cam.y+h.speed;
  64.       end;
  65.       if (getkeystate(ord('A')) and $8000 > 0) then
  66.       begin
  67.          h.ugol:=h.ugol+h.povorot;        
  68.          a := (pi*(h.ugol))/180; // угол поворота в радианах  
  69.          setactivepage(1);
  70.          putanim(1,1,tank1,transput);
  71.          for i := 1 to 135 do      
  72.             for j := 1 to 164 do
  73.             begin              
  74.                r := sqrt(sqr(i - 67.5) + sqr(j - 82));
  75.                SinCos(a + arctan2((j - 82), (i - 67.5)), s, c);
  76.                h.matr[i,j] := GetPixel(round(67.5 + r * c), round(82 + r * s));
  77.             end;            
  78.          for i := 1 to 135 do      
  79.             for j := 1 to 164 do
  80.                PutPixel(i+500,j+500,h.matr[i,j]);
  81.          getanim(500+1,500+1,500+135,500+164,getrgbcolor(0,0,0),h.bp);
  82.          
  83.       end;
  84.      
  85.       if not (getkeystate(ord('W')) and $8000 > 0) and
  86.          not (getkeystate(ord('S')) and $8000 > 0) then
  87.          begin
  88.             if h.speed>=h.redspeed then h.speed:=h.speed-h.redspeed
  89.                                    else h.speed:=0;
  90.          end;
  91.       setactivepage(0);
  92.    end;
  93.    
  94. begin
  95.    hero_move;
  96. end;
  97.  
  98. procedure obrabotka;
  99. begin
  100.    obrabotka_hero;
  101. end;
  102.  
  103. procedure otrisovka;
  104. var cam_x,cam_y:real;
  105.    
  106.    procedure inform;
  107.    var s:string;
  108.    begin      
  109.       settextstyle(51,0,30);
  110.       setcolor(getrgbcolor(255,255,255));
  111.       str(h.speed:0:4,s);
  112.       outtextxy(20,20,'Speed: '+s);
  113.       str(h.x:0:4,s);
  114.       outtextxy(20,50,'X: '+s);
  115.       str(h.y:0:4,s);
  116.       outtextxy(20,80,'Y: '+s);
  117.       str(h.ugol,s);
  118.       outtextxy(20,110,'Ugol: '+s);    
  119.       str(cam.x:0:4,s);
  120.       outtextxy(200,50,'CAM X: '+s);
  121.       str(cam.y:0:4,s);
  122.       outtextxy(200,80,'CAM Y: '+s);
  123.    end;
  124.    
  125. begin
  126.    updategraph(updateoff);
  127.    cleardevice;
  128.    //
  129.    cam_x:=-(cam.x - getmaxx / 2);
  130.    cam_y:=-(cam.y - getmaxy / 2);
  131.    //
  132.    setfillstyle(1,getrgbcolor(180,80,0));
  133.    bar(0,0,getmaxx,getmaxy);
  134.    //
  135.    setcolor(getrgbcolor(0,255,0));
  136.    for i:=1 to map.size_x div 200 +1  do
  137.       line((i-1)*200+round(cam_x),0+round(cam_y),(i-1)*200+round(cam_x),map.size_y+round(cam_y));
  138.    for i:=1 to map.size_y div 200 +1  do
  139.       line(0+round(cam_x),(i-1)*200+round(cam_y),map.size_x+round(cam_x),(i-1)*200+round(cam_y));
  140.    //
  141.    inform;
  142.    //
  143.    putanim(round(h.x)+round(cam_x),round(h.y+round(cam_y)),h.bp,transput);
  144.    updategraph(updatenow);
  145. end;
  146.  
  147. begin
  148.    //
  149.    drive:=nopalette;
  150.    mode:=mfullscr;
  151.    initgraph(drive,mode,'Tanks');
  152.    //
  153.    loadbmp;
  154.    //
  155.    h.x:=500;
  156.    h.y:=500;
  157.    h.maxspeed:=3;
  158.    h.speed:=0;
  159.    h.incspeed:=0.01;
  160.    h.redspeed:=0.02;
  161.    h.bp:=tank1;
  162.    h.ugol:=0;
  163.    h.povorot:=1;
  164.    SetLength(h.matr,135*2,164*2);
  165.      ///
  166.    cam.x:=getmaxx / 2;
  167.    cam.y:=getmaxy / 2;
  168.      ///
  169.    map.size_x:=1920*3;
  170.    map.size_y:=1080*3;
  171.    //
  172.    repeat      
  173.       delay(10);
  174.       otrisovka;
  175.       obrabotka;
  176.    until mode<-1000;
  177.    //
  178.    closegraph;
  179. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы