[英]pygame.rect.colliderect() won't work
我需要手動檢查一個圖像是否碰到另一個。 我似乎無法獲得結果……請這讓我發瘋了!!! 我已經嘗試了2天,但無法正常工作。
我沒有包含其他一些代碼,例如Menu()。main(),但它工作得很好。 我不明白為什么僵屍在播放器上時它不會返回true。
class Game():
def setup(self):
global tiles
for files in os.listdir(os.curdir):
if files.endswith(".png") and files != "Player.png" and files != "Zombie.png":
tilees.append(files)
numtil = tilees.count(files)
print("a " + str(numtil))
fli = pygame.image.load(files).convert_alpha()
i = 0
while i <= 1000:
tiles.append(fli)
i = i + 1
global TileLen
TileLen = tiles.count(fli)
Game().Game()
def Game(self):
global zomx, zomy, zombie, MMS, step, zombieRect
zombieRect = []
zomx = []
zomy = []
zombie = []
step = 0
HP = 15
Map = pygame.image.load("BG.png").convert()
Map = pygame.transform.scale(Map, (pygame.display.list_modes()[0]))
person = pygame.image.load("Player.png").convert()
person = pygame.transform.scale(person, (30, 30))
dagger = pygame.image.load("Dagger.png").convert_alpha()
dagger = pygame.transform.scale(dagger, (13, 13))
screen.blit(Map, (0, 0))
perx = 800
pery = 700
ai().zombieadd(MMS)
screen.blit(person, (perx, pery))
screen.blit(dagger, (perx+20, pery-5))
global thething
thething = 0
for crap in zombie:
screen.blit(zombie[thething], (zomx[thething], zomy[thething]))
print(thething)
thething = thething + 1
pygame.display.flip()
awesome = 1
fttt = 0
ff = 0
ofx = 0
ofy = 0
while 1:
print(perx, pery)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_w:
pery = pery - 5
if fttt != 1:
if awesome == 4:
dagger = pygame.transform.rotate(dagger, 270)
person = pygame.transform.rotate(person, 270)
elif awesome == 3:
dagger = pygame.transform.rotate(dagger, 90)
person = pygame.transform.rotate(person, 90)
elif awesome == 2:
dagger = pygame.transform.rotate(dagger, 180)
person = pygame.transform.rotate(person, 180)
person = pygame.transform.rotate(person, 0)
dagger = pygame.transform.rotate(dagger, 0)
awesome = 1
fttt = 1
elif event.key == K_s:
pery = pery + 5
if fttt != 2:
if awesome == 4:
dagger = pygame.transform.rotate(dagger, 270)
person = pygame.transform.rotate(person, 270)
elif awesome == 3:
dagger = pygame.transform.rotate(dagger, 90)
person = pygame.transform.rotate(person, 90)
person = pygame.transform.rotate(person, 180)
dagger = pygame.transform.rotate(dagger, 180)
awesome = 2
fttt = 2
elif event.key == K_a:
perx = perx - 5
if fttt != 3:
if awesome == 2:
dagger = pygame.transform.rotate(dagger, 180)
person = pygame.transform.rotate(person, 180)
elif awesome == 4:
dagger = pygame.transform.rotate(dagger, 270)
person = pygame.transform.rotate(person, 270)
person = pygame.transform.rotate(person, 270)
dagger = pygame.transform.rotate(dagger, 270)
awesome = 3
fttt = 3
elif event.key == K_d:
perx = perx + 5
if fttt != 4:
if awesome == 2:
dagger = pygame.transform.rotate(dagger, 180)
person = pygame.transform.rotate(person, 180)
elif awesome == 3:
dagger = pygame.transform.rotate(dagger, 90)
person = pygame.transform.rotate(person, 90)
person = pygame.transform.rotate(person, 90)
dagger = pygame.transform.rotate(dagger, 90)
awesome = 4
fttt = 4
elif event.key == K_e:
if awesome == 1:
while ofx >= -6:
ofx = ofx - 1
screen.blit(dagger, (perx+20, pery-5+ofx))
pygame.time.delay(1)
pygame.display.update()
if ofx <= -6:
ofx = 0
elif awesome == 2:
while ofx >= -6:
ofx = ofx - 1
screen.blit(dagger, (perx-5, pery+25-ofx))
pygame.time.delay(1)
pygame.display.update()
if ofx <= -6:
ofx = 0
if awesome == 3:
while ofx >= -6:
ofx = ofx - 1
screen.blit(dagger, (perx-5+ofx, pery-5))
pygame.time.delay(1)
pygame.display.update()
if ofx <= -6:
ofx = 0
if awesome == 4:
while ofx >= -6:
ofx = ofx - 1
screen.blit(dagger, (perx+20-ofx, pery+25))
pygame.time.delay(1)
pygame.display.update()
if ofx <= -6:
ofx = 0
screen.blit(Map, (0, 0))
screen.blit(person, (perx, pery))
if awesome == 1:
screen.blit(dagger, (perx+20, pery-5))
elif awesome == 2:
screen.blit(dagger, (perx-5, pery+25))
elif awesome == 3:
screen.blit(dagger, (perx-5, pery-5))
else:
screen.blit(dagger, (perx+20, pery+25))
text = "Health: "+str(HP)
font = pygame.font.Font(None, 32)
ttex = font.render(text, True, (255, 0, 0))
screen.blit(ttex, (30, 30))
thecrap = 0
while thecrap < thething:
print(thecrap)
screen.blit(zombie[thecrap], (zomx[thecrap], zomy[thecrap]))
if perx >= zomx[thecrap]:
loop = 0
while loop <= 5:
zomx[thecrap] = zomx[thecrap] + .09
loop = loop + 1
if pery >= zomy[thecrap]:
loop = 0
while loop <= 5:
zomy[thecrap] = zomy[thecrap] + .09
loop = loop + 1
if perx <= zomx[thecrap]:
loop = 0
while loop <= 5:
zomx[thecrap] = zomx[thecrap] - .09
loop = loop + 1
if pery <= zomy[thecrap]:
loop = 0
while loop <= 5:
zomy[thecrap] = zomy[thecrap] - .09
loop = loop + 1
if person.get_rect().contains(pygame.Rect(zomx[thecrap], zomy[thecrap], 30, 30)):
HP = HP - .5
thecrap = thecrap + 1
thecrap = 0
pygame.display.update()
if HP <= 0:
print("Game over! Sorry!")
while 1:
abss = font.render("Sorry, but you lost! Press any key to continue...", True, (255, 255, 255))
pygame.display.update()
screen.blit(abss, (90, 90))
for event in pygame.event.get():
Menu().main()
class ai():
def zombieadd(self, Num):
global zomx, zomy, zombie, zombieRect
zombieRect = []
zombie = []
global step
step = 0
print(Num)
while Num > step:
global zomx, zomy, zombie
print(step)
zomx.append(random.randint(0, 600))
zomy.append(random.randint(0, 600))
zombieI = pygame.image.load("Zombie.png").convert()
zombie.append(zombieI)
zombie[step] = pygame.transform.scale(zombie[step], (30, 30))
print(zomx[step], zomy[step])
zombieRect.append(zombie[step].get_rect())
step = step + 1
Num = 0
return 0
Menu().main()
class Game():
def setup(self):
global tiles
for files in os.listdir(os.curdir):
if files.endswith(".png") and files != "Player.png" and files != "Zombie.png":
tilees.append(files)
numtil = tilees.count(files)
print("a " + str(numtil))
fli = pygame.image.load(files).convert_alpha()
i = 0
while i <= 1000:
tiles.append(fli)
i = i + 1
global TileLen
TileLen = tiles.count(fli)
Game().Game()
def Game(self):
global zomx, zomy, zombie, MMS, step, zombieRect
zombieRect = []
zomx = []
zomy = []
zombie = []
step = 0
HP = 15
Map = pygame.image.load("BG.png").convert()
Map = pygame.transform.scale(Map, (pygame.display.list_modes()[0]))
person = pygame.image.load("Player.png").convert()
person = pygame.transform.scale(person, (30, 30))
dagger = pygame.image.load("Dagger.png").convert_alpha()
dagger = pygame.transform.scale(dagger, (13, 13))
screen.blit(Map, (0, 0))
perx = 800
pery = 700
ai().zombieadd(MMS)
screen.blit(person, (perx, pery))
screen.blit(dagger, (perx+20, pery-5))
global thething
thething = 0
for crap in zombie:
screen.blit(zombie[thething], (zomx[thething], zomy[thething]))
print(thething)
thething = thething + 1
pygame.display.flip()
awesome = 1
fttt = 0
ff = 0
ofx = 0
ofy = 0
while 1:
print(perx, pery)
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_w:
pery = pery - 5
if fttt != 1:
if awesome == 4:
dagger = pygame.transform.rotate(dagger, 270)
person = pygame.transform.rotate(person, 270)
elif awesome == 3:
dagger = pygame.transform.rotate(dagger, 90)
person = pygame.transform.rotate(person, 90)
elif awesome == 2:
dagger = pygame.transform.rotate(dagger, 180)
person = pygame.transform.rotate(person, 180)
person = pygame.transform.rotate(person, 0)
dagger = pygame.transform.rotate(dagger, 0)
awesome = 1
fttt = 1
elif event.key == K_s:
pery = pery + 5
if fttt != 2:
if awesome == 4:
dagger = pygame.transform.rotate(dagger, 270)
person = pygame.transform.rotate(person, 270)
elif awesome == 3:
dagger = pygame.transform.rotate(dagger, 90)
person = pygame.transform.rotate(person, 90)
person = pygame.transform.rotate(person, 180)
dagger = pygame.transform.rotate(dagger, 180)
awesome = 2
fttt = 2
elif event.key == K_a:
perx = perx - 5
if fttt != 3:
if awesome == 2:
dagger = pygame.transform.rotate(dagger, 180)
person = pygame.transform.rotate(person, 180)
elif awesome == 4:
dagger = pygame.transform.rotate(dagger, 270)
person = pygame.transform.rotate(person, 270)
person = pygame.transform.rotate(person, 270)
dagger = pygame.transform.rotate(dagger, 270)
awesome = 3
fttt = 3
elif event.key == K_d:
perx = perx + 5
if fttt != 4:
if awesome == 2:
dagger = pygame.transform.rotate(dagger, 180)
person = pygame.transform.rotate(person, 180)
elif awesome == 3:
dagger = pygame.transform.rotate(dagger, 90)
person = pygame.transform.rotate(person, 90)
person = pygame.transform.rotate(person, 90)
dagger = pygame.transform.rotate(dagger, 90)
awesome = 4
fttt = 4
elif event.key == K_e:
if awesome == 1:
while ofx >= -6:
ofx = ofx - 1
screen.blit(dagger, (perx+20, pery-5+ofx))
pygame.time.delay(1)
pygame.display.update()
if ofx <= -6:
ofx = 0
elif awesome == 2:
while ofx >= -6:
ofx = ofx - 1
screen.blit(dagger, (perx-5, pery+25-ofx))
pygame.time.delay(1)
pygame.display.update()
if ofx <= -6:
ofx = 0
if awesome == 3:
while ofx >= -6:
ofx = ofx - 1
screen.blit(dagger, (perx-5+ofx, pery-5))
pygame.time.delay(1)
pygame.display.update()
if ofx <= -6:
ofx = 0
if awesome == 4:
while ofx >= -6:
ofx = ofx - 1
screen.blit(dagger, (perx+20-ofx, pery+25))
pygame.time.delay(1)
pygame.display.update()
if ofx <= -6:
ofx = 0
screen.blit(Map, (0, 0))
screen.blit(person, (perx, pery))
if awesome == 1:
screen.blit(dagger, (perx+20, pery-5))
elif awesome == 2:
screen.blit(dagger, (perx-5, pery+25))
elif awesome == 3:
screen.blit(dagger, (perx-5, pery-5))
else:
screen.blit(dagger, (perx+20, pery+25))
text = "Health: "+str(HP)
font = pygame.font.Font(None, 32)
ttex = font.render(text, True, (255, 0, 0))
screen.blit(ttex, (30, 30))
thecrap = 0
while thecrap < thething:
print(thecrap)
screen.blit(zombie[thecrap], (zomx[thecrap], zomy[thecrap]))
if perx >= zomx[thecrap]:
loop = 0
while loop <= 5:
zomx[thecrap] = zomx[thecrap] + .09
loop = loop + 1
if pery >= zomy[thecrap]:
loop = 0
while loop <= 5:
zomy[thecrap] = zomy[thecrap] + .09
loop = loop + 1
if perx <= zomx[thecrap]:
loop = 0
while loop <= 5:
zomx[thecrap] = zomx[thecrap] - .09
loop = loop + 1
if pery <= zomy[thecrap]:
loop = 0
while loop <= 5:
zomy[thecrap] = zomy[thecrap] - .09
loop = loop + 1
if person.get_rect().contains(zombieRect)):
HP = HP - .5
thecrap = thecrap + 1
thecrap = 0
pygame.display.update()
if HP <= 0:
print("Game over! Sorry!")
while 1:
abss = font.render("Sorry, but you lost! Press any key to continue...", True, (255, 255, 255))
pygame.display.update()
screen.blit(abss, (90, 90))
for event in pygame.event.get():
Menu().main()
class ai():
def zombieadd(self, Num):
global zomx, zomy, zombie, zombieRect
zombieRect = []
zombie = []
global step
step = 0
print(Num)
while Num > step:
global zomx, zomy, zombie
print(step)
zomx.append(random.randint(0, 600))
zomy.append(random.randint(0, 600))
zombieI = pygame.image.load("Zombie.png").convert()
zombie.append(zombieI)
zombie[step] = pygame.transform.scale(zombie[step], (30, 30))
print(zomx[step], zomy[step])
zombieRect.append(zombie[step].get_rect())
step = step + 1
Num = 0
return 0
Menu().main()
您需要做很多事情。
PyGame的Sprite類針對各種游戲功能進行了優化,您似乎並沒有使用它。
但是,如果您只想處理Rect,則必須考慮要比較哪些Rect。 圖像是pygame.Surface對象-進行get_rect
調用后,您將獲得它們的尺寸,但不一定是它們的坐標 。 從任何Surface對象的get_rect()調用返回的Rect的rect.x和rect.y分別為(0,0)。
幸運的是,get_rect()調用允許您傳遞參數。 因此,無論您使用什么方法來跟蹤角色的x和y坐標,都可以在get_rect()調用期間使用關鍵字將其pygame.Rect
給pygame.Rect
對象,以正確反映其坐標。
例如-這不是直接基於您的代碼,因此如果在第一次通過時就炸毀了,那不是我的錯... :)
zombieRect = zombie_image.get_rect(topleft=(zombieX, zombieY))
...然后將其用於與Player rect或任何想要將其碰到的Rect進行比較-使用類似的get_rect(topleft=(x, y))
技術-您可能會開始看到結果。
說了這么多,我強烈敦促您將事物與PyGame對象合並到類中。 如果我沒記錯的話,PyGame的大部分內容都是用C編寫的,如果我沒記錯的話,它的一部分是用FORTRAN和ASM編寫的(請不要讓我同時使用這兩個lang,我可能會記錯),所以只要將內容放在適當的類中,就可以會讓您的生活更輕松。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.