semvec/pypi-packages huggingface dataset:
pyxel-physics-engine 0.2.0
GameObject and Physics framework for Pyxel
License: MIT License

# Pyxel-Physics-Engine

[日本語](#japanese) | [English](#english)

<a name="japanese"></a>

## 日本語

### 概要

レトロゲームエンジン![Pyxel](https://github.com/kitao/pyxel/blob/main/docs/README.ja.md)を基盤に開発された軽量で、プログラミング初心者向けの2D物理演算フレームワークです.

#### pyxel との違い

pyxelは描画・音・入力機能などを提供する優れたフレームワークですが、本格的なゲームを作る上で必須となる「物理演算」「オブジェクト管理」は開発者が一から実装する必要があります。そこで、これらの車輪の再発明を肩代わりを行い、実装の上で必要となる数学・物理・プログラミングの知識がなくても本格的なゲーム開発が行えるように設計したのが本フレームワークです。

##### 1. 座標ではなくオブジェクト単位で考える

pyxelでは座標を個別に管理しますが、本フレームワークではゲーム内に登場する「プレイヤー」「ボール」「ブロック」といった物理的な実体をそれぞれ一つのオブジェクトとして管理することで、各要素の更新(`update`)や描画(`draw`)の処理をひとまとめにしてコードを綺麗に保つことが出来ます。

##### 2. 当たり判定の最適化

通常$N$個のオブジェクトの当たり判定を行うには、それらのオブジェクトの組み合わせを考えておよそ$N^2$回の計算を必要とします。
ですが、本フレームワークではこの当たり判定の処理を数学的知識を用いて最適化することによって、およそ理想的には$N\log{N}$回の計算に落とし込むことが出来ます。

例えば、$100$個オブジェクトがあったとき、通常は$10,000$回の衝突処理を行う必要がありますが、これを理想的には$460$回にまで減らすことが出来ます。

##### 3. 物理演算

アクションゲームにおけるジャンプ、2つの物体の衝突による跳ね返り、バネの挙動などは、高校レベル〜大学教養レベルの物理学(力学)の知識を必要とします。一方で本フレームワークを使用することで、あなたはオブジェクトの「当たり判定の大きさ」「重さ」「跳ね返りやすさ」といったパラメーターを設定するだけで物理的な動きを実装することが可能です。

#### 対象ユーザー

Pyxel-Physics-Engineは特に以下の項目に当てはまるような人を対象に開発を行っています。
(もちろん、本フレームワークは誰でもMITライセンスの範囲内で自由に使用可能です！)

- `if`や`for`は分かるが、ゲームはどうやって作れば...?という人 (初心者)
- 学校でpyxelを使ったプログラミングの学習を行なっていたが、もっと本格的なゲームが作りたくなった人 (初心者)
- 将来Unityなど他ゲームエンジンに興味があり、基本的な知識を習得したい人 (中級者)
- とりあえずゲームのアイデアを手っ取り早くプロトタイプとして形にしたい人 (中級者~)

#### 特徴

- **知識がなくても使いやすい**
  - 直感的な仕組み。`App`,`World` を作って `add` するだけで、より直感的にゲームが作ることができます！
  - 豊富なデモと日本語によるドキュメント (予定)
  - 衝突判定といったゲーム制作の上で必須の処理をPyxel-Physics-Engine側で最適化！高度な数学の知識は必要ありません
- ゲームエンジンUnityの設計思想、用語に準拠
  - もし将来本格的なゲーム開発がしたい場合、ゲームエンジンの中で一位二位を争う知名度であるUnityにスムーズな移行ができます!

#### インストール方法 & クイックスタート

```txt
pip install pyxel-physics-engine
```

```python
import pyxphys 
import pyxel

class Ball(pyxphys.GameObject):
    color : int = 6 # ボールの色
    radius : int = 10 # ボールの半径

    def __init__(self):
        super().__init__(x=100, y=20)
        self.name = "ball"
        self.vx = 0
        self.vy = -4
        self.add_collider(pyxphys.CircleCollider(self.radius))
    
    def update(self):
        if self.y > 190:
            self.vy *= -0.9
            self.y = 190

    def draw(self):
        pyxel.circ(self.x, self.y, self.radius, self.color)

# 初期設定
app = pyxphys.App(200,200) # アプリ本体
world = pyxphys.World(gravity = 0.9) # アプリの中における世界
app.add_world(world) # ゲーム本体に、世界を追加

world.add_object(Ball()) # "world"という世界にBallオブジェクトを追加

app.run() # アプリを実行
```

### API仕様

#### 基本構造

| クラス名 | 説明 |
| :--- | :--- |
| `App` | アプリ本体。`App`が保有しているすべての`World`の描画をここで行います |
| `World` | `GameObject`が配置できる仮想的な空間です |
| `GameObject` | 実際のゲーム上における物理的な実体です。複数個の`Collider`を保有します。 |
| `Collider` | 衝突や接触といった判定を検知します。 |

<a name="english"></a>

## English

This framework enables you to use a physic object with a retro game-engine **Pyxel**.