日経ソフトウェア2022年5月号の「特集4Pythonで3Dゲームを作ろう」を試してみた その2

Part2 ビー玉迷路ゲームを作ろう

part2はpanda3Dからサンプルプログラムをダウンロードし、それを改良したプログラムです。

ステップは1から7まで以下のようになっています。

ステップ1:画面にテキストを表示する

ステップ2:迷路を配置する

ステップ3:迷路をマウス操作で傾ける

ステップ4:ボールを転がす

ステップ5:穴に落ちたら開始地点に戻る

ステップ6:ゴールしたらテキストを表示する

ステップ7:ボールに光を反射させる

 

ステップ1から7を実行する前に、

Panda3DのHPからサンプルプログラムをダウンロードします。

www.panda3d.org

 

  • Sample Programs をクリックするとpanda3d-1.10.11-samples.zipがダウンロードされます。

 

作業フォルダを作成し、その直下に3Dモデルをコピーします。

コピーはpanda3d-1.10.11-samples\panda3d-1.10.11\samples\ball-in-maze\modelsフォルダとなります。

 

ステップ1:画面にテキストを表示する

pythonの実行ファイルは日経ソフトウェアからダウンロードしたt42205.zip内にmain1.pyという名であるのでこのファイルを実行します。

from direct.showbase.ShowBase import ShowBase
import sys
# テキスト表示
from direct.gui.OnscreenText import OnscreenText
from panda3d.core import TextNode
# 衝突検出マスク

# 衝突判定

# ボールの速度計算

# インターバル

# ゴールの衝突判定

# ライトと素材

class BallInMazeDemo(ShowBase):
    # init関数の定義
    def __init__(self):
        # 画面の生成
        ShowBase.__init__(self)

        # カメラの設定
        self.disableMouse() # カメラマウス制御 OFF
        camera.setPosHpr(11, -11, 25, 45, -60, 0) # カメラの位置
       
        # Escキーでプログラムの終了
        self.accept("escape", sys.exit)
        # テキストの表示
        # windowsの場合
        font = loader.loadFont('/c/Windows/Fonts/msgothic.ttc')
        # macの場合
        # font = loader.loadFont('/System/Library/Fonts/Hiragino Sans GB.ttc')
        # タイトル文字を表示する
        self.title = \
            OnscreenText(text="ボールをゴール地点まで運べ!",
                         parent=base.a2dBottomRight, align=TextNode.ARight,
                         fg=(1, 1, 1, 1), pos=(-0.1, 0.1), scale=.08, font=font,
                         shadow=(0, 0, 0, 0.5))
        # サブタイトル文字を表示する
        self.instructions = \
            OnscreenText(text="マウスを動かすと迷路を傾けることができます",
                         parent=base.a2dTopLeft, align=TextNode.ALeft,
                         fg=(1, 1, 1, 1), pos=(0.1, -0.15), scale=.06, font=font,
                         shadow=(0, 0, 0, 0.5))

        # 迷路オブジェクトの設定

        # ボールオブジェクトの設定

        # ゴールオブジェクトの設定

        # ライトの設定

        # start関数の呼び出し

    # start関数の定義
        # ボールの初期位置の設定
       
        # rollTask関数の呼び出し

    # rollTask関数の定義
        # ボールが衝突したときの処理の分岐

        # ボールの速度や向きの計算

        # 迷路の傾きのマウス操作

    # groundCollideHandler関数の定義

    # wallCollideHandler関数の定義

    # loseGame関数の定義

    # winGame関数の定義

game = BallInMazeDemo()
game.run()

 

実行するとwindowが開きます。OnscreenTextに記載した内容が表示されます。

main1.py

 

ステップ2:迷路を配置する

衝突検出用のマスクのモジュールをインポートします。

 

# 衝突検出マスク
from panda3d.core import BitMask32

 

initメソッドの中に迷路の3Dモデルmaze.egg.pzを表示し、壁の衝突・地面の衝突・穴の衝突検出を記載します。

       # 迷路オブジェクトの設定
        self.maze = loader.loadModel("models/maze")
        self.maze.reparentTo(render)
        # 迷路の壁の衝突検出用マスク
        self.walls = self.maze.find("**/wall_collide")
        self.walls.node().setIntoCollideMask(BitMask32.bit(0))
        # 迷路の地面の衝突検出用マスク
        self.mazeGround = self.maze.find("**/ground_collide")
        self.mazeGround.node().setIntoCollideMask(BitMask32.bit(1))
        # 迷路の穴の衝突検出用マスク
        self.loseTriggers = []
        for i in range(6):
            trigger = self.maze.find("**/hole_collide" + str(i))
            trigger.node().setIntoCollideMask(BitMask32.bit(0))
            trigger.node().setName("loseTrigger")
            self.loseTriggers.append(trigger)

 

 

この時点でPythonを実行すると、以下のように表示されます。

main2.py

 

ステップ3:迷路をマウス操作で傾ける

画面上でマウスを動かすと迷路が傾くプログラムを追加します。

 

initメソッド内でstartメソッドを呼び出します。

        # start関数の呼び出し
        self.start()

 

startメソッドを定義します。

    # start関数の定義
    def start(self):
        # ボールの初期位置の設定

        # rollTask関数の呼び出し
        taskMgr.remove("rollTask")
        self.mainLoop = taskMgr.add(self.rollTask, "rollTask")

 

 

 

「ステップ4:ボールを転がす」へ。。

 

 

/* -----codeの行番号----- */