static void DrawLives( const GraphicsDevice *device, const PlayerData *player, const Vec2i pos, const FontAlign hAlign, const FontAlign vAlign) { const int xStep = hAlign == ALIGN_START ? 10 : -10; const Vec2i offset = Vec2iNew(5, 20); Vec2i drawPos = Vec2iAdd(pos, offset); if (hAlign == ALIGN_END) { const int w = device->cachedConfig.Res.x; drawPos.x = w - drawPos.x - offset.x; } if (vAlign == ALIGN_END) { const int h = device->cachedConfig.Res.y; drawPos.y = h - drawPos.y + offset.y + 5; } const TOffsetPic head = GetHeadPic( BODY_ARMED, DIRECTION_DOWN, player->Char.looks.Face, STATE_IDLE); for (int i = 0; i < player->Lives; i++) { BlitOld( drawPos.x + head.dx, drawPos.y + head.dy, PicManagerGetOldPic(&gPicManager, head.picIndex), &player->Char.table, BLIT_TRANSPARENT); drawPos.x += xStep; } }
void DrawHead( const Character *c, const direction_e dir, const Vec2i pos) { const Pic *head = GetHeadPic(c->Class, dir, GUNSTATE_READY); const Vec2i drawPos = Vec2iMinus(pos, Vec2iNew( head->size.x / 2, head->size.y / 2)); BlitCharMultichannel(&gGraphicsDevice, head, drawPos, &c->Colors); }
static void GetCharacterPics( ActorPics *pics, Character *c, const direction_e dir, const int frame, const NamedSprites *gunPics, const gunstate_e gunState, const bool isTransparent, HSV *tint, color_t *mask, const int deadPic) { memset(pics, 0, sizeof *pics); pics->DrawOrder[0] = pics->DrawOrder[1] = pics->DrawOrder[2] = -1; pics->Colors = &c->Colors; // If the actor is dead, simply draw a dying animation pics->IsDead = deadPic > 0; if (pics->IsDead) { if (deadPic < DEATH_MAX) { pics->IsDying = true; pics->Body = GetDeathPic(&gPicManager, deadPic - 1); pics->DrawOrder[0] = BODY_PART_BODY; } return; } pics->IsTransparent = isTransparent; if (pics->IsTransparent) { pics->Tint = &tintDarker; } else if (tint != NULL) { pics->Tint = tint; pics->Mask = mask; } // Head direction_e headDir = dir; int headFrame = frame; // If firing, draw the firing head pic if (gunState == GUNSTATE_FIRING || gunState == GUNSTATE_RECOIL) { headFrame = STATE_COUNT + gunState - GUNSTATE_FIRING; } // If idle, turn head left/right on occasion if (headFrame == STATE_IDLELEFT) headDir = (dir + 7) % 8; else if (headFrame == STATE_IDLERIGHT) headDir = (dir + 1) % 8; pics->Head = GetHeadPic(c->Class, headDir, headFrame); // Body const bool isArmed = gunPics != NULL; pics->Body = GetBodyPic(&gPicManager, dir, frame, isArmed); // Gun pics->Gun = NULL; if (isArmed) { pics->Gun = GetGunPic(gunPics, dir, gunState); } // Determine draw order based on the direction the player is facing // Order is: 0: head, 1: body, 2: gun switch (dir) { case DIRECTION_UP: case DIRECTION_UPRIGHT: pics->DrawOrder[0] = BODY_PART_GUN; pics->DrawOrder[1] = BODY_PART_HEAD; pics->DrawOrder[2] = BODY_PART_BODY; break; case DIRECTION_RIGHT: case DIRECTION_DOWNRIGHT: case DIRECTION_DOWN: case DIRECTION_DOWNLEFT: pics->DrawOrder[0] = BODY_PART_BODY; pics->DrawOrder[1] = BODY_PART_HEAD; pics->DrawOrder[2] = BODY_PART_GUN; break; case DIRECTION_LEFT: case DIRECTION_UPLEFT: pics->DrawOrder[0] = BODY_PART_GUN; pics->DrawOrder[1] = BODY_PART_BODY; pics->DrawOrder[2] = BODY_PART_HEAD; break; default: CASSERT(false, "invalid direction"); return; } }
void DrawCharacterSimple( const Character *c, const Vec2i pos, const direction_e dir, const int state, const int gunPic, const gunstate_e gunState, const TranslationTable *table) { TOffsetPic body, head, gun; TOffsetPic pic1, pic2, pic3; direction_e headDir = dir; int headState = state; if (gunState == GUNSTATE_FIRING || gunState == GUNSTATE_RECOIL) { headState = STATE_COUNT + gunState - GUNSTATE_FIRING; } if (state == STATE_IDLELEFT) { headDir = (direction_e)((dir + 7) % 8); } else if (state == STATE_IDLERIGHT) { headDir = (direction_e)((dir + 1) % 8); } int bodyType = gunPic < 0 ? BODY_UNARMED : BODY_ARMED; body.dx = cBodyOffset[bodyType][dir].dx; body.dy = cBodyOffset[bodyType][dir].dy; body.picIndex = cBodyPic[bodyType][dir][state]; head = GetHeadPic(bodyType, headDir, c->looks.Face, headState); gun.picIndex = -1; if (gunPic >= 0) { gun.dx = cGunHandOffset[bodyType][dir].dx + cGunPics[gunPic][dir][gunState].dx; gun.dy = cGunHandOffset[bodyType][dir].dy + cGunPics[gunPic][dir][gunState].dy; gun.picIndex = cGunPics[gunPic][dir][gunState].picIndex; } switch (dir) { case DIRECTION_UP: case DIRECTION_UPRIGHT: pic1 = gun; pic2 = head; pic3 = body; break; case DIRECTION_RIGHT: case DIRECTION_DOWNRIGHT: case DIRECTION_DOWN: case DIRECTION_DOWNLEFT: pic1 = body; pic2 = head; pic3 = gun; break; case DIRECTION_LEFT: case DIRECTION_UPLEFT: pic1 = gun; pic2 = body; pic3 = head; break; default: assert(0 && "invalid direction"); return; } if (pic1.picIndex >= 0) { BlitOld( pos.x + pic1.dx, pos.y + pic1.dy, PicManagerGetOldPic(&gPicManager, pic1.picIndex), table, BLIT_TRANSPARENT); } if (pic2.picIndex >= 0) { BlitOld( pos.x + pic2.dx, pos.y + pic2.dy, PicManagerGetOldPic(&gPicManager, pic2.picIndex), table, BLIT_TRANSPARENT); } if (pic3.picIndex >= 0) { BlitOld( pos.x + pic3.dx, pos.y + pic3.dy, PicManagerGetOldPic(&gPicManager, pic3.picIndex), table, BLIT_TRANSPARENT); } }
ActorPics GetCharacterPics( Character *c, const direction_e dir, const ActorAnimation anim, const int frame, const NamedSprites *gunPics, const gunstate_e gunState, const bool isTransparent, HSV *tint, color_t *mask, const int deadPic) { ActorPics pics; memset(&pics, 0, sizeof pics); pics.Colors = &c->Colors; // If the actor is dead, simply draw a dying animation pics.IsDead = deadPic > 0; if (pics.IsDead) { if (deadPic < DEATH_MAX) { pics.IsDying = true; pics.Body = GetDeathPic(&gPicManager, deadPic - 1); pics.OrderedPics[0] = pics.Body; } return pics; } pics.IsTransparent = isTransparent; if (pics.IsTransparent) { pics.Tint = &tintDarker; } else if (tint != NULL) { pics.Tint = tint; pics.Mask = mask; } // Head direction_e headDir = dir; // If idle, turn head left/right on occasion if (anim == ACTORANIMATION_IDLE) { if (frame == IDLEHEAD_LEFT) headDir = (dir + 7) % 8; else if (frame == IDLEHEAD_RIGHT) headDir = (dir + 1) % 8; } pics.Head = GetHeadPic(c->Class, headDir, gunState); pics.HeadOffset = GetActorDrawOffset( pics.Head, BODY_PART_HEAD, c->Class->Sprites, anim, frame, dir); // Body const bool isArmed = gunPics != NULL; pics.Body = GetBodyPic( &gPicManager, c->Class->Sprites, dir, anim, frame, isArmed); pics.BodyOffset = GetActorDrawOffset( pics.Body, BODY_PART_BODY, c->Class->Sprites, anim, frame, dir); // Legs pics.Legs = GetLegsPic( &gPicManager, c->Class->Sprites, dir, anim, frame); pics.LegsOffset = GetActorDrawOffset( pics.Legs, BODY_PART_LEGS, c->Class->Sprites, anim, frame, dir); // Gun pics.Gun = NULL; if (isArmed) { pics.Gun = GetGunPic(gunPics, dir, gunState); pics.GunOffset = GetActorDrawOffset( pics.Gun, BODY_PART_GUN, c->Class->Sprites, anim, frame, dir); } // Determine draw order based on the direction the player is facing for (BodyPart bp = BODY_PART_HEAD; bp < BODY_PART_COUNT; bp++) { const BodyPart drawOrder = c->Class->Sprites->Order[dir][bp]; switch (drawOrder) { case BODY_PART_HEAD: pics.OrderedPics[bp] = pics.Head; pics.OrderedOffsets[bp] = pics.HeadOffset; break; case BODY_PART_BODY: pics.OrderedPics[bp] = pics.Body; pics.OrderedOffsets[bp] = pics.BodyOffset; break; case BODY_PART_LEGS: pics.OrderedPics[bp] = pics.Legs; pics.OrderedOffsets[bp] = pics.LegsOffset; break; case BODY_PART_GUN: pics.OrderedPics[bp] = pics.Gun; pics.OrderedOffsets[bp] = pics.GunOffset; break; default: break; } } pics.Sprites = c->Class->Sprites; return pics; }