Как мне сделать столкновения между квадратом и кругом, чтобы запустить игру в pygame?

Я делаю игру, в которой есть несколько падающих кругов, и игрок (квадрат) должен их избегать. Проблема в том, что я не могу найти способ заставить круг и игрока столкнуться, чтобы запустить игру. Есть ли способ заставить квадрат и круг столкнуться, чтобы запустить игру, или это заставит игру выйти в 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
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. Bogs

    Для испытания на столкновение достаточно использовать ограничивающий прямоугольник мяча. Связанный pygame.Rect возвращается _ 2_. Если 2 прямоугольника пересекаются, это можно оценить с помощью colliderect() .

    Например:

    while True:
      # [...]
    
      for i in range(len(eBall)):
    
        ball_rect = pygame.draw.circle(apGame, blue, eBall[i], size)
    
        if player.rect.colliderect(ball_rect):
            print("hit")
    
        # [...]
    

    Если вы хотите провести тест на столкновение в отдельном цикле, вам необходимо вручную построить ограничивающий прямоугольник мяча:

    while True:
      # [...]
    
      for ball in eBall:
          ball_rect = pygame.Rect(ball[0]-size, ball[1]-size, size*2, size*2)
          if player.rect.colliderect(ball_rect):
              print("hit")
    
  2. Bogs

    Существуют проверки столкновений для прямоугольников pygame, которые могут обнаруживать столкновения между прямоугольниками или между прямоугольником и точкой. Существуют также процедуры столкновения для спрайтов, которые будут проверять столкновение на основе круга (см. здесь). Однако я не знаю каких-либо встроенных подпрограмм, которые выполняли бы проверку столкновений кругом и прямоугольником.

    Как сказал @ rabbid76 в своем ответе, обычно люди просто аппроксимируют это, используя прямоугольник для круга.

    Если вы уменьшите прямоугольник круга, который вы используете для обнаружения столкновений, чтобы он был немного меньше прямоугольника, ограничивающего круг, чтобы углы выступали меньше (но на самом деле он находится немного внутри сверху, снизу, слева и справа от круга). круг) обычно не заметно, что вы на самом деле не используете круг. Однако это не идеально.

    Вы также можете использовать маски и выполнять с ними проверку коллизий, см. Здесь. Это более затратно с точки зрения вычислений, поэтому вам нужно иметь это в виду, если вы пойдете этим путем.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: