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

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;
}
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?

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ą.

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.

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.

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;
	}
}
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 :]

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ę

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