Skocz do zawartości

GM'owe "bounce" w C++


Rekomendowane odpowiedzi

Opublikowano

Hej, mam taki kod:

void Odbij()    //Funkcja odbijania piłki
{
    randomize();    //Losowość
    int from=20;    //Ustaw zakres
    rands=random(from*2)-from;    //Losuj losową liczbę w przedziale od -20 do 20
    ball->direction+=180+(ball->direction*2)+rands;    //Odbijanie z losowym współczynnikiem
}

Problem mam z tą funkcją ponieważ nie zawsze działa jak należy, "świruje" itd.

Zmienna ball->direction i ball->speed działają tak ja w GM (mój patent) ale coś napisanie odpowiednika dla GM'owego "bounce" mi nie wychodzi :sp_ike:

Opublikowano

GMowe bounce dziala na zasadzie kolizji masek. sprawdza ksztalt i na jego podstawie wylicza wektor normalny i wektor odbicia. a ze Ty masz obiekty jako kulki to latwo znajdziesz wektor normalny (jest on przedluzeniem promienia, przecinajacym sie z punktem gdzie nastapila kolizja na okregu kulki), wzor na wektor odbicia znajdziesz w sieci, nawet chyba pod pierwszym linkiem w googlach :)

 

(mój patent)

sprowadzę Cię na ziemię i powiem - nie ;p

Opublikowano

no wlasnie nie jest to takie jak oczekiwales :P

Opublikowano

R=I-2N(dot(N,I));

N-normalna

I-promień padania

 

Mój błąd, żadnego L tam nie ma.

 

vec3 reflect(vec3 I,vec3 N)//wektor n powinien być znormlizowany

