Меню сайта
Форма входа
Категории раздела
Уроки по созданию игр [38]
Программирование игр разной сложности
Игровые алгоритмы [24]
Алгоритмы, которые уже реализованы для разных жанров игр
Графика [5]
Учимся работать с графикой в Делфи
Мультимедиа [3]
Работа с мультимедийными возможностями Делфи
Другие статьи [18]
Статьи не вошедшие не в один из разделов
Ошибки [4]
Всевозможные ошибки и пути их решения
Вторник, 01.07.2025, 17:28
Приветствую Вас Гость

Статьи по программированию

Главная » Статьи » Игровые алгоритмы

Процедура обработки монстров
Вашему вниманию представлена процедура, которая отвечает за поведение монстров в моей игре. Здесь реализован простенький штучный интеллект. Возможно кому-то будет интересно и принесет пользу в создании своих игр

procedure Monstr_Draw;
var i,j,zz:integer;
vzaklinanii,ubeganiye:boolean;
Obzor:integer;
begin
vzaklinanii:=false;
//form2.vrag_health.Visible:=false;

//zaderzhka pokaza udara v tsiklah

//proverka mozhet li monstr udarit geroya
for i:=round(Player.x/60)-1 to round(Player.x/60)+1 do
for j:=round(Player.y/60)-1 to round(Player.y/60)+1 do
if Karta.monsters[i,j,1]>0 then
begin

//vibor pravilnogo povorota
//esli geroy snizu
if (round(Player.x/60)=i) and (round(Player.y/60)>j) then Monsters[Karta.monsters[i,j,2]].povorot:=1;
//esli geroy sverhu
if (round(Player.x/60)=i) and (round(Player.y/60)<j) then Monsters[Karta.monsters[i,j,2]].povorot:=2;
//esli geroy sleva
if (round(Player.x/60)<i) and (round(Player.y/60)=j) then Monsters[Karta.monsters[i,j,2]].povorot:=3;
//esli geroy sprava
if (round(Player.x/60)>i) and (round(Player.y/60)=j) then Monsters[Karta.monsters[i,j,2]].povorot:=4;
//esli geroy snizu sleva
if (round(Player.x/60)<i) and (round(Player.y/60)>j) then Monsters[Karta.monsters[i,j,2]].povorot:=5;
//esli geroy snizu sprava
if (round(Player.x/60)>i) and (round(Player.y/60)>j) then Monsters[Karta.monsters[i,j,2]].povorot:=6;
//esli geroy sverhu sleva
if (round(Player.x/60)<i) and (round(Player.y/60)<j) then Monsters[Karta.monsters[i,j,2]].povorot:=7;
//esli geroy sverhu sprava
if (round(Player.x/60)>i) and (round(Player.y/60)<j) then Monsters[Karta.monsters[i,j,2]].povorot:=8;

//delaem monstra nederushimsya
monsters[Karta.monsters[i,j,2]].Fight:=false;

//proveryaem zaderzhku udara
if monsters[Karta.monsters[i,j,2]].udar>0 then
monsters[Karta.monsters[i,j,2]].udar:=monsters[Karta.monsters[i,j,2]].udar+1;

//esli prishlo vremya dlya udara obnulyaem
if (monsters[Karta.monsters[i,j,2]].udar=monsters[Karta.monsters[i,j,2]].SkorostUdara)
then monsters[Karta.monsters[i,j,2]].udar:=0;

monsters[Karta.monsters[i,j,2]].MonstersUron:=0;

if ((Karta.monsters[i,j,1]<>0)
//and (i<>Player.x)
and (monsters[Karta.monsters[i,j,2]].udar=0)
and (monsters[Karta.monsters[i,j,2]].visible=true))

or ((Karta.monsters[i,j,1]<>0)
//and (j<>Player.y)
and (monsters[Karta.monsters[i,j,2]].udar=0)
and (monsters[Karta.monsters[i,j,2]].visible=true)) then

begin
//monstr udaril poetomu zapuskaem zaderzhku udara
monsters[Karta.monsters[i,j,2]].udar:=1;

