2017-09-10 31 views
1

私はpythonとpygameを使用するコードを持っています。特定の条件が満たされて画面を消去し、途中で "GAME OVER"という言葉を印刷すると仮定します。しかし、条件が満たされたときに、プレーヤーと衝突する部分がちょうど通過し、何もしません。画面を消去して単語を印刷するにはどうしたらいいですか?画面を消してからpygameで新しいものを描くにはどうすればいいですか?

import pygame 
import random 
BLACK = (0,0,0) 
WHITE = (255,255,255) 
GREEN = (0,255,0) 
RED = (255,0,0) 
BLUE = (0,0,255) 
pygame.init() 
size = (700,700) 
screen = pygame.display.set_mode(size) 
pygame.display.set_caption("Dodger") 
done = False 
clock = pygame.time.Clock() 

bullet_x = 350 
bullet_y = 0 

bullet_x2 = 175 
bullet_y2 = 0 

bullet_x3 = 525 
bullet_y3 = 0 

circle_x = 350 
while not done: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
     if event.type == pygame.KEYDOWN: 
      circle_x += 5 
    bullet_y += 1 
    bullet_y2 += 2 
    bullet_y3 += 3 
    screen.fill(BLACK) 
    pygame.draw.circle(screen, GREEN, (circle_x,600), 15) 
    pygame.draw.circle(screen, RED, (bullet_x, bullet_y), 20) 
    pygame.draw.circle(screen, RED, (bullet_x2, bullet_y2), 20) 
    pygame.draw.circle(screen, RED, (bullet_x3, bullet_y3), 20) 
    if bullet_y == 800: 
     bullet_y = 0 
     bullet_x = random.randint(20, 680) 
    if bullet_y2 == 800: 
     bullet_y2 = 0 
     bullet_x2 = random.randint(20, 680) 
    if bullet_y3 == 800: 
     bullet_y3 = 0 
     bullet_x3 = random.randint(20, 680) 
    if circle_x == 685: 
     circle_x = 15 
    if bullet_y == 600 and bullet_x == circle_x or bullet_y2 == 600 and bullet_x2 == circle_x or bullet_y3 == 600 and bullet_x3 == circle_x: 
     screen.fill(BLACK) 
     font = pygame.font.SysFont('Calibri',40,True,False) 
     text = font.render("GAME OVER",True,RED) 
     screen.blit(text,[0,0]) 
    pygame.display.flip() 
    clock.tick(300) 
pygame.quit() 

答えて

1

変数circle_yを作成し、次にライン50に変更する権利circle_x = 350 の下に、(circle_y = 600)600に設定します。これは、あなたの衝突の問題を解決します

if (abs(bullet_y - circle_y) < 35 and abs(bullet_x - circle_x) < 35) or (abs(bullet_y2 - circle_y) < 35 and abs(bullet_x2 - circle_x) < 35) or abs(bullet_y3 - circle_y) < 35 and abs(bullet_x3 - circle_x) < 35: 

を。私はあなたのアイデアが円と弾丸との間の距離を確認することです

do_circle_and_bullet_hit = abs(bullet_y - circle_y) < 35 and abs(bullet_x - circle_x) < 35 
do_circle_and_bullet2_hit = abs(bullet_y2 - circle_y) < 35 and abs(bullet_x2 - circle_x) < 35 
do_circle_and_bullet3_hit = abs(bullet_y3 - circle_y) < 35 and abs(bullet_x3 - circle_x) < 35 
if do_circle_and_bullet_hit or do_circle_and_bullet2_hit or do_circle_and_bullet3_hit: 

にexepressionをリファクタリング提案することができます。距離が35を下回るとヒットします。

0

私は、衝突をテストするためにPygame Rect Classを作成すると助けになると思います。彼らはbulletrect = pygame.rect.Rect(xpos, ypos, xsize, ysize)を行うことによって作られています。コードの後半で、bulletrect.y += 1,2または3を実行して下に移動できます。 bulletrect.x =またはbulletrect.y =を実行すると、円のxとyの位置が変更されます。画面に円を表示するには、pygame.draw.circle(screen, RED, (bullet_x, bullet_y), 20)または他の円をpygame.draw.circle(screen, RED, bulletrect.center, 20)に変更します。実際に衝突をチェックするには、衝突方法を使用してください:playerrect.colliderect(bulletrect)。 コードは次のようになります。pygameのダウンロードとpygameのrectsについて学ぶために

import pygame 
import random 
BLACK = (0,0,0) 
WHITE = (255,255,255) 
GREEN = (0,255,0) 
RED = (255,0,0) 
BLUE = (0,0,255) 
pygame.init() 
size = (700,700) 
screen = pygame.display.set_mode(size) 
pygame.display.set_caption("Dodger") 
done = False 
clock = pygame.time.Clock() 

