Автор: killerfriz 9.05.2004 4:50
я выполняю курсовую работу задача которой сделать игру. Я решил сделать игру Galaxi(галакси)
Код
uses graph,crt;
type Point=record
x:Word;
y:word;
end;
MasStar=array[1..2,1..300] of word;{Тип массива для звезд}
BotMas=array [1..30] of char;{Тип массива для ботов}
TargetMas=array [1..2] of word;{Тип массива для хранения координатов летящих ботов}
var
P1,P2,P3:Pointer;{Modeli Korablei}
Target:TargetMas;{массива для хранения координатов поподания в бототв}
Napr:String;{переменая определяющая своим значением в какую сторону движутся боты}
bots:BotMas;{массив для хронения состояния ботов}
a,r:integer;{пременные осуществляющее перемещение пули}
Polet:boolean;{признок палёта пули}
gr,dr,io:integer;{переменные модуля граф}
x:integer;{переменная для движения коробля}
i:integer;{для цикла вывода звезд на экран}
Bot:array[1..5] of point;{массив для хранения координат вершин бота}
pol:array[1..4] of point;{массив для хранения вершин коробля}
c:char;{переменная для хранения символа нажатой клавиши}
stars_x_y:MasStar;{Массив для хронания координат звезд}
b:integer;{переменная для хронения значения смещения ботов}
pow:real;{переменная для повтора цикла перемещения ботов}
{==============================ПРОЦЕДУРЫ===============================
=====}
procedure fire(var x,y:integer);{Процедура осуществляющяя перемищения пули}
var y1:integer;
begin
setcolor(12);
line(x,y,x,y-10);
setcolor(0);
line(x,y,x,y+10);
nosound;
end;
procedure stars (var a:MasStar);{Поцедуро выводящяя на экран Звезды}
var x,y:word;
begin
for i:=1 to 300 do
begin
x:=a[1,i];
y:=a[2,i];
putpixel(x,y,random(640));
end;
end;
procedure Boti (a:BotMas; y:word);{процидура осуществляющая вывод на экран ботов}
var i,x:word;
begin
x:=0;
for i:=1 to 10 do
begin
x:=x+40;
if a[i]='a' then
putimage(100+x+y,130,p1^,copyput);
if a[i+10]='b' then
putimage(100+x+y,90,p1^,copyput);
if a[i+20]='c' then
putimage(100+x+y,50,p1^,copyput);
end;
end;
Procedure Hit ( x:integer; y,z:integer; var b:BotMas; var est:boolean);
var w:word;
begin
w:=0;
if y=150 then
if est=true then
For i:=1 to 10 do
begin
w:=w+40;
if b[i]='a' then
if (z<=130+w+x) and (z>=110+w+x) Then
begin
b[i]:='x';
est:=false;
setfillstyle(1,7);
fillellipse(120+w+x,140,20,20);
sound(190);
delay(10000);
setfillstyle(1,0);
fillellipse(120+w+x,140,20,20);
end;
end;
w:=0;
if y=110 then
if est=true then
For i:=11 to 20 do
begin
w:=w+40;
if b[i]='b' then
if (z<=130+w+x) and (z>=110+w+x) Then
begin
b[i]:='x';
est:=false;
setfillstyle(1,7);
fillellipse(120+w+x,100,20,20);
sound(190);
end;
end;
w:=0;
if y=70 then
if est=true then
For i:=21 to 30 do
begin
w:=w+40;
if b[i]='c' then
if (z<=130+w+x) and (z>=110+w+x) Then
begin
b[i]:='x';
est:=false;
setfillstyle(1,7);
fillellipse(120+w+x,60,20,20);
sound(190);
end;
end;
end;
{==========================Начало программы==============================}
Begin
{===================подключение графического модуля========================}
gr:=detect;
initgraph(gr,dr,'E:\Distant\TP7\BGI\');
directvideo:=false;
setcolor(2);
bot[1].x:=100; bot[1].y:=130;
bot[2].x:=110; bot[2].y:=140;
bot[3].x:=100; bot[3].y:=150;
bot[4].x:=90; bot[4].y:=140;
bot[5].x:=100; bot[5].y:=130;
DrawPoly(5,bot);
setfillstyle(solidfill,2);
FloodFill(100,140,2);
GetMem(P1,imagesize(91,130,111,150));
getimage(84,130,116,150,p1^);
ClearViewPort;
for i:=1 to 10 do{4 цикла задоющих начального состояния ботов}
bots[i]:='a';
for i:=11 to 20 do
bots[i]:='b';
for i:=21 to 30 do
bots[i]:='c';
for i:=1 to 300 do {Занесения в массив координат Звезд случайным вбором}
begin
stars_x_y[1,i]:=random(640);
stars_x_y[2,i]:=random(480);
end;
stars(stars_x_y);{вывод на экран звёзд}
setcolor(7);{заполнение массива pol координатами вершин треугольника}
pol[1].x:=320; pol[1].y:=420;
pol[2].x:=310; pol[2].y:=440;
pol[3].x:=330; pol[3].y:=440;
pol[4].x:=320; pol[4].y:=420;
DrawPoly(4,pol);{рисование треугольника и заливка его красным цветом}
setfillstyle(solidfill,red);
FloodFill(320,439,7);
b:=-150;{начальное смещение ботов}
repeat{начало главного цикла программы}
Case b of{оператор выбора опредиляет дошли ли боты до конца экрана и в какую сторону им двиготься}
100:Napr:='l';
-130:Napr:='r';
end;
if pow=10 then
begin
if Napr='l' then b:=b-5 {движение ботов путем изменения значения их смещения}
else b:=b+5;
Boti (bots,b);
pow:=0;
end;
stars(stars_x_y);{вывод на экран звезд}
if polet=true then {проверка условия находится ли пуля в полёте или нет}
begin
if r<=0 then begin polet:=false;end{если пуля столкнулась с какимнибуть
объектом или достигла конца экрана то полёт
прекрощается иначе продолжается её перемещение}
else
begin
r:=r-10;
fire(a,r);
end;
end;
Hit(b,r,a,bots,polet);{Обращение к процидуре которая определяет попала ли пуля в цель}
{========================================================================}
if keypressed then{проверка условия былали нажата клавиша}
begin
c:=readkey;{присваевание переменной с значение нажатой клавиши}
case c of{в зависимости от того какая клавиша была нажата оператором выбора выберается действие}
#75:if x>-300 then x:=x-7;{уменьшить значение х если была нажата клавиша в лево}
#77:if x<300 then x:=x+7; {увеличить значение х если была нажата клавиша в право}
#32:if polet=false then begin sound(1700); a:=x+320; r:=420; polet:=true; end;{если был нажат пробел то производится
выстрел из вершины треугольника}
end;
setcolor(0);{закрашивание предыдущего треугольника}
DrawPoly(4,pol);
setfillstyle(solidfill,0);
FloodFill(320+x,439,0);
setcolor(7);{вывод на экран нового треугольника с новыми координатами}
pol[1].x:=320+x; pol[1].y:=420;
pol[2].x:=310+x; pol[2].y:=440;
pol[3].x:=330+x; pol[3].y:=440;
pol[4].x:=320+x; pol[4].y:=420;
DrawPoly(4,pol);
setfillstyle(solidfill,red);
FloodFill(320+x,439,7);
end;
delay(5000);
nosound;
pow:=pow+1;
until c=#27;{конец главного цикла если была нажата клавиша Esc}
closegraph;{закрытие модуля graph}
end.{конец программы}
это всё что у меня готово в данный момент но проблема и вопрос состоит в том чтоб избавиться от замедлений при управлении клавишами---------->когда к примеру я жму в лево и во время того как корабль перемещается нажимаю стрелять то корабль произведя выстрел не продолжает перемещаться в лево хотя я всёравно жму в лево.
ПОМОГИТЕ ПОЖАЛУЙСТО
============Прикладываю исходник ================
Прикрепленные файлы
LINIE2.PAS ( 7.32 килобайт )
Кол-во скачиваний: 273
Автор: AlaRic 9.05.2004 4:53
Правила читай наконец!! Сколько можно?!