Skocz do zawartości
DobryZiom

Pytania od nieznajomego gościa

Rekomendowane odpowiedzi

Witam. Tajniak, napewno nie Ja chciałby w tym temacie zadawać swoje tajne pytania. Oto i pierwsze pytanie:

1.Czemu to nie działa?:

pos = Czolg_Dol.Position;
    Position.X = pos.X;
    Position.Y = pos.Y;

Mam to w C_CZOLG_GORA w Update. Zamiast być na tej pozycji to jest na pozycji 0,0 i obrocie 0 :/

 

YXE, why?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

stary... ja, tfuu... ten tajniak, ma to wszystko na kompie ^^ zaraz zerknie ^^

 

E: To raczej nie to. Po prostu ten kod powinien mi zmieniać pozycję i obrót, a nie zmienia.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

na bank redefiniujesz zmienna Position oraz Direction w klasie czolgu. tego nie mozna robic, to jest zasada dziedziczenia ze dziedziczonych zmiennych NIE WOLNO redefiniowac bo beda one zupelnie innymi zmiennymi, mimo ze o tej samej nazwie. Dla tego tez mowilem nie raz zeby zapoznac sie z dziedzicznoscia, jesli chce sie operowac na aktorach.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

A więc co ten tajniak ma zrobić? :D Jest tak miły że poda swój idealny kod:

#ifndef APP_DATA_H
#define APP_DATA_H

C_APPLICATION    Game;


class C_CZOLG_DOL : public XE_ACTOR2D
{
    public:
            XE_VECTOR pos;
            double speed, max_speed, obrot, rozped, skret, hamowanie;

            C_CZOLG_DOL( XE_VECTOR pos = 0 );
            ~C_CZOLG_DOL( );
            void Update( );
            void Render( );
} Czolg_Dol;
class C_CZOLG_GORA : public XE_ACTOR2D
{
    public:
            XE_VECTOR pos;
            double obrot;

            C_CZOLG_GORA( XE_VECTOR pos = 0 );
            ~C_CZOLG_GORA( );
            void Update( );
            void Render( );
} Czolg_Gora;

/* CZOLG DÓŁ */
C_CZOLG_DOL::C_CZOLG_DOL( XE_VECTOR pos )
{
    Game.Describe( this, "CZOLG_DOL" );
    Sprite = Game.Sprites.Access( "spr_czolg_dol" );
    Position = pos;
    speed = 0;
    max_speed = 2;
    obrot = 0;
    rozped = 0.02;
    skret = 0.5;
    hamowanie = 0.04;
}
C_CZOLG_DOL::~C_CZOLG_DOL( )
{
    Sprite = XE_SPRITE( );
}
void C_CZOLG_DOL::Update( )
{
    if( XE_IO::KeyboardGet( XE_KEY_UP ) ) speed += rozped;
    else if( XE_IO::KeyboardGet( XE_KEY_DOWN ) ) speed -= rozped;
    else if( speed != 0 )
    {
        if( speed > 0 && speed <= rozped ) speed = 0;
        else if( speed > 0 ) speed -= hamowanie;
        else if( speed < 0 && speed >= -rozped ) speed = 0;
        else speed += hamowanie;
    }

    if( XE_IO::KeyboardGet( XE_KEY_LEFT ) ) obrot -= ( skret * speed ) + 0.5;
    else if( XE_IO::KeyboardGet( XE_KEY_RIGHT ) ) obrot += ( skret * speed ) + 0.5;

    if( speed > max_speed ) speed = max_speed;
    else if( speed < -( max_speed / 2 ) ) speed = -( max_speed / 2 );
    Direction = obrot;
    Position += XeLengthdirLen( Direction, speed );
    Direction.Alpha = obrot - 90;
}
void C_CZOLG_DOL::Render( )
{
    DrawSprite( );
}
/* CZOLG GÓRA */
C_CZOLG_GORA::C_CZOLG_GORA( XE_VECTOR pos )
{
    Game.Describe( this, "CZOLG_GORA" );
    Sprite = Game.Sprites.Access( "spr_czolg_gora" );
    Position = pos;
    obrot = 0;
}
C_CZOLG_GORA::~C_CZOLG_GORA( )
{
    Sprite = XE_SPRITE( );
}
void C_CZOLG_GORA::Update( )
{
    pos = Czolg_Dol.Position;
    Position.X = pos.X;
    Position.Y = pos.Y;

    if( XE_IO::KeyboardGet( XE_KEY_A ) ) obrot -= 3;
    else if( XE_IO::KeyboardGet( XE_KEY_D ) ) obrot += 3;

    Direction.Alpha = obrot + Czolg_Dol.obrot;
}
void C_CZOLG_GORA::Render( )
{
    DrawSprite( );
}

#endif

 

EDIT:

Dla tego tez mowilem nie raz zeby zapoznac sie z dziedzicznoscia, jesli chce sie operowac na aktorach.

Mówił, mówił!! ...ale zapomniałem o tym :P

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

hmm, a jednak nie masz tak jak mylalem.. blad na to wskazywal, hmm.. zastanawia mnie po co Ci zmienna pos, skoro masz Position oraz zawsze przypisujesz ja ze zmiennej pos. to jest takie latanie na okolo. druga sprawa ze aktorzy MUSZA byc rejestrowani, nie moga byc to statyczne obiekty, inaczej nie wykonuje sie ich Update() i Render(), dopuki sam ich nie wywolasz. Automat gry dziala tylko na rejestrowanych aktorow

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

#ifndef APP_EVENTS_H
#define APP_EVENTS_H

PROGRESS(GameProgress)
{
    if( XE_IO::KeyboardGetPressed( XE_KEY_ESC ) ) Game.Exit();
    Game.Camera.Update();

    Game.Progress();

    XeRenderScene( XE_FLAG_SWAP | XE_FLAG_COLORBUFF | XE_FLAG_TRANSFORMIDENT );
}

SCENE(GameScene)
{
    Game.Windows( "main" )->Width = 800;    
    Game.Windows( "main" )->Height = 600;    
    Game.WindowCentralize( "main" );        
    Game.Windows( "main" )->Update();        
    Game.OnWindowSetup( "main" );            
    Game.Vsync( true );
    Game.Camera.Width = (float)Game.Windows( "main" )->Width;
    Game.Camera.Height = (float)Game.Windows( "main" )->Height;



    Game.Sprites( "spr_czolg_dol" )->Prepare( "data/1.xet" );
    Game.Sprites( "spr_czolg_dol" )->Centralize( );
    Game.Sprites( "spr_czolg_gora" )->Prepare( "data/2.xet" );
    Game.Sprites( "spr_czolg_gora" )->Centralize( );


    Game.RegisterActor( "CZOLG_DOL", new C_CZOLG_DOL( XE_VECTOR( 100, 100 ) ) );
    Game.RegisterActor( "CZOLG_GORA", new C_CZOLG_GORA( XE_VECTOR( 100, 100 ) ) );

    
    XE_EVENTS::Execute( GameProgress );
    Game.Cleanup();
}


#endif /* APP_EVENTS_H */

Next, Pleas :D

 

 

EDIT: Poprawiłem kawałek kodu, przesuwa się z graczem(a raczej za nim...) itp, tyle że tworzy się na pozycji 0,0 oraz z obrotem 0 i z tej pozycji przesuwa, obraca się za graczem:

PROGRESS(GameProgress)
{
    if( XE_IO::KeyboardGetPressed( XE_KEY_ESC ) ) Game.Exit();
    Game.Camera.Update();

    Game.Progress();


    Czolg_Gora.Update( );
    Czolg_Dol.Update( );


    XeRenderScene( XE_FLAG_SWAP | XE_FLAG_COLORBUFF | XE_FLAG_TRANSFORMIDENT );
}

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

×