Problem z grą typu Agar.io dla dwóch osób z wykorzystaniem biblioteki winbgim.

Odpowiedz Nowy wątek
2019-04-23 10:31
0

Mam problem z grą typu Agar.io dla dwóch osób w konsoli graficznej. Podczas kompilacji nie pojawia się żaden błąd, jednakże podczas najechania kulki z class'y BALL na jedną z kulek z class'y BALLS zmienna masa w class'ie BALL się nie zmienia (w obydwu kulkach, którymi sterują gracze). Miejsca w kodzie, które wg. mnie mogą za to odpowiadać zaznaczyłem znakami zapytania, możliwe jest jednak, że chodzi o coś innego.

Moje środowisko to Dev-C++.
System operacyjny to Windows 10.

Za pomoc z góry dziękuje!

#include <winbgim.h>    
#include <time.h>
#include <stdlib.h>
#include <stdio.h>      

class BALL 
{
private:
    float v;
    int r,x,y;
    int mass;
    int rk,gk,bk;
public:
    BALL();
    void move1();
    void move2();
    void draw();
    void setmassr();
    int rx();
    int ry();
    int rr();
    int rm();
    };

BALL::BALL() 
{
    mass=100;
    r=mass/2;
    x=50+rand()%1230;
    y=r+rand()%(720-2*r);
    rk=34+rand()%221;
    gk=34+rand()%221;
    bk=34+rand()%221;
    v=100/mass;
}

int BALL::rm()
{
    return mass;
}
//////////////////////////////////////////////////////
?????????????????????????????
void BALL::setmassr()
{
    mass+=5;
    r++;
}
??????????????????????????????
////////////////////////////////////////////////////////////
int BALL::rr()
{
    return r;
}

int BALL::rx()
{
    return x;
}

int BALL::ry()
{
    return y;
}

void BALL::move1()
{
    v=200/mass;
    if(mass>200) v=1;
    //poruszanie WSAD
    if(GetAsyncKeyState(0x41) & 0x8000)x-=v;
    if(GetAsyncKeyState(0x44) & 0x8000)x+=v;
    if(GetAsyncKeyState(0x57) & 0x8000)y-=v;
    if(GetAsyncKeyState(0x53) & 0x8000)y+=v;
    if(x<0+r) x=0+r;
    if(x>1280-r) x=1280-r;
    if(y<0+r) y=0+r;
    if(y>720-r) y=720-r;
}

void BALL::move2()
{
    v=200/mass;
    if(mass>200) v=1;
    //poruszanie strzałki
    if(GetAsyncKeyState(VK_LEFT) & 0x8000)x-=v;
    if(GetAsyncKeyState(VK_RIGHT) & 0x8000)x+=v;
    if(GetAsyncKeyState(VK_UP) & 0x8000)y-=v;
    if(GetAsyncKeyState(VK_DOWN) & 0x8000)y+=v;
    if(x<0+r) x=0+r;
    if(x>1280-r) x=1280-r;
    if(y<0+r) y=0+r;
    if(y>720-r) y=720-r;
}

void BALL::draw()
{
    setcolor(COLOR(rk,gk,bk));
    setfillstyle(SOLID_FILL,COLOR(rk,gk,bk));
    fillellipse(x,y,r,r);
}
///////////////////////////////////////////////////////////////////////////////////////////
class BALLS
{
private:
    bool show;
    int x,y;
    int r,g,b;
public:
    BALLS();
    void draw();
    void check(BALL);
};

BALLS::BALLS()
{
    show=true;
    x=10+rand()%1260;
    y=10+rand()%700;
    r=34+rand()%221;
    g=34+rand()%221;
    b=34+rand()%221;
}
////////////////////////////////////////////////////////////////////////////////////////////////
??????????????????????????????????????????????
void BALLS::check(BALL b)
{
    if((x>b.rx()-b.rr())&&(x<b.rx()+b.rr())&&(y>b.ry()-b.rr())&&(y<b.ry()+b.rr())&&(show==true))
    {
        b.setmassr();
        show=false;
    }
}
?????????????????????????????????????????????
///////////////////////////////////////////////////////////////////////////////////////////
void BALLS::draw()
{
    if(show==true)
    {
        setfillstyle(SOLID_FILL,COLOR(r,g,b));
        setcolor(COLOR(r,g,b));
        fillellipse(x,y,5,5);
    }
}
/////////////////////////////////////////////////////////////////////////////////////////////
int main() 
{
    srand(time(0));
    initwindow(1280,720);

    BALL b[2];
    BALLS bs[500];
    char buff[40];

    int page=1;

    while(1) 
    {
        b[0].move1();
        b[1].move2();
        for(int j=0;j<2;j++)
        {
            for(int i=0;i<500;i++)
            {
                bs[i].check(b[j]);
                bs[i].draw();
            }
        }
        for(int i=0;i<2;i++)
        {
            b[i].draw();
        }

        sprintf(buff,"mass: %i \n r: %i",b[0].rm(),b[0].rr());

        outtextxy(20,50,buff);

        delay(1);

        setactivepage(page);
        setvisualpage(1-page);
        page=1-page;
        cleardevice();

    }

    getch();
    return 0;
}
edytowany 1x, ostatnio: Rekar, 2019-04-23 10:32

Pozostało 580 znaków