//prorisovka magicheskoy ikonki esli monstr popal na zaklinaniye
if (mag.ispolzovaniye<>9) and (mag.ispolzovaniye<>7) then
monsters[Karta.monsters[i,j,2]].Fight:=true;

//proverka na popadaniye i promah
randomize;
buh1:=random(Player.lovkost+monsters[Karta.monsters[i,j,2]].metkost)+1;

//esli ispolzovano zaklinaniye kamennaya kozha
if (mag.ispolzovaniye=9)

or ( (Player.Tip_oruzhiya='posoh') and (Posohi[Player.odezhda[11]].zaklinaniye='Щит')
and ( Posohi[Player.odezhda[11]].DlitMin<=Posohi[Player.odezhda[11]].dlitelnost+Posohi[Player.odezhda[11]].power )
and (Posohi[Player.odezhda[11]].DlitMin>=0) )

or ( (Player.Tip_oruzhiya='posoh') and (Posohi[Player.odezhda[11]].zaklinaniye='Ослепление')
and ( Posohi[Player.odezhda[11]].DlitMin<=Posohi[Player.odezhda[11]].dlitelnost+Posohi[Player.odezhda[11]].power )
and (Posohi[Player.odezhda[11]].DlitMin>=0) )

then monsters[Karta.monsters[i,j,2]].Fight:=false

else
begin
if (Player.health>0) and (buh1>Player.lovkost) and (mag.ispolzovaniye<>9) then
begin
monsters[Karta.monsters[i,j,2]].MonstersUron:=1;
if (mag.ispolzovaniye=5) then
begin
Player.health:=Player.health - round(monsters[Karta.monsters[i,j,2]].sila/2);
monsters[Karta.monsters[i,j,2]].NURON:=
monsters[Karta.monsters[i,j,2]].NURON+round(monsters[Karta.monsters[i,j,2]].sila/2);
end

else
begin
Player.health:=Player.health-monsters[Karta.monsters[i,j,2]].sila;
monsters[Karta.monsters[i,j,2]].NURON:=
monsters[Karta.monsters[i,j,2]].NURON+monsters[Karta.monsters[i,j,2]].sila;
monsters[Karta.monsters[i,j,2]].NPOPADANIYA:=monsters[Karta.monsters[i,j,2]].NPOPADANIYA+1;
end;
end;

if (Player.health>0) and (buh1<=Player.lovkost) and (mag.ispolzovaniye<>9) then
begin
monsters[Karta.monsters[i,j,2]].MonstersUron:=2;
monsters[Karta.monsters[i,j,2]].NPROMAHI:=
monsters[Karta.monsters[i,j,2]].NPROMAHI+1;
end;

end;

end;
end;

//obnuleniye vseh monstrov v nachale
for zz:=1 to nomer do
begin

//ne derutsya v nachale
if Monsters[zz].health>0 then
begin
Monsters[zz].Go:=false;
end;

//esli ubit to cherez skolko poyavitsya
if Monsters[zz].health<=0 then
begin
Monsters[zz].Poyavleniye:=Monsters[zz].Poyavleniye+1;
if Monsters[zz].Poyavleniye>=Monsters[zz].Poyavleniye_max then
begin
Monsters[zz].Poyavleniye:=0;
case monsters[zz].tip of
1:monsters[zz].health:=90;
2:monsters[zz].health:=120;
3:monsters[zz].health:=200;
4:monsters[zz].health:=300;
end;
Monsters[zz].Visible:=true;
end;
end;

end;

//proverka na prorisovku magicheskoy ikonki
for i:=round(Mag.x/60)-mag.radius to round(Mag.x/60)+mag.radius do
for j:=round(Mag.y/60)-mag.radius to round(Mag.y/60)+mag.radius do
begin

