Skocz do zawartości
  • Ogłoszenia

  • Gdzie świętować urodziny GMCLANu   27 użytkowników zagłosowało

    1. 1. Gdzie świętować urodziny GMCLANu


      • Warszawa (bo w centrum)
      • Szczecin (bo tam mieszka Ranma i narodził się GMCLAN)

    Żeby zagłosować w tej ankiecie, prosimy się zalogować lub zarejestrować. Zobacz temat
DobryZiom

Kolizje

Rekomendowane odpowiedzi

DobryZiom    0

Hey :] Mam taki drobny problem z kolizjami, źle działają ;/ Oto kod:

if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 0, 2 ) ) ) c_lewo = true;
    if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 2, 0 ) ) ) c_gora = true;
    if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 2, -2 ) ) ) c_prawo = true;
    if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( -1, 1 ) ) ) c_dol = true;

    if( XE_IO::KeyboardGet( XE_KEY_UP ) )
        if( c_gora == false )
            Position.Y -= 2;

    if( XE_IO::KeyboardGet( XE_KEY_DOWN ) )
        if( c_dol == false )
            Position.Y += 2;

    if( XE_IO::KeyboardGet( XE_KEY_LEFT ) )
        if( c_lewo == false )
            Position.X -= 2;
    
    if( XE_IO::KeyboardGet( XE_KEY_RIGHT ) )
        if( c_prawo == false )
            Position.X += 2;

działają nie poprawnie :/ jak jestem w kolizji dołem to nie moge iść w dól, ale też w prawo ;/

 

cała grafika 16x16(kwadraty)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
pi1er    0

  if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 2, -2 ) ) ) c_prawo = true;
    if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( -1, 1 ) ) ) c_dol = true;

 

 

Te linijki są złe, sprawdzasz z wektorem jednocześnie zmienionym w osi X jak i Y.

 

Zamień na:

 

 if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 0, -2 ) ) ) c_prawo = true;
    if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( -2, 0 ) ) ) c_dol = true;

 

 

I sprawdź teraz :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
DobryZiom    0

Ciągle to samo :/ Po kolizji ze ścianą nie można się od niej oderwać :/ Tu kod AppData.h:

#ifndef APP_DATA_H
#define APP_DATA_H

C_APPLICATION    Game;
int a;
bool c_gora = false;
bool c_dol = false;
bool c_lewo = false;
bool c_prawo = false;

/* GRACZ */
class C_GRACZ : public XE_ACTOR2D
{
    public:
            XE_VECTOR pos;
            int hp;

            C_GRACZ( XE_VECTOR pos = 0 );
            ~C_GRACZ( );
            void Update( );
            void Render( );
} Gracz;
C_GRACZ::C_GRACZ( XE_VECTOR pos )
{
    Game.Describe( this, "GRACZ" );
    Sprite = Game.Sprites.Access( "spr_gracz" );
    Position = pos;
}
C_GRACZ::~C_GRACZ()
{
    Sprite = XE_SPRITE();
}
void C_GRACZ::Update()
{
    c_gora = false;
    c_dol = false;
    c_lewo = false;
    c_prawo = false;

    if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 0, 2 ) ) ) c_lewo = true;
    if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 2, 0 ) ) ) c_gora = true;
    if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 0, -2 ) ) ) c_prawo = true;
    if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( -2, 0 ) ) ) c_dol = true;

    if( XE_IO::KeyboardGet( XE_KEY_UP ) )
        if( c_gora == false )
            Position.Y -= 2;

    if( XE_IO::KeyboardGet( XE_KEY_DOWN ) )
        if( c_dol == false )
            Position.Y += 2;

    if( XE_IO::KeyboardGet( XE_KEY_LEFT ) )
        if( c_lewo == false )
            Position.X -= 2;
    
    if( XE_IO::KeyboardGet( XE_KEY_RIGHT ) )
        if( c_prawo == false )
            Position.X += 2;
}
void C_GRACZ::Render()
{
    DrawSprite();
}

/* MUR */
class C_MUR : public XE_ACTOR2D
{
    public:
            XE_VECTOR pos;
            int hp;

