Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Управление в игре

Автор: killerfriz 11.05.2004 22:57

Я выполняю курсовую работу задача которой сделать игру. Я решил сделать игру 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.{конец программы}


Это всё что у меня готово в данный момент но проблема и вопрос состоит в том чтоб избавиться от замедлений при управлении клавишами---------->когда к примеру я жму в лево и во время того как корабль перемещается нажимаю стрелять то корабль произведя выстрел не продолжает перемещаться в лево хотя я всёравно жму в лево.

Помогите пожалуста

Автор: Altair 13.05.2004 3:14

Хе-хе. Так это естественно, что тормозит...
Надо оптимизировать уметь. Раз уж игра- аркада, так здесь не с keypressed и readkey нужно работать, а с прерываниями или хотя бы с портами.

Автор: killerfriz 13.05.2004 12:13

А чтоб с прерываниями работать научиться какой тематики летературу искакть ... и надо ли дополнительный модуль подключать? unsure.gif

Автор: BlackShadow 13.05.2004 14:11

Можно подключить и модуль, а можно и на ассемблере чуть-чуть почитать. Кто-то тут говорил, чтобы получить исходник TSR'а достаточно в BP написать Kepp и нажать Ctrl-F1. Скорее всего там будет работа с клавой. А если нет, то запусти TechHelp. Там очень хорошо написано.

Автор: Altair 13.05.2004 18:45

Так это я и говорил про keep. Но в данном случае, я бы, прежде чем лезть в прерывания, попробовал бы использовать порт $60 - порт клавы.
В форуме "Вопросы и ответы" обсуждалась эта тема. (Поищите там). А уж если все равно тормозить будет, стал бы работать с прерываниями.

Цитата
А чтоб с прерываниями работать научиться какой тематики летературу искакть

Ну вообще советую книги Журдена, Питера Нортона, есть хорошая книга"MS-DOS для разработчика" часть можно скачать с этого сайта, часть с исходников.ru
Ну уж если совсем ничего не найдете, попробуем что-нибудь сделать.

Автор: killerfriz 17.05.2004 0:48

Все понятно что нечего не понятно <_< . Видать я до этого не дорос еще.

Вот еще один вопрос на засыпку Програмка у меня готова но надо как то узнать её системные требования подскажите где найти rolleyes.gif посмотреть в смысле. И еще одно на щет прерываний правдо что может компютер от этого постродать если че не правельно зделаю?

Автор: GLuk 18.05.2004 1:31

Зачем говорить товарищу о перехвате прерываний, если по тексту проги видно, что он в этом не канает!!?? Все управление вполне возможно реализовать и стандартными паскалевскими средствами...