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.