if (Monsters[Karta.monsters[i,j,2]].ubezhal=false) and (Karta.monsters[i,j,1]<>0) then
begin
//proverka popadaniya monstra na zaklinaniye
case mag.ispolzovaniye of
//esli popal na zibuchiy pesok
1:begin
//for ii:=round(Mag.x/60)-mag.radius to round(Mag.x/60)+mag.radius do
//for jj:=round(Mag.y/60)-mag.radius to round(Mag.y/60)+mag.radius do
//begin
// if (round(Monsters[Karta.monsters[i,j,2]].x/60)=ii)
// and (round(Monsters[Karta.monsters[i,j,2]].y/60)=jj)
// and (monsters[Karta.monsters[i,j,2]].visible=true) then
Monsters[Karta.monsters[i,j,2]].vzaklinanii:=true;
//end;
end;

//esli popal na zamedleniye
4:begin
//for ii:=round(Mag.x/60)-mag.radius to round(Mag.x/60)+mag.radius do
//for jj:=round(Mag.y/60)-mag.radius to round(Mag.y/60)+mag.radius do
//begin
// if (round(Monsters[Karta.monsters[i,j,2]].x/60)=ii)
// and (round(Monsters[Karta.monsters[i,j,2]].y/60)=jj)
// and (monsters[Karta.monsters[i,j,2]].visible=true) then
Monsters[Karta.monsters[i,j,2]].vzaklinanii:=true;
//end;
end;

{
//esli ispolzovana kamennaya kozha
5:begin
vzaklinanii:=true;
end;
}

//esli popal na usipleniye
7:begin
//for ii:=round(Mag.x/60)-mag.radius to round(Mag.x/60)+mag.radius do
//for jj:=round(Mag.y/60)-mag.radius to round(Mag.y/60)+mag.radius do
// begin
// if (round(Monsters[Karta.monsters[i,j,2]].x/60)=ii)
// and (round(Monsters[Karta.monsters[i,j,2]].y/60)=jj)
// and (monsters[Karta.monsters[i,j,2]].visible=true) then
Monsters[Karta.monsters[i,j,2]].vzaklinanii:=true;
Monsters[Karta.monsters[i,j,2]].Fight:=false;
// end;
end;

//esli popal na chumu
8:begin
//for ii:=round(Mag.x/60)-mag.radius to round(Mag.x/60)+mag.radius do
//for jj:=round(Mag.y/60)-mag.radius to round(Mag.y/60)+mag.radius do
// begin
// if (round(Monsters[Karta.monsters[i,j,2]].x/60)=ii)
// and (round(Monsters[Karta.monsters[i,j,2]].y/60)=jj)
// and (monsters[Karta.monsters[i,j,2]].visible=true) then
Monsters[Karta.monsters[i,j,2]].vzaklinanii:=true;
// end;

if Monsters[Karta.monsters[i,j,2]].vzaklinanii=true then
begin
if (Monsters[Karta.monsters[i,j,2]].health>0) then
Monsters[Karta.monsters[i,j,2]].health:=round(Monsters[Karta.monsters[i,j,2]].health/4)-Player.PowerMagic;
Monsters[Karta.monsters[i,j,2]].vzaklinanii:=false;
end;

if Monsters[Karta.monsters[i,j,2]].health<=0 then
//ubivaniye monstra
begin
Player.opit:=Player.opit+50;
Karta.prohodimost[round(Monsters[Karta.monsters[i,j,2]].x/60),
round(Monsters[Karta.monsters[i,j,2]].y/60)]:=true;
Monsters[Karta.monsters[i,j,2]].Visible:=false;
Karta.predmets[round(Monsters[Karta.monsters[i,j,2]].x/60),
round(Monsters[Karta.monsters[i,j,2]].y/60)]:=937;
end;

end;