bulletrect1 = pygame.rect.Rect((350, 0, 20, 20)) 
bulletrect2 = pygame.rect.Rect((175, 0, 20, 20)) 
bulletrect3 = pygame.rect.Rect((525, 0, 20, 20)) 

circlerect = pygame.rect.Rect((350, 600, 20, 20)) 
while not done: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
     if event.type == pygame.KEYDOWN: 
      circle.rect.x += 5 
    bulletrect1.rect.y += 1 
    bulletrect2.rect.y2 += 2 
    bulletrect3.rect.y3 += 3 
    screen.fill(BLACK) 
    pygame.draw.circle(screen, GREEN, (circlerect.center), 15) 
    pygame.draw.circle(screen, RED, (bulletrect1.center), 20) 
    pygame.draw.circle(screen, RED, (bulletrect2.center), 20) 
    pygame.draw.circle(screen, RED, (bulletrect3.center), 20) 
    if bulletrect1.y == 800: 
     bulletrect1.y = 0 
     bulletrect1.x = random.randint(20, 680) 
    if bulletrect2.y == 800: 
     bulletrect2.y = 0 
     bulletrect2.x = random.randint(20, 680) 
    if bulletrect3.y == 800: 
     bulletrect3.y = 0 
     bulletrect3.x = random.randint(20, 680) 
    if circlerect.x == 685: 
     circlerect.x = 15 
    if [bulletrect.colliderect(circlerect) for bulletrect in (bulletrect1, bulletrect2, bulletrect3)] 
     screen.fill(BLACK) 
     font = pygame.font.SysFont('Calibri',40,True,False) 
     text = font.render("GAME OVER",True,RED) 
     screen.blit(text,[0,0]) 
    pygame.display.flip() 
    clock.tick(300) 
pygame.quit() 

もう一つの良いところは、Al Sweigarts free online book教育のpythonです。 Chapter 2は矩形を教える。

EDIT:

最後のコードは本当にここで働いていなかったが、いくつかの新しい改良コードです:ときに

import pygame 
import random 
BLACK = (0,0,0) 
WHITE = (255,255,255) 
GREEN = (0,255,0) 
RED = (255,0,0) 
BLUE = (0,0,255) 
pygame.init() 
size = (700,700) 
screen = pygame.display.set_mode(size) 
pygame.display.set_caption("Dodger") 
done = False 
clock = pygame.time.Clock() 

def resetpositions(): 
    global bulletrect1, bulletrect2, bulletrect3, circlerect 
    bulletrect1 = pygame.rect.Rect((350, 0, 20, 20)) 
    bulletrect2 = pygame.rect.Rect((175, 0, 20, 20)) 
    bulletrect3 = pygame.rect.Rect((525, 0, 20, 20)) 

    circlerect = pygame.rect.Rect((350, 600, 20, 20)) 

resetpositions() 
while not done: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
     if event.type == pygame.KEYDOWN: 
      circlerect.x += 5 
    bulletrect1.y += 1 
    bulletrect2.y += 2 
    bulletrect3.y += 3 
    screen.fill(BLACK) 
    pygame.draw.circle(screen, GREEN, (circlerect.center), 15) 
    pygame.draw.circle(screen, RED, (bulletrect1.center), 20) 
    pygame.draw.circle(screen, RED, (bulletrect2.center), 20) 
    pygame.draw.circle(screen, RED, (bulletrect3.center), 20) 
    if bulletrect1.y == 800: 
     bulletrect1.y = 0 
     bulletrect1.x = random.randint(20, 680) 
    if bulletrect2.y == 800: 
     bulletrect2.y = 0 
     bulletrect2.x = random.randint(20, 680) 
    if bulletrect3.y == 800: 
     bulletrect3.y = 0 
     bulletrect3.x = random.randint(20, 680) 
    if circlerect.x == 685: 
     circlerect.x = 15 
    if circlerect.collidelist((bulletrect1, bulletrect2, bulletrect3)) == 0: 
     screen.fill(BLACK) 
     font = pygame.font.SysFont('Calibri',40,True,False) 
     text = font.render("GAME OVER",True,RED) 
     screen.blit(text,[0,0]) 
     pygame.display.update() 
     pygame.time.delay(3000) 
     resetpositions() 
    pygame.display.flip() 
    clock.tick(300) 

私は)それが今、それは(pygame.display.updateを呼び出して変更しましたGAME OVERが画面に表示されます。また、ゲームオーバーがすぐに消えないように3秒間待つ。また、実際に動作します。 pygame.rect.Rectがどのような目的で使用されているかを明確に理解するために、2つのWebサイトを参照してください。それは多くの助けになります。

+0

コードはまだ動作しません。まだ修正しようとしています。 pygame.rectはかなりの衝突のために作られたので、ウェブサイトに移動します。 – SnootierBaBoon

+0

この問題を解決していただきありがとうございます –

関連する問題