            C_MUR( XE_VECTOR pos = 0 );
            ~C_MUR( );
            void Update( );
            void Render( );
} Mur;
C_MUR::C_MUR( XE_VECTOR pos )
{
    Game.Describe( this, "MUR" );
    Sprite = Game.Sprites.Access( "spr_mur" );
    Position = pos;
}
C_MUR::~C_MUR()
{
    Sprite = XE_SPRITE();
}
void C_MUR::Update()
{
    //...
}
void C_MUR::Render()
{
    DrawSprite();
}

#endif

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
gnysek    34

Hm, a nie trzeba jak w GM wracać na poprzednią pozycję ( w sensie xprevious, yprevious) ?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
Dawidds    0

Wiem, że się czepiam, ale:

c_gora = false;
    c_dol = false;
    c_lewo = false;
    c_prawo = false;

    if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 0, 2 ) ) ) c_lewo = true;
    if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 2, 0 ) ) ) c_gora = true;
    if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 0, -2 ) ) ) c_prawo = true;
    if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( -2, 0 ) ) ) c_dol = true;

->

 c_lewo = Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 0, 2 ) );
     c_gora = Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 2, 0 ) );
     c_prawo = Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 0, -2 ) );
     c_dol = Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( -2, 0 ) )

 

No i w ogóle najfajniej by było coś w tym stylu (możliwe że piszę bełkot, ale powinieneś się domyślić o co chodzi):

XE_VECTOR vec = XE_VECTOR(0);

 

if(XE_IO::KeyboardGet( XE_KEY_UP ))

vec += XE_VECTOR(0, -2);

if(XE_IO::KeyboardGet( XE_KEY_DOWN ))

vec += XE_VECTOR(0, 2);

if(XE_IO::KeyboardGet( XE_KEY_RIGHT ))

vec += XE_VECTOR(2, 0);

if(XE_IO::KeyboardGet( XE_KEY_LEFT ))

vec += XE_VECTOR(-2, 0);

 

if(Game.Collision2D( XEF_BOX, this, "MUR", vec))

Position += vec;

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
DobryZiom    0

@Dawid: narazie nie mogę odpalić projektu, potem zobaczę.

@Roki: Tak są kolizje do platformy... jest to nieco inne od kolizji w topdown(bez grawitacji...)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
pi1er    0
@Roki: Tak są kolizje do platformy... jest to nieco inne od kolizji w topdown(bez grawitacji...)

Bzdura, po prostu grawitacje wywalisz i problem z głowy. 2D to ciągle 2D

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
DobryZiom    0
appdata.h(38): warning C4800: 'XeCore::XE_ACTOR2D *' : forcing value to bool 'true' or 'false' (performance warning)

To po wklejeniu

c_lewo = Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 0, 2 ) );
     c_gora = Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 2, 0 ) );
     c_prawo = Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 0, -2 ) );
     c_dol = Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( -2, 0 ) );

:)

reczej nie :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
PsichiX    0

to co napisał dawidds powinno zadziałać:

XE_VECTOR vec = XE_VECTOR(0);

 

if(XE_IO::KeyboardGet( XE_KEY_UP ))

vec += XE_VECTOR(0, -2);

if(XE_IO::KeyboardGet( XE_KEY_DOWN ))

vec += XE_VECTOR(0, 2);

if(XE_IO::KeyboardGet( XE_KEY_RIGHT ))

vec += XE_VECTOR(2, 0);

if(XE_IO::KeyboardGet( XE_KEY_LEFT ))

vec += XE_VECTOR(-2, 0);

 

if(Game.Collision2D( XEF_BOX, this, "MUR", vec))

Position += vec;

 

btw. Game.Collision2D() zwraca wskaźnik na aktora z którym koliduje, lub NULL jeśli nie koliduje z niczym

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
DobryZiom    0
if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( -1, 1 ) ) ) c_lewo = true;

if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 1, -1 ) ) ) c_gora = true;

if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 2, 1 ) ) ) c_prawo = true;

if( Game.Collision2D( XEF_BOX, this, "MUR", XE_VECTOR( 1, 2) ) ) c_dol = true;

tak zrobiłem i działa :)

 

btw. Game.Collision2D() zwraca wskaźnik na aktora z którym koliduje, lub NULL jeśli nie koliduje z niczym

wiem :P pisze :D

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×