//esli popal na vudu
12:begin
//for ii:=round(Mag.x/60)-mag.radius to round(Mag.x/60)+mag.radius do
// for jj:=round(Mag.y/60)-mag.radius to round(Mag.y/60)+mag.radius do
// begin
// if (round(Monsters[Karta.monsters[i,j,2]].x/60)=ii)
// and (round(Monsters[Karta.monsters[i,j,2]].y/60)=jj)
// and (monsters[Karta.monsters[i,j,2]].visible=true) then
begin
Monsters[Karta.monsters[i,j,2]].vzaklinanii:=true;
if Monsters[Karta.monsters[i,j,2]].health>(10+Player.PowerMagic) then
Monsters[Karta.monsters[i,j,2]].health:=
Monsters[Karta.monsters[i,j,2]].health-(10+Player.PowerMagic)
else
begin
Player.opit:=Player.opit+50;
Monsters[Karta.monsters[i,j,2]].health:=0;
Monsters[Karta.monsters[i,j,2]].Visible:=false;
Karta.predmets[ii,jj]:=937;
Karta.prohodimost[ii,jj]:=true;
end;
mag.ispolzovaniye:=0;
end;
//end;

//pokaz urona
if ( (Player.powerMagic+10)>=10) and ( (Player.powerMagic+2) <100) then
begin
Pik.buf.Canvas.Draw(Monsters[Karta.monsters[i,j,2]].x-Karta.mx+20,
Monsters[Karta.monsters[i,j,2]].y-Karta.my-30,Pik.uron[round( (Player.powerMagic+2) div 10),1]);
Pik.buf.Canvas.Draw(Monsters[Karta.monsters[i,j,2]].x-Karta.mx+45,
Monsters[Karta.monsters[i,j,2]].y-Karta.my-30,Pik.uron[round( (Player.powerMagic+2) mod 10),1]);
end;

if ( (Player.powerMagic+10)>=100) and ( (Player.powerMagic+10)<1000) then
begin
Pik.buf.Canvas.Draw(Monsters[Karta.monsters[i,j,2]].x-Karta.mx,
Monsters[Karta.monsters[i,j,2]].y-Karta.my-30,Pik.uron[round( (Player.powerMagic+2) div 100),1]);
Pik.buf.Canvas.Draw(Monsters[Karta.monsters[i,j,2]].x-Karta.mx+25,
Monsters[Karta.monsters[i,j,2]].y-Karta.my-30,Pik.uron[round( (Player.powerMagic+2) mod 10),1]);
Pik.buf.Canvas.Draw(Monsters[Karta.monsters[i,j,2]].x-Karta.mx+50,
Monsters[Karta.monsters[i,j,2]].y-Karta.my-30,Pik.uron[round( (Player.powerMagic+2) mod 100),1]);
end;

end;

//esli popal na пчелиный рой
6:begin
//for ii:=round(Mag.x/60)-mag.radius to round(Mag.x/60)+mag.radius do
// for jj:=round(Mag.y/60)-mag.radius to round(Mag.y/60)+mag.radius do
// begin
/// if (round(Monsters[Karta.monsters[i,j,2]].x/60)=ii)
// and (round(Monsters[Karta.monsters[i,j,2]].y/60)=jj)
// and (monsters[Karta.monsters[i,j,2]].visible=true) then
Monsters[Karta.monsters[i,j,2]].vzaklinanii:=true;

if Monsters[Karta.monsters[i,j,2]].vzaklinanii=true then
begin
if Monsters[Karta.monsters[i,j,2]].health>0 then
begin
Monsters[Karta.monsters[i,j,2]].health:=
Monsters[Karta.monsters[i,j,2]].health-(2+Player.PowerMagic);

//pokaz urona
if (Player.powerMagic+2)<10 then
Pik.buf.Canvas.Draw(Monsters[Karta.monsters[i,j,2]].x-Karta.mx+20,
Monsters[Karta.monsters[i,j,2]].y-Karta.my-30,Pik.uron[ (Player.powerMagic+2),1]);

if ( (Player.powerMagic+2)>=10) and ( (Player.powerMagic+2) <100) then
begin
Pik.buf.Canvas.Draw(Monsters[Karta.monsters[i,j,2]].x-Karta.mx+20,
Monsters[Karta.monsters[i,j,2]].y-Karta.my-30,Pik.uron[round( (Player.powerMagic+2) div 10),1]);
Pik.buf.Canvas.Draw(Monsters[Karta.monsters[i,j,2]].x-Karta.mx+45,
Monsters[Karta.monsters[i,j,2]].y-Karta.my-30,Pik.uron[round( (Player.powerMagic+2) mod 10),1]);
end;