2019-04-23 10:42
0
    if((x>b.rx()-b.rr())&&(x<b.rx()+b.rr())&&(y>b.ry()-b.rr())&&(y<b.ry()+b.rr())&&(show==true))
    {
        b.setmassr();

Czy na pewno kiedykolwiek wchodzi w tego ifa?


((0b10*0b11*(0b10**0b101-0b10)**0b10+0b110)**0b10+(100-1)**0b10+0x10-1).toString(0b10**0b101+0b100);

Pozostało 580 znaków

2019-04-23 10:47
0
LukeJL napisał(a):
    if((x>b.rx()-b.rr())&&(x<b.rx()+b.rr())&&(y>b.ry()-b.rr())&&(y<b.ry()+b.rr())&&(show==true))
    {
        b.setmassr();

Czy na pewno kiedykolwiek wchodzi w tego ifa?

Wchodzi, ponieważ gdy gracz najeżdża na kulki, one znikają.

Pozostało 580 znaków

2019-04-23 10:49
0

Jeśli nie jesteś pewien - debugger jest Twoim przyjacielem :)

Czasem ustawienie paru breakpointów i wykonanie kodu krok po kroku jest warte więcej niż dziesiątki godzin patrzenia się w kod.


Prosząc o pomoc w wiadomości prywatnej odbierasz sobie szansę na otrzymanie pomocy od kogoś bardziej kompetentnego :)

Pozostało 580 znaków

2019-04-23 11:23
1

Zmień na

void BALLS::check(const BALL& b)
{
    if((x>b.rx()-b.rr())&&(x<b.rx()+b.rr())&&(y>b.ry()-b.rr())&&(y<b.ry()+b.rr())&&(show==true))
    {
        b.setmassr();
        show=false;
    }
}

gdyż teraz modyfikujesz lokalną kopię, która przestaje istnieć po wyjściu z funkcji.
Musisz jeszcze zmodyfikować funkcje składowe rx(), ry(), rx() dodając const.

Pozostało 580 znaków

2019-04-23 18:48
0
TomaszLiMoon napisał(a):

Zmień na

void BALLS::check(const BALL& b)
{
    if((x>b.rx()-b.rr())&&(x<b.rx()+b.rr())&&(y>b.ry()-b.rr())&&(y<b.ry()+b.rr())&&(show==true))
    {
        b.setmassr();    //tu jest błąd
        show=false;
    }
}

gdyż teraz modyfikujesz lokalną kopię, która przestaje istnieć po wyjściu z funkcji.
Musisz jeszcze zmodyfikować funkcje składowe rx(), ry(), rx() dodając const.

Zrobiłem tak jak mówisz, jednak teraz wyskakuje mi podczas kompilacji błąd " [Error] passing 'const BALL' as 'this' argument of 'void BALL::setmassr()' discards qualifiers [-fpermissive]"

class BALL 
{
private:
    float v;
    int r,x,y;
    int mass;
    int rk,gk,bk;
public:
    BALL();
    void move1();
    void move2();
    void draw();
    void setmassr();
    int rx() const;
    int ry() const;
    int rr() const;
    int rm();
    };

BALL::BALL() 
{
    mass=100;
    r=mass/2;
    x=50+rand()%1230;
    y=r+rand()%(720-2*r);
    rk=34+rand()%221;
    gk=34+rand()%221;
    bk=34+rand()%221;
    v=100/mass;
}

int BALL::rm()
{
    return mass;
}
//////////////////////////////////////////////////////
void BALL::setmassr()
{
    mass+=5;
    r++;
}
////////////////////////////////////////////////////////////
int BALL::rr() const
{
    return r;
}

int BALL::rx() const
{
    return x;
}

int BALL::ry() const
{
    return y;
}

////////////////////////////////////////////////////////////////////////////////////////////////
void BALLS::check(const BALL b)
{
    if((x>b.rx()-b.rr())&&(x<b.rx()+b.rr())&&(y>b.ry()-b.rr())&&(y<b.ry()+b.rr())&&(show==true))
    {
        b.setmassr();
        show=false;
    }
}
edytowany 3x, ostatnio: Rekar, 2019-04-23 18:50

Pozostało 580 znaków

2019-04-23 18:54
1
Rekar napisał(a):

Zrobiłem tak jak mówisz, jednak teraz wyskakuje mi podczas kompilacji błąd " [Error] passing 'const BALL' as 'this' argument of 'void BALL::setmassr()' discards qualifiers [-fpermissive]"

void BALLS::check(const BALL b)
{
  if((x>b.rx()-b.rr())&&(x<b.rx()+b.rr())&&(y>b.ry()-b.rr())&&(y<b.ry()+b.rr())&&(show==true))
  {
      b.setmassr();
      show=false;
  }
}

No wiesz, jak coś jest const to raczej nie powinno się tego modyfikować, kompilator słusznie krzyczy :]


Prosząc o pomoc w wiadomości prywatnej odbierasz sobie szansę na otrzymanie pomocy od kogoś bardziej kompetentnego :)

Pozostało 580 znaków

2019-04-24 09:34
0

Użyj bez const

void BALLS::check(BALL& b)
{
    if((x>b.rx()-b.rr())&&(x<b.rx()+b.rr())&&(y>b.ry()-b.rr())&&(y<b.ry()+b.rr())&&(show==true))
    {
        b.setmassr();    
        show=false;
    }
}

i pamiętaj aby argument b był przekazywany przez referencję

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0