如何在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"