if ( (Player.powerMagic+2)>=100) then
begin
Pik.buf.Canvas.Draw(Monsters[Karta.monsters[i,j,2]].x-Karta.mx,
Monsters[Karta.monsters[i,j,2]].y-Karta.my-30,Pik.uron[round( (Player.powerMagic+2) div 100),1]);
Pik.buf.Canvas.Draw(Monsters[Karta.monsters[i,j,2]].x-Karta.mx+25,
Monsters[Karta.monsters[i,j,2]].y-Karta.my-30,Pik.uron[round( (Player.powerMagic+2) mod 10),1]);
Pik.buf.Canvas.Draw(Monsters[Karta.monsters[i,j,2]].x-Karta.mx+50,
Monsters[Karta.monsters[i,j,2]].y-Karta.my-30,Pik.uron[round( (Player.powerMagic+2) mod 100),1]);
end;
end

else
//ubivaniye monstra
begin
Player.opit:=Player.opit+50;
Karta.prohodimost[round(Monsters[Karta.monsters[i,j,2]].x/60),
round(Monsters[Karta.monsters[i,j,2]].y/60)]:=true;
Monsters[Karta.monsters[i,j,2]].Visible:=false;
Karta.predmets[round(Monsters[Karta.monsters[i,j,2]].x/60),
round(Monsters[Karta.monsters[i,j,2]].y/60)]:=937;
end;
vzaklinanii:=false;
end;
// end;
end;
end; //case
end; //eli monstr ne ubegayet
end; //proverka na prorisovku ikonki

//proverka zametil li monstr geroya chtobi bezhat za nim
for i:=round(Player.x/60)-6 to round(Player.x/60)+6 do
for j:=round(Player.y/60)-6 to round(Player.y/60)+6 do
begin

if (Player.Tip_oruzhiya='posoh' ) and (Posohi[Player.odezhda[11]].zaklinaniye='Ослепление')
and (Posohi[Player.odezhda[11]].DlitMin<=Posohi[Player.odezhda[11]].Dlitelnost)
and (Posohi[Player.odezhda[11]].DlitMin>=0) then
begin
star_x:=star_x;
end

else
begin
//esli geroy popal v zonu vidimosti monstra i monstr eshe s nim ne deretsya
if ((Karta.monsters[i,j,1]<>0) and (monsters[Karta.monsters[i,j,2]].fight=false)
and (monsters[Karta.monsters[i,j,2]].visible=true)
and (monsters[Karta.monsters[i,j,2]].ubezhal=false)) then
begin

if monsters[Karta.monsters[i,j,2]].health>50 then
begin
//vibor pravilnogo povorota esli monstr ne ubegayet
//esli geroy snizu
if (round(Player.x/60)=i) and (round(Player.y/60)>j) then Monsters[Karta.monsters[i,j,2]].povorot:=1;
//esli geroy sverhu
if (round(Player.x/60)=i) and (round(Player.y/60)<j) then Monsters[Karta.monsters[i,j,2]].povorot:=2;
//esli geroy sleva
if (round(Player.x/60)<i) and (round(Player.y/60)=j) then Monsters[Karta.monsters[i,j,2]].povorot:=3;
//esli geroy sprava
if (round(Player.x/60)>i) and (round(Player.y/60)=j) then Monsters[Karta.monsters[i,j,2]].povorot:=4;
//esli geroy snizu sleva
if (round(Player.x/60)<i) and (round(Player.y/60)>j) then Monsters[Karta.monsters[i,j,2]].povorot:=5;
//esli geroy snizu sprava
if (round(Player.x/60)>i) and (round(Player.y/60)>j) then Monsters[Karta.monsters[i,j,2]].povorot:=6;
//esli geroy sverhu sleva
if (round(Player.x/60)<i) and (round(Player.y/60)<j) then Monsters[Karta.monsters[i,j,2]].povorot:=7;
//esli geroy sverhu sprava
if (round(Player.x/60)>i) and (round(Player.y/60)<j) then Monsters[Karta.monsters[i,j,2]].povorot:=8;
end;

