AI Skill Report Card
Animating Realistic Cats
YAML--- name: animating-realistic-cats description: Creates lifelike cat animations with natural paw movement using SkiaSharp. Use when building interactive cat animations, games with feline characters, or educational apps requiring realistic animal motion. ---
Realistic Cat Animation with SkiaSharp
Quick Start14 / 15
CSHARPusing SkiaSharp; using SkiaSharp.Views.Maui.Controls; public class CatAnimator { private float walkCycle = 0f; private readonly float walkSpeed = 0.05f; private readonly SKPoint catPosition = new(200, 300); public void DrawWalkingCat(SKCanvas canvas, long frame) { walkCycle += walkSpeed; // Front paws alternate with offset float frontPawOffset = (float)Math.Sin(walkCycle) * 15f; float backPawOffset = (float)Math.Sin(walkCycle + Math.PI) * 12f; DrawCatBody(canvas, catPosition); DrawPaw(canvas, catPosition.X - 20, catPosition.Y + 40 + frontPawOffset); DrawPaw(canvas, catPosition.X + 20, catPosition.Y + 40 - frontPawOffset); DrawPaw(canvas, catPosition.X - 15, catPosition.Y + 35 + backPawOffset); DrawPaw(canvas, catPosition.X + 15, catPosition.Y + 35 - backPawOffset); } }
Recommendation▾
Add missing DrawCatBody() and DrawPaw() method implementations in Quick Start for immediate usability
Workflow13 / 15
Animation Setup:
- Initialize timing variables (walkCycle, idleCycle, frameTime)
- Set realistic speed constants (walkSpeed: 0.05f, runSpeed: 0.12f)
- Create easing functions for natural acceleration/deceleration
- Establish paw positioning offsets for quadruped gait
Core Animation Loop: Progress:
- Update timing based on real deltaTime
- Calculate current gait phase (walk/trot/run)
- Apply physics-based movement curves
- Render body with subtle bounce
- Draw paws with proper alternating pattern
- Add secondary animations (tail, ears, whiskers)
Natural Movement Patterns:
- Walking Gait: Diagonal pairs alternate (front-left + back-right, then front-right + back-left)
- Trotting: Faster diagonal coordination with slight airtime
- Prowling: Lower body, slower deliberate steps, extended paw holds
- Sitting/Standing: Weight shift with micro-movements for breathing
Recommendation▾
Reduce verbosity in Best Practices section - combine timing and physics into fewer, more actionable points
Examples20 / 20
Example 1: Walking Animation
CSHARPpublic void UpdateWalkCycle(float deltaTime) { walkCycle += walkSpeed * deltaTime * 60f; // 60fps normalization // Natural paw lifting curve (quick up, slow down) float frontLeft = EaseOutQuart(Math.Sin(walkCycle)) * 20f; float frontRight = EaseOutQuart(Math.Sin(walkCycle + Math.PI)) * 20f; float backLeft = EaseOutQuart(Math.Sin(walkCycle + Math.PI/2)) * 15f; float backRight = EaseOutQuart(Math.Sin(walkCycle - Math.PI/2)) * 15f; }
Example 2: Pounce Sequence
CSHARPpublic void AnimatePounce(float progress) { if (progress < 0.3f) // Crouch phase { float crouch = progress / 0.3f; bodyHeight = Lerp(normalHeight, crouchHeight, EaseInQuad(crouch)); frontPawSpread = Lerp(0f, 25f, crouch); } else if (progress < 0.8f) // Leap phase { float leap = (progress - 0.3f) / 0.5f; bodyHeight = Lerp(crouchHeight, leapHeight, EaseOutCubic(leap)); allPawsUp = true; } // Landing handled separately with impact absorption }
Recommendation▾
Include a complete minimal working example showing the full animation loop from start to finish
Best Practices
Timing and Physics:
- Use deltaTime for frame-rate independent animation
- Apply easing functions: EaseOutQuart for paw lifting, EaseInQuad for landing
- Acceleration curves: gradual start (0.8s), quick middle, gradual stop (1.2s)
- Body bounce: 2-3px vertical movement during walk, synchronized with paw contact
Paw Mechanics:
- Front paws lift higher (20px) than back paws (15px)
- Hold paws briefly at peak lift (0.1s) for realistic hesitation
- Slight paw rotation during lift (8-10 degrees forward)
- Contact sound triggers when paw Y-position reaches ground level
Visual Details:
- Subtle body rotation (±2 degrees) following movement direction
- Tail movement lags body movement by 0.2s
- Ear twitching independent of main animation (random 0.5-2s intervals)
- Eye blinks every 3-7 seconds with natural timing
Performance:
- Pre-calculate sine/cosine values for smooth curves
- Use object pooling for particle effects (dust, fur movement)
- Limit redraw regions to animated areas only
- Cache static body parts, animate overlays
Common Pitfalls
Avoid Robotic Movement:
- Never use linear interpolation for organic motion
- Don't sync all movements to same timing
- Avoid perfectly symmetrical animations
Physics Mistakes:
- Don't ignore momentum in direction changes
- Never instant-stop animations (always ease out)
- Don't forget weight distribution affects paw pressure
Performance Issues:
- Don't recalculate complex curves every frame
- Avoid creating new SKPaint objects in draw loops
- Don't animate invisible or off-screen elements
Timing Errors:
- Don't use fixed frame counts (use time-based animation)
- Never assume 60fps consistency
- Don't forget to normalize deltaTime calculations