Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2008, 10:08   #1
Serega123
Пользователь
 
Регистрация: 03.06.2008
Сообщений: 10
Лампочка Игра озеро на Delphi, нужна небольшая помощь

Суть игры простая: Есть озеро, в нем плавают рыбы 2-х видов: карп и щука {Эту часть работы я выполнил}. Нужно чтобы рыбы разных видов поедали друг друга, а одного вида размножались. Рыбы у меня сделаны .bmp изображениями, в общем когда эти изображения соприкасаются и должно происходить одно из действий, помогите пожалуйста написать такую процедуру. Опыта работы у меня немного и не получается это сделать

Вот Юнит, относящийся к рыбам:
Код:
unit Fishes;

interface

uses Forms, Graphics, Types;

type
PFish = ^TFish;
PShuka = ^TShuka;
PCarp = ^TCarp;

TFish=object
x,y:integer;
color:integer;
Body:TBitmap;
Owner:TForm;
OwnerBody:TBitmap;
xSpeed,ySpeed,napr:integer;

constructor Init(px,py,pcolor:integer; myOwner:TForm; MyOwnerBody:TBitmap);

procedure LoadFromFile(FileName:string);
procedure Show;virtual;
procedure Move;virtual;
procedure Hide;
end;

TShuka=object(TFish)

constructor Init(px,py,pcolor:integer; myOwner:TForm; MyOwnerBody:TBitmap);
procedure Show;virtual;
procedure Move;virtual;
end;

TCarp=object(TFish)

constructor Init(px,py,pcolor:integer; myOwner:TForm; MyOwnerBody:TBitmap);
procedure Show;virtual;
procedure Move;virtual;
end;

implementation

constructor TFish.Init;
begin
end;

constructor TCarp.Init;
begin
x:=px;
y:=py;
color:=pcolor;
Owner:=myOwner;
OwnerBody:=MyOwnerBody;
Body:=TBitmap.Create;
LoadFromFile('Image\Fish1.bmp');
Body.Transparent:=true;
end;

constructor TShuka.Init;
begin
x:=px;
y:=py;
color:=pcolor;
Owner:=myOwner;
OwnerBody:=MyOwnerBody;
Body:=TBitmap.Create;
LoadFromFile('Image\Fish2.bmp');
Body.Transparent:=true;
end;

procedure TFish.LoadFromFile;
begin
Body.LoadFromFile(FileName);
end;

procedure TFish.Show;
begin
end;

procedure TFish.Move;
begin
end;

procedure TFish.Hide;
var
Rect1,Rect2:TRect;
begin
Rect1:=Rect(x,y,x+Body.Width,y+Body.Height);
Rect2:=Rect(x,y,x+Body.Width,y+Body.Height);
Owner.Canvas.BrushCopy(Rect1,OwnerBody,Rect2,clBlack);
end;

{=======================Shuka=======================}
procedure TShuka.Show;
begin
Owner.Canvas.Draw(x,y,Body);
end;

procedure TShuka.Move;
begin
xSpeed:=Random(10);
ySpeed:=Random(10);
napr:=1;
if (Random(200)<30) then
napr:=-napr;
case Random(2) of
0: Inc(x,xSpeed*napr);
1: Inc(y,ySpeed*napr);
end;
if (x>550)or(x<100) then
x:=100;
if (y>450)or(y<50) then
y:=50;
end;

{=======================Carp=======================}

procedure TCarp.Show;
begin
Owner.Canvas.Draw(x,y, Body);
end;

procedure TCarp.Move;
begin
xSpeed:=Random(10);
ySpeed:=Random(10);
napr:=1;
if (Random(200)<30) then
napr:=-napr;
case Random(2) of
0: Inc(x,xSpeed*napr);
1: Inc(y,ySpeed*napr);
end;
if (x>550)or(x<100) then
x:=100;
if (y>450)or(y<50) then
y:=50;
end;

begin
Randomize;
end.

Последний раз редактировалось Stilet; 03.06.2008 в 10:55.
Serega123 вне форума Ответить с цитированием
Старый 03.06.2008, 10:59   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А где тут у тебя проверка пересечения этих картинок?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.06.2008, 11:12   #3
Serega123
Пользователь
 
Регистрация: 03.06.2008
Сообщений: 10
По умолчанию

Я недавно начал программировать в Delphi, знаком только с Pascal, и именно с этим у меня и проблема, незнаю как сделать пересечение картинок! Остальное то более менее понятно ( как создать новую рыбку и удалить при поедании)
Помоги пожалуйста.

Rect(x,y,x+Body.Width,y+Body.Height ); - Это изображение одной рыбы. Никак не могу придумать: как сделать, чтобы он сравнил их со всеми остальными рыбами из массива!? Если бы их 2 было, то не сложно в принципе ... а так чёто не могу догнать .... Помогите plz

{Рыбы хранятся в массивах:
Ribki[i]:=new(PCarp,Init(Random(Width),Rand om(Height),Red,Owner,Body));
Ribki[i]:=new(PShuka,Init(Random(Width),Ran dom(Height),Red,Owner,Body));}

