見出し画像

ChatGPTによるプログラミング学習06:Arcadeに触ってみた

実施結果

Pythonの2Dゲーム開発ライブラリとしてArcadeというのがあるというので触ってみました。ちょっと最後までできていませんが一応の体験として軽く載せておきます。
ChatGPTの大きなメリットとして、ちょっと聞いたことがあるものを、インターネットを探して見たり、書籍を買ったりするとちょっとおっくうになるということがあるのではないでしょうか。そんな時に簡単に触ってみるというのはいいですね。

簡単なサンプル

例によって、簡単なサンプルをお願いしました。

import arcade

SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480
SCREEN_TITLE = "Arcade Sample"

class Ball:
    def __init__(self, x, y, radius, color):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color

    def draw(self):
        arcade.draw_circle_filled(self.x, self.y, self.radius, self.color)

    def update_position(self, x, y):
        self.x = x
        self.y = y

class MyGame(arcade.Window):
    def __init__(self, width, height, title):
        super().__init__(width, height, title)
        arcade.set_background_color(arcade.color.WHITE)

        self.ball = Ball(50, 50, 20, arcade.color.BLUE)

    def on_draw(self):
        arcade.start_render()
        self.ball.draw()

    def on_mouse_motion(self, x, y, dx, dy):
        self.ball.update_position(x, y)

def main():
    game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
    arcade.run()

if __name__ == "__main__":
    main()

簡単なサンプルの割にはClassを使い、mainを使っていますね。この格調高さがArcadeの特徴かもしれませんね。While TRUE:というループもないですね。ただ、ClassでBallとMyGameを定義しているようです。
実行結果を次に示します。マウスに連れて青いボールが動きます。

サンプル2

次にこのようなサンプルを頼みました。

import arcade
import random

SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480
SCREEN_TITLE = "Ball Game"

BALL_RADIUS = 20
BALL_COLOR = arcade.color.RED

ARROW_SPEED = 5
ARROW_COLOR = arcade.color.BLACK

class Ball:
    def __init__(self, x, y, radius, color):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color
        self.velocity_y = -5 # ボールが落ちる速度

    def draw(self):
        arcade.draw_circle_filled(self.x, self.y, self.radius, self.color)

    def update(self):
        self.y += self.velocity_y

class Arrow:
    def __init__(self, x, y, width, height, color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color

    def draw(self):
        arcade.draw_rectangle_filled(self.x, self.y, self.width, self.height, self.color)

    def move_left(self):
        if self.x > 0:
            self.x -= ARROW_SPEED

    def move_right(self):
        if self.x < SCREEN_WIDTH:
            self.x += ARROW_SPEED

class MyGame(arcade.Window):
    def __init__(self, width, height, title):
        super().__init__(width, height, title)
        arcade.set_background_color(arcade.color.WHITE)

        self.ball_list = []
        self.arrow = Arrow(SCREEN_WIDTH//2, BALL_RADIUS, BALL_RADIUS*2, BALL_RADIUS, ARROW_COLOR)
        self.score = 0

    def on_draw(self):
        arcade.start_render()

        # ボールを描画
        for ball in self.ball_list:
            ball.draw()

        # 矢印を描画
        self.arrow.draw()

        # スコアを描画
        arcade.draw_text(f"Score: {self.score}", 10, SCREEN_HEIGHT-20, arcade.color.BLACK, 16)

    def update(self, delta_time):
        # ボールを更新
        for ball in self.ball_list:
            ball.update()

            # 上の壁に衝突した場合、スコアを減点
            if ball.y < 0:
                self.score -= 1
                self.ball_list.remove(ball)

            # 矢印に衝突した場合、スコアを加点
            if ball.y < BALL_RADIUS and abs(ball.x - self.arrow.x) < BALL_RADIUS:
                self.score += 5
                self.ball_list.remove(ball)

        # ボールを追加
        if random.randint(1, 50) == 1:
            ball = Ball(random.randint(0, SCREEN_WIDTH), SCREEN_HEIGHT+BALL_RADIUS, BALL_RADIUS, BALL_COLOR)
            self.ball_list.append(ball)

    def on_key_press(self, key, modifiers):
        # 矢印キーで矢印を移動
        if key == arcade.key.LEFT:
            self.arrow.move_left()
        elif key == arcade.key.RIGHT:
            self.arrow.move_right()

    def game_clear(self):
        # スコアが20点以上になった
        if self.score >= 20:
            arcade.draw_text("Game Clear!!", SCREEN_WIDTH//2-70, SCREEN_HEIGHT//2, arcade.color.BLACK, 32)
            return True

        return False

def main():
    game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
    arcade.run()

if __name__ == "__main__":
    main()

一番目立ったのはARROWというので何かと思いましたが、ボールを矢印キーで動かすというのを乞う誤解したようです。
結果をしめします

結果を見て、ボールがバーに当たれば消滅指せたかったのですが、うまくいきませんでした。バーの動きもぎこちない動きでした。pygameの動きではクリアしている問題なので、このまま終了にしました。

感想

pygameとarcadeの違いについて、ChatGTPに聞きました。

ArcadeとPygameは、どちらもPythonで2Dゲームを作成するためのライブラリですが、いくつかの違いがあります。
1.設計思想の違い
Arcadeは、プログラマーがコードを書きやすくすることを目的とした、直感的で簡単なAPIを提供することに特化しています。一方で、Pygameは、柔軟性とカスタマイズ性を重視しており、プログラマーが自由に機能を拡張できるように設計されています。2.アニメーションの実装方法の違い
Arcadeは、アニメーションの実装に便利なSpriteクラスを提供しています。Spriteクラスは、画像やアニメーションのフレームを保持し、簡単に表示や操作を行うことができます。一方、Pygameは、アニメーションの実装にSurfaceクラスを使用することが多く、Spriteクラスはデフォルトで提供されていません。
3.描画速度の違い
Arcadeは、Pygameよりも描画速度が速いとされています。これは、ArcadeがOpenGLを使用しているためで、GPUのハードウェアアクセラレーションを活用することができるためです。一方、Pygameは、CPUのみで描画を行うため、高速な描画が求められる場合には、パフォーマンスの制限がある場合があります。

以上が、ArcadeとPygameの主な違いです。どちらも優れたライブラリであり、ゲーム開発には役立ちますが、目的や用途に応じて選択することが重要です。

ChatGTPによります

チュートリアルは量も多いけど初心者用にも使いやすくできていると思われます。
是非、こちらで勉強してください。僕も時間があったら覗いてみようと思います。
                       20230506 記

この記事が気に入ったらサポートをしてみませんか?