IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Очень нужна помощь!, Игра "Артиллерист"
Rooosi
сообщение 24.05.2010 16:22
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


Имеется игра) Написанная на Паскале но не могу вывести на экран панельку которая показывала бы силу и направление ветра! Помогите пожалуйста.

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];

dr:=detect;initgraph(dr,dm,'');{инициализация графики}

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;

getimage(x_orudie-60,y_orudie-60,x_orudie+60,y_orudie+60,p^);

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)));{рисуем орудие}

W:=-10+random(20);{определяем силу ветра}

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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.05.2010 18:32
Сообщение #2


Гость






Ну, например, вот так...

{ В разделе констант описываем: }
const
WindPanel = 50;
maxWind = 10;

{ ... А потом, когда получаем скорость ветра - делаем: }

W := -maxWind + random(2 * maxWind + 1); { <--- Вот так сила ветра будет в интервале -10 .. 10 }

SetColor(White);
Line(640 - WindPanel, 5, 640 - WindPanel, 15);
SetColor(LightRed);
MoveTo(640 - WindPanel, 5);
LineTo(640 - WindPanel + Trunc(W * (WindPanel / maxWind)), 10);
LineTo(640 - WindPanel, 15);

repeat { Это уже пошел тот Repeat, который был у тебя в коде, дальше - без изменений }
{ ... }


В результате получаешь стрелку, направленную туда, куда дует ветер. Чем длиннее стрелка - тем сильней ветер. При желании можно и саму скорость ветра вывести туда же, но по-моему это лишнее...

Кстати, твой код вылетает с ошибкой, если "снаряд" выходит за левую границу экрана. Это так, то, что я успел увидеть, я всего три раза запускал, и уже нарвался на эту ошибку... Исправляй.
 К началу страницы 
+ Ответить 
Rooosi
сообщение 24.05.2010 18:38
Сообщение #3





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


Блииин большое спасибо! Оч выручил!))))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 10.11.2024 14:19
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"