Я делаю игру, в которой есть несколько падающих кругов, и игрок (квадрат) должен их избегать. Проблема в том, что я не могу найти способ заставить круг и игрока столкнуться, чтобы запустить игру. Есть ли способ заставить квадрат и круг столкнуться, чтобы запустить игру, или это заставит игру выйти в pygame?
import pygame
from pygame.locals import *
import os
import random
import math
import sys
import time
white = (255,255,255)
blue = (0,0,255)
gravity = 10
size =10
height = 500
width =600
varHeigth = height
ballNum = 5
eBall = []
apGame = pygame.display.set_mode((width, height))
pygame.display.set_caption("AP Project")
clock = pygame.time.Clock()
class Player(object):
def __init__(self):
red = (255, 0, 0)
move_x = 300
move_y = 400
self.rect = pygame.draw.rect(apGame,red, (move_x, move_y, 10, 10))
self.dist = 10
def handle_keys(self):
for e in pygame.event.get():
if e.type == pygame.QUIT:
pygame.quit();
exit()
key = pygame.key.get_pressed()
if key[pygame.K_LEFT]:
self.draw_rect(-1, 0)
elif key[pygame.K_RIGHT]:
self.draw_rect(1, 0)
elif key[pygame.K_ESCAPE]:
pygame.quit();
exit()
else:
self.draw_rect(0, 0)
def draw_rect(self, x, y):
red = (255, 0, 0)
black = (0, 0, 0)
'''apGame.fill(black)'''
self.rect = self.rect.move(x * self.dist, y * self.dist);
pygame.draw.rect(apGame, red , self.rect)
pygame.display.update()
def draw(self,surface):
red = (255, 0, 0)
move_x = 300
move_y = 400
pygame.draw.rect(apGame, red, (move_x, move_y, 10, 10))
move_x = 300
move_y = 400
red = (255, 0, 0)
black = (0, 0, 0)
player = Player()
clock = pygame.time.Clock()
'''apGame.fill(black)'''
player.draw(apGame)
pygame.display.update()
for q in range(ballNum):
x = random.randrange(0, width)
y = random.randrange(0, varHeigth)
eBall.append([x, y])
while True:
apGame.fill(black)
for i in range(len(eBall)):
pygame.draw.circle(apGame, blue, eBall[i], size)
eBall[i][1] += 5
if eBall[i][1] > height:
y = random.randrange(-50, -10)
eBall[i][1] = y
x = random.randrange(0, width)
eBall[i][0] = x
player.handle_keys()
pygame.display.flip()
clock.tick(30)
Для испытания на столкновение достаточно использовать ограничивающий прямоугольник мяча. Связанный
pygame.Rect
возвращается _ 2_. Если 2 прямоугольника пересекаются, это можно оценить с помощьюcolliderect()
.Например:
Если вы хотите провести тест на столкновение в отдельном цикле, вам необходимо вручную построить ограничивающий прямоугольник мяча:
Существуют проверки столкновений для прямоугольников pygame, которые могут обнаруживать столкновения между прямоугольниками или между прямоугольником и точкой. Существуют также процедуры столкновения для спрайтов, которые будут проверять столкновение на основе круга (см. здесь). Однако я не знаю каких-либо встроенных подпрограмм, которые выполняли бы проверку столкновений кругом и прямоугольником.
Как сказал @ rabbid76 в своем ответе, обычно люди просто аппроксимируют это, используя прямоугольник для круга.
Если вы уменьшите прямоугольник круга, который вы используете для обнаружения столкновений, чтобы он был немного меньше прямоугольника, ограничивающего круг, чтобы углы выступали меньше (но на самом деле он находится немного внутри сверху, снизу, слева и справа от круга). круг) обычно не заметно, что вы на самом деле не используете круг. Однако это не идеально.
Вы также можете использовать маски и выполнять с ними проверку коллизий, см. Здесь. Это более затратно с точки зрения вычислений, поэтому вам нужно иметь это в виду, если вы пойдете этим путем.