• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Arkanoid, tworzenie cegieł operatorem new

Object Storage Arubacloud
0 głosów
235 wizyt
pytanie zadane 7 października 2016 w C i C++ przez sagan47 Nowicjusz (140 p.)

Witam,

Mam pytanie, jestem na etapie robienia gry arkanoid, postanowiłem jednak że cegiełki będą tworzone operatorem new. Wszystko fajnie ale przy kontakcie piłki z cegiełką nie chce ona zniknąć. Co dziwne właściwość Visible jest zmieniana na false tzn po sprawdzeniu IF Visible cegełki zniszczone zwracają fałsz ale są dalej widoczne.

class field
{
public:
int sx,sy;              //SIZE, HOW MANY BRICKS HORIZONTAL AND VERTICAL
int offsetx, offsety;   //OFFSET OF ORIGIN FROM 0,0 IN PIXELS
brick * bp;             //POINTER TO TABEL OF BRICKS
field(int xx=15,int yy=6);
};
//////////////////////////////////
field :: field(int xx,int yy)  : sx(xx), sy(yy), offsetx(60), offsety(60)
{
   bp = new brick[xx*yy];
   for(int i=0; i<sy; i++)
   {
      for(int j=0; j<sx; j++)
      {
       bp[(j*sy)+i].x = j;
       bp[(j*sy)+i].y = i;
       bp[(j*sy)+i].seturslf(offsetx, offsety);

      }
   }
}
//////////////////////////////////////////
class brick
{
   static int sizex, sizey;

public:
  int x,y;
  TImage * pic;

  brick(int x=0, int y=0);
  void seturslf(int ofx, int ofy);
  void change();
  //bool collision();
};
///////////////////////////////////////////
void brick :: seturslf(int offx, int offy)
{
   pic->Top = y*sizey+offy;
   pic->Left = x*sizex+offx;
   pic->Transparent=true;
   pic->Picture->LoadFromFile("img/brick.bmp");
}
/////////////////////////////////////////////
 void brick :: change()
 {
    //pic->Picture->LoadFromFile("img/ball.bmp");
    pic->Visible=false;
    pic->Enabled=false;
 }
////////////////////////////////////////////   MAIN
 for(int i=0; i<(hmx*hmy); i++)
 {
     if(collision(ball, area.bp[i].pic) && area.bp[i].pic->Visible==true)
       {
       x=-x;
       y=-y;
       //area.bp[i].pic->Visible=false;
       //Image1->Picture->LoadFromFile("img/ball.bmp");
       //area.bp[i].pic->Picture->LoadFromFile("img/ball.bmp");
       area.bp[i].change();
       }
 }

Jak widać mamy klasę field odpowiedzialną za stworzenie cegieł swoim konstruktorem.

Potem klasa cegła która ma w sobie obiekt TImage.

Funkcją seturslf nastawiam pokolei cegiełki (konkretniej obrazek w nich).

Funkcja change ma za zadanie wyłączyć cegłe czyli dokonać w niej zmiany parametru Visible.

Potem w mainie sprawdzam kolizję i warunek widoczności oraz wykonuję operację odbicia i zmiany.

No i niestety zmiana Visible nie powoduje zniknięcia cegły. Jeżeli ktoś ma jakiś pomysł to bardzo proszę o pomoc. Obawiam się że może być to wina samego kompilatora.

komentarz 7 października 2016 przez maly Nałogowiec (37,190 p.)

Potem w mainie sprawdzam kolizję

Aplikacja z formatką nie ma maina.

Obawiam się że może być to wina samego kompilatora.

Builder aż tak zdupcony nie jest.

komentarz 7 października 2016 przez sagan47 Nowicjusz (140 p.)

Aplikacja z formatką nie ma maina.

Miałem na myśli funkcję Timera w której rozgrywa się wszystko, nie main.

Builder aż tak zdupcony nie jest.

To może jakaś sugestia?

1
komentarz 7 października 2016 przez maly Nałogowiec (37,190 p.)
Trudno stwierdzić co jest nie tak z tak małą ilością kodu, poza tym tworzenie gierki w Builderze to słaby pomysł.
komentarz 7 października 2016 przez niezalogowany
offtopując to nawet kiedyś wrzucałem tekst o gamedevie i builderze: http://forum.pasja-informatyki.pl/147265/borland-cpp-builder-6-a-pisanie-gier?show=147265#q147265
komentarz 7 października 2016 przez sagan47 Nowicjusz (140 p.)

Wyłączam widoczność taką instrukcją:

area.bp[i].change();

gdzie area to obiekt klasy field i zawiera tablicę wskaźników do elementów klasy brick (tworzoną operatorem new) która z kolei zawiera TImage.

