如何在python的字典中创建一种有效的矩形间碰撞检测方法(使用pygame来实现)?

如何在python的字典中创建一种有效的矩形间碰撞检测方法(使用pygame来实现)?,python,python-2.7,dictionary,pygame,Python,Python 2.7,Dictionary,Pygame,我知道这个问题很长,但请帮助我,你的时间将非常宝贵 谢谢,这个问题与写作相比不是很复杂,我只是 不确定如何处理,请帮助我。(您只需使用 我试图链接的词典,其余的就在你需要的时候) 我一直在不知疲倦地为这个游戏工作,我正在为一个项目制作这个游戏,它一直运行得相对平稳,直到最近我才发现这是一个相当大的问题,我不知道如何克服它。 我的问题如下: 当我为一个对象创建字典时,它会在屏幕上做一些事情 (在本例中为球员的子弹): 我可以将所有dictionary对象放在屏幕上,让它执行所有必要的操作,例如向上

我知道这个问题很长,但请帮助我,你的时间将非常宝贵 谢谢,这个问题与写作相比不是很复杂,我只是 不确定如何处理,请帮助我。(您只需使用 我试图链接的词典,其余的就在你需要的时候)

我一直在不知疲倦地为这个游戏工作,我正在为一个项目制作这个游戏,
它一直运行得相对平稳,直到最近我才发现这是一个相当大的问题,我不知道如何克服它。

我的问题如下:

当我为一个对象创建字典时,它会在屏幕上做一些事情

(在本例中为球员的子弹):

我可以将所有dictionary对象放在屏幕上,让它执行所有必要的操作,例如向上移动、在某个点删除自己以及让它显示自己。当我试图将一些链接到彼此时,问题就出现了。例如。我能够正确地将我的播放器的矩形链接到“
yummy
”字典,如果我的播放器触摸到该矩形,则
'score'
获得更多分数,并且删除“
yummy
”。同样的道理,当我尝试在“
项目符号
”和气泡之间进行碰撞检测时,它会删除气泡,该项目符号并给出我想要的更多分数。虽然如果我尝试使用与其他方法相同的
'z.colliderect(x,y)
,但它不起作用。例如,如果我试图将我的“
bigbirt
”和“
yummy
”字典链接成矩形,以检测
'bigbirt'
是否击中了“
yummy
”,并在发生这种情况时采取行动,我会收到一条消息,说:`

'File "E:\Bubble Dash\practice\bubbledashworking1.py", line 347, in play
    if u['rect'].colliderect(u['rect']):
UnboundLocalError: local variable 'u' referenced before assignment'
我真的被这件事搞砸了,因为我在这方面不是很在行 编程,我真的很想知道如何制作它,这样我就可以
控制所有的字典,就像我控制
'bubble'
bullet'
字典一样,在那里我也许可以把
'bigbilet'
删除,如果它击中了目标,给我40分“
bubble

#Additional Information: ###########################################################
enemyImage = pygame.image.load('enemy2.png')

yummyImage = pygame.image.load('bubble.png')

bulletImage = pygame.image.load('Haduoken.png')

playerImage = pygame.image.load('player.png')
playerImage2 = pygame.image.load('sadplayer.png')
playerStretchedImage = pygame.transform.scale(playerImage, (40, 40))

def play(PLAY, playing, highscore):

    baddie = []
    yummy = []
    bullet = []
    bigbullet = []
    movex,movey = 0,0
    charx, chary= WindowWidth /2 - 20, 800
    enemyy, enemyx = 10, 10
    moveright = False
    moveleft = False
    spawn = False
    direction = 'down'

    score = 0
    level1min = 2
    level1max = 7
    level2min = 3
    level2max = 9
    level3min = 5
    level3max = 15
    level1 = False
    level2 = False
    level3 = False
    boom = False
    cheat = False

    #for i in range(20):
        #baddie.append(pygame.Rect(random.randint(0, WindowWidth - 40), random.randint(0, WindowHeight - 40), 40, 80))
    #enemycounter = 0
    #newenemy = 40
    while True: 
        for event in pygame.event.get():

            if event.type == KEYDOWN:
                if event.key == ord('m'):
                    pygame.mixer.music.pause()
                    music = False
                if event.key == ord('n'):
                    pygame.mixer.music.unpause()
                    music = True
                if event.key == ord('a'):
                    moveleft = True
                if event.key == ord('d'):
                    moveright = True
                if event.key == ord('w'):
                    movey = -5
                    if score > 100:
                        movey = -7
                    if score > 500:
                        movey = -10
                    if score > 1000:
                        movey = -12
                if event.key == ord('s'):
                    movey = 5
                    if score > 100:
                        movey = 7
                    if score > 500:
                        movey = 10
                    if score > 1000:
                        movey = 12
                if event.key == ord('p'):
                    time.sleep(5)

            if event.type ==KEYUP:
                if event.key == ord('a'):
                    moveleft = False
                    if moveleft == False:
                        movex = 0
                if event.key == ord('c'):
                    cheat = True
                if event.key == ord('x'):
                    cheat = False
                if event.key == ord('d'):
                    moveright = False
                    if moveright == False:
                        movex = 0
                if event.key == ord('w'):
                    movey = 0
                if event.key == ord('s'):
                    movey = 0
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

        screen.blit(playscreenStretchImage,(0,0))
        player = pygame.Rect(charx, chary, 40, 40)  

        if direction == 'down':
            enemyy += 0.5
        if moveright ==True:
            movex = 5
            if score > 100:
                movex = 7
            if score > 500:
                movex = 10
            if score > 1000:
                movex = 12
        if moveleft ==True:
            movex = -5
            if score > 100:
                movex = -7
            if score > 500:
                movex = -10
            if score > 1000:
                movex = -12
        #for bad in baddie[:]:
            #if player.colliderect(bad):
               # print('COLLISION')

        if player.bottom > WindowHeight:
            chary = WindowHeight - 40
            movey = 0
            print'bottom'
        if player.top < 0:
            chary = 1
            movey = 0
            print'top'
        if player.left < 0:
            charx = -1
            movex = 0
            if event.type == KEYDOWN:
                if event.key == ord('d'):
                    movex = 5
            print 'left'
        if player.right > WindowWidth:
            charx = WindowWidth  - 39
            movex = 0
            if event.type == KEYDOWN:
                if event.key == ord('a'):
                    movex = -5
            print'right'

        if playing != False:
            score +=1
            score_render = font.render("score: %.0f"%score, True, (255,255,255))
            time_passed = clock.tick(60)
            time_passed_seconds = time_passed*1000

            if score in range(40, 60):
                screen.blit(countdown3, (WindowWidth / 2, WindowHeight / 2))
            if score in range(61, 80):
                screen.blit(countdown2, (WindowWidth / 2, WindowHeight / 2))
            if score in range(81, 100):
                screen.blit(countdown1, (WindowWidth / 2, WindowHeight / 2))
            if score in range(440, 460):
                screen.blit(countdown3, (WindowWidth / 2, WindowHeight / 2))
            if score in range(461, 480):
                screen.blit(countdown2, (WindowWidth / 2, WindowHeight / 2))
            if score in range(481, 500):
                screen.blit(countdown1, (WindowWidth / 2, WindowHeight / 2))
            if score in range(940, 960):
                screen.blit(countdown3, (WindowWidth / 2, WindowHeight / 2))
            if score in range(961, 980):
                screen.blit(countdown2, (WindowWidth / 2, WindowHeight / 2))
            if score in range(981, 1000):
                screen.blit(countdown1, (WindowWidth / 2, WindowHeight / 2))






            screen.blit(score_render, (0,0))
            if score > highscore:
                highscore = score
            finalscore = score
            score_render = font.render("%0.f"%score, True, (255,255,255))
            highscore_render = font.render("Highscore:%.0f"%highscore, True, (255,255,255))
            maxscore_render = font.render("%.0f"%highscore, True, (255,255,255))
            screen.blit(highscore_render, (200,0))
#Here is the dictionaries i am trying to link:#########################################
            #BULLETS
            if len(bullet) <1:
                bulletSize = 30
                newBullet = {'rect': pygame.Rect(charx, chary, bulletSize, bulletSize),
                             'speed': -20,
                             'surface': pygame.transform.scale(bulletImage, (bulletSize, bulletSize))}
                bullet.append(newBullet)

            for l in bullet[:]:
                l['rect'].move_ip(0, l['speed'])
            for l in bullet[:]:
                if l['rect'].top < 0:
                    bullet.remove(l)
            for l in bullet[:]:
                screen.blit(l['surface'], l['rect'])

            #BIGBULLETS
                if len(bigbullet) < 1:
                    bigbulletSize = 200
                    newBigBullet = {'rect': pygame.Rect(0, WindowHeight - bigbulletSize, bigbulletSize, bigbulletSize),
                                    'speed': -5,
                                    'surface': pygame.transform.scale(bulletImage, (bigbulletSize,bigbulletSize))}
                if score in range(100, 200):
                    bigbullet.append(newBigBullet)
                for u in bigbullet[:]:
                    u['rect'].move_ip(0, u['speed'])
                    boom = False
                for u in bigbullet[:]:
                    screen.blit(u['surface'], u['rect'])



            #YUMMYYY
            if len(yummy)<5:
                if score < 100:
                    yummySize = 100
                    for y in yummy[:]:
                        if score == 100:
                            yummy.remove(y)
                if score > 100:

                    yummySize = 75
                    for y in yummy[:]:
                        if score == 500:
                            yummy.remove(y)
                if score >= 500:
                    yummySize = 50
                    for y in yummy[:]:
                        if score == 1000:
                            yummy.remove(y)
                if score >= 1000:
                    yummySize = 25




                newYummy = {'rect': pygame.Rect(random.randint(0, WindowWidth - yummySize), random.randint(0, WindowHeight-yummySize), yummySize-yummySize/2.2 , yummySize-yummySize/2.2),
                            'speed': random.randint(eminspeed, emaxspeed),
                            'surface': pygame.transform.scale(yummyImage, (yummySize, yummySize)),}
                yummy.append(newYummy)

            for y in yummy[:]:
                y['rect'].move_ip(0, y['speed'])
            for y in yummy[:]:
                if y['rect'].top > WindowHeight:
                    yummy.remove(y)
            for y in yummy[:]:
                if player.colliderect(y['rect']):
                    yummy.remove(y)
                    score += 20
            for y in yummy[:]:
                if l['rect'].colliderect(y['rect']):
                    yummy.remove(y)
                    bullet.remove(l)
                    score +=40
##            for y in yummy[:]:
##                if u['rect'].colliderect(y['rect']):
##                    yummy.remove(y)
##                    score +=200
##           
            for y in yummy:
                screen.blit(y['surface'], y['rect'])

            #BADDDIESS
            if len(baddie)<30:
                eminsize = 10
                emaxsize = 40
                if score >= 900:
                    eminsize = 30
                    emaxsize = 60


                enemySize = random.randint(eminsize, emaxsize)
                newEnemy = {'rect': pygame.Rect(random.randint(0, WindowWidth- enemySize),0-enemySize, enemySize, enemySize),
                            'speed': random.randint(eminspeed, emaxspeed),
                            'level1':random.randint(level1min, level1max),
                            'level2': random.randint(level2min, level2max),
                            'level3': random.randint(level3min, level3max),
                            'surface': pygame.transform.scale(enemyImage, (enemySize, enemySize)),}
                baddie.append(newEnemy)


            for b in baddie:
                if not level1 and not level2 and not level3 and not cheat:
                    b['rect'].move_ip(0, b['speed'])
                if score >= 100:
                    level1 = True
                    if level1 and not cheat == True:
                        b['rect'].move_ip(0, b['level1'])
                if cheat and level1 == True:
                    b['rect'].move_ip(0, 0)
                if score >= 500:
                    level1 = False
                    level2 = True
                    if level2 and not cheat == True:
                        b['rect'].move_ip(0, b['level2'])
                    elif cheat == True:
                        b['rect'].move_ip(0, 0)

                if cheat and level2 == True:
                    b['rect'].move_ip(0, 0)
                if score >= 1000:
                    level2 = False
                    level3 = True
                    if level3 and not cheat == True:
                        b['rect'].move_ip(0, b['level3'])

                if cheat and level3 == True:
                    b['rect'].move_ip(0, 0)
                if cheat == True:
                    b['rect'].move_ip(0,0)
            for b in baddie[:]:
                if level1 == True:
                    screen.blit(level1text, (400, 0))
                elif level2 == True:
                    screen.blit(level2text, (400, 0))
                elif level3 == True:
                    screen.blit(level3text, (400, 0))
            for b in baddie[:]:
                if b['rect'].top > WindowHeight:
                    baddie.remove(b)

            for b in baddie[:]:
                if player.colliderect(b['rect']):
                    baddie.remove(b)

                    charx, chary= WindowWidth /2 - 50, 340
                    playing = False

            for b in baddie:
#Additional Information:#############################################################
        while playing == False:

                for event in pygame.event.get():
                    if event.type == KEYDOWN:
                        if event.key == ord('m'):
                            pygame.mixer.music.pause()
                        if event.key == ord('n'):
                            pygame.mixer.music.play()
                        if event.key == K_ESCAPE:
                            pygame.quit()
                            sys.exit()
                        if event.key == ord('r'):
                            playing = True
                            play(PLAY, playing, highscore)
                        if event.key == ord('b'):
                            presskey(instrtomenu, highscore)
                    if event.type == QUIT:
                        pygame.quit()
                        sys.exit()

                    if event.type == MOUSEBUTTONDOWN:
                        x, y = event.pos
                        if (x in range (28, 598)) and (y in range(570, 642)):
                            playing = True
                            play(PLAY, playing, highscore)
                        if (x in range (24, 712)) and (y in range(688, 760)):
                            presskey(instrtomenu, highscore)

                score += 0

                screen.blit(gameoverscreenStretchImage, (0,0))
                screen.blit(score_render, (494, 14))
                screen.blit(maxscore_render, (506 ,66))
                screen.blit(playerStretchedImage3, (0,227))

                if finalscore in range(1100, 1199):
                    screen.blit(gunterLabel, (450, 408))
                    screen.blit(gunterLabel2, (450, 463))
                    screen.blit(gunterStretchImage, (500, 519))
                pygame.display.update()
        screen.blit(playerStretchedImage, player)
        charx+=movex
        chary+=movey
        clock.tick(FPS)

        pygame.display.update()
#其他信息:###########################################################
enemyImage=pygame.image.load('enemy2.png')
yummyImage=pygame.image.load('bubble.png')
bulletImage=pygame.image.load('hadooken.png')
playerImage=pygame.image.load('player.png')
playerImage2=pygame.image.load('sadplayer.png')
playerStretchDimage=pygame.transform.scale(playerImage,(40,40))
def播放(播放、播放、高分):
坏蛋=[]
美味=[]
项目符号=[]
大子弹=[]
movex,movey=0,0
charx,chary=窗宽/2-20800
灌肠,灌肠=10,10
moveright=False
moveleft=False
spawn=False
方向=‘向下’
分数=0
1分钟=2级
level1max=7
级别2min=3
level2max=9
水平3分钟=5
level3max=15
级别1=错误
级别2=错误
级别3=错误
boom=错误
欺骗=虚假
#对于范围(20)内的i:
#baddie.append(pygame.Rect(random.randint(0,WindowWidth-40),random.randint(0,WindowHeight-40),40,80))
#EnemCounter=0
#新敌人=40
尽管如此:
对于pygame.event.get()中的事件:
如果event.type==KEYDOWN:
如果event.key==ord('m'):
pygame.mixer.music.pause()
音乐=假
如果event.key==ord('n'):
pygame.mixer.music.unpuse()
音乐=真实
if event.key==ord('a'):
moveleft=True
如果event.key==ord('d'):
moveright=True
如果event.key==ord('w'):
movey=-5
如果得分>100:
movey=-7
如果得分>500:
movey=-10
如果得分>1000:
movey=-12
如果event.key==ord('s'):
movey=5
如果得分>100:
movey=7
如果得分>500:
movey=10
如果得分>1000:
movey=12
如果event.key==ord('p'):
时间。睡眠(5)
如果event.type==KEYUP:
如果event.key==ord('a'):
moveleft=False
如果moveleft==False:
movex=0
如果event.key==ord('c'):
欺骗=真实
如果event.key==ord('x'):
欺骗=虚假
如果event.key==ord('d'):
moveright=False
如果moveright==False:
movex=0
如果event.key==ord('w'):
movey=0
如果event.key==ord('s'):
movey=0
如果event.type==退出:
pygame.quit()
sys.exit()
屏幕。blit(PlayScreenStretchMage,(0,0))
player=pygame.Rect(charx,chary,40,40)
如果方向==“向下”:
灌肠率+=0.5
如果moveright==True:
movex=5
如果得分>100:
movex=7
如果得分>500:
movex=10
如果得分>1000:
movex=12
如果moveleft==True:
movex=-5
如果得分>100:
movex=-7
如果得分>500:
movex=-10
如果得分>1000:
movex=-12
#对于坏人中的坏人[:]:
#如果player.collide rect(错误):
class collidable(pygame.sprite.Sprite):
    def __init__(self,coordinates,image):            #this method is called on an instance of a class upon creation. it is always nescessary to pass in "self" as the first argument to a def that is part of a class
        pygame.sprite.Sprite.__init__(self)
        self.image = image
        self.rect = self.image.get_rect()
        self.rect.center = coordinates
    def collide(self,other):                         #pass in the other sprite to check for a collision, this will return a True/False value of whether or not you are colliding with the other sprite
        mycollisions = pygame.sprite.spritecollide(self,other,False)
        for collision in mycollisions:
            if collision != self:
                return True
        return False
<classname>.<attributename>
mysprite = collidable((200,200),pygame.image.load("image_path.png").convert_alpha())
myothersprite = collidable((300,300),pygame.image.load("image_path.png").convert_alpha())
if mysprite.collide(myothersprite):
    print "sprites are colliding"