简体   繁体   中英

python collision detection?

So I've been working on a python game for a project.I'm having the trouble now that If I put an obstacle in the game I can't make it respond to my picture like when my picture collides with it, the game ends. I've been at it for quite sometime now but I'm unable to figure out the code.Any help will be greatly appreciated.I seriously need help with this.Please not that I'm a beginner and I just started studying python a month ago.So please try to understand. I've attached the code below.

import pygame, random, sys
from pygame.locals import *
BACKGROUNDCOLOR = (181, 230, 29)
FPS = 30
pixels = 5


pygame.init()
mainClock = pygame.time.Clock()
windowSurface = pygame.display.set_mode((990, 557))
pygame.display.set_caption('Clumsy Claire :D')

background = pygame.image.load('grass.jpg')
backgroundRect = background.get_rect()
size = (990, 557)
background.get_size()

image = pygame.image.load('snail 2.png')
imageRect = image.get_rect()

stone1 = pygame.image.load('rock.PNG')
stone1Rect = stone1.get_rect()
stone2 = pygame.image.load('rock.PNG')
stone2Rect = stone2.get_rect()


BROWN =  (128,64,0)
pygame.draw.line(background, BROWN, (98, 555), (98,69), 12)
pygame.draw.line(background, BROWN, (98, 16), (98,1), 12)
pygame.draw.line(background, BROWN, (94, 3), (283, 3),12)
pygame.draw.line(background, BROWN, (278, 457), (278, 3),12)
pygame.draw.line(background, BROWN, (278, 554), (278, 512),12)
pygame.draw.line(background, BROWN, (274, 554), (470, 554),12)
pygame.draw.line(background, BROWN, (465, 554), (465, 90),12)
pygame.draw.line(background, BROWN, (465, 35), (465, 0),12)
pygame.draw.line(background, BROWN, (465, 3), (657, 3),12)
pygame.draw.line(background, BROWN, (652,555 ), (652, 502),12)
pygame.draw.line(background, BROWN, (652, 449), (652, 0),12)
pygame.draw.line(background, BROWN, (648, 553), (844, 553),12)
pygame.draw.line(background, BROWN, (838, 553 ), (838, 138),12)
pygame.draw.line(background, BROWN, (838, 84 ), (838, 0),12)

while True:
    imageRect.topleft = (10,488)
    moveLeft = False
    moveRight = False
    moveUp = False
    moveDown = False

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key == K_LEFT:
                   moveLeft = True
                if event.key == K_RIGHT:
                   moveRight = True
                if event.key == K_UP:
                   moveUp = True
                if event.key == K_DOWN:
                   moveDown = True

           if event.type == KEYUP:
               if event.key == K_LEFT:
                    moveLeft = False
               if event.key == K_RIGHT:
                    moveRight = False
               if event.key == K_UP:
                    moveUp = False
               if event.key == K_DOWN:
                    moveDown = False

          if moveLeft and imageRect.left > 0:
              imageRect.move_ip(-1 * pixels, 0)
          if moveRight and imageRect.right < 990:
              imageRect.move_ip(pixels, 0)
          if moveUp and imageRect.top > 0:
              imageRect.move_ip(0, -1 * pixels)
          if moveDown and imageRect.bottom < 557:
              imageRect.move_ip(0, pixels)

          windowSurface.blit(background, backgroundRect)
          windowSurface.blit(image, imageRect)
          rock1 = background.blit(stone1,(658,337))
          rock2 = background.blit(stone2,(225,150))


          pygame.display.update()

          mainClock.tick(FPS)

You need to add a colliderect function to your code among other things. Right now you have no way to test collisions. Paste this below your blit code:

if imageRect.colliderect(stone1Rect):
    print('Game Over')
    pygame.quit()
if imageRect.colliderect(stone2Rect):
    print('Game Over')
    pygame.quit()

This code here:

rock1 = background.blit(stone1,(658,337))
rock2 = background.blit(stone2,(225,150))

also needs to be changed to this:

windowSurface.blit(stone1, (658, 337))
windowSurface.blit(stone2, (225, 150))

The reason we need to change the above is this: your code is blitting on your background image instead of the window; which is a bad practice.

For some reason, I'm guessing you're learning python from inventwithpython.org ;D That's the way I learned it too (if my guess is right ;D)

If you need any more help or have questions just comment below. Good luck!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM