Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


#ActualKain5056

Posted 06 February 2013 - 02:38 AM

Hello everybody.

I'm trying to learn how to make a simple game with SDL using mainly LazyFoo's tutorials, and I have a problem I have know idea how to solve.

 

When I move the player around with nothing else on the screen except the tiles, the player moves fine.

But when I add another entity ( an enemy ), the ntity that calls its moving function last moves really slowly.

So, if I call the player's moving function first, the enemy moves slowly, and if I call the enemy's moving function first, the player moves slowly.

 

This is the code:

 

Player movement:

 

void player::control()
{
    if( event.type == SDL_KEYDOWN )
    {
        switch( event.key.keysym.sym )
        {
            case SDLK_d:
            xvel += VELOCITY;
            break;

            case SDLK_a:
            xvel -= VELOCITY;
            break;

            default: {}
        }
    }

    if( event.type == SDL_KEYUP )
    {
        switch( event.key.keysym.sym )
        {
            case SDLK_d:
            xvel -= VELOCITY;
            break;

            case SDLK_a:
            xvel += VELOCITY;
            break;

            default: {}
        }
    }
}

void player::jump()
{
    Uint8 * keystate = SDL_GetKeyState( NULL );

    if( keystate[ SDLK_SPACE ] && jumping == false )
    {
        jumping = true;
        yvel = -( VELOCITY * 3 );
    }
}

void player::move( Uint32 delta_ticks , tile * tiles[] )
{
    double lastx = box.x;
    double lasty = box.y;

    box.x += xvel * ( delta_ticks / 1000.f );

    if( box.x < 0 ) box.x = 0;
    if( box.x + PLAYER_WIDTH > LEVEL_WIDTH ) box.x = LEVEL_WIDTH - PLAYER_WIDTH;

    if( collision( box , tiles ) ) box.x = lastx;

    box.y += yvel * ( delta_ticks / 1000.f );

    if( collision( box , tiles ) )
    {
        if( yvel >= 0 )
        {
            box.y = lasty;
            jumping = false;
        }
        else
        {
            box.y = lasty;
            jumping = true;
        }

        yvel = 0;
    }
    else jumping = true;

    yvel += gravity;

    if( yvel >= VELOCITY * 8 ) yvel = VELOCITY * 8;

    if( box.y > LEVEL_HEIGHT + 50 )
    {
        box.y = 0;
        box.x = 50;
        status = FACING_RIGHT;
        yvel = 0;
    }

    x = box.x;
    y = box.y;
}

 

Enemy movement ( the enemy is a completely different class than the player.):

 

void enemy::move_enemy( Uint32 delta_ticks , tile * tiles[] )
{
    double lastx = box.x;
    double lasty = box.y;

    xvel = -VELOCITY;

    box.x += xvel * ( delta_ticks / 1000.f );

    if( collision( box , tiles ) )
    {
        box.x = lastx;
        xvel = -xvel;
    }

    box.y += yvel * ( delta_ticks / 1000.f );

    if( collision( box , tiles ) )
    {
        box.y = lasty;
        yvel = 0;
    }

    yvel += gravity;

    if( yvel >= VELOCITY * 8 ) yvel = VELOCITY * 8;

    x = box.x;
    y = box.y;
}

 

The main function:

 

bool quit = false;
    bool tileedit = false;

    if( init() == false ) return 1;
    if( load_files() == false ) return 2;

    timer delta;
    player player1( 50 , 50 );
    enemy enemy1( 600 , 100 , BUBBLE );
    tile * tiles[ TOTAL_TILES ];

    if( set_tiles( tiles ) == false ) return 4;

    delta.start();

    while( quit == false )
    {
        scrolling_background();
        if( tileedit ) editor_show( current_tile );

        while( SDL_PollEvent( &event ) )
        {
            if( event.type == SDL_KEYDOWN )
            {
                if( event.key.keysym.sym == SDLK_t ) tileedit = !tileedit;
            }

            if( event.type == SDL_QUIT ) quit = true;

            if( tileedit == false ) player1.control();
            else if( tileedit ) editor_control( tiles );
        }

        if( tileedit == false )
        {
            player1.jump();
            scrolling_background();
            player1.move( delta.get_ticks() , tiles );
            enemy1.move_enemy( delta.get_ticks() , tiles );
            player1.player_camera();
        }
        else editor_camera();

        for( int t = 0 ; t < TOTAL_TILES ; t++ )
        {
            tiles[t]->show();
        }

        if( tileedit == false ) player1.show();

        enemy1.show();

        if( SDL_Flip( screen ) == -1 ) return 5;
    }

    editor_save( tiles );
    cleanup( tiles );

    return 0;

 

Could it be that I don't use frame independent movement correctly? I have no idea, and I'm very new to programming in general, so if someone more experienced could help me understand where is the problem, I would really appreciate it.

 

