2

複数の衝突検出について以前に質問しましたが、その問題を修正するコードを作成するスキルがありません。代わりに、2 番目の壁を追加してタイマーを入れようとしています。

私の質問は、どのようにタイマーをコードに入れるのですか?

カウントダウンする必要があり、ヒット00:00するとテキストが表示されGAME OVER、ゲームが終了します。それが役立つ場合は、コードのメイン行に入れています。クラスなどのコードがさらに必要な場合は、喜んで投稿します。

while done == False:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

            #This makes the player move
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player.changespeed(-6,0)
            if event.key == pygame.K_RIGHT:
                player.changespeed(6,0)
            if event.key == pygame.K_UP:
                player.changespeed(0,-6)
            if event.key == pygame.K_DOWN:
                player.changespeed(0,6)

        #This stops the player from moving
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                player.changespeed(6,0)
            if event.key == pygame.K_RIGHT:
                player.changespeed(-6,0)
            if event.key == pygame.K_UP:
                player.changespeed(0,6)
            if event.key == pygame.K_DOWN:
                player.changespeed(0,-6)

    player.updateWall(wall_list)

    window.fill(black)

    movingsprt.draw(window)
    wall_list.draw(window)

    pygame.display.flip()

    clock.tick(40)

pygame.quit()            
4

4 に答える 4

2

Hans Then が言ったように、このpygame.time.set_timer()メソッドを使用して、特定の時間が経過した後に関数を呼び出すことができます。しかし、経過した時間を表示するという点では、おそらく別の方法を使用した方がよいでしょう。

このpygame.time.Clock.tick_busy_loopメソッドを使用すると、最後の呼び出しから経過したミリ秒数が返されるため、ゲームを実行する FPS の数を制御し、経過時間を追跡できます。

clock = pygame.time.Clock()
minutes = 0
seconds = 0
milliseconds = 0

while True: #game loop
    #do stuff here
    if milliseconds > 1000:
        seconds += 1
        milliseconds -= 1000
    if seconds > 60:
        minutes += 1
        seconds -= 60

    print ("{}:{}".format(minutes, seconds))

    milliseconds += clock.tick_busy_loop(60) #returns the time since the last time we called the function, and limits the frame rate to 60FPS
于 2013-08-03T06:30:41.957 に答える
1

あなたはこれを行うことができます

time = 100 #time in seconds
pygame.time.set_timer(USEREVENT+1, 1000)#1 second is 1000 milliseconds 

#everything below this line should be in your main loop
for event in pygame.event.get():
    if event.type = USEREVENT+1:
        time -= 1

if time == 0:
    print "GAME OVER"
于 2013-08-03T15:06:00.100 に答える
1

しばらくすると、イベントを生成できます。参照: http://www.pygame.org/docs/ref/time.html#pygame.time.set_timer

現在のコードと同様のコードを使用して、イベントがタイマー イベントであるかどうかを確認し、それに応じて動作させることができます。

于 2013-08-02T09:40:52.723 に答える
0

あなたが答えを見つけたかどうか、それとも、これが役立つかどうかはわかりません...私もゲームにタイマーを追加することに取り組んでいますが、いくつか質問があります...まず、私は次のコードで成功しています。(これは別の掲示板から入手したものですが、もう一度見つけられないようですので、現時点で信用を与えていないことをお詫びします。サイトを見つけたら、この投稿を編集します)。

コンソール ウィンドウにカウントを表示するように記述されたこのコードを取得し、画面に表示するように変更しました。

タイマーとティックでほとんど成功しませんでした(何らかの理由で、プログラムが無限ループを実行しているように見えました...とにかく:

これは私が使用しているものです:

import time
import threading
import pygame, sys
#among others....

#timer clock
global timerrun #I added this to show / hide the clock from my main screen
timerrun = 0 #just a default 

class Timer (threading.Thread):
    def __init__(self,seconds):
        self.runTime = seconds
        threading.Thread.__init__(self)
    def run(self):
        time.sleep(self.runTime)

class CountDownTimer(Timer):
    def run(self):
            counter = self.runTime
            for sec in range(self.runTime):
                global timerrun
                timerrun = 1 #set timer is running global variable - tells main loop to display clock
                global timedisp #set timedisplay as global var so it can be shared between threads
                timedisp = clockfont.render(str(counter),1,(255,255,255))
                #print str(counter)
                time.sleep(1.0)
                counter -= 1

class CountDownExec(CountDownTimer):
        def __init__(self, seconds, action):
            self.action = action
            CountDownTimer.__init__(self, seconds)
        def run (self):
            CountDownTimer.run(self)
            self.action()

def myAction():
    #print "Perform an action here... say GAME OVER!"
    global timedisp
    timedisp = clockfont.render("GAME OVER",1,(255,255,255))

c = CountDownExec(timeonclock,myAction)

いくつかの注意点: まず、これが何をするのか 100% 確信が持てません... 基本的に、最初の部分はタイマー関数を設定します。2 番目の部分では、タイマーの変数を設定します (カウントと遅延... 今のところ、簡単にするために 1 秒ずつ増やしています)。

次の部分 (私が思うに) は、この関数を新しいスレッド内で実行するように指示します。したがって、メインループから独立して自分のペースで実行されます (つまり、一度に 1 秒ずつゲームを一時停止することはありません)。

最後の部分は、時計がゼロになったときに何をしたいかです... グローバルな timedisp 変数を「ゲームオーバー」と言うように再設定します

また、このメソッドがシステムにどのように負担をかけているのかわかりません。これが「効率的かどうか」はわかりません-これについて誰かの意見が欲しいです。

これらの関数の前に、フォントを次のように定義しています。

clockfont = pygame.font.SysFont("#FONT_NAME",SIZE) #font to use for timer clock

私のメインループでは、次のように結果を表示しています:

if timerrun == 1:
        clockpos = (screenwidth - timedisp.get_width()) /2 #center my clock
        screen.blit(timedisp,(clockpos,100)) #put it on screen

繰り返しますが、timerrun 変数を使用しているのは、(私のゲームで) 時計をオプションにしたいからです... テストのために、キーボードの "t" キーを押すまで時計は表示されません.. タイマーを実行します新しいスレッドで:

    if event.key==K_t:
        c.start();

その後、時計が表示され、カウントダウンし、終了すると「GAME OVER」と表示されます。

誰かが助けてくれるなら、ここに私の質問があります...

グローバル変数を介して変更テキストを渡すことがこれを行うための「正しい」方法であるかどうかはわかりません..これら2つのスレッドを使用して画面上の表示を更新するより良い方法があるかどうか、またはどのように行うかを誰かに教えてもらえますか.

タイムアップ時のアクション(「ゲームオーバー」と表示されている部分)をメインスレッドに戻して実行したい(これでいいのか?)

例: 時間がなくなると、2 人のプレイヤーのスコアを比較して勝者を宣言する関数が実行されます。- 「スレッド 2」(タイマー) が「スレッド 1」(ゲームの残りの部分) で関数を呼び出すようにするにはどうすればよいですか??

最後に、プログラム全体をリセットせずに時計を「リセット」する方法を探しています。もう一度「t」を押すと、スレッドを最初からやり直すことができないというエラーが表示されます。時計を再起動する方法について誰か提案できますか??

どうもありがとうございました!

ジェイ

于 2013-12-03T06:49:00.467 に答える