0

背景に画像を 1 秒 (またはそれ以上) 保持したい場合は、それが消えるはずです。if ステートメント内で呼び出される関数 ( image_draw ) 内で blit を使用しようとしましたが、画像が非常に短時間表示された場合関数 image_draw 内の画像の時間を変更しましたが、何の変化も見られませんでした。

コードでは、右と左に連続的に移動する太い線があり、フレームの境界線の1つに触れるたびに方向が変わり、方向の変更が発生したときに画像が表示されます。私の質問は、時間をどのように制御できるかです背景の画像の?関数 image_draw は役に立ちませんでした。コードは次のとおりです。

import pygame
import sys
import time
import math

from pygame.locals import *

def image_draw(IMAGE, RECT_FOR_IMAGE, IMAGE_TIME ):
    while IMAGE_TIME > 0:
        windowSurface.blit(IMAGE, RECT_FOR_IMAGE)
        IMAGE_TIME -= 1

pygame.init()

windowSurface = pygame.display.set_mode((300, 600), 0, 32)
pygame.display.set_caption("line and image")

WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
BLACK = (0, 0, 0)
MYCOLOR= (200, 240, 50)
OTHER_LINE_COLOR = (180, 0, 0)



OUR_LINE_START_X = 50
OUR_LINE_START_Y = 400
OUR_LINE_END_X = 250
OUR_LINE_END_Y = 400

OTHER_LINE_START_X = 0
OTHER_LINE_START_Y = 415
OTHER_LINE_END_X = 300
OTHER_LINE_END_Y = 415





IMAGE = pygame.image.load("cherry.png")
LEFT_IMAGE = 250
TOP_IMAGE = 530
WIDTH_IMAGE = 40
HIGHT_IMAGE = 40
IMAGE_TIME = 10
RECT_FOR_IMAGE_1 = pygame.Rect(LEFT_IMAGE, TOP_IMAGE, WIDTH_IMAGE, HIGHT_IMAGE)
RECT_FOR_IMAGE_2 = pygame.Rect(LEFT_IMAGE - 200, TOP_IMAGE, WIDTH_IMAGE, HIGHT_IMAGE)
SOUND = pygame.mixer.Sound("pickup.wav")

MOVE_SPEED = 1


DIRECTION = "left"



while True:
    windowSurface.fill(WHITE) 
    for event in pygame.event.get(): 
        if event.type == QUIT: 
            pygame.quit() 
            sys.exit()



    if DIRECTION == "right" :
        OUR_LINE_START_X += MOVE_SPEED
        OUR_LINE_END_X += MOVE_SPEED

    elif DIRECTION == "left":
        OUR_LINE_START_X -= MOVE_SPEED
        OUR_LINE_END_X -= MOVE_SPEED

    if OUR_LINE_START_X < 0:
        DIRECTION = "right"
        SOUND.play()
        image_draw(IMAGE, RECT_FOR_IMAGE_1, IMAGE_TIME )


    if OUR_LINE_END_X > 300:
        DIRECTION = "left"
        SOUND.play()
        image_draw(IMAGE, RECT_FOR_IMAGE_2, IMAGE_TIME )




    pygame.draw.line(windowSurface, MYCOLOR, (OUR_LINE_START_X, OUR_LINE_START_Y), (OUR_LINE_END_X, OUR_LINE_END_Y), 30)
    pygame.draw.line(windowSurface, OTHER_LINE_COLOR, (OTHER_LINE_START_X, OTHER_LINE_START_Y), (OTHER_LINE_END_X, OTHER_LINE_END_Y), 3)
    pygame.display.update()
    time.sleep(0.02)

前もって感謝します。

4

1 に答える 1

3

while ループはゲーム フレーム ループです。

image_draw を使用して描画すると、1 フレーム内で 10 から 0 までカウントダウンし、画像をブリットします。また、同じ名前の関数内から IMAGE_TIME 変数を参照しているため、変数のスコープはその関数内のみです。

何が起こっているかの視覚的な説明:

Game Loop:
  draw_image:
    10 - 0
      blit
  next frame

これを適切に機能させるには、image_draw メソッド シグネチャから IMAGE_TIME 変数を除外し、グローバル IMAGE_TIME を使用します。image_draw から while ループを削除し、各フレームでグローバルを変更できるようにします。その後、画像を再度描画する場合は、それをリセットする必要があります。

IMAGE_TIME = 10

def image_draw(IMAGE, RECT_FOR_IMAGE):
  if IMAGE_TIME > 0:
    windowSurface.blit(IMAGE, RECT_FOR_IMAGE)
    IMAGE_TIME -= 1

# ... other code left out for brevity

if OUR_LINE_START_X < 0:
    DIRECTION = "right"
    SOUND.play()
    if IMAGE_TIME == 0:
      IMAGE_TIME = 10
    image_draw(IMAGE, RECT_FOR_IMAGE_1)


if OUR_LINE_END_X > 300:
    DIRECTION = "left"
    SOUND.play()
    if IMAGE_TIME == 0:
      IMAGE_TIME = 10
    image_draw(IMAGE, RECT_FOR_IMAGE_2)

また、pygame でフレームレートを制御する適切な方法は、クロック オブジェクトを作成し、目的のフレーム レートで刻むことです。

clock = pygame.Clock()
while True:
  # do your stuff here
  clock.tick(60) # 60 frames per second

これは、ゲーム ループが毎秒約 60 回実行されることを意味するため、 を設定することで、画像の表示を 1 秒に簡単に制御できますIMAGE_TIME = 60

于 2013-05-24T23:57:16.200 に答える