//proverka obichnogo obzora pri popavshey strele
if (abs(monsters[Karta.monsters[i,j,2]].x-Player.x)<=180 )
and ( abs(monsters[Karta.monsters[i,j,2]].y-Player.y)<=180)
//and ( monsters[Karta.monsters[i,j,2]].Podstrelil=false )
then
monsters[Karta.monsters[i,j,2]].Go:=true;

//proverka rashirennogo obzora pri popavshey strele
if ( (abs(monsters[Karta.monsters[i,j,2]].x-Player.x)>180 )
and ( monsters[Karta.monsters[i,j,2]].Podstrelil=true ) )
or ( ( abs(monsters[Karta.monsters[i,j,2]].y-Player.y)>180)
and ( monsters[Karta.monsters[i,j,2]].Podstrelil=true ) ) then
monsters[Karta.monsters[i,j,2]].Go:=true;
end;

monsters[Karta.monsters[i,j,2]].Pohodil:=false;

//proverka kuda monstru bezhat za geroyem
if (monsters[Karta.monsters[i,j,2]].Go=true) and (monsters[Karta.monsters[i,j,2]].visible=true)
and (monsters[Karta.monsters[i,j,2]].ubeganiye=false) then
begin

//bezhat li vlevo
if (round(Player.x/60)<round(Monsters[Karta.monsters[i,j,2]].x/60))
and (Karta.prohodimost[i-1,j]=true)
and (round(Magmonstr.x)<>(i-1)) and (round(Magmonstr.y/60)<>j)
and (round(player.x+59)<round(Monsters[Karta.monsters[i,j,2]].x))
//and (Monsters[Karta.monsters[i,j,2]].health>50)
then
begin
//prisvoeniye nomera i tipa rassmatrivaemogo monstra
star_nomer:=Karta.monsters[i,j,2];
star_monstr:=Karta.monsters[i,j,1];
star_x:=Monsters[Karta.monsters[i,j,2]].x;
star_y:=Monsters[Karta.monsters[i,j,2]].y;

//izmeneniye koordinat monstra
if (mag.ispolzovaniye=0) or (mag.ispolzovaniye=9) or (mag.ispolzovaniye=10)
or (mag.ispolzovaniye=5) or (mag.ispolzovaniye=2) then
Monsters[Karta.monsters[i,j,2]].x:=
Monsters[Karta.monsters[i,j,2]].x-Monsters[Karta.monsters[i,j,2]].speed;

if mag.ispolzovaniye=4 then
Monsters[Karta.monsters[i,j,2]].x:=
Monsters[Karta.monsters[i,j,2]].x-round(Monsters[Karta.monsters[i,j,2]].speed/2);

//obnuleniye starih dannih
Karta.prohodimost[round(star_x/60),round(star_y/60)]:=true;
Karta.monsters[i,j,2]:=0;
Karta.monsters[i,j,1]:=0;

//prisvoyeniye novih dannih
Karta.monsters[round(Monsters[star_nomer].x/60),round(Monsters[star_nomer].y/60),1]:=star_monstr;
Karta.monsters[round(Monsters[star_nomer].x/60),round(Monsters[star_nomer].y/60),2]:=star_nomer;
if Monsters[Karta.monsters[i,j,2]].health>0 then
Karta.prohodimost[round(Monsters[Karta.monsters[i,j,2]].x/60),round(Monsters[Karta.monsters[i,j,2]].y/60)]:=false;

monsters[Karta.monsters[i,j,2]].Pohodil:=true;
end;

