简体   繁体   中英

Python collision detection between rectangles

I'm trying to figure out how to do some basic collision detection between rectangles. It's working on all sides of my enemy rectangle except the left side. While the collision seems to be detected, my player is moving in a direction contrary to my instructions.

#!/usr/bin/python

import pygame
from random import randrange
pygame.init()

BLACK = ( 0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
color = GREEN

w = 800
h = 600
size = (w, h)


screen = pygame.display.set_mode(size)
pygame.display.set_caption("Cool Window")



done = False

clock = pygame.time.Clock()
pos_x = 0
pos_y = 0

enemy_pos_x = w/2
enemy_pos_y = h/2
last_move = "none"



while not done:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True



    if(event.type==pygame.KEYDOWN):
        if(event.key == pygame.K_ESCAPE):
            done = True
        if(event.key == pygame.K_LEFT):
            pos_x -= 5
            last_move = "left"
            print 'Posx: %s.\n' % pos_x

        if(event.key == pygame.K_RIGHT):
            pos_x += 5
            las_move = "right"
            print 'Posx: %s.\n' % pos_x

        if(event.key == pygame.K_UP):
            pos_y -= 5
            last_move = "up"
            print 'Posy: %s.\n' % pos_y

        if(event.key == pygame.K_DOWN):
            pos_y += 5
            last_move = "down"
            print 'Posy: %s.\n' % pos_y

    if pos_x+40 > 800:
        pos_x -= 5
    if pos_x < 0:
        pos_x += 5

    if pos_y+40 > 600:
        pos_y -= 5
    if pos_y < 0:
        pos_y += 5

    #collision with enemy
    if (pos_x+40 >= enemy_pos_x ) & (pos_y+40 >= enemy_pos_y) & (pos_x <= enemy_pos_x+40) & (pos_y <= enemy_pos_y+40):

        print 'Collision \n'
        if last_move == "left" :
            pos_x += 5
        if last_move == "right" :
            pos_x -= 5
        if last_move == "up" :
            pos_y += 5
        if last_move == "down" :
            pos_y -= 5





    screen.fill(BLACK)

    #Draw

    pygame.draw.rect(screen, WHITE, [enemy_pos_x, enemy_pos_y, 40, 40])
    pygame.draw.rect(screen, color, [pos_x, pos_y, 40, 40])



    pygame.display.flip()
    clock.tick(60)


pygame.quit()

I ran into that problem myself, so I did some research and found a good JavaScript code, so I translated it to python and here is the layout:

if rect_1_x < rect_2_x + rect_1_width and rect_1_x + rect_2_width > rect_2_x and rect_1_y < rect_2_y + rect_1_height and rect_2_height + rect_1_y > rect_2_y:

#now type whatever code you want to be activated when the rectangles touch

This works by sensing if any of the edges of the first rectangle (rect_1) are touching any of the edges of the second rectangle (rect_2). this does not fix the passing problem it just calculates the collision better.

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