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

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Управление в игре, Помогите разобраться
сообщение
Сообщение #1


Новичок
*

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

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


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


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

Помогите пожалуста
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 





- Текстовая версия 23.10.2020 4:10
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name