//bezhat li vpravo
if (round(Player.x/60)>round(Monsters[Karta.monsters[i,j,2]].x/60))
and (Karta.prohodimost[i+1,j]=true) and (round(Magmonstr.x)<>(i+1)) and (round(Magmonstr.y/60)<>j)
and (round(player.x)>round(Monsters[Karta.monsters[i,j,2]].x+59)) and (monsters[Karta.monsters[i,j,2]].pohodil=false)
//and (Monsters[Karta.monsters[i,j,2]].health>50)
then
begin
//prisvoeniye nomera i tipa rassmatrivaemogo monstra
star_nomer:=Karta.monsters[i,j,2];
star_monstr:=Karta.monsters[i,j,1];
star_x:=Monsters[Karta.monsters[i,j,2]].x;
star_y:=Monsters[Karta.monsters[i,j,2]].y;
Monsters[Karta.monsters[i,j,2]].number:=2;
//izmeneniye koordinat monstra

if (mag.ispolzovaniye=0) or (mag.ispolzovaniye=9) or (mag.ispolzovaniye=10)
or (mag.ispolzovaniye=5) or (mag.ispolzovaniye=2) then
Monsters[Karta.monsters[i,j,2]].x:=
Monsters[Karta.monsters[i,j,2]].x+Monsters[Karta.monsters[i,j,2]].speed;

if mag.ispolzovaniye=4 then
Monsters[Karta.monsters[i,j,2]].x:=
Monsters[Karta.monsters[i,j,2]].x+round(Monsters[Karta.monsters[i,j,2]].speed/2);

//obnuleniye starih dannih
Karta.prohodimost[round(star_x/60),round(star_y/60)]:=true;
Karta.monsters[i,j,2]:=0;
Karta.monsters[i,j,1]:=0;

//prisvoyeniye novih dannih
Karta.monsters[round(Monsters[star_nomer].x/60),round(Monsters[star_nomer].y/60),1]:=star_monstr;
Karta.monsters[round(Monsters[star_nomer].x/60),round(Monsters[star_nomer].y/60),2]:=star_nomer;
if Monsters[Karta.monsters[i,j,2]].health>0 then
Karta.prohodimost[round(Monsters[Karta.monsters[i,j,2]].x/60),round(Monsters[Karta.monsters[i,j,2]].y/60)]:=false;

monsters[Karta.monsters[i,j,2]].Pohodil:=true;
end;

//bezhat li vverh
if (round(Player.y/60)<round(Monsters[Karta.monsters[i,j,2]].y/60))
and (Karta.prohodimost[i,j-1]=true) and (round(Magmonstr.x)<>i) and (round(Magmonstr.y/60)<>(j-1))
and (round(player.y+59)<round(Monsters[Karta.monsters[i,j,2]].y))and (monsters[Karta.monsters[i,j,2]].pohodil=false)
then
begin
//prisvoeniye nomera i tipa rassmatrivaemogo monstra
star_nomer:=Karta.monsters[i,j,2];
star_monstr:=Karta.monsters[i,j,1];
star_x:=Monsters[Karta.monsters[i,j,2]].x;
star_y:=Monsters[Karta.monsters[i,j,2]].y;

//izmeneniye koordinat monstra
if (mag.ispolzovaniye=0) or (mag.ispolzovaniye=9) or (mag.ispolzovaniye=10)
or (mag.ispolzovaniye=5) or (mag.ispolzovaniye=2) then
Monsters[Karta.monsters[i,j,2]].y:=
Monsters[Karta.monsters[i,j,2]].y-Monsters[Karta.monsters[i,j,2]].speed;

if (mag.ispolzovaniye=4) then
Monsters[Karta.monsters[i,j,2]].y:=
Monsters[Karta.monsters[i,j,2]].y-round(Monsters[Karta.monsters[i,j,2]].speed/2);

//obnuleniye starih dannih
Karta.prohodimost[round(star_x/60),round(star_y/60)]:=true;
Karta.monsters[i,j,2]:=0;
Karta.monsters[i,j,1]:=0;

