К основному содержанию
скилл CX Codex

pygame-core — скилл для Claude Code: структура игры на pygame

Скилл собирает каркас игры на pygame: игровой цикл, движение с учётом delta-time, ввод, спрайты и коллизии. Пригодится, когда проект начинается с import pygame.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill pygame-core -a claude-code
Открыть на GitHub

Что делает pygame-core

Скилл описывает, как устроить игру на pygame-ce 2.5.8 — поддерживаемом форке, который импортируется как pygame и работает на Python 3.10–3.15. Внутри один файл SKILL.md с готовыми шаблонами кода: минимальный цикл «события → обновление → отрисовка → flip», движение через Vector2 и dt, обработка клавиатуры и мыши, подкласс pygame.sprite.Sprite вместе с Group.

Ввод разбирается двумя способами: события KEYDOWN и MOUSEBUTTONDOWN для одиночных нажатий, опрос pygame.key.get_pressed() для удержания. Коллизии показаны через spritecollide, groupcollide и обычный colliderect. Отдельный раздел про грабли: окно зависает, если не вычитывать очередь событий каждый кадр, а после паузы в отладчике clock.tick() вернёт весь простой одним огромным dt — его советует ограничить, например dt = min(clock.tick(60) / 1000, 0.05).

Ставить pygame-ce нужно вместо старого pygame, и держать оба в одном окружении не стоит. Скилл не про 3D и не про вопросы языка Python в отрыве от pygame: для сохранений есть save-systems, для переназначаемых клавиш — input-systems.

Какие задачи решает

  • собрать рабочий игровой цикл с нуля
  • убрать зависимость скорости от частоты кадров
  • развести обработку одиночных нажатий и удержания клавиш
  • описать спрайты и группы с коллизиями
  • починить зависание окна и рывки при движении

Примеры запросов агенту

  • Настрой игровой цикл на pygame: события, update, draw, flip
  • Персонаж двигается быстрее на мощной машине — переделай движение через delta-time
  • Сделай класс Player на pygame.sprite.Sprite и группу с проверкой столкновений

Как установить pygame-core

1Через Skills CLI (Vercel)

npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill pygame-core -a claude-code

2Вручную: положить файлы

~/.claude/skills/pygame-core/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/pygame-core/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о pygame-core

Как установить pygame-core в Claude?

Выполните npx skills add gamedev-skills/awesome-gamedev-agent-skills --skill pygame-core -a claude-code. После этого файл скилла лежит в ~/.claude/skills/pygame-core/SKILL.md.

Что делает pygame-core?

Даёт шаблоны для каркаса игры на pygame: цикл, движение с учётом delta-time, ввод, отрисовка через Surface и Rect, спрайты с группами и коллизиями.

Нужен pygame или pygame-ce?

Скилл нацелен на pygame-ce 2.5.8, который импортируется как pygame. Ставьте pip install pygame-ce и не держите оба пакета в одном окружении.

Исходный текст

SKILL.md · Apache-2.0
---
name: pygame-core
description: >
  Structure a pygame (pygame-ce) game in Python: the init/event/update/draw loop,
  delta-time movement, Surface/Rect blitting, keyboard/mouse input, and
  Sprite/Group management with collision. Use when building or debugging a pygame
  game — when the user mentions pygame, pygame-ce, the game loop, blit, Surface,
  Rect, sprite groups, or clock.tick. Targets pygame-ce.
---

# pygame Core

Build the foundation of a pygame game in Python: the main loop, delta-time
movement, drawing with `Surface`/`Rect`, input, and `Sprite`/`Group` management.
Targets **pygame-ce 2.5.8** (the actively maintained community fork; same
`import pygame`), which supports Python 3.10–3.15.

## When to use

- Use when starting a pygame game, fixing the loop, frame-rate-dependent speed,
  input handling, blitting, or sprite/group collision.
- Use when code does `import pygame` and the project depends on `pygame-ce`
  (or `pygame`).

**When *not* to use:** Python language questions unrelated to pygame. 3D rendering
(pygame is 2D). For cross-engine save/load use `save-systems`; for rebindable input
architecture see `input-systems`.

## Core workflow

1. **Install pygame-ce, not legacy pygame.** `pip install pygame-ce` — it's the
   maintained fork and imports as `pygame`. Don't install both in one environment.
2. **Init and open a window.** `pygame.init()`, `screen =
   pygame.display.set_mode((w, h))`, `clock = pygame.time.Clock()`.
3. **Run one loop: events → update → draw → flip.** Pump the event queue every
   frame (`for event in pygame.event.get()`), update state, redraw, then
   `pygame.display.flip()`.
4. **Make it frame-rate independent.** Get `dt = clock.tick(60) / 1000` (seconds)
   and scale all motion by `dt`. Keep positions as floats; blit at integer rects.
