2017-05-11 33 views
1

私は表面があり、右に5ピクセル移動するサーフェスをクリックするたびに基本的なゲームを作っています。プログラムはcheckCollide(event)関数なしで正常に動作していますが、私がその条件を置くと動きません。なにが問題ですか?今までPygame RectangleとMouse pos Collidepointが機能しない

私のコードは、この

import pygame, sys 
from pygame.locals import * 

pygame.init() 

DISPLAYSURF = pygame.display.set_mode((300,300)) 

def checkCollide(event): 
    k = 0 
    a,b = event.pos 
    x = P1[0].get_rect() 
    if x.collidepoint(a,b): 
     return True 
    return False 

CP1 = [(150, 150) 
     ,(155, 150) 
     ,(160, 150) 
     ,(165, 150) 
     ,(170, 150) 
     ,(175, 150) 
     ,(180, 150) 
     ,(185, 150) 
     ,(190, 150)] 

statp1_1 = 0 

WHITE = (255,255,255) 
DISPLAYSURF.fill(WHITE) 

while True: # the main game loop 
    P1 = [pygame.image.load('PAzul.png'),CP1[statp1_1],statp1_1] 
    DISPLAYSURF.blit(P1[0], P1[1]) 
    e = pygame.event.get() 
    for event in e: 
     if event.type == MOUSEBUTTONUP: 
      a = checkCollide(event) 
      if a: 
       DISPLAYSURF.fill(WHITE) 
       statp1_1 +=1 

     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
    pygame.display.update() 

ある

+0

次に、 'x.collidepoint(a、b)'は常に比較対象のFalseの値を返すようです。 –

+0

あなた自身の質問に答えることができ、それを解決した印を付けることができます。 –

答えて

1

私はちょうど何が間違っていたか分かりました。 x = P1[0].get_rect()を実行すると、topleftが(0,0)のサーフェスが作成されます。 私がする必要があったのは、長方形の位置を変更することでした。x.topleft = P1[1]

1

は、あなたの関数のこれらの行で、あなたのロジックを確認してくださいありがとう:

x = P1[0][0].get_rect() 
if x.collidepoint(a,b): 
    return True 
return False 

あなたのコードは、このビットにかかっ:

a = checkCollide(event) 
if a: 
    DISPLAYSURF.fill(WHITE) 

だから、あなたはこの作品を真実に評価することはありません。

1

私はいくつかのヒントを得ました。最初にP1リストに矩形を格納します(次の例では画像と矩形のみが含まれていますが、statp1_1インデックスを追加することもできます)。今度は、ユーザーがクリックすると、このrectを移動できます(例では、topleft属性を次のポイントに設定しています)。いくつかのヒントについてはコメントを読んでください。あなたが修正する必要があることの1つは、statp1_1のインデックスが大きすぎるとゲームがクラッシュするのを防ぐことです。

import sys 
import pygame 


pygame.init() 

DISPLAYSURF = pygame.display.set_mode((300, 300)) 

WHITE = (255, 255, 255) 
# Don't load images in your while loop, otherwise they have to 
# be loaded again and again from your hard drive. 
# Also, convert loaded images to improve the performance. 
P1_IMAGE = pygame.image.load('PAzul.png').convert() # or .convert_alpha() 

# Look up `list comprehension` if you don't know what this is. 
CP1 = [(150+x, 150) for x in range(0, 41, 5)] 

statp1_1 = 0 
# Now P1 just contains the image and the rect which stores the position. 
P1 = [P1_IMAGE, P1_IMAGE.get_rect(topleft=CP1[statp1_1])] 

clock = pygame.time.Clock() # Use this clock to limit the frame rate. 

while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      sys.exit() 
     if event.type == pygame.MOUSEBUTTONUP: 
      if P1[1].collidepoint(event.pos): 
       print('clicked') 
       statp1_1 += 1 
       # Set the rect.topleft attribute to CP1[statp1_1]. 
       P1[1].topleft = CP1[statp1_1] 

    DISPLAYSURF.fill(WHITE) 
    DISPLAYSURF.blit(P1[0], P1[1]) # Blit image at rect.topleft. 

    pygame.display.update() 
    clock.tick(30) # Limit frame rate to 30 fps. 
関連する問題