//prisvoyeniye novih dannih
Karta.monsters[round(Monsters[star_nomer].x/60),round(Monsters[star_nomer].y/60),1]:=star_monstr;
Karta.monsters[round(Monsters[star_nomer].x/60),round(Monsters[star_nomer].y/60),2]:=star_nomer;
if Monsters[Karta.monsters[i,j,2]].health>0 then Karta.prohodimost[round(Monsters[Karta.monsters[i,j,2]].x/60),round(Monsters[Karta.monsters[i,j,2]].y/60)]:=false;

monsters[Karta.monsters[i,j,2]].Pohodil:=true;
end;

//bezhat li vniz
if (round(Player.y/60)>round(Monsters[Karta.monsters[i,j,2]].y/60))
and (Karta.prohodimost[i,j+1]=true) and (round(Magmonstr.x)<>i) and (round(Magmonstr.y/60)<>(j+1))
and (round(player.y+59)>round(Monsters[Karta.monsters[i,j,2]].y))and (monsters[Karta.monsters[i,j,2]].pohodil=false)
then
begin
//prisvoeniye nomera i tipa rassmatrivaemogo monstra
star_nomer:=Karta.monsters[i,j,2];
star_monstr:=Karta.monsters[i,j,1];
star_x:=Monsters[Karta.monsters[i,j,2]].x;
star_y:=Monsters[Karta.monsters[i,j,2]].y;

//izmeneniye koordinat monstra
if (mag.ispolzovaniye=0) or (mag.ispolzovaniye=9) or (mag.ispolzovaniye=10)
or (mag.ispolzovaniye=5) or (mag.ispolzovaniye=2) then
Monsters[Karta.monsters[i,j,2]].y:=
Monsters[Karta.monsters[i,j,2]].y+Monsters[Karta.monsters[i,j,2]].speed;

if (mag.ispolzovaniye=4) then
Monsters[Karta.monsters[i,j,2]].y:=
Monsters[Karta.monsters[i,j,2]].y+round(Monsters[Karta.monsters[i,j,2]].speed/2);

//obnuleniye starih dannih
Karta.prohodimost[round(star_x/60),round(star_y/60)]:=true;
Karta.monsters[i,j,2]:=0;
Karta.monsters[i,j,1]:=0;

//prisvoyeniye novih dannih
Karta.monsters[round(Monsters[star_nomer].x/60),round(Monsters[star_nomer].y/60),1]:=star_monstr;
Karta.monsters[round(Monsters[star_nomer].x/60),round(Monsters[star_nomer].y/60),2]:=star_nomer;
if Monsters[Karta.monsters[i,j,2]].health>0 then Karta.prohodimost[round(Monsters[Karta.monsters[i,j,2]].x/60),round(Monsters[Karta.monsters[i,j,2]].y/60)]:=false;

monsters[Karta.monsters[i,j,2]].Pohodil:=true;
end;

end;

end;

end;

//obnuleniye vseh monstrov v nachale
for zz:=1 to 500 do
if (Monsters[zz].health>0) and ( Round(Monsters[zz].x/60)>=Abs(opt.vidX-round(Player.x/60) ) )
and (Round(Monsters[zz].x/60)>=Abs(opt.vidY-round(Player.y/60) ) ) then
begin
//Monsters[zz].Go:=false;
//obnovleniye shkali zhizney monstrov
Pik.buf.Canvas.Pen.Color:=clred;
Pik.buf.Canvas.Pen.Width:=5;
Pik.buf.Canvas.MoveTo(Monsters[zz].x-Karta.mx,Monsters[zz].y-Karta.my);
Pik.buf.Canvas.LineTo(Monsters[zz].x-Karta.mx+Monsters[zz].health,Monsters[zz].y-Karta.my);
Monsters[zz].ubeganiye:=false;
if (abs(Monsters[zz].x-Player.x)>120) or (abs(Monsters[zz].y-Player.y)>120)
then
begin
Monsters[zz].ubezhal:=false;
Monsters[zz].BegPrioritet:=0;
end;
end;

end;
Категория: Игровые алгоритмы | Добавил: Armageddets (07.01.2013)
Просмотров: 1183 | Теги: процедура обработки монстров | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш опрос
Какие уроки по созданию игр Вам удобнее?
Всего ответов: 141
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0