area.bp[i].pic->Visible=false;

taka instrukcja bezpośrednio na wskaźnik do TImage - pic, też nie działa. Jak przyjdę z pracy to mogę wrzucić cały kod. Dziwne bo tą samą instrukcją moge zmieniać widoczność danej cegiełki z funkcji OnCreate, która startuje na początku, ale nie mogę tego zrobić z funkcji Timera

Wiem że tworzenie gier w builderze nie jest optymalne, ale nie chodzi mi tu o grywalność, ale o przećwiczenie klas i być może dziedziczenia z polimorfizmem.

 

komentarz 7 października 2016 przez sagan47 Nowicjusz (140 p.)
edycja 7 października 2016 przez sagan47
​
//DECLARATION
bool collision(TImage *b, TImage *p);

//GLOBAL
 int x=-8,y=-8;   //moving vector
 TImage * point;
 int hmx = 15, hmy = 5; //HOW MUCH BRICKS
 field area;
 field * arp;

void __fastcall TForm1::Timer_ballTimer(TObject *Sender)
{
//MOVING
  ball->Left += x;
  ball->Top += y;
//BOUNCING FROM ENGE
  if(ball->Left <= bg->Left) x=-x;          //bounce the ball from left edge
  if(ball->Left+ball->Width >= bg->Width) x=-x;    //bounce the ball from right edge
  if(ball->Top <= bg->Top) y=-y;            //bounce the ball from top edge
//LOSING
  if(ball->Top + ball->Height >= pad->Top + pad->Height+60)
     {
     Timer_ball->Enabled=false;
     ball->Visible=false;
     }
//BOUNCING FROM PADDLE
  else if(ball->Left + ball->Width/2 > pad->Left && ball->Left + ball->Width/2 < pad->Left + pad->Width &&
          ball->Top + ball->Height >= pad->Top && ball->Top + ball->Height <= pad->Top +8 )
       {
       if(y>0) y=-y;
       }
  else if(ball->Left + ball->Width > pad->Left && ball->Left < pad->Left + pad->Width &&
          ball->Top + ball->Height >= pad->Top+ pad->Height/2 && ball->Top + ball->Height <= pad->Top + pad->Height )
       {
       if(y>0) y=-y;
       x=-x;
       }
//CHECKING COLLISION
 for(int i=0; i<(hmx*hmy); i++)
 {
     if(collision(ball, area.bp[i].pic) && area.bp[i].pic->Visible==true)
       {
       x=-x;
       y=-y;
       //area.bp[i].pic->Visible=false;
       //Image1->Picture->LoadFromFile("img/ball.bmp");
       //area.bp[i].pic->Picture->LoadFromFile("img/ball.bmp");
       area.bp[i].change();
       }
 }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::leftTimer(TObject *Sender) //CONTROLING LEFT
{
    if(pad->Left > bg->Left+10) pad->Left -= 10;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::rightTimer(TObject *Sender)//CONTROLING RIGHT
{
    if(pad->Left+pad->Width < bg->Width-10)pad->Left += 10;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,  //CONTROLING STOP LEFT
      TShiftState Shift)
{
        if(Key == VK_LEFT) left->Enabled = true;
        if(Key == VK_RIGHT) right->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,  //CONTROLING STOP RIGHT
      TShiftState Shift)
{
        if(Key == VK_LEFT) left->Enabled = false;
        if(Key == VK_RIGHT) right->Enabled = false;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Form1->Width=(hmx*60+2*60);
    field area(hmx, hmy);
    arp=&area;
    //arp->bp[0].pic->Visible=false;
    //area.bp[0].pic->Picture->LoadFromFile("img/ball.bmp");
    area.bp[5].pic->Visible=false;  ///////////////////////////tu działa

}
//---------------------------------------------------------------------------

bool collision(TImage *b, TImage *p)
{
   if(b->Left >= p->Left - b->Width &&
      b->Left <= p->Left + p->Width &&
      b->Top >= p->Top - b->Height &&
      b->Top <= p->Top + p->Height)
      {
         return true;
      }
   else return false;
}

Oto cały kod z Unit1. w unit2 i 3 są klasy.

 

///////////////////////////////////////////////////

 

Okej udało się, musiałem uczynić obiekt area składnikiem klasy TForm1.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 340 wizyt
pytanie zadane 30 stycznia 2017 w C i C++ przez jakobosik Początkujący (340 p.)
0 głosów
1 odpowiedź 187 wizyt
–2 głosów
1 odpowiedź 289 wizyt

92,568 zapytań

141,424 odpowiedzi

319,629 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...