Python Pygame鼠标单击和矩形相交

Python Pygame鼠标单击和矩形相交,python,pygame,Python,Pygame,我正在设计一个基于生存的游戏,我在允许玩家从树上收集木材时遇到了麻烦 下面的函数检查我的鼠标是否被按下,如果玩家与任何树矩形发生碰撞,它们的木材数量增加1。我使用刻度来确保每九个刻度只添加一个木材 def check(self): global tick if pygame.mouse.get_pressed()[0]: for tree in resources: tree_rect=tree.rect

我正在设计一个基于生存的游戏,我在允许玩家从树上收集木材时遇到了麻烦

下面的函数检查我的鼠标是否被按下,如果玩家与任何树矩形发生碰撞,它们的木材数量增加1。我使用刻度来确保每九个刻度只添加一个木材

def check(self):
    global tick
    if pygame.mouse.get_pressed()[0]: 
        for tree in resources:
            tree_rect=tree.rect                                
            if self.rect.colliderect(tree_rect) and tick>=9:
                self.inventory['wood']+=1
                tick=0
然而,无论我的玩家类是否与任何树发生碰撞,每当我单击时,木头有时会被添加,有时不会

我尝试使用
pygame.sprite.spritecollide()
,但结果是一样的。感谢您的帮助

完整代码:

import pygame
from pygame.locals import * 
import sys
import math
import pygame.gfxdraw
import random

pygame.init()

black=(0,0,0)
white=(255,255,255)
forest=(34,139,34)
red=(255,0,0)
blue=(0,0,255)
green=(0,255,0)
light_green=(0,120,0)
dark_green=(0,90,0)
skin=(255,224,189)
yellow=(255,255,0)

wood_image=pygame.image.load('./assets/images/wood.png')
stone_image=pygame.image.load('./assets/images/stone.png')
player_image=pygame.image.load('./assets/images/player.png')

tick=0

def terminate():
    pygame.quit()
    sys.exit()

def drawTextcenter(text,font,screen,x,y,color):
    textobj=font.render(text,True,color)
    textrect=textobj.get_rect(center=(x,y))
    screen.blit(textobj,textrect)

def drawText(text, font, surface, x, y,color):
    textobj=font.render(text, 1, color)
    textrect=textobj.get_rect()
    textrect.topleft=(x, y)
    surface.blit(textobj, textrect)

class Button(object):
    global screen_width,screen_height,screen
    def __init__(self,x,y,width,height,text_color,background_color,text):
        self.rect=pygame.Rect(x,y,width,height)
        self.x=x
        self.y=y
        self.width=width
        self.height=height
        self.text=text
        self.text_color=text_color
        self.background_color=background_color
        self.angle=0

    def check(self):
        return self.rect.collidepoint(pygame.mouse.get_pos())

    def draw(self):
        pygame.draw.rect(screen,self.background_color,(self.rect),0)
        drawTextcenter(self.text,font,screen,self.x+self.width/2,self.y+self.height/2,self.text_color)  
        pygame.draw.rect(screen,self.text_color,self.rect,3) 

class Bar(object):
    def __init__(self,x,y,length,color):
        self.rect=pygame.Rect(x,y,length,17.5)
        self.image=pygame.draw.rect(screen,white,(self.rect),)
        self.x=x
        self.y=y
        self.width=100
        self.height=17.5
        self.color=color
        self.multiplier=length/100

    def draw(self,num): 
        rect=pygame.Rect(self.x,self.y,num*self.multiplier,self.height)
        pygame.draw.rect(screen,self.color,self.rect,3)
        pygame.draw.rect(screen,self.color,rect,0)

class Player(pygame.sprite.Sprite):
    def __init__(self,x,y):
        super(Player,self).__init__()
        self.image=player_image
        self.original_image=self.image
        self.rect=self.image.get_rect(center=(x,y))
        self.change_x=0
        self.change_y=0
        self.speed=7.5
        self.inventory={'wood':0}

    def changespeed(self,x,y):
        self.change_x+=x
        self.change_y+=y

    def update(self,rect):
        self.rotate(camera)
        self.rect.x+=self.change_x
        self.rect.y+=self.change_y
        rect = camera.apply(self)
        screen.blit(self.image,rect)

    def check(self):
        global tick
        if pygame.mouse.get_pressed()[0]: 
            for tree in resources:
                tree_rect=tree.rect                                
                if self.rect.colliderect(tree_rect) and tick>=9:
                    self.inventory['wood']+=1
                    tick=0

    def rotate(self,camera):
        mouse_x,mouse_y=pygame.mouse.get_pos()
        mouse_x-=camera.state.x
        mouse_y-=camera.state.y
        rel_x,rel_y= mouse_x - self.rect.centerx, mouse_y -self.rect.centery
        angle = -math.degrees(math.atan2(rel_y, rel_x))
        self.image = pygame.transform.rotozoom(self.original_image, angle,1)
        self.rect = self.image.get_rect(center=self.rect.center)

class Tree(pygame.sprite.Sprite):
    def __init__(self,x,y):
        super(Tree,self).__init__()
        self.rect=pygame.Rect(x,y,100,100)
        self.rect.x=x
        self.rect.y=y

    def update(self,rect):
        pygame.gfxdraw.filled_circle(screen,rect.x,rect.y,80,light_green)
        pygame.gfxdraw.aacircle(screen,rect.x,rect.y,80,light_green)

class Rock(pygame.sprite.Sprite):
    def __init__(self):
        pass

class Camera(object):
    def __init__(self,camera_func,width,height):
        self.camera_func=camera_func
        self.state=pygame.Rect(0,0,width,height)

    def apply(self,target):
        return target.rect.move(self.state.topleft)

    def update(self,target):
        self.state=self.camera_func(self.state,target.rect)

def complex_camera(camera, target_rect):
    l, t = target_rect.center
    _,_,w,h = camera
    l,t,_,_ = -l+screen_width/2, -t+screen_height/2, w, h

    l = min(0, l)                           
    l = max(-(camera.width-screen_width), l)
    t = max(-(camera.height-screen_height), t)
    t = min(0, t)                           

    return pygame.Rect(l, t, w, h)

clock=pygame.time.Clock()
font=pygame.font.SysFont(None,40)

screen_width=1440
screen_height=800
screen=pygame.display.set_mode([screen_width,screen_height])
pygame.display.set_caption('Survival')

total_level_width=screen_width*5
total_level_height=screen_height*5
camera = Camera(complex_camera, total_level_width, total_level_height)

player=Player(random.randint(100,7900),random.randint(100,5900))
friendlies=pygame.sprite.Group()
friendlies.add(player)

player_health_bar=Bar(125,15,200,green)
player_health=100
player_food_bar=Bar(437.5,15,200,red)
player_food=100
player_thirst_bar=Bar(750,15,200,blue)
player_thirst=100
player_energy_bar=Bar(1100,15,200,yellow)
player_energy=100

resources=pygame.sprite.Group()

wood=False
inventory={}

for i in range(1000):
    tree=Tree(random.randint(100,7900),random.randint(100,5900))
    resources.add(tree)

done1=False
while not done1:
    screen.fill(black)
    font=pygame.font.SysFont(None, 90)
    text_width,text_height=font.size('Survival')
    drawText('Survival', font, screen, (screen_width/2-text_width/2), (screen_height / 2-375),white)
    font=pygame.font.SysFont(None, 40)
    start_button=Button(screen_width/2-125,450,250,50,white,black,'Play')
    start_button.draw()
    back_button=Button(screen_width/2-125,725,250,50,white,black,'Back')
    pygame.display.flip()
    done2=False
    while not done2:
        for event in pygame.event.get():
            if event.type==QUIT:
                terminate()
            elif event.type==pygame.MOUSEBUTTONDOWN:
                if start_button.check()==True: 
                    done3=False
                    pause_back=False
                    while not done3:             
                        tick+=1
                        for event in pygame.event.get():
                            if event.type==pygame.QUIT:
                                terminate()
                            elif event.type==pygame.KEYDOWN:
                                if event.key==pygame.K_a:
                                    player.changespeed(-(player.speed), 0)
                                elif event.key==pygame.K_d:
                                    player.changespeed(player.speed, 0)
                                elif event.key==pygame.K_w:
                                    player.changespeed(0, -(player.speed))
                                elif event.key==pygame.K_s:
                                    player.changespeed(0, player.speed)
                                elif event.key==pygame.K_p:
                                    font=pygame.font.SysFont(None, 90)
                                    text_width,text_height=font.size('Paused')
                                    drawText('Paused', font, screen, (screen_width / 2-(text_width/2)), (screen_height / 2-375),white)
                                    resume_button=Button(screen_width/2-125,650,250,50,white,black,'Resume')
                                    resume_button.draw()
                                    back_button.draw()
                                    pygame.display.flip()
                                    back=False
                                    while not back:
                                        for event in pygame.event.get():
                                            if event.type==QUIT:
                                                terminate()
                                            elif event.type==pygame.MOUSEBUTTONDOWN:
                                                if resume_button.check()==True:
                                                    back=True
                                                elif back_button.check()==True:
                                                    done3=True
                                                    done2=True
                                                    pause_back=True
                                                    back=True

                            elif event.type == pygame.KEYUP:
                                if event.key == pygame.K_a:
                                    player.changespeed(player.speed, 0)
                                elif event.key == pygame.K_d:
                                    player.changespeed(-(player.speed), 0)
                                elif event.key == pygame.K_w:
                                    player.changespeed(0, player.speed)
                                elif event.key == pygame.K_s:
                                    player.changespeed(0, -(player.speed))   

                        camera.update(player)

                        if player.rect.x<0:
                            player.rect.x=0
                        if player.rect.right>total_level_width:
                            player.rect.right=total_level_width
                        if player.rect.y<0:
                            player.rect.y=0
                        if player.rect.bottom>total_level_height:
                            player.rect.bottom=total_level_height

                        screen.fill(dark_green)

                        player.update(camera)

                        for resource in resources:
                            resource.update(camera.apply(resource))

                        player_health_bar.draw(player_health)
                        #player_thirst_bar.draw(player_thirst)
                        #player_endergy_bar.draw(player_energy)
                        font=pygame.font.SysFont(None, 40)
                        drawText('Health:',font,screen,20,10,green)
                        #drawText('Food:',font,screen,350,10,red)
                        #drawText('Thirst:',font,screen,650,10,blue)
                        #drawText('Energy:', font, screen, 975, 10, yellow)
                        pygame.draw.rect(screen,forest,(50,675,100,100))
                        pygame.draw.rect(screen,forest,(175,675,100,100))
                        pygame.draw.rect(screen,forest,(300,675,100,100))

                        player.check()

                        for item in player.inventory:
                            if item=='wood' and player.inventory['wood']>0:
                                wood=True

                        if wood:
                            screen.blit(wood_image,(62.5,687.5))
                            drawTextcenter(str(player.inventory['wood']),font,screen,100,735,black)

                        pygame.display.flip()

                        clock.tick(100)

                        if pause_back==True:
                                break
                    if pause_back==True:
                        break
                    screen.fill(black)
                    font=pygame.font.SysFont(None, 90)
                    text_width,text_height=font.size("Game Over")
                    drawText('Game Over', font, screen, (screen_width/2-text_width/2), (screen_height / 2-200),white)
                    font=pygame.font.SysFont(None, 40)
                    retry_button=Button(screen_width/2-125,650,250,50,white,black,'Retry')
                    retry_button.draw()
                    back_button.draw()
                    pygame.display.flip()
                    back=False 
                    while not back:
                        for event in pygame.event.get():
                                if event.type==QUIT:
                                    terminate()
                                elif event.type==pygame.MOUSEBUTTONDOWN:
                                    if retry_button.check()==True:
                                        back=True
                                    if back_button.check()==True:
                                        back=True
                                        done2=True
                                        done3=True        
                elif back_button.check()==True: 
                    done2=True
                    done1=True
导入pygame
从pygame.locals导入*
导入系统
输入数学
导入pygame.gfxdraw
随机输入
pygame.init()
黑色=(0,0,0)
白色=(255255)
森林=(34139,34)
红色=(255,0,0)
蓝色=(0,0255)
绿色=(0255,0)
浅绿色=(0120,0)
深绿色=(0,90,0)
皮肤=(255224189)
黄色=(255255,0)
wood_image=pygame.image.load(“./assets/images/wood.png”)
stone_image=pygame.image.load(“./assets/images/stone.png”)
player_image=pygame.image.load(“./assets/images/player.png”)
刻度=0
def terminate():
pygame.quit()
sys.exit()
def drawTextcenter(文本、字体、屏幕、x、y、颜色):
textobj=font.render(文本、真、彩色)
textrect=textobj.get_rect(中心=(x,y))
screen.blit(textobj、textrect)
def drawText(文本、字体、表面、x、y、颜色):
textobj=font.render(文本,1,颜色)
textrect=textobj.get_rect()
textrect.topleft=(x,y)
surface.blit(textobj,textrect)
类按钮(对象):
全局屏幕宽度、屏幕高度、屏幕
定义初始值(自身、x、y、宽度、高度、文本颜色、背景颜色、文本):
self.rect=pygame.rect(x,y,宽度,高度)
self.x=x
self.y=y
自身宽度=宽度
自我高度=高度
self.text=文本
self.text\u color=text\u color
self.background\u color=背景颜色
自转角=0
def检查(自我):
返回self.rect.collidepoint(pygame.mouse.get_pos())
def牵引(自):
pygame.draw.rect(屏幕,self.background_color,(self.rect),0)
drawTextcenter(self.text、字体、屏幕、self.x+self.width/2、self.y+self.height/2、self.text\u颜色)
pygame.draw.rect(屏幕,self.text\u颜色,self.rect,3)
类栏(对象):
定义初始值(self、x、y、长度、颜色):
self.rect=pygame.rect(x,y,长度,17.5)
self.image=pygame.draw.rect(屏幕,白色,(self.rect),)
self.x=x
self.y=y
自宽=100
自身高度=17.5
self.color=color
自我倍增=长度/100
def draw(自我,数值):
rect=pygame.rect(self.x,self.y,num*self.乘数,self.height)
pygame.draw.rect(屏幕,self.color,self.rect,3)
pygame.draw.rect(屏幕,自我颜色,rect,0)
职业玩家(pygame.sprite.sprite):
定义初始化(self,x,y):
超级(玩家,自我)。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()
self.image=player\u image
self.original_image=self.image
self.rect=self.image.get_rect(中心=(x,y))
self.change_x=0
自我改变_y=0
自身速度=7.5
self.inventory={'wood':0}
def更换速度(自身、x、y):
自我改变x+=x
自我改变_y+=y
def更新(自身、rect):
自动旋转(照相机)
self.rect.x+=self.change\u x
self.rect.y+=self.change\u y
rect=摄影机。应用(自身)
screen.blit(self.image,rect)
def检查(自我):
全球蜱虫
如果pygame.mouse.get_按下()[0]:
对于资源中的树:
tree_rect=tree.rect
如果self.rect.collide rect(tree_rect)并勾选>=9:
自我盘点['wood']+=1
刻度=0
def旋转(自身、摄像头):
鼠标x,鼠标y=pygame.mouse.get\u pos()
鼠标_x-=摄影机.state.x
鼠标_y-=摄影机.state.y
rel_x,rel_y=鼠标_x-self.rect.centerx,鼠标_y-self.rect.centery
角度=-math.degrees(math.atan2(rel_y,rel_x))
self.image=pygame.transform.rotozoom(self.original_图像,角度,1)
self.rect=self.image.get_rect(中心=self.rect.center)
类树(pygame.sprite.sprite):
定义初始化(self,x,y):
超级(树,自我)。\uuuu初始化
self.rect=pygame.rect(x,y,100100)
self.rect.x=x
自校正y=y
def更新(自身、rect):
pygame.gfxdraw.filled_圆圈(屏幕,矩形x,矩形y,80,浅绿色)
pygame.gfxdraw.aacircle(屏幕,矩形x,矩形y,80,浅绿色)
摇滚类(pygame.sprite.sprite):
定义初始化(自):
通过
类摄影机(对象):
定义初始值(自身、相机功能、宽度、高度):
self.camera\u func=camera\u func
self.state=pygame.Rect(0,0,宽度,高度)
def应用(自身、目标):
返回target.rect.move(self.state.topleft)
def更新(自我、目标):
self.state=self.camera_func(self.state,target.rect)
def复合摄像头(摄像头、目标摄像头):
l、 t=目标直线中心
_,uw,h=摄像机
l、 t,w,h=-l+屏幕宽度/2,-t+屏幕高度/2,w,h
l=最小值(0,l)
l=最大值(-(摄像头宽度-屏幕宽度),l)
t=最大值(-(摄像机高度-屏幕高度),t)
t=最小值(0,t)
return pygame.Rect(l,t,w,h)
clock=pygame.time.clock()
font=pygame.font.SysFont(无,40)
屏幕宽度=1440
屏幕高度=800
screen=pygame.display.set_模式([屏幕宽度,屏幕高度])
pygame.display.set_标题('生存')
总水平宽度=屏幕宽度*5
总高度=屏幕高度*5
照相机=照相机(复杂照相机、总水平宽度、总水平高度)
player=player(random.randint(1007900),random.randint(1005900))
friendlies=pygame.sprite.Group()
友谊赛。添加(玩家)
玩家\健康\酒吧=酒吧(125,15200,绿色)
玩家健康=100
玩家食物酒吧=酒吧(437.5,15200,红色)
玩家食物=100
玩家渴望酒吧=酒吧(750,15200,蓝色)
玩家_=100
玩家能量条=条(1100,15200,黄色)
玩家能量=100
resources=pygame.sprite.Group()
木头=假
发明
pygame.draw.rect(screen, (120, 50, 0), rect)
    =  =    
 =        =
=      ____=___
=     |    =   |
 =    |   =    |
    = |=       |
      |________|
pygame.gfxdraw.filled_circle(screen, rect.centerx, rect.centery, 80, light_green)
pygame.gfxdraw.aacircle(screen, rect.centerx, rect.centery, 80, light_green)