Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Игра на Pascal

Ответить
Настройки темы
Delphi - [решено] Игра на Pascal

Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Собственно, делаю мою первую небольшую игрушку (Top-Down shooter) на PascalABC.net
Почти все сделал, кроме столкновения выстрела с противником и столкновения противника с игроком.
путем проб и ошибок выяснил, что код не реагирует на пересечение спрайтов, хотя должен. Помогите, товарищи, пожалуйста, я уже второй день думаю
Код: Выделить весь код
uses graphabc, abcobjects;
var obj:objectabc; 
health:integer; 
wall:objectabc; 
blast:objectabc; 
score:integer;
enemy: array [1..10] of objectabc;
procedure Move(x,y,mb: integer);
begin
  obj.Moveto(x,y);
end;

procedure enemystart;
begin
enemy[1]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[2]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[3]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[4]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[5]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[5]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[6]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[7]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[8]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[9]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[10]:=pictureabc.create (random(10,500),-50, 'enemy.png');
end;


procedure enemymove;
begin
foreach x: objectabc in enemy do
repeat
x.Moveto (x.Left,x.Top+1);
sleep (1);
until x.Intersect (wall)=false
end;


procedure fire (x,y,mb:integer);
begin
if mb=1 then
blast:= pictureabc.Create (obj.Left+25,obj.Top,'blast.png');
repeat
blast.MoveOn (0,-1);
until blast.Intersect (wall)=false
end;


procedure kill;                                         //Не работает выстрел
begin
foreach x:objectabc in enemy do
begin
if x.Intersect (blast)=true then x.Destroy;
score:=score+1;
end;
end;

procedure boom;                                       //Не работает столкновение
begin
foreach x:objectabc in enemy do
begin
if x.Intersect (obj)=true 
then 
health:=health-10;
x.Destroy;
end;
end;


begin
health:=100;
setwindowsize (539,479);
SetWindowIsFixedSize (true);
setwindowcaption ('Game');
wall:=pictureabc.Create(0,0,'wall.jpg');
obj:=pictureabc.Create(250,440,'ship.png');
Onmousemove:= Move;
Onmousedown:=fire;
repeat
enemystart;
enemymove;
kill;
boom;
until health=0;
write ('Вы умерли, ваши очки: ', score);
end.

Отправлено: 18:57, 03-05-2013

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


nemo_the_capitain@vk, не ясна реализация функции x.Intersect ().
Можно получить полный архив игры?

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 19:21, 03-05-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: rar Игра.rar
(167.6 Kb, 17 просмотров)

x.intersect () проверяет пересечение изображений
архив пожалуйста:

Отправлено: 19:31, 03-05-2013 | #3


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Чудная какая то среда.
nemo_the_capitain@vk, у вас несколько нарушена логика работы приложения.
Код: Выделить весь код
repeat
    enemystart;
    enemymove;
    kill;
    boom;
until health=0;
Сначала происходит запуск всех 10 самолетов противника (enemystart). Они все доходят до конца экрана, а только затем запускаются процедуры обработки столкновения и попадания выстрелом.
Т.е. процедуры kill и boom надо совместить с процедурой полета самолета противника (enemymove) и с процедурой выстрела (fire) соответственно.
По началу сбивает с толку, что самолет движется (Onmousemove:= Move и даже стреляет (Onmousedown:=fire. Т.е. строго говоря создаются отдельные потоки и они выполняются вполне себе параллельно.
Да, с одной стороны это удобно, с другой не очень - теория прихрамывает.

Полусырой вариант таков:
Код: Выделить весь код
uses graphabc, abcobjects;
var obj:objectabc; 
health:integer; 
wall:objectabc; 
blast:objectabc; 
score:integer;
enemy: array [1..10] of objectabc;
procedure Move(x,y,mb: integer);
begin
  obj.Moveto(x,y);
end;

procedure enemystart;
begin
enemy[1]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[2]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[3]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[4]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[5]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[5]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[6]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[7]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[8]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[9]:=pictureabc.create (random(10,500),-50, 'enemy.png');
enemy[10]:=pictureabc.create (random(10,500),-50, 'enemy.png');
end;


procedure shoot;                                         //Не работает выстрел
begin
foreach x:objectabc in enemy do begin
  if x.Intersect(blast) then 
    x.Destroy;
    score:=score+1;
  end;
end;

procedure boom;                                       //Не работает столкновение
begin
foreach x:objectabc in enemy do begin
  if x.Intersect (obj) then 
    health:=health-10;
    x.Destroy;
  end;
end;


procedure enemymove;
var flag:boolean;
begin
foreach x: objectabc in enemy do
repeat
  flag:=false;
  x.Moveto (x.Left,x.Top+1);
  if x.Intersect (obj) then begin
    health:=health-10;
    x.Destroy;
    flag:=true;
  end;
until not(flag) or not(x.Intersect (wall));
end;


procedure fire (x,y,mb:integer);
begin
if mb=1 then
  blast:= pictureabc.Create (obj.Left+25,obj.Top,'blast.png');
repeat
  blast.MoveOn (0,-1);
  shoot;
until blast.Intersect (wall)=false
end;


begin
health:=100;
setwindowsize (539,479);
SetWindowIsFixedSize (true);
setwindowcaption ('Game');
wall:=pictureabc.Create(0,0,'wall.jpg');
obj:=pictureabc.Create(250,440,'ship.png');
Onmousemove:= Move;
Onmousedown:=fire;
enemystart;
repeat
enemymove;
//kill;
//boom;
until health=0;
write ('Вы умерли, ваши очки: ', score);
end.
Надо ее еще полчаса, час до ума довести и будет вполне себе детская срелялка.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:35, 03-05-2013 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - [решено] Игра на Pascal

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Игра на QBasic GordonG Программирование и базы данных 15 14-06-2015 12:10
Разное - Всё о TURBO PASCAL (обсуждение, помощь в написание программ, ошибки, Pascal ABC) Loading Программирование и базы данных 41 20-05-2015 15:28
C/C++ - Перевод с Pascal на C++ Ru1nN Программирование и базы данных 0 21-12-2011 22:45
программирование на pascal TauRus Программирование и базы данных 11 10-12-2006 12:17
Скремблер на Pascal fossil Программирование и базы данных 3 28-12-2005 07:28




 
Переход