コード例 #1
0
Shape_Blitter::Shape_Blitter(short collection, short texture_index,
                             short texture_type,
                             short clut_index) : m_type(texture_type),
  m_surface(NULL), m_scaled_surface(NULL),
  tint_color_r(1.0), tint_color_g(1.0), tint_color_b(1.0), tint_color_a(1.0),
  rotation(0.0)
{
  m_src.x = m_src.y = m_src.w = m_src.h = 0;
  m_scaled_src.x = m_scaled_src.y = m_scaled_src.w = m_scaled_src.h = 0;
  crop_rect.x = crop_rect.y = crop_rect.w = crop_rect.h = 0;

  m_desc = BUILD_DESCRIPTOR(BUILD_COLLECTION(collection,
                                             clut_index), texture_index);

  byte *pixelsOut = NULL;
  SDL_Surface *tmp = get_shape_surface(m_desc, NONE, &pixelsOut);
  if (tmp) {
    m_src.w = m_scaled_src.w = crop_rect.w = tmp->w;
    m_src.h = m_scaled_src.h = crop_rect.h = tmp->h;
    SDL_FreeSurface(tmp);
    if (pixelsOut) {
      free(pixelsOut);
    }
  }
}
コード例 #2
0
void
PlayerImage::updateLegsDrawingInfo() {
    // Remove old data, if applicable
    if(mLegsSurface != NULL) {
        SDL_FreeSurface(mLegsSurface);
        mLegsSurface = NULL;
    }
    
    if(mLegsData != NULL) {
        free(mLegsData);
        mLegsData = NULL;
    }
    
    mLegsValid = false;

    // Get the player shape definitions
    player_shape_definitions*	theShapeDefinitions	= get_player_shape_definitions();
    
    // tryAgain tells us whether we made any random choices in the loop.  If so, a failed effort results in
    // another trip through the loop (hopefully with different random choices :) ).
    bool	tryAgain = false;
    
    // For safety - don't keep looping if we seem not to be finding good data... eventually, give up as invalid.
    int16	theNumberOfTriesLeft = 100;

    do {
        // We're using up one of our attempts...
        theNumberOfTriesLeft--;
    
        // Find the leg action
        // We use a local here (instead of using the member directly) so we still which things to pick randomly if we loop.
        int16 theLegsAction = mLegsAction;
        if(mLegsAction == NONE) {
            theLegsAction = local_random() % NUMBER_OF_PLAYER_ACTIONS;
            tryAgain = true;
        }
        // If the user fed us a bad value, stop (with invalid data)
        else if(theLegsAction < 0 || theLegsAction >= NUMBER_OF_PLAYER_ACTIONS)
            break;
        
        // Find the high-level shape index
        uint16	theLegsHighLevelShapeIndex	= theShapeDefinitions->legs[theLegsAction];
        
        // Find out how many animation frames there are for the chosen legs
        shape_animation_data*	theLegsAnimationData = get_shape_animation_data(
                                    BUILD_DESCRIPTOR(theShapeDefinitions->collection, theLegsHighLevelShapeIndex));
        
        // If this failed, either give up or try again
        if(theLegsAnimationData == NULL)
            continue;
        
        // Find a view for the legs
        int16 theLegsView = mLegsView;
        if(theLegsView == NONE) {
            theLegsView = local_random() % 8;//theLegsAnimationData->number_of_views;
            tryAgain = true;
        }
        else if(theLegsView < 0 || theLegsView >= 8)
            break;
        
        // Find an animation frame
        int16 theLegsFrame = mLegsFrame;
        if(theLegsFrame == NONE) {
            theLegsFrame = local_random() % theLegsAnimationData->frames_per_view;
            tryAgain = true;
        }
        else if(theLegsFrame < 0 || theLegsFrame >= theLegsAnimationData->frames_per_view)
            break;

        // Calculate the low-level shape index index
        uint16 theLegsLowLevelShapeIndexIndex	= theLegsAnimationData->frames_per_view * theLegsView + theLegsFrame;
        
        // Finally, we can look up the low-level shape index
        uint16 theLegsLowLevelShapeIndex	= theLegsAnimationData->low_level_shape_indexes[theLegsLowLevelShapeIndexIndex];

        // Find a legs color
        int16 theLegsColor = mLegsColor;
        if(theLegsColor == NONE) {
            theLegsColor = local_random() % 8;
            tryAgain = true;
        }
        else if(theLegsColor < 0 || theLegsColor >= 8)
            break;
        
        low_level_shape_definition *theLegsLowLevelShape =
                    get_low_level_shape_definition(theShapeDefinitions->collection, theLegsLowLevelShapeIndex);
        
        if(theLegsLowLevelShape == NULL)
            continue;

        // Get the shape surfaces for the given collection, CLUT (according to color/team), and low-level shape index.
	if (bit_depth == 8) continue;
	mLegsSurface	= get_shape_surface(theLegsLowLevelShapeIndex,
                            BUILD_COLLECTION(theShapeDefinitions->collection, theLegsColor), &mLegsData, mLegsBrightness);

        if(mLegsSurface == NULL)
            continue;

        // Fill in rect information
        mLegsRect.x = -theLegsLowLevelShape->key_x;
        mLegsRect.y = -theLegsLowLevelShape->key_y;
        mLegsRect.w = mLegsSurface->w;
        mLegsRect.h = mLegsSurface->h;

        // We're clear.  Copy our temporary variables into the data members.
        mLegsAction	= theLegsAction;
        mLegsView	= theLegsView;
        mLegsFrame	= theLegsFrame;
        mLegsColor	= theLegsColor;
        
        // We are _valid_.  Sweet.
        mLegsValid	= true;

        // Success - get me outta here!
        break;

    } while(tryAgain && theNumberOfTriesLeft > 0);

    // Valid or not, the legs are no longer dirty.
    mLegsDirty = false;
}
コード例 #3
0
void
PlayerImage::updateTorsoDrawingInfo() {
    // Remove old data, if applicable
    if(mTorsoSurface != NULL) {
        SDL_FreeSurface(mTorsoSurface);
        mTorsoSurface = NULL;
    }
    
    if(mTorsoData != NULL) {
        free(mTorsoData);
        mTorsoData = NULL;
    }
    
    mTorsoValid = false;

    // Get the player shape definitions
    player_shape_definitions*	theShapeDefinitions	= get_player_shape_definitions();
    
    // tryAgain tells us whether we made any random choices in the loop.  If so, a failed effort results in
    // another trip through the loop (hopefully with different random choices :) ).
    bool	tryAgain = false;
    
    // For safety - don't keep looping if we seem not to be finding good data... eventually, give up as invalid.
    int16	theNumberOfTriesLeft = 100;

    do {
        // We're using up one of our attempts...
        theNumberOfTriesLeft--;
    
        // Find the torso action
        // We use a local here (instead of using the member directly) so we still which things to pick randomly if we loop.
        int16 theTorsoAction = mTorsoAction;
        if(mTorsoAction == NONE) {
            theTorsoAction = local_random() % PLAYER_TORSO_WEAPON_ACTION_COUNT;
            tryAgain = true;
        }
        // If the user fed us a bad value, stop (with invalid data)
        else if(theTorsoAction < 0 || theTorsoAction >= PLAYER_TORSO_WEAPON_ACTION_COUNT)
            break;
        
        // Find a torso pseudo-weapon
        int16 thePseudoWeapon = mPseudoWeapon;
        if(mPseudoWeapon == NONE) {
            thePseudoWeapon = local_random() % PLAYER_TORSO_SHAPE_COUNT;
            tryAgain = true;
        }
        else if(thePseudoWeapon < 0 || thePseudoWeapon >= PLAYER_TORSO_SHAPE_COUNT)
            break;
        
        // Find the high-level shape index
        uint16	theTorsoHighLevelShapeIndex;
        
        switch(theTorsoAction) {
            
            case _shape_weapon_firing:
                theTorsoHighLevelShapeIndex = theShapeDefinitions->firing_torsos[thePseudoWeapon];
            break;
            
            case _shape_weapon_idle:
                theTorsoHighLevelShapeIndex = theShapeDefinitions->torsos[thePseudoWeapon];
            break;
            
            case _shape_weapon_charging:
                theTorsoHighLevelShapeIndex = theShapeDefinitions->charging_torsos[thePseudoWeapon];
            break;
            
            default:
                // This staves off a compiler warning
                theTorsoHighLevelShapeIndex = 0;
                assert(false);

        }
        
        // Find out how many animation frames there are for the chosen torso
        shape_animation_data*	theTorsoAnimationData = get_shape_animation_data(
                                    BUILD_DESCRIPTOR(theShapeDefinitions->collection, theTorsoHighLevelShapeIndex));
        
        // If this failed, either give up or try again
        if(theTorsoAnimationData == NULL)
            continue;
        
        // Find a view for the torso
        int16 theTorsoView = mTorsoView;
        if(theTorsoView == NONE) {
            theTorsoView = local_random() % 8;//theTorsoAnimationData->number_of_views;
            tryAgain = true;
        }
        else if(theTorsoView < 0 || theTorsoView >= 8)
            break;
        
        // Find an animation frame
        int16 theTorsoFrame = mTorsoFrame;
        if(theTorsoFrame == NONE) {
            theTorsoFrame = local_random() % theTorsoAnimationData->frames_per_view;
            tryAgain = true;
        }
        else if(theTorsoFrame < 0 || theTorsoFrame >= theTorsoAnimationData->frames_per_view)
            break;

        // Calculate the low-level shape index index
        uint16 theTorsoLowLevelShapeIndexIndex	= theTorsoAnimationData->frames_per_view * theTorsoView + theTorsoFrame;
        
        // Finally, we can look up the low-level shape index
        uint16 theTorsoLowLevelShapeIndex	= theTorsoAnimationData->low_level_shape_indexes[theTorsoLowLevelShapeIndexIndex];

        // Find a torso color
        int16 theTorsoColor = mTorsoColor;
        if(theTorsoColor == NONE) {
            theTorsoColor = local_random() % 8;
            tryAgain = true;
        }
        else if(theTorsoColor < 0 || theTorsoColor >= 8)
            break;
        
        low_level_shape_definition *theTorsoLowLevelShape =
                    get_low_level_shape_definition(theShapeDefinitions->collection, theTorsoLowLevelShapeIndex);
        
        if(theTorsoLowLevelShape == NULL)
            continue;

        // Get the shape surfaces for the given collection, CLUT (according to color/team), and low-level shape index.
	if (bit_depth == 8) continue;
	mTorsoSurface	= get_shape_surface(theTorsoLowLevelShapeIndex,
                                BUILD_COLLECTION(theShapeDefinitions->collection, theTorsoColor), &mTorsoData, mTorsoBrightness);

        // Argh, it failed.  Why don't we wait for backup?
        if(mTorsoSurface == NULL)
            continue;

        // Fill in rect information
        mTorsoRect.x = -theTorsoLowLevelShape->origin_x;
        mTorsoRect.y = -theTorsoLowLevelShape->origin_y;
        mTorsoRect.w = mTorsoSurface->w;
        mTorsoRect.h = mTorsoSurface->h;

        // We're clear.  Copy our temporary variables into the data members.
        mTorsoAction	= theTorsoAction;
        mPseudoWeapon	= thePseudoWeapon;
        mTorsoView	= theTorsoView;
        mTorsoFrame	= theTorsoFrame;
        mTorsoColor	= theTorsoColor;
        
        // We are _valid_.  Sweet.
        mTorsoValid	= true;

        // Success - get me outta here!
        break;

    } while(tryAgain && theNumberOfTriesLeft > 0);

    // Valid or not, the torso is no longer dirty.
    mTorsoDirty = false;
}