Stage Component
The Stage component is the central visual element of MistWarp that renders the project's stage and sprites.
Overview
The Stage component handles:
- Rendering the project's visual content
- Managing sprite positioning and transformations
- Handling stage interactions and events
- Coordinating with the VM for visual updates
Architecture
StageWrapper (container)
└── Stage (presentation component)
├── StageHeader
├── StageCanvas
└── StageControls
Key Features
Canvas Rendering
- Uses WebGL for high-performance rendering
- Supports custom stage sizes
- Handles HD sprite rendering
- Implements efficient dirty region updates
Event Handling
- Mouse and touch interactions
- Drag and drop for sprites
- Right-click context menus
- Keyboard events when stage is focused
Performance Optimizations
- Frame rate limiting
- Sprite culling for off-screen sprites
- Texture atlasing for costumes
- GPU-accelerated effects
Props Interface
interface StageProps {
width: number;
height: number;
isFullScreen: boolean;
isStarted: boolean;
onGreenFlag: () => void;
onStop: () => void;
vm: VirtualMachine;
// ... other props
}
Integration with VM
The Stage component closely integrates with the MistWarp VM:
// Listen for VM render events
vm.on('VISUAL_REPORT', this.handleVisualUpdate);
vm.on('PROJECT_CHANGED', this.handleProjectChange);
vm.on('SPRITE_INFO_REPORT', this.handleSpriteInfo);
Costume Management
The stage handles costume rendering for all sprites:
- Loads and caches costume data
- Applies transformations (rotation, scale)
- Manages layering (sprite order)
- Handles costume switching animations
MistWarp Enhancements
MistWarp adds several enhancements to the standard Scratch stage:
Performance Mode
- Reduced quality mode for slower devices
- Framerate limiting options
- Sprite limit enforcement
Custom Stage Sizes
- Support for non-standard aspect ratios
- Dynamic resizing during runtime
- Responsive scaling
Advanced Effects
- Additional visual effects beyond Scratch
- GPU shader support
- Custom blend modes
Testing
// Example test for stage rendering
it('should render sprites correctly', () => {
const stage = mount(<Stage {...defaultProps} />);
const canvas = stage.find('canvas');
expect(canvas).toHaveLength(1);
expect(canvas.prop('width')).toBe(480);
expect(canvas.prop('height')).toBe(360);
});