5

私は Python と Pygame を学んでおり、最初に作成するのは単純な Snake ゲームです。ヘビが0.25秒に1回動くようにしようとしています。ループする私のコードの部分は次のとおりです。

while True:
    check_for_quit()

    clear_screen()

    draw_snake()
    draw_food()

    check_for_direction_change()

    move_snake() #How do I make it so that this loop runs at normal speed, but move_snake() only executes once every 0.25 seconds?

    pygame.display.update()

他のすべての関数を正常に実行したいのですが、move_snake() は 0.25 秒ごとに 1 回だけ発生するようにします。私はそれを調べて、いくつかの答えを見つけましたが、それらはすべて、初めて Python スクリプトを作成する人にとっては複雑すぎるようです。

どの関数を使用する必要があるかを伝えるだけでなく、コードがどのように見えるべきかの例を実際に取得することは可能でしょうか? ありがとう!

4

2 に答える 2

8

There are several approaches, like keeping track of the system time or using a Clock and counting ticks.

But the simplest way is to use the event queue and creating an event every x ms, using pygame.time.set_timer():

pygame.time.set_timer()

repeatedly create an event on the event queue

set_timer(eventid, milliseconds) -> None

Set an event type to appear on the event queue every given number of milliseconds. The first event will not appear until the amount of time has passed.

Every event type can have a separate timer attached to it. It is best to use the value between pygame.USEREVENT and pygame.NUMEVENTS.

To disable the timer for an event, set the milliseconds argument to 0.

Here's a small, running example where the snake moves every 250 ms:

import pygame
pygame.init()
screen = pygame.display.set_mode((300, 300))
player, dir, size = pygame.Rect(100,100,20,20), (0, 0), 20
MOVEEVENT, t, trail = pygame.USEREVENT+1, 250, []
pygame.time.set_timer(MOVEEVENT, t)
while True:
    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]: dir = 0, -1
    if keys[pygame.K_a]: dir = -1, 0
    if keys[pygame.K_s]: dir = 0, 1
    if keys[pygame.K_d]: dir = 1, 0

    if pygame.event.get(pygame.QUIT): break
    for e in pygame.event.get():
        if e.type == MOVEEVENT: # is called every 't' milliseconds
            trail.append(player.inflate((-10, -10)))
            trail = trail[-5:]
            player.move_ip(*[v*size for v in dir])

    screen.fill((0,120,0))
    for t in trail:
        pygame.draw.rect(screen, (255,0,0), t)
    pygame.draw.rect(screen, (255,0,0), player)
    pygame.display.flip()

enter image description here

于 2013-09-23T08:35:59.507 に答える
5

時間を追跡するには、Pygameの Clock モジュールを使用します。具体的にtickは、Clockクラスのメソッドは、最後に を呼び出してからのミリ秒数を報告しますtick。したがってtick、ゲーム ループの各反復の開始時 (または終了時) に 1 回呼び出し、その戻り値を という変数に格納できますdt。次に、 を使用dtして、時間依存のゲーム ステート変数を更新します。

time_elapsed_since_last_action = 0
clock = pygame.time.Clock()

while True: # game loop
    # the following method returns the time since its last call in milliseconds
    # it is good practice to store it in a variable called 'dt'
    dt = clock.tick() 

    time_elapsed_since_last_action += dt
    # dt is measured in milliseconds, therefore 250 ms = 0.25 seconds
    if time_elapsed_since_last_action > 250:
        snake.action() # move the snake here
        time_elapsed_since_last_action = 0 # reset it to 0 so you can count again
于 2013-09-22T21:43:26.203 に答える