0

これは私のコードです。mainメソッドには1行しかありません。

game.initShowBase()

この関数のコードは次のとおりです。

def initShowBase():

   global myShowBase   
   myShowBase = ShowBase(False)
   startwindowThread = threading.Thread(target = starters.startfunction)
   startwindowThread.start()
   myShowBase.run()

スターター:

def startfunction():
   from modules.logic import game
   global h
   h = 0
   print h
   # g1 = open ("game1", "a")
   #g1.close()
   #g2 = open ("game2", "a")
   #g2.close()
   #g3 = open ("game3", "a")
   #g3.close()
   game.myShowBase.setBackgroundColor(1.0,0.627,0.894, 1)     
   textObject = OnscreenText(text = "Beginn", pos = (0.95,-0.95), 
                         scale = 0.07,fg=(1,0.5,0.5,1),align=TextNode.ACenter,mayChange=1)


   buttons = [
           DirectRadioButton(text = 'Game 1 ', scale=0.05, indicatorValue = 0,  pos=(-0.4,0,0), command=load, extraArgs =[1]),
           DirectRadioButton(text = 'Game 2 ',  scale=0.05, indicatorValue = 0, pos=(0,0,0), command=load, extraArgs = [2]),
           DirectRadioButton(text = 'Game 3 ',  scale=0.05, indicatorValue = 0, pos=(0.4,0,0), command=load, extraArgs = [3])
         ]
   print "button"
   for button in buttons:
       button.setOthers(buttons)
       print "true"


def load(gamenumber):
   global h
   if (gamenumber==1):
       h += 1
       if (h>0):
           loadGame("game1")
   elif (gamenumber==2):
       loadGame("game2")
   else:
       loadGame("game3")


def loadGame (gamename): 
    from modules.logic import game
    global data
    data = open (gamename, "r")
    print gamename

コードを変更しないと、ボタンのない黒いウィンドウ、ボタンのないピンクのウィンドウ(正しい色)、または3つのボタンすべてがあるピンクのウィンドウが表示されることがあります。

コンパイラがエラーを認識しないように見えるため、スタックトレースはありません。そのため、どこかにデッドロックがあると思います。私はそれを見つけられません、つまり、それはそれほど多くのコードではありません。

誰か助けてもらえますか?

たぶん、indicatorValueが機能していないように見えることにも言及する必要があります。最初のボタンは、表示されている場合は常に設定されています。

4

1 に答える 1

1

問題はスレッドの使用に関係していると思います。まず、Panda3D 1.8をまだ使用していない場合は使用することをお勧めします。これにより、スレッドのサポートが改善されました。そうは言っても、Panda3D1.8のコードでいくつかの問題を再現することはできます。

次に、メインスレッドでセットアップを行うか、同期を追加することを強くお勧めします。たとえば、メインスレッドでウィンドウが適切に開始される前にsetBackgroundColorが呼び出された場合、ウィンドウが黒く表示されることがあります。スレッドを使用する場合、特に2つのスレッドから同時に同じ構造にアクセスする場合は、考慮すべき潜在的な落とし穴がたくさんあります。モデルの読み込み(Panda3Dにはこれを非同期で行うための特別な構造があります)などの重い読み込み操作や、グラフィックスパイプラインとの相互作用がほとんどないゲームロジック用にスレッドを予約します。

IndicatorValueについては、次のように、実際にvalueandvariableフィールドを使用してデフォルト値を変更する必要があります。

var = [1]
buttons = [
    DirectRadioButton(text='Game 1 ', variable=var, value=[1], scale=0.05, pos=(-0.4,0,0), command=load, extraArgs=[1]),
    DirectRadioButton(text='Game 2 ', variable=var, value=[2], scale=0.05, pos=(0,0,0), command=load, extraArgs=[2]),
    DirectRadioButton(text='Game 3 ', variable=var, value=[3], scale=0.05, pos=(0.4,0,0), command=load, extraArgs=[3])
]

デフォルトでは、設定されているボタンの値と一致するボタンvarが選択されます。(intの代わりにリストが使用される理由は、リストが値ではなく参照によって渡されるためです。

于 2013-03-16T13:50:13.950 に答える