Последний раз редактировалось Stilet; 03.06.2008 в 13:38.
Serega123 вне форума Ответить с цитированием
Старый 03.06.2008, 13:59   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

М.м.м... Как ты в паскале бы проверял пересекаются ли прямоугольники или нет?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.06.2008, 14:10   #5
Serega123
Пользователь
 
Регистрация: 03.06.2008
Сообщений: 10
По умолчанию

if (x>Ribki[i]^.x) and (x<Ribki[i]^.x+77) and (y>Ribki[i]^.y) and (y<Ribki[i]^.y+64) tnen {Т.е. когда координаты одно прямоугольника совпадаюс с координатами другог}
А дальше нужно удалить значение(рыбку) из массива, но там по идее нужно как-то со смещением все делать, просто удалить наверное нельзя ...
+ Компилятор Delphi ругается [Error] Fishes.pas(112): 'THEN' expected but identifier 'tnen' found
Serega123 вне форума Ответить с цитированием
Старый 03.06.2008, 14:21   #6
N!ckeL
Форумчанин
 
Регистрация: 29.03.2008
Сообщений: 300
По умолчанию

Цитата:
Компилятор Delphi ругается [Error] Fishes.pas(112): 'THEN' expected but identifier 'tnen' found
исправь tnen на then
Цитата:
if (x>Ribki[i]^.x) and (x<Ribki[i]^.x+77) and (y>Ribki[i]^.y) and (y<Ribki[i]^.y+64) tnen {Т.е. когда координаты одно прямоугольника совпадаюс с координатами другог}
если ничего не напутал то так:
Код:
if (x>=Ribki[i].x) and (Ribki[i].x>x+Ribki[i].Width) and (y>=Ribki[i].y) and (y<=Ribki[i].y+Ribki[i].Height) then {пересекаются, здесь можно использовать 
variable:=random(2)
if variable=0 then процедура размножения
if variable=1 then процедура 'убивания' (или как её назвать? ;))
if variable=2 then exit 
}
Карп преодолевший водопад становится драконом.

Последний раз редактировалось N!ckeL; 03.06.2008 в 14:24.
N!ckeL вне форума Ответить с цитированием
Старый 03.06.2008, 14:31   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А дальше нужно удалить значение(рыбку) из массива, но там по идее нужно как-то со смещением все делать, просто удалить наверное нельзя ...
У тебя массив рыб это массив указателей. просто удаляемой рыбку делай FREE если твой object такое поддерживает, и ставь в ячейку массива nil а когда будеш проходиться по массиву игнорируй эти nil

Цитата:
'THEN' expected but identifier 'tnen' found
э-э-э ТХЕН и ТНЕН всетки разные слова (эт я по русски их написал)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.06.2008, 14:49   #8
Serega123
Пользователь
 
Регистрация: 03.06.2008
Сообщений: 10
По умолчанию

Спасибо за помощь!
У меня i - массив карпов j - массив щук

For i:=1 to 10 do
if (x>=Ribki[i].x) and (Ribki[i].x>x+77) and (y>=Ribki[i].y) and (y<=Ribki[i].y+64) then
Ribki[i]^:=nil;
For j:=1 to 5 do
if (x>=Ribki[j].x) and (Ribki[j].x>x+77) and (y>=Ribki[j].y) and (y<=Ribki[j].y+64) then
Ribki[j]:=New(PShuka,Init(Random(Width),Ran dom(Height),Green,Owner,Body));

Но обнулить указатель не получается [Error] Fishes.pas(115): Incompatible types: 'TFish' and 'Pointer'

Последний раз редактировалось Serega123; 03.06.2008 в 15:23.
Serega123 вне форума Ответить с цитированием
Старый 03.06.2008, 15:31   #9
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Serega123 Посмотреть сообщение
Но обнулить указатель не получается [Error] Fishes.pas(115): Incompatible types: 'TFish' and 'Pointer'
(птичку уберите)
Ribki[i]:=nil
alexBlack вне форума Ответить с цитированием
Старый 03.06.2008, 15:52   #10
Serega123
Пользователь
 
Регистрация: 03.06.2008
Сообщений: 10
По умолчанию

Помогите еще пожалуйста разобраться!
Уже часа 3 не могу понять почему не работает эта вещь:
For i:=1 to 10 do
if (x>=Ribki[i].x) and (Ribki[i].x+77>x) and (y>=Ribki[i].y) and (y<=Ribki[i].y+64) then
Ribki[i]:=nil;

Без галочки стало получше, но все равно не работает (((
Вылезает ошибка доступа: read of address 000000000
Serega123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi.Задачи.Нужна помощь SkaStud Помощь студентам 10 30.05.2011 23:26
Нужна помощь на Delphi ВЕКО Помощь студентам 1 19.04.2008 15:48
Нужна ваша помощь в Delphi Ivanich Помощь студентам 3 23.12.2007 20:06
Пшу диплом, нужна консультация небольшая.. staspro Помощь студентам 5 07.08.2007 23:36
Нужна помощь по Delphi Виктория 1 Фриланс 5 25.02.2007 21:21