5. **Handle input two ways:** event-based (`KEYDOWN`/`MOUSEBUTTONDOWN`, for discrete
   actions) and polled (`pygame.key.get_pressed()`, for held movement).
6. **Organise objects with `Sprite` + `Group`.** Subclass `pygame.sprite.Sprite`
   with `image`/`rect`; `group.update(dt)` and `group.draw(screen)` handle the
   batch. Run it and watch the window before assuming it works.

## Patterns

### 1. Minimal game loop (the skeleton)

```python
import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()

running = True
while running:
    dt = clock.tick(60) / 1000          # cap at 60 FPS; dt = seconds since last frame
    for event in pygame.event.get():    # MUST drain the queue or the OS thinks it hung
        if event.type == pygame.QUIT:
            running = False

    # update game state here, scaled by dt ...

    screen.fill((18, 18, 28))           # clear each frame
    # draw everything here ...
    pygame.display.flip()               # present the frame

pygame.quit()
```

### 2. Delta-time movement (frame-rate independent)

```python
from pygame.math import Vector2

pos = Vector2(100, 100)        # keep position as floats
speed = 220                    # PIXELS PER SECOND, not per frame

# inside the loop, after computing dt:
keys = pygame.key.get_pressed()
direction = Vector2(
    keys[pygame.K_RIGHT] - keys[pygame.K_LEFT],
    keys[pygame.K_DOWN]  - keys[pygame.K_UP],
)
if direction.length_squared() > 0:
    direction = direction.normalize()      # equal speed on diagonals
pos += direction * speed * dt              # RIGHT: dt-scaled
screen.blit(player_img, (round(pos.x), round(pos.y)))  # blit at integer pixels
```

### 3. Input: events vs polling

```python
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False
    elif event.type == pygame.KEYDOWN:        # discrete press: jump, menu, pause
        if event.key == pygame.K_SPACE:
            jump()
        elif event.key == pygame.K_ESCAPE:
            running = False
    elif event.type == pygame.MOUSEBUTTONDOWN:
        shoot_at(event.pos)                   # event.pos = (x, y)

# Polled state (read once per frame) for continuous/held input:
keys = pygame.key.get_pressed()
if keys[pygame.K_a]:
    move_left(dt)
```

### 4. A Sprite subclass + a Group

```python
class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        # convert() once at load makes blits much faster; _alpha keeps transparency.
        self.image = pygame.image.load("player.png").convert_alpha()
        self.rect = self.image.get_rect(center=(x, y))
        self.pos = pygame.math.Vector2(self.rect.center)
        self.speed = 240

    def update(self, dt):                      # Group.update(dt) calls this per sprite
        keys = pygame.key.get_pressed()
        self.pos.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * self.speed * dt
        self.rect.center = (round(self.pos.x), round(self.pos.y))

all_sprites = pygame.sprite.Group()
all_sprites.add(Player(400, 300))

# in the loop:
all_sprites.update(dt)        # calls each sprite's update(dt)
all_sprites.draw(screen)      # blits each sprite at its rect
```

### 5. Collision detection

```python
# Sprite vs group: e.g. player picking up coins (True = remove collided coins).
collected = pygame.sprite.spritecollide(player, coins, dokill=True)
score += len(collected)

# Group vs group: bullets vs enemies (kill both on hit).
hits = pygame.sprite.groupcollide(bullets, enemies, True, True)

# Plain rect overlap (no sprites needed):
if player.rect.colliderect(door_rect):
    open_door()
```

## Pitfalls

- **Window freezes / "not responding"** → you didn't pump the event queue. Call
  `pygame.event.get()` (or `pygame.event.pump()`) every frame.
- **Speed differs on faster machines** → you moved by a fixed amount per frame.
  Scale by `dt = clock.tick(fps) / 1000` and use pixels-per-second values.
- **Sub-pixel movement snaps/jitters** → `rect` coordinates are integers; store the
  true position as a `Vector2` of floats and assign `rect.center = round(...)` each
  frame. In pygame-ce you can instead use a float rect: `image.get_frect(...)` returns
  a `pygame.FRect`, which sprite groups and collision functions accept like a `Rect`.
- **Objects jump or tunnel through walls after the window was dragged or the game
  paused in a debugger** → the next `clock.tick()` returns the whole stall as one huge
  `dt`. Clamp it before use, e.g. `dt = min(clock.tick(60) / 1000, 0.05)`.
- **`ValueError: Can't normalize Vector of length zero`** → `Vector2.normalize()` was
  called with no keys held. Check `length_squared() > 0` first, as in Pattern 2.
