2013-09-23 39 views
0

我正在pygame上玩遊戲,我希望有一個受重力影響的玩家。Pygame:測試實體間碰撞的方法

我需要一個代碼,可以像這個 -

如果玩家沒有與塊碰撞: player.y = player.y + 1

所以,當有一個塊在它之下,不要掉下來,否則會掉下來。

下面是代碼作爲一個整體:

import pygame,random 
from pygame.locals import * 
import itertools 
pygame.init() 
screen=pygame.display.set_mode((640,480)) 
class Block(object): 
    sprite = pygame.image.load("texture\\dirt.png").convert_alpha() 
    def __init__(self, x, y): 
     self.rect = self.sprite.get_rect(centery=y, centerx=x) 

class Player(object): 
    sprite = pygame.image.load("texture\\playr.png").convert() 
    sprite.set_colorkey((0,255,0)) 
    def __init__(self, x, y): 
     self.rect = self.sprite.get_rect(centery=y, centerx=x) 

blocklist = [] 
player = [] 

while True: 
    screen.fill((25,30,90)) 
    mse = pygame.mouse.get_pos() 
    for event in pygame.event.get(): 
     if event.type == QUIT: exit() 
     key=pygame.key.get_pressed() 
     if key[K_LSHIFT]: 
      if event.type==MOUSEMOTION: 
       x=(int(mse[0])/32)*32 
       y=(int(mse[1])/32)*32 
       blocklist.append(Block(x+16,y+16)) 
     else: 
      if event.type == pygame.MOUSEBUTTONUP: 
       if event.button == 1: 
        to_remove = [b for b in blocklist if b.rect.collidepoint(mse)] 
        for b in to_remove: 
         blocklist.remove(b) 

        if not to_remove: 
         x=(int(mse[0])/32)*32 
         y=(int(mse[1])/32)*32 
         blocklist.append(Block(x+16,y+16)) 

       elif event.button == 3: 
        x=(int(mse[0])/32)*32 
        y=(int(mse[1])/32)*32 
        player=[] 
        player.append(Player(x+16,y+16)) 

    for b in blocklist: 
     screen.blit(b.sprite, b.rect) 
    for p in player: 
     if p.rect.colliderect(blocklist): 
      print 'scoof' 
     screen.blit(p.sprite, p.rect) 
    pygame.display.update() 

任何幫助表示讚賞!

+0

您是否嘗試用'p.rect.top + = 1'替換'print'scoof''。 – Shashank

+0

這個錯誤是從'如果p.rect.colliderect(blocklist)'引發的:' –

回答

2

你的問題是,blocklist不是一個矩形,它是Rects的列表。 colliderect只需要一個Rect,但你給了它一個列表。這裏是一個解決方案,將工作:

for p in player: 
    if any(p.rect.colliderect(block) for block in blocklist): 
     print 'scoof' 
    else: 
     p.rect.top += 1 
    screen.blit(p.sprite, p.rect) 

這將看看是否有任何在blocklist塊與球員發生碰撞。如果是,它將打印'scoof',否則會將播放器向下移動一個像素。

+1

!你做到了!謝謝:)並感謝您的幫助@Shashank! –

+1

而不是'如果有的話(對於塊列表中的塊,使用p.rect.colliderect(block)):',只要使用'if p.rect.collidelist(blocklist):'。 – sloth

1

colliderect應該採用矩形參數。在你的代碼中,你傳遞了一個完整的塊列表(blocklist),所以它不知道該如何處理它。試試這段代碼,讓我知道它是否有效。

編輯:哎呀修復了一些潛在的錯誤。

for b in blocklist: 
    screen.blit(b.sprite, b.rect) 
for p in player: 
    colliding = False 
    for b in blocklist: 
     if p.rect.colliderect(b.rect): 
      colliding = True 
    if not colliding: 
     p.rect.top += 1 
    screen.blit(p.sprite, p.rect) 

pygame.display.update() 

這裏是documentation for colliderect.

+0

對它做了一些小的修改......但它完美地達到了目的!謝謝! –

+0

@Sam我修正了一些邏輯錯誤。一探究竟。 – Shashank

+0

@Sam,並增加了更多的編輯....抱歉,我今天很困。 :) – Shashank