1

pygame と IDLE を使用して、python で簡単なゲームを開発しようとしています。昨日から、言語 (およびプログラミング全般) について学ぶためにさまざまな情報源に目を通しましたが、それでも、すべてがどのように機能するかについていくつかの問題や誤解に遭遇しました。ですから、誰かが私にどのように進めればよいかアドバイスしていただければ (または、良い学習教材の方向性を教えてください)、大いに感謝します。

これまでのところ、ゲームのアイデアの基礎となる小さなコードを手に入れたので、ここに投稿して、いくつかの問題をリストします。

import pygame

def main():


pygame.init()


logo = pygame.image.load("coolblack.jpg")
pygame.display.set_icon(logo)
pygame.display.set_caption("Battleship")


screenWidth = 800
screenHeight = 600
screen = pygame.display.set_mode((screenWidth, screenHeight))


bgd_image = pygame.image.load("grid.png")
#--------------------------------------------------------------------
#the image named 'image' should be above 'bgd_image' but below 'cv9'
#in fact, everything should be above bgd_image, especially 'cv9'
#--------------------------------------------------------------------
image = pygame.image.load("coolblack.jpg")
cv9 = pygame.image.load("ussessexcv9.gif").convert_alpha()


xposCv9 = 400
yposCv9 = 510


step_xCv9 = 1
step_yCv9 = 1


screen.blit(bgd_image, (0,0))
screen.blit(image, (400,300))
screen.blit(cv9, (xposCv9, yposCv9))


pygame.display.flip()
clock = pygame.time.Clock()
running = True

#---------------------------------------------
#I've got a pretty good idea (sort of) about
#what is happening in the section
#below this point, however it seems that
#the image 'cv9' creates a trail of itself
#every time it moves, so how could I make it 
#so that it doesn't do so?
#---------------------------------------------
while running:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            running = False
    if xposCv9>screenWidth-64 or xposCv9<0:
        step_xCv9 = -step_xCv9
    if yposCv9>screenHeight-64 or yposCv9<0:
        step_yCv9 = -step_yCv9
    xposCv9 += step_xCv9
    yposCv9 += step_yCv9
    screen.blit(cv9, (xposCv9, yposCv9))
    pygame.display.flip()
    clock.tick(60)


if __name__=="__main__":
    main()
4

1 に答える 1

2

pygame が機能する方法は、更新している画面の表現を内部的に持っていることです。つまり、最初は真っ黒で、最初の「ブリット」を行います。これにより、内部表現が更新されます。次に、「pygame.display.flip」を呼び出すと、その表現が画面に表示されます。ただし、これは自動的に表現を「クリア」して次のフレームのすべての黒に戻すわけではありません。したがって、次のフレームで再びブリットし (たとえば、少し左に)、最初のブリットが残り、「軌跡」が作成されます。

したがって、あなたがしていることについては、次のフレームの描画を開始する前に、ループ内で画面の内部表現をクリアすることをお勧めします。次のように、画面を単一の色で塗りつぶすことで画面を「クリア」できます...

BLACK = (0,0,0)
....
screen.blit(cv9, (xposCv9, yposCv9))
pygame.display.flip()
clock.tick(60)
screen.fill(BLACK) # Add this to "clear" the screen.

このルートを選択した場合、これは、(最後のフレーム以降に変更された要素だけでなく) すべての要素をフレームごとに再描画する必要があることを意味することに注意してください。

ところで、疑問に思っている場合は、最後にフレームが自動的にクリアされないのには十分な理由があります。場合によっては、更新する画面の部分のみを更新する方が高速な場合があります。これにより、一部のアプリケーションでパフォーマンスが向上する可能性があります。ただし、上記の例のように、画面をクリアすることから始めるのがおそらく最善です。

于 2013-02-24T07:23:46.883 に答える