- **Blits are slow / framerate drops** → call `.convert()` (opaque) or
  `.convert_alpha()` (transparent) on loaded images once; un-converted surfaces blit
  far slower.
- **Nothing appears** → you forgot `pygame.display.flip()` (or `update()`), or you
  drew before `screen.fill(...)` so it was cleared away.
- **Wrong draw order** → pygame uses painter's order; later blits cover earlier ones.
  Draw background first, sprites last.
- **`pip install pygame` got the old one** → for the maintained fork use
  `pip install pygame-ce`; having both installed causes import conflicts.
- **Diagonal movement is faster** → normalise the direction vector before scaling by
  speed.

## References

- For `Group` variants (`GroupSingle`, `LayeredUpdates` for z-order), pixel-perfect
  collision with `mask`, slicing a spritesheet, simple animation, sound/music, and
  text rendering, read `references/sprites-and-collision.md`.

## Related skills

- `love2d-core` — the same loop concepts in LÖVE/Lua.
- `bevy-ecs` — a heavier ECS engine when a project outgrows pygame.
- `input-systems` / `save-systems` — engine-agnostic input and persistence.
- `platformer` / `roguelike` — genre templates that pair with pygame.

© gamedev-skills · Apache-2.0 · gamedev-skills/awesome-gamedev-agent-skills

Похожие скиллы

Всё по теме «Геймдев и 3D: Unity, Unreal, Godot, Blender» →
pygame sanjeed5 Правило для Cursor задаёт каркас Pygame-проекта: один UIManager, фиксированный шаг времени, вёрстка на якорях и темы в JSON. ★ 3 579звёзд репо pixijs-scene-sprite pixijs Скилл объясняет агенту, как рисовать изображения в PixiJS v8: Sprite, AnimatedSprite, NineSliceSprite и TilingSprite. Пригодится, когда в проекте уже есть PixiJS и нужно быстро получить рабочий код отрисовки. CX Codex +1 5 900установок pixijs-scene-particle-container pixijs Инструктирует агента по работе с ParticleContainer в PixiJS v8. Помогает рендерить десятки тысяч легковесных спрайтов за один draw call. CX Codex +1 5 800установок sprite-segment-3x3grid Unity-Technologies Делит текстуру спрайта на сетку три на три и строит текстовую карту совпадения оттенков вокруг центра. Помогает проверять геометрию ассетов в автотестах. CX Codex +1 3 300установок pixel-art-sprites omer-metin Настраивает ассистента на отрисовку спрайтов и тайлсетов. Пригодится при разработке ретро-игр с жёсткими лимитами палитры и кадров. CX Codex +1 2 700установок asset-pipeline rehan-remade Готовит из сгенерированной или нарисованной картинки файлы, которые загрузит движок: кадры спрайтов, полосы анимации, изометрические ракурсы из 3D-модели. CX Codex +1 1 500установок

Из того же набора77

unity-navmesh Скилл для ИИ-кодинга: печёт NavMesh на уровне Unity и водит NPC по маршруту через NavMeshAgent. Пригодится, когда враг должен догонять игрока, а не стоять на месте. CX Codex +1 5 500установок unity-tilemap-2d Помогает собирать и настраивать 2D-тайлмапы в Unity 6.3 LTS через скрипты и Tile Palette. Пригодится при расстановке тайлов, сборке коллайдеров и генерации уровней. CX Codex +1 5 500установок unreal-cpp-gameplay Учит агента писать геймплейный C++ под Unreal Engine 5: макросы рефлексии, классы Gameplay Framework, зависимости модуля в *.Build.cs. CX Codex +1 5 300установок unreal-blueprints Помогает проектировать геймплейную логику на блюпринтах в Unreal Engine 5. Подсказывает, как связать графы событий и не сломать проект жёсткими ссылками при общении классов. CX Codex +1 5 300установок bevy-ecs Держит агента в рамках ECS-модели Bevy: плагины, компоненты и ресурсы, системы с Query. Пригодится, когда проект на Rust уже тянет bevy и пора наводить порядок в системах. CX Codex +1 5 100установок unreal-packaging Помогает собрать проект Unreal Engine 5 в готовый билд через интерфейс редактора или утилиту RunUAT. Пригодится при настройке профилей сборки, кукинге контента и подготовке релизов для CI. CX Codex +1 5 200установок unreal-behavior-trees Скилл помогает собирать AI NPC в Unreal Engine 5 через Behavior Trees и Blackboards. Нужен для врагов, патрулей и реактивных веток поведения. CX Codex +1 5 200установок unreal-niagara Скилл ведёт агента по Niagara в Unreal Engine 5: сборка систем и эмиттеров, модули в стейджах spawn/update, спавн эффектов из Blueprint и C++. CX Codex +1 5 200установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой