Skip to content

Commit

Permalink
Sprite_Character/AirshipShadow: Move functions that are only used by …
Browse files Browse the repository at this point in the history
…Sprite from Update to Draw.

This is similiar how Pictures do it since years.

Avoids some unnecessary function calls when Player is frame-skipping as less draw related code is processed.
  • Loading branch information
Ghabry committed Apr 15, 2024
1 parent 2f129a1 commit 2ba6a23
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 23 deletions.
20 changes: 13 additions & 7 deletions src/sprite_airshipshadow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,19 @@ void Sprite_AirshipShadow::RecreateShadow() {
GetBitmap()->Blit(0, 0, *system, Rect(128+16,32,16,16), opacity);
}

void Sprite_AirshipShadow::Draw(Bitmap &dst) {
Game_Vehicle* airship = Game_Map::GetVehicle(Game_Vehicle::Airship);
const int altitude = airship->GetAltitude();
const int max_altitude = TILE_SIZE;
const double opacity = (double)altitude / max_altitude;
SetOpacity(opacity * 255);

SetX(Main_Data::game_player->GetScreenX() + x_offset);
SetY(Main_Data::game_player->GetScreenY() + y_offset + Main_Data::game_player->GetJumpHeight());

Sprite::Draw(dst);
}

void Sprite_AirshipShadow::Update() {
if (!Main_Data::game_player->InAirship()) {
SetVisible(false);
Expand All @@ -63,13 +76,6 @@ void Sprite_AirshipShadow::Update() {

Game_Vehicle* airship = Game_Map::GetVehicle(Game_Vehicle::Airship);

const int altitude = airship->GetAltitude();
const int max_altitude = TILE_SIZE;
const double opacity = (double)altitude / max_altitude;
SetOpacity(opacity * 255);

SetX(Main_Data::game_player->GetScreenX() + x_offset);
SetY(Main_Data::game_player->GetScreenY() + y_offset + Main_Data::game_player->GetJumpHeight());
// Synchronized with airship priority
SetZ(airship->GetScreenZ(x_offset, y_offset) - 1);
}
1 change: 1 addition & 0 deletions src/sprite_airshipshadow.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class Sprite_AirshipShadow : public Sprite {
};

Sprite_AirshipShadow(int x_offset = 0, int y_offset = 0);
void Draw(Bitmap& dst) override;
void Update();
void RecreateShadow();

Expand Down
38 changes: 22 additions & 16 deletions src/sprite_character.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,27 @@ Sprite_Character::Sprite_Character(Game_Character* character, int x_offset, int
Update();
}

void Sprite_Character::Draw(Bitmap &dst) {
if (UsesCharset()) {
int row = character->GetFacing();
auto frame = character->GetAnimFrame();
if (frame >= lcf::rpg::EventPage::Frame_middle2) frame = lcf::rpg::EventPage::Frame_middle;
SetSrcRect({frame * chara_width, row * chara_height, chara_width, chara_height});
}

SetFlashEffect(character->GetFlashColor());

SetOpacity(character->GetOpacity());

SetX(character->GetScreenX() + x_offset);
SetY(character->GetScreenY() + y_offset);

int bush_split = 4 - character->GetBushDepth();
SetBushDepth(bush_split > 3 ? 0 : GetHeight() / bush_split);

Sprite::Draw(dst);
}

void Sprite_Character::Update() {
if (tile_id != character->GetTileId() ||
character_name != character->GetSpriteName() ||
Expand Down Expand Up @@ -63,29 +84,14 @@ void Sprite_Character::Update() {
}
}

if (UsesCharset()) {
int row = character->GetFacing();
auto frame = character->GetAnimFrame();
if (frame >= lcf::rpg::EventPage::Frame_middle2) frame = lcf::rpg::EventPage::Frame_middle;
SetSrcRect({frame * chara_width, row * chara_height, chara_width, chara_height});
}

SetFlashEffect(character->GetFlashColor());

SetOpacity(character->GetOpacity());
SetVisible(character->IsVisible());

SetX(character->GetScreenX() + x_offset);
SetY(character->GetScreenY() + y_offset);
SetZ(character->GetScreenZ(x_offset, y_offset));

int bush_split = 4 - character->GetBushDepth();
SetBushDepth(bush_split > 3 ? 0 : GetHeight() / bush_split);
}

Game_Character* Sprite_Character::GetCharacter() {
return character;
}

void Sprite_Character::SetCharacter(Game_Character* new_character) {
character = new_character;
}
Expand Down
2 changes: 2 additions & 0 deletions src/sprite_character.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ class Sprite_Character : public Sprite {
*/
Sprite_Character(Game_Character* character, int x_offset = 0, int y_offset = 0);

void Draw(Bitmap& dst) override;

/**
* Updates sprite state.
*/
Expand Down

0 comments on commit 2ba6a23

Please sign in to comment.