Thank you in advance.


#2Kain5056

Posted 06 February 2013 - 02:31 AM

Hello everybody.

I'm trying to learn how to make a simple game with SDL using mainly LazyFoo's tutorials, and I have a problem I have know idea how to solve.

 

When I move the player around with nothing else on the screen except the tiles, the player moves fine.

But when I add another entity ( an enemy ), the ntity that calls its moving function last moves really slowly.

So, if I call the player's moving function first, the enemy moves slowly, and if I call the enemy's moving function first, the player moves slowly.

 

This is the code:

 

Player movement:

 

void player::control()
{
    if( event.type == SDL_KEYDOWN )
    {
        switch( event.key.keysym.sym )
        {
            case SDLK_d:
            xvel += VELOCITY;
            break;

            case SDLK_a:
            xvel -= VELOCITY;
            break;

            default: {}
        }
    }

    if( event.type == SDL_KEYUP )
    {
        switch( event.key.keysym.sym )
        {
            case SDLK_d:
            xvel -= VELOCITY;
            break;

            case SDLK_a:
            xvel += VELOCITY;
            break;

            default: {}
        }
    }
}

void player::jump()
{
    Uint8 * keystate = SDL_GetKeyState( NULL );

    if( keystate[ SDLK_SPACE ] && jumping == false )
    {
        jumping = true;
        yvel = -( VELOCITY * 3 );
    }
}

void player::move( Uint32 delta_ticks , tile * tiles[] )
{
    double lastx = box.x;
    double lasty = box.y;

    box.x += xvel * ( delta_ticks / 1000.f );

    if( box.x < 0 ) box.x = 0;
    if( box.x + PLAYER_WIDTH > LEVEL_WIDTH ) box.x = LEVEL_WIDTH - PLAYER_WIDTH;

    if( collision( box , tiles ) ) box.x = lastx;

    box.y += yvel * ( delta_ticks / 1000.f );

    if( collision( box , tiles ) )
    {
        if( yvel >= 0 )
        {
            box.y = lasty;
            jumping = false;
        }
        else
        {
            box.y = lasty;
            jumping = true;
        }

        yvel = 0;
    }
    else jumping = true;

    yvel += gravity;

    if( yvel >= VELOCITY * 8 ) yvel = VELOCITY * 8;

    if( box.y > LEVEL_HEIGHT + 50 )
    {
        box.y = 0;
        box.x = 50;
        status = FACING_RIGHT;
        yvel = 0;
    }

    x = box.x;
    y = box.y;
}

 

Enemy movement ( the enemy is a completely different class than the player.):

 

void enemy::move_enemy( Uint32 delta_ticks , tile * tiles[] )
{
    double lastx = box.x;
    double lasty = box.y;

    xvel -= VELOCITY;

    box.x += xvel * ( delta_ticks / 1000.f );

    if( collision( box , tiles ) )
    {
        box.x = lastx;
        xvel = -xvel;
    }

    box.y += yvel * ( delta_ticks / 1000.f );

    if( collision( box , tiles ) )
    {
        box.y = lasty;
        yvel = 0;
    }

    yvel += gravity;

    if( yvel >= VELOCITY * 8 ) yvel = VELOCITY * 8;

    x = box.x;
    y = box.y;
}

 

The main function:

 

bool quit = false;
    bool tileedit = false;

    if( init() == false ) return 1;
    if( load_files() == false ) return 2;

    timer delta;
    player player1( 50 , 50 );
    enemy enemy1( 600 , 100 , BUBBLE );
    tile * tiles[ TOTAL_TILES ];

    if( set_tiles( tiles ) == false ) return 4;

    delta.start();

    while( quit == false )
    {
        scrolling_background();
        if( tileedit ) editor_show( current_tile );

        while( SDL_PollEvent( &event ) )
        {
            if( event.type == SDL_KEYDOWN )
            {
                if( event.key.keysym.sym == SDLK_t ) tileedit = !tileedit;
            }

            if( event.type == SDL_QUIT ) quit = true;

            if( tileedit == false ) player1.control();
            else if( tileedit ) editor_control( tiles );
        }

        if( tileedit == false )
        {
            player1.jump();
            scrolling_background();
            player1.move( delta.get_ticks() , tiles );
            enemy1.move_enemy( delta.get_ticks() , tiles );
            player1.player_camera();
        }
        else editor_camera();

        for( int t = 0 ; t < TOTAL_TILES ; t++ )
        {
            tiles[t]->show();
        }

        if( tileedit == false ) player1.show();

        enemy1.show();

        if( SDL_Flip( screen ) == -1 ) return 5;
    }

    editor_save( tiles );
    cleanup( tiles );

    return 0;

 

Could it be that I don't use frame independent movement correctly? I have no idea, and I'm very new to programming in general, so if someone more experienced could help me understand where is the problem, I would really appreciate it.

 

Thank you in advance.


#1Kain5056

Posted 06 February 2013 - 02:30 AM

I'm trying to learn how to make a simple game with SDL using mainly LazyFoo's tutorials, and I have a problem I have know idea how to solve.

 

When I move the player around with nothing else on the screen except the tiles, the player moves fine.

But when I add another entity ( an enemy ), the ntity that calls its moving function last moves really slowly.

So, if I call the player's moving function first, the enemy moves slowly, and if I call the enemy's moving function first, the player moves slowly.

 

This is the code:

 

Player movement:

void player::control()
{
    if( event.type == SDL_KEYDOWN )
    {
        switch( event.key.keysym.sym )
        {
            case SDLK_d:
            xvel += VELOCITY;
            break;

            case SDLK_a:
            xvel -= VELOCITY;
            break;

            default: {}
        }
    }

    if( event.type == SDL_KEYUP )
    {
        switch( event.key.keysym.sym )
        {
            case SDLK_d:
            xvel -= VELOCITY;
            break;

            case SDLK_a:
            xvel += VELOCITY;
            break;

            default: {}
        }
    }
}

void player::jump()
{
    Uint8 * keystate = SDL_GetKeyState( NULL );

    if( keystate[ SDLK_SPACE ] && jumping == false )
    {
        jumping = true;
        yvel = -( VELOCITY * 3 );
    }
}

void player::move( Uint32 delta_ticks , tile * tiles[] )
{
    double lastx = box.x;
    double lasty = box.y;

    box.x += xvel * ( delta_ticks / 1000.f );

    if( box.x < 0 ) box.x = 0;
    if( box.x + PLAYER_WIDTH > LEVEL_WIDTH ) box.x = LEVEL_WIDTH - PLAYER_WIDTH;

    if( collision( box , tiles ) ) box.x = lastx;

    box.y += yvel * ( delta_ticks / 1000.f );

    if( collision( box , tiles ) )
    {
        if( yvel >= 0 )
        {
            box.y = lasty;
            jumping = false;
        }
        else
        {
            box.y = lasty;
            jumping = true;
        }

        yvel = 0;
    }
    else jumping = true;

    yvel += gravity;

    if( yvel >= VELOCITY * 8 ) yvel = VELOCITY * 8;

    if( box.y > LEVEL_HEIGHT + 50 )
    {
        box.y = 0;
        box.x = 50;
        status = FACING_RIGHT;
        yvel = 0;
    }

    x = box.x;
    y = box.y;
}

 

Enemy movement ( the enemy is a completely different class than the player.):

void enemy::move_enemy( Uint32 delta_ticks , tile * tiles[] )
{
    double lastx = box.x;
    double lasty = box.y;

    xvel -= VELOCITY;

    box.x += xvel * ( delta_ticks / 1000.f );

    if( collision( box , tiles ) )
    {
        box.x = lastx;
        xvel = -xvel;
    }

    box.y += yvel * ( delta_ticks / 1000.f );

    if( collision( box , tiles ) )
    {
        box.y = lasty;
        yvel = 0;
    }

    yvel += gravity;

    if( yvel >= VELOCITY * 8 ) yvel = VELOCITY * 8;

    x = box.x;
    y = box.y;
}

 

The main function:

bool quit = false;
    bool tileedit = false;

    if( init() == false ) return 1;
    if( load_files() == false ) return 2;

    timer delta;
    player player1( 50 , 50 );
    enemy enemy1( 600 , 100 , BUBBLE );
    tile * tiles[ TOTAL_TILES ];

    if( set_tiles( tiles ) == false ) return 4;

    delta.start();

    while( quit == false )
    {
        scrolling_background();
        if( tileedit ) editor_show( current_tile );

        while( SDL_PollEvent( &event ) )
        {
            if( event.type == SDL_KEYDOWN )
            {
                if( event.key.keysym.sym == SDLK_t ) tileedit = !tileedit;
            }

            if( event.type == SDL_QUIT ) quit = true;

            if( tileedit == false ) player1.control();
            else if( tileedit ) editor_control( tiles );
        }

        if( tileedit == false )
        {
            player1.jump();
            scrolling_background();
            player1.move( delta.get_ticks() , tiles );
            enemy1.move_enemy( delta.get_ticks() , tiles );
            player1.player_camera();
        }
        else editor_camera();

        for( int t = 0 ; t < TOTAL_TILES ; t++ )
        {
            tiles[t]->show();
        }

        if( tileedit == false ) player1.show();

        enemy1.show();

        if( SDL_Flip( screen ) == -1 ) return 5;
    }

    editor_save( tiles );
    cleanup( tiles );

    return 0;

 

Could it be that I don't use frame independent movement correctly? I have no idea, and I'm very new to programming in general, so if someone more experienced could help me understand where is the problem, I would really appreciate it.

 

Thank you in advance.


PARTNERS