Czesc,
piszę prosty program w C++ Builder,. Program to symulacja zagrody z owcami i wpuszczamy do niej wilka, który zjada napotkane owce. Mam problem z tym, że nie działają linie odpowiadające za znikanie owiec. Dopiero uczę się uczę się wykorzystywania wskaźników i funkcji wirtualnych. Z góry dziękuję bardzo za pomoc!
Wilk - duży obiekt typu TShape, kwadrat
Owca- mały obiekt typu TShape, kwadrat
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define Sx 400
#define Sy 300
#define N 50
bool spotkanie(TShape *owca, TShape *wilk)
{
if (owca->Left >= wilk->Left-owca->Width &&
owca->Left <= wilk->Left+owca->Width &&
owca->Top >= wilk->Top-owca->Width &&
owca->Top >= wilk->Top+owca->Width)
{
return true;
}
else return false;
}
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
class Zwierze //klasa abstrakcyjna
{
public:
int x0,y0, vx,vy;
double masa,q;
virtual void ruch() =0;
virtual void smierc()=0;
};
//KLASA OWCA////////////////////////////////////////
class Owca:public Zwierze
{
public:
TShape *ksz_o;
virtual void ruch()
{
x0+=vx;
y0+=vy;
if(x0>=Sx) { vx=-vx; x0=Sx-1; }
if(x0<0) { vx=-vx; x0=0; }
if(y0>=Sy) { vy=-vy; y0=Sy-1; }
if(y0<0) { vy=-vy; y0=0; }
ksz_o->Left=x0;
ksz_o->Top=y0;
}
virtual void smierc() //ginie gdy trafi na wilka
{
if(spotkanie(ksz_o, ksz_w))ksz_o->Visible=false; // znikanie kwadracika(owcy), gdy napotka wilka
}
Owca() //konstruktor owcy
{
x0=random(Sx);
y0=random(Sy);
while( (vx=random(7)-3)==0);
while( (vy=random(7)-3)==0);
ksz_o=new TShape(Form1);
ksz_o->Parent=Form1;
ksz_o->Left=x0;
ksz_o->Top=y0;
ksz_o->Width=10;
ksz_o->Height=10;
ksz_o->Visible=true;
ksz_o->Shape=stSquare;
}
~Owca(void);//
};
//KLASA WILK////////////////////////////////////////
class Wilk:public Zwierze
{
public:
TShape *ksz_w;
virtual void ruch()
{
x0+=vx;
y0+=vy;
if(x0>=Sx) { vx=-vx; x0=Sx-1; }
if(x0<0) { vx=-vx; x0=0; }
if(y0>=Sy) { vy=-vy; y0=Sy-1; }
if(y0<0) { vy=-vy; y0=0; }
ksz_w->Left=x0;
ksz_w->Top=y0;
}
virtual void smierc(void);
Wilk() //konstruktor wilka
{
x0=random(Sx);
y0=random(Sy);
vx=20;
vy=20;
ksz_w=new TShape(Form1);
ksz_w->Parent=Form1;
ksz_w->Left=x0;
ksz_w->Top=y0;
ksz_w->Width=50;
ksz_w->Height=50;
ksz_w->Visible=true;
ksz_w->Shape=stSquare;
}
~Wilk(void);
};
Owca *to;
Wilk *tw;
Owca::~Owca()
{
}
Wilk::~Wilk()
{
}
void Wilk::smierc()
{
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
tw->ruch();
tw->smierc();
to->ruch();
to->smierc();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
tw = new Wilk;
to = new Owca;
Timer1->Enabled = 1;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------