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

Arkanoid, tworzenie cegieł operatorem new

Mały hosting, OGROMNE możliwości
0 głosów
502 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ź 436 wizyt
pytanie zadane 30 stycznia 2017 w C i C++ przez jakobosik Początkujący (340 p.)
0 głosów
1 odpowiedź 315 wizyt
–2 głosów
1 odpowiedź 610 wizyt

93,715 zapytań

142,629 odpowiedzi

323,260 komentarzy

63,257 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...