Имеется игра) Написанная на Паскале но не могу вывести на экран панельку которая показывала бы силу и направление ветра! Помогите пожалуйста.
uses crt,graph; const pi=3.14159265359; G=9.81;{ускорение свободного падения} pause=2000;{пауза в миллисекундах} var dr{для графики},dm{для графики},i{счетчик},j{счетчик}:integer; W{сила ветра},time{время},koef_height{коэф. высоты - для генерации ландшафта},xt{координата х снаряда},yt,vx{скорость снаряда по оси Ох},vy:real; world:array[1..640] of integer{массив для хранения ландшафта}; exit{флаг выхода},kolvo{для генерации ландшафта},x,y,rad{радиус круга для ландшафта},max_rad,x_orudie{размещение орудия по Ох},y_orudie,angle{угол орудия},x_aim{координата х цели},y_aim,rad_aim{радиус цели},size{для снимка экрана},speed{}:word; p{для снимка экрана}:pointer; key{сканирование клавиши}:char; lkey{сканирование клавиши}:longint; BEGIN {задание условий генерации ландшафта} koef_height:=0.3; kolvo:=20; max_rad:=150; rad_aim:=7; angle:=90; speed:=100; randomize; for i:=1 to 640 do world[i]:=480; for i:=1 to kolvo do begin x:=random(640);y:=random(480);rad:=random(max_rad);{генерируем круг} world[x]:=world[x]-round(rad*koef_height);{добавляем его в кучу ландшафта} for j:=1 to rad do begin if x+j<=640 then world[x+j]:=world[x+j]-round(koef_height*sqrt(sqr(rad)-sqr(j))); if x-j>=1 then world[x-j]:=world[x-j]-round(koef_height*sqrt(sqr(rad)-sqr(j))); end; end;{добавили} x_orudie:=440+random(200);{координаты пушки} y_orudie:=world[x_orudie]; repeat x_aim:=random(640);{генерируем координаты цели} until abs(x_aim-x_orudie)>100; y_aim:=world[x_aim];
setcolor(2);for i:=1 to 640 do line(i,world[i],i,480);{рисуем ландшафт} setfillstyle(1,4);fillellipse(x_aim,y_aim-rad_aim div 2,rad_aim,rad_aim);{рисуем цель}
size:=imagesize(x_orudie-60,y_orudie-60,x_orudie+60,y_orudie+60);{фоткаем область с орудием для того чтоб вертеть его можно было} if(memavail>=size) then getmem(p,size) else begin writeln("Not enough memory");halt(1);end;
repeat{поехали} key:=readkey;lkey:=ord(key);{считываем код клавиши, стрелки имеют двойной код к примеру 0-80} if key=#0 then begin {esli najata strelka} key:=readkey;lkey:=ord(key); putimage(x_orudie-60,y_orudie-60,p^,normalput); if lkey=77 {vpravo} then angle:=angle-3; if lkey=75 {vlevo } then angle:=angle+3; if lkey=72 {vverh } then speed:=speed+1; if lkey=80 {vniz } then speed:=speed-1; if speed=49 then speed:=50; if speed=121 then speed:=120; setcolor(15); line(x_orudie,y_orudie,x_orudie+round(0.5*speed*cos(angle/180*pi)),y_orudie-round(0.5*speed*sin(angle/180*pi))); end; if lkey=32 then begin {babah} xt:=x_orudie;yt:=y_orudie; exit:=0;time:=0; vy:=-speed*sin(angle/180*pi);{нач значения} vx:=speed*cos(angle/180*pi); while exit=0 do begin{пока ... делаем} setcolor(15);line(x_orudie,y_orudie,x_orudie+round(0.5*vx),y_orudie+round(0.5*vy));{отрисовываем орудие чтоб не затиралось} setcolor(0);setfillstyle(1,0);fillellipse(round(xt),round(yt),2,2);{затираем снаряд на старом месте} if (round(yt)>world[round(xt)]) or (xt<0) or (xt>640) then begin{снаряд упал или вылетел за пределы} for i:=2 to 7 do begin{взрыв грунта} fillellipse(round(xt),round(yt),i,i); delay(pause*10); end; if (xt>0) and (xt<641) then{если попал на грунт} for i:=-7 to 7 do begin{осыпание грунта} x:=round(xt)+i;y:=round(yt); if (x>0) and (x<641) then begin{правка грунта по dx} if y-world[x]>=round(sqrt(7*7-i*i)) then world[x]:=world[x]+round(sqrt(7*7-i*i));{считаем} if y-world[x]>=-round(sqrt(7*7-i*i)) then world[x]:=world[x]+round(sqrt(7*7-i*i)); setcolor(0);line(x,0,x,world[x]);{рисуем} setcolor(2);line(x,world[x],x,480); end; end; setfillstyle(1,4);fillellipse(x_aim,y_aim-rad_aim div 2,rad_aim,rad_aim);{рисуем цель} exit:=1;{все сделали} end; if sqr(x_aim-xt)+sqr(y_aim-yt)-sqr(rad_aim+2)<=0 then begin{попали} setcolor(14);outtextxy(100,50,'victory!'); exit:=1; end; if exit=0 then begin{если ничего из вышесказанного то двигаем снаряд} time:=time+0.01; xt:=x_orudie+time*(vx+W*time); yt:=y_orudie+time*(vy+G*time); setfillstyle(1,15);fillellipse(round(xt),round(yt),2,2);{отрисовываем снаряд} delay(pause); end; end; end; if lkey=27 then begin {esc} freemem(p,size);{чистим память} closegraph;{} halt(1);{выходим} end; until 1<>1;{repeat} END.
repeat { Это уже пошел тот Repeat, который был у тебя в коде, дальше - без изменений } { ... }
В результате получаешь стрелку, направленную туда, куда дует ветер. Чем длиннее стрелка - тем сильней ветер. При желании можно и саму скорость ветра вывести туда же, но по-моему это лишнее...
Кстати, твой код вылетает с ошибкой, если "снаряд" выходит за левую границу экрана. Это так, то, что я успел увидеть, я всего три раза запускал, и уже нарвался на эту ошибку... Исправляй.