2017-12-24 5 views
2

私は衝突がありますが、鳥がブロックに接触したときにコードが働くようにしたいのですが、それはprint('x')です。それはそうしていますが、鳥の正しい場所ではありません。長いコードには申し訳ありませんが、実行するためには必要です。なぜpygame rectは正しい場所にありませんか?

import random 
import pygame 

vec = pygame.math.Vector2 

BLACK = (0,0,0) 
RED = (255,0,0) 

WIDTH = 500 
HEIGHT = 400 

pygame.init() 
window = pygame.display.set_mode((WIDTH, HEIGHT)) 
pygame.display.set_caption('Flappy Bird') 
clock = pygame.time.Clock() 

class Bird(): 

    def __init__(self): 
     self.skin = pygame.image.load('bird2.png') 
     self.rect = self.skin.get_rect() 
     self.rect.center = (WIDTH/2, HEIGHT/2) 

     self.vx = 0 
     self.vy = 0 

     self.pos = vec(WIDTH/2, HEIGHT/2) 
     self.vel = vec(0, 0) 
     self.acc = vec(0, 0) 

    def update(self): 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       quit() 

     window.fill(BLACK) 
     self.acc = vec(0, 0.7) #having 0.5 adds gravity 

     self.vy = 0 

     keys = pygame.key.get_pressed() 
     if keys[pygame.K_SPACE]: 
      self.vel.y = -7 

     if keys[pygame.K_LEFT]: 
      self.acc.x = -0.5 #change to y to add vertical motion 

     if keys[pygame.K_RIGHT]: 
      self.acc.x = 0.5 #change to y to add vertical motion 

     #applys friction 
     self.acc.x += self.vel.x * -0.08 #FRICTION 
     #motion equations 
     self.vel += self.acc 
     self.pos += self.vel + 0.5 * self.acc 

     self.rect.center = self.pos 

     window.blit(self.skin, self.pos) 

class Pipe(): 

    def __init__(self,x,y): 

     self.image = pygame.Surface((50,60)) 
     self.image.fill(RED) 
     self.rect = self.image.get_rect(topleft=(x,y)) 

     self.pos = vec(x,y) 

    def blit_pipe(self): 
     window.blit(self.image, self.pos) 

def border_check(): 
    if (flappy.pos.y)+32 > HEIGHT: #this is the very top of the flappy 
     print("You are under\n") 
     pygame.quit() 
     quit() 

    if flappy.pos.y < 0: 
     print("You are over\n") #this is the very top of the flappy 
     pygame.quit() 
     quit() 


pipey = Pipe(300,200) 
pipey.blit_pipe() 

pipey2 = Pipe(100,200) 
pipey2.blit_pipe() 

flappy = Bird() 

window.blit(flappy.skin, flappy.pos) 

while True: 
    border_check() 
    flappy.update() 
    pipey.blit_pipe() 
    pipey2.blit_pipe() 

    if flappy.rect.colliderect(pipey.rect): 
     print('x') 

    clock.tick(30) 
    pygame.display.update() 

鳥がenter image description hereのように見える、と私はRECTはenter image description hereになりたいが、ゲームではそれがより​​のように動作します。私は問題は、rectはその中心が塔の中にあるが、私はそれをどのように変更するのかわからないと思う。

答えて

4

rectの左上の座標でイメージをblitする必要がある。あなたがself.posにセンターを設定すると、ブリット位置(その後、pygameの左上COORDSを使用しています)としてself.pos

self.rect.center = self.pos 
window.blit(self.skin, self.rect) 

またはtopleft属性を設定するRECTを渡すことができますいずれか、あなたはまだで画像をブリットすることができますself.pos

self.rect.topleft = self.pos 
window.blit(self.skin, self.pos) 
1

pygameのに四角形を描画する、第2のパラメータはXとYの出発点であるが、次の2つのパラメータは、幅と高さです。これにより、左上隅に四角形が描かれます。あなたがする必要があるのは、鳥が画像の端である場合にエッジがどこにあるのかをイメージしていることです。あなただけの微調整のための+記号を使用し、画像を編集することができない場合は、代替

pygame.draw.rect(screen, red, [topLeftX, topLeftY, birdWidth, birdHeight]) 

:あなたは、その後のような何かを行うことができます。

関連する問題