Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Capture gameplay screenshots using godot-e2e for visual verification. Use when you need to: take a screenshot of the running game, capture multiple screenshots during an E2E scenario, generate reference.png, visually verify game state, or provide screenshots for VQA analysis. Triggers: "screenshot", "capture screenshot", "take screenshot", "reference.png", "visual capture", "screenshot the game".
.claude/skills/randallliuxin-screenshot/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 6% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -35% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -7% | 0% |
$ARGUMENTS
Capture screenshots from a running Godot game using godot-e2e's internal viewport capture. Works headless, multi-monitor safe, no external tools needed.
Write and run a Python script:
python# capture_screenshot.py import os, sys from godot_e2e import GodotE2E project_path = sys.argv[1] if len(sys.argv) > 1 else "." save_path = sys.argv[2] if len(sys.argv) > 2 else "screenshot.png" with GodotE2E.launch(project_path, timeout=15.0) as game: game.wait_for_node("/root/Main", timeout=10.0) game.wait_seconds(1.0) # let the game render a few frames result = game.screenshot(save_path=save_path) print(f"Screenshot saved: {result}")
Run: python capture_screenshot.py <project_dir> <output_path>
For capturing multiple screenshots during a gameplay scenario:
python# capture_gameplay.py import os, sys from godot_e2e import GodotE2E project_path = sys.argv[1] if len(sys.argv) > 1 else "." output_dir = sys.argv[2] if len(sys.argv) > 2 else "screenshots" os.makedirs(output_dir, exist_ok=True) with GodotE2E.launch(project_path, timeout=15.0) as game: game.wait_for_node("/root/Main", timeout=10.0) # 1. Initial state game.wait_seconds(0.5) game.screenshot(save_path=os.path.join(output_dir, "01_initial.png")) # 2. After some interaction (customize per game) game.wait_seconds(2.0) game.screenshot(save_path=os.path.join(output_dir, "02_gameplay.png")) # 3. Later state game.wait_seconds(3.0) game.screenshot(save_path=os.path.join(output_dir, "03_later.png")) print(f"Captured {len(os.listdir(output_dir))} screenshots to {output_dir}/")
For scenes with motion, animation, or physics, the visual-qa skill's Dynamic mode expects a reference image plus N frames captured at 0.5s intervals (2 FPS cadence). Output goes into a per-scene subdirectory (e2e/screenshots/scene_{name}/) so multiple scenes don't collide:
python# capture_dynamic.py import os, sys from godot_e2e import GodotE2E project_path = sys.argv[1] out_dir = sys.argv[2] # e.g. "e2e/screenshots/scene_main" n_frames = int(sys.argv[3]) if len(sys.argv) > 3 else 6 os.makedirs(out_dir, exist_ok=True) with GodotE2E.launch(project_path, timeout=15.0) as game: game.wait_for_node("/root/Main", timeout=10.0) game.wait_seconds(1.0) # let initial render settle for i in range(n_frames): path = os.path.join(out_dir, f"frame_{i:03d}.png") game.screenshot(save_path=path) if i < n_frames - 1: game.wait_seconds(0.5) # 0.5s = 2 FPS, matches VQA Dynamic cadence
Then feed reference + sequence to visual-qa (see .claude/skills/visual-qa/SKILL.md):
Skill(skill="visual-qa") "Check references/scene_main.png against e2e/screenshots/scene_main/frame_*.png — Goal: ..., Requirements: ..., Verify: ..."For static scenes (decoration, terrain, UI without motion), one screenshot is enough — use the Quick Capture pattern above and call visual-qa Static mode.
For fixgap worker visual self-checks, save evidence under reports/fixgap-visual/<task_id>/. For verifier-only fresh captures, use reports/verifier-temp/.
Use the quick capture method, save to reference.png in the project root:
bashpython capture_screenshot.py <project_dir> <project_dir>/reference.png
If the game has a title screen, wait for it to load and capture. If the game starts directly in gameplay, capture after 1-2 seconds of gameplay.
During spot-check, use multi-point capture with game interactions:
python# spot_check_capture.py import os, sys from godot_e2e import GodotE2E project_path = sys.argv[1] output_dir = os.path.join(project_path, "spot_check_screenshots") os.makedirs(output_dir, exist_ok=True) with GodotE2E.launch(project_path, timeout=15.0) as game: game.wait_for_node("/root/Main", timeout=10.0) # Capture at intervals for i in range(4): game.wait_seconds(1.5) path = os.path.join(output_dir, f"spot_{i+1}.png") game.screenshot(save_path=path) print(f"Spot-check screenshot {i+1}: {path}")
| Method | Description | |--------|-------------| | game.screenshot(save_path="") | Capture viewport as PNG. Returns absolute path. If save_path is empty, saves to a temp file. |
When capturing screenshots for physics/collision verification, launch Godot with --debug-collisions to render collision shapes as visible overlays:
pythonwith GodotE2E.launch(project_path, timeout=15.0, extra_args=["--debug-collisions"]) as game: game.wait_seconds(1.0) game.screenshot(save_path="collision_check.png")
This makes CollisionShape2D/3D outlines visible in the capture, allowing VQA to verify that collision bounds match sprite extents.
game.screenshot() — internal viewport capture. Do NOT use external screenshot tools.game.wait_seconds(0.5) minimum after scene load to ensure rendering is complete.01_initial.png, 02_after_input.png, not screenshot1.png.--debug-collisions when verifying physics/collision correctness.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-04 | fail→pass | 32,939 | 6,131 | -81% | 1 | 1 | 0% | 2,725 | 2,902 | +6% | 0 | 0 | — |
case-03 | fail→pass | 14,000 | 5,712 | -59% | 1 | 1 | 0% | 2,262 | 2,754 | +22% | 0 | 0 | — |
case-02 | fail→pass | 25,528 | 6,884 | -73% | 1 | 1 | 0% | 4,766 | 3,119 | -35% | 0 | 0 | — |
case-01 | fail→pass | 9,603 | 3,287 | -66% | 1 | 1 | 0% | 1,679 | 2,366 | +41% | 0 | 0 | — |
case-05 | fail→fail | 13,356 | 12,257 | -8% | 1 | 1 | 0% | 2,797 | 4,019 | +44% | 0 | 0 | — |
case-06 | fail→fail | 4,583 | 4,582 | -0% | 1 | 1 | 0% | 167 | 2,024 | +1112% | 0 | 0 | — |
case-07 | fail→fail | 23,201 | 7,597 | -67% | 1 | 1 | 0% | 4,083 | 3,340 | -18% | 0 | 0 | — |
case-08 | fail→pass | 16,112 | 5,556 | -66% | 1 | 1 | 0% | 3,053 | 2,844 | -7% | 0 | 0 | — |
case-09 | fail→pass | 13,637 | 4,335 | -68% | 1 | 1 | 0% | 2,134 | 2,445 | +15% | 0 | 0 | — |
case-10 | pass→pass | 13,141 | 5,758 | -56% | 1 | 1 | 0% | 2,487 | 2,774 | +12% | 0 | 0 | — |
case-11 | pass→pass | 12,933 | 2,922 | -77% | 1 | 1 | 0% | 1,927 | 2,208 | +15% | 0 | 0 | — |
case-12 | fail→pass | 10,840 | 4,163 | -62% | 1 | 1 | 0% | 1,835 | 2,534 | +38% | 0 | 0 | — |
case-13 | fail→pass | 14,324 | 5,824 | -59% | 1 | 1 | 0% | 2,405 | 2,843 | +18% | 0 | 0 | — |
case-14 | fail→pass | 15,691 | 5,967 | -62% | 1 | 1 | 0% | 2,349 | 2,758 | +17% | 0 | 0 | — |
case-15 | fail→pass | 8,204 | 3,625 | -56% | 1 | 1 | 0% | 1,449 | 2,394 | +65% | 0 | 0 | — |
case-16 | fail→pass | 12,731 | 2,000 | -84% | 1 | 1 | 0% | 1,955 | 2,002 | +2% | 0 | 0 | — |
case-17 | fail→pass | 15,683 | 5,665 | -64% | 1 | 1 | 0% | 2,697 | 2,810 | +4% | 0 | 0 | — |
case-18 | pass→pass | 17,099 | 6,784 | -60% | 1 | 1 | 0% | 2,557 | 2,804 | +10% | 0 | 0 | — |
case-19 | fail→pass | 11,424 | 5,141 | -55% | 1 | 1 | 0% | 2,019 | 2,655 | +32% | 0 | 0 | — |
case-20 | fail→pass | 13,486 | 5,480 | -59% | 1 | 1 | 0% | 2,201 | 2,843 | +29% | 0 | 0 | — |
case-21 | fail→pass | 25,379 | 2,153 | -92% | 1 | 1 | 0% | 1,705 | 2,098 | +23% | 0 | 0 | — |
case-22 | fail→pass | 11,703 | 3,463 | -70% | 1 | 1 | 0% | 1,660 | 2,286 | +38% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +73 percentage points is the difference between those two pass rates over the 21 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.