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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

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


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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


А чтоб с прерываниями работать научиться какой тематики летературу искакть ... и надо ли дополнительный модуль подключать? unsure.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

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


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

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


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

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

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


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

Вот еще один вопрос на засыпку Програмка у меня готова но надо как то узнать её системные требования подскажите где найти rolleyes.gif посмотреть в смысле. И еще одно на щет прерываний правдо что может компютер от этого постродать если че не правельно зделаю?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

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

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


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

Сообщение отредактировано: GLuk -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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