{

return I-2.0f*N*dot(N,I);

{

 

float dot(vec3 v1,vec3 v2)

{

return v1.x*v2.x+v1.y*v2.y+v1.z*v2.z;

}

Opublikowano

to mnoz tylko 2 pierwsze: X i Y, Z w tym przypadku bedzie zawsze rowne 0

 

float dot(vec2 v1,vec2 v2)

{

return v1.x*v2.x+v1.y*v2.y

};

Opublikowano

sam mozesz je sobie zrobic. Korzysci z obiektowosci.

 

struct vec2

{

float x;

float y;

};

Opublikowano

OMG dobra, to łatwiejsze niż myślałem :P

Wiesz Vec kojarzy mi się z wektorem, takim co ma pkt. zaczepienia kierunek, wartość i inne syfy :P

 

Ale skoro I to promień padania, to jak mam go wyrazić w X i Y?

Opublikowano

generalnie kierunki lepiej trzymac w wektorach.

zawsze konwertuj kierunki obrotu na wektory za pomoca lengthdirs.

 

vec2 kierunek;

kierunek.x=lengthdir_x(direction,1);

kierunek.y=lengthdir_y(direction,1);

Opublikowano

Czekaj, uaktualnie mój cudowny kod:

struct vec2
{
float x;
float y;
};

vec2 reflect(vec2 I,vec2 N)
{
return I-2.0f*N*dot(N,I);
{

float dot(vec2 v1,vec2 v2)
{
return v1.x*v2.x+v1.y*v2.y;
}

void Odbij()  
{
vec2 kierunek,nowy;
kierunek.x=lengthdir_x(ball->direction,1);
kierunek.y=lengthdir_y(ball->direction,1);
nowy=reflect(12,kierunek);
i_co_teraz();
}

Opublikowano

musisz jeszcze zrobic przeciazenie operatora mnozenia dla vec2 (przy okazji reszte tez)

 

vec2& operator* (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x*v2.x;
temp.y=v1.y*v2.y;
return(temp);
};

vec2& operator/ (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x/v2.x;
temp.y=v1.y/v2.y;
return(temp);
};

vec2& operator+ (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x+v2.x;
temp.y=v1.y+v2.y;
return(temp);
};

vec2& operator- (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x-v2.x;
temp.y=v1.y-v2.y;
return(temp);
};

Opublikowano

point_direction() musisz sobie napisac. na forum nie raz byl poruszany o tym watek z tego co wiem

Opublikowano

struct vec2
{
float x;
float y;
};

//pomijam operatory

vec2 reflect(vec2 I,vec2 N)
{
return I-2.0f*N*dot(N,I);
{

float dot(vec2 v1,vec2 v2)
{
return v1.x*v2.x+v1.y*v2.y;
}

int point_direction(int x1, int x2, int y1, int y2)
{
atan2(y2-y1,x2-x1) * 180 / M_PI; //korzystam z math.h
}

void Odbij()  
{
vec2 kierunek,nowy;
kierunek.x=lengthdir_x(ball->direction,1);
kierunek.y=lengthdir_y(ball->direction,1);
nowy=reflect(12,kierunek);
ball->direction=point_direction(nowy.x,nowy.y, -co tutaj-, -co tutaj-);
}

A co z x2, y2 :(

Opublikowano

ball->direction=point_direction(0,0,nowy.x,nowy.y);

 

bo wektor kierunku to tylko kierunek, bez pozycji poczatkowej, a raczej pozycja ta lezy na [0,0]

Opublikowano

zapomnialem jeszcze o operatorach dla vec2 z liczbami bez ktorych nie zadziala funkcja reflect:

 

vec2& operator* (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x*v2;
temp.y=v1.y*v2;
return(temp);
};


vec2& operator/ (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x/v2;
temp.y=v1.y/v2;
return(temp);
};


vec2& operator+ (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x+v2;
temp.y=v1.y+v2;
return(temp);
};


vec2& operator- (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x-v2;
temp.y=v1.y-v2;
return(temp);
};

Opublikowano

to jak zwraca "vec2&" zamien na "vec2" bez "&"

Opublikowano
float lengthdir_x(float len,float dir)
{
return(cos(degtorad(dir))*len)
};

float lengthdir_y(float len,float dir)
{
return(sin(degtorad(dir))*len)
};

Opublikowano

Ok, mam takie coś:

//
//Początek GMCLAN'owego syfa
//
struct vec2
{
float x;
float y;
};

vec2 operator* (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x*v2;
temp.y=v1.y*v2;
return(temp);
};

vec2 operator/ (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x/v2;
temp.y=v1.y/v2;
return(temp);
};

vec2 operator+ (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x+v2;
temp.y=v1.y+v2;
return(temp);
};

vec2 operator- (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x-v2;
temp.y=v1.y-v2;
return(temp);
};

float dot(vec2 v1,vec2 v2)
{
return v1.x*v2.x+v1.y*v2.y;
}

vec2 reflect(vec2 I,vec2 N)
{
return I-2.0f*N*dot(N,I);
}

int point_direction(int x1, int x2, int y1, int y2)
{
return(atan2(y2-y1,x2-x1) * 180 / M_PI);
}

double degtorad( double alfa) { return alfa * M_PI / 180; }

float lengthdir_x(float len,float dir)
{
return(cos(degtorad(dir))*len);
}

float lengthdir_y(float len,float dir)
{
return(sin(degtorad(dir))*len);
}

void Odbij()
{

vec2 srodek;
srodek.x=12;
srodek.y=12;

vec2 kierunek,nowy;
kierunek.x=lengthdir_x(ball->direction,1);
kierunek.y=lengthdir_y(ball->direction,1);
nowy=reflect(srodek,kierunek);
ball->direction=point_direction(0,0,nowy.x,nowy.y);
}
//
//Koniec GMCLAN'owego syfa
//

 

I wywala: Illegal structure operation tutaj:

vec2 reflect(vec2 I,vec2 N)

{

return I-2.0f*N*dot(N,I);

}

Opublikowano

bo mususz miec operatory vec2<->float oraz vec2<->vec2, a ty masz tylko te pierwsze. zapomnaiels o drugich, dla tego nie moze wykonac dzialan wektora z wektorem.

Opublikowano

//
//Początek GMCLAN'owego syfa
//
struct vec2
{
float x;
float y;
};

//Operatory wektor<->float
vec2 operator* (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x*v2;
temp.y=v1.y*v2;
return(temp);
};

vec2 operator/ (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x/v2;
temp.y=v1.y/v2;
return(temp);
};

vec2 operator+ (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x+v2;
temp.y=v1.y+v2;
return(temp);
};

vec2 operator- (vec2& v1,float& v2)
{
vec2 temp;
temp.x=v1.x-v2;
temp.y=v1.y-v2;
return(temp);
};
//Operatory wektor<->float

//Operatory wektor<->wektor
vec2 operator* (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x*v2.x;
temp.y=v1.y*v2.y;
return(temp);
};

vec2 operator/ (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x/v2.x;
temp.y=v1.y/v2.y;
return(temp);
};

vec2 operator+ (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x+v2.x;
temp.y=v1.y+v2.y;
return(temp);
};

vec2 operator- (vec2& v1,vec2& v2)
{
vec2 temp;
temp.x=v1.x-v2.x;
temp.y=v1.y-v2.y;
return(temp);
};
//Operatory wektor<->wektor

float dot(vec2 v1,vec2 v2)
{
return v1.x*v2.x+v1.y*v2.y;
}

vec2 reflect(vec2 I,vec2 N)
{
return I-2.0f*N*dot(N,I);
}

int point_direction(int x1, int x2, int y1, int y2)
{
return(atan2(y2-y1,x2-x1) * 180 / M_PI);
}

double degtorad( double alfa) { return alfa * M_PI / 180; }

float lengthdir_x(float len,float dir)
{
return(cos(degtorad(dir))*len);
}

float lengthdir_y(float len,float dir)
{
return(sin(degtorad(dir))*len);
}

void Odbij()
{

vec2 srodek;
srodek.x=12;
srodek.y=12;

vec2 kierunek,nowy;
kierunek.x=lengthdir_x(ball->direction,1);
kierunek.y=lengthdir_y(ball->direction,1);
nowy=reflect(srodek,kierunek);
ball->direction=point_direction(0,0,nowy.x,nowy.y);
}
//
//Koniec GMCLAN'owego syfa
//

Ten sam error!

Opublikowano

Boże, nie przekazuj float'a przez referencje toż to zbrodnia przeciw szybkości działania twojego programu a do tego w tym wypadku błąd.

 

edit: Nie zwraca się referencji do lokalnego obiektu

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...