Part2 ビー玉迷路ゲームを作ろう
part2はpanda3Dからサンプルプログラムをダウンロードし、それを改良したプログラムです。
ステップは1から7まで以下のようになっています。
ステップ1:画面にテキストを表示する
ステップ2:迷路を配置する
ステップ3:迷路をマウス操作で傾ける
ステップ4:ボールを転がす
ステップ5:穴に落ちたら開始地点に戻る
ステップ6:ゴールしたらテキストを表示する
ステップ7:ボールに光を反射させる
ステップ1から7を実行する前に、
Panda3DのHPからサンプルプログラムをダウンロードします。
www.panda3d.org
作業フォルダを作成し、その直下に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)
# テキストの表示
font = loader.loadFont('/c/Windows/Fonts/msgothic.ttc')
# 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に記載した内容が表示されます。
ステップ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を実行すると、以下のように表示されます。
ステップ3:迷路をマウス操作で傾ける
画面上でマウスを動かすと迷路が傾くプログラムを追加します。
initメソッド内でstartメソッドを呼び出します。
# start関数の呼び出し
self.start()
startメソッドを定義します。
# start関数の定義
def start(self):
# ボールの初期位置の設定
# rollTask関数の呼び出し
taskMgr.remove("rollTask")
self.mainLoop = taskMgr.add(self.rollTask, "rollTask")
「ステップ4:ボールを転がす」へ。。