Как повернуть 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.
Объяснение кода листинга программы
- Установка начальных значений переменных:
- 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 устанавливаются в размер карты.
- Загрузка 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);
- Основной цикл игры:
- repeat
- delay(10);
- otrisovka;
- obrabotka;
- until mode <- 1000;
- repeat
- Процедура obrabotka_hero:
- hero_move;
- Процедура 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
- if (getkeystate(ord('W')) and $8000 > 0) then
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д