УРОК 9. РАСЧЕТ СТОЛКНОВЕНИЙ БОЛЬШОГО КОЛИЧЕСТВА ОБЪЕКТОВ.
В предыдущем уроке было рассмотрено столкновение двух движущихся объектов и их изменение направления движения. При том наши объекты имели конкретные имена и по их именам(координатам спрайтов) мы и проверяли столкновения спрайтов. Теперь усложним задачу - используя известные нам по предыдущему уроку объекты при столкновении их будем порождать еще объект, при столкновении любых объектов (даже новых) будет появляться еще один объект, ну и соответственно будет присутствовать и их изменение направления движения
Исходный код столкновения двух объектов с порождением объекта при столкновении (с ограничением количества объектов на игровом поле):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Мячики -через класс задаём положение и скорость
# движение шаров только при движении мышки
import sys
import os
import pygame
import random
pygame.init()
# окно
window = pygame.display.set_mode((600,600))# создаём окно
pygame.display.set_caption('Masha and Misha') # титул строка
# поле игры-холст
screen = pygame.Surface((600,600)) # создаем игровое поле(экран)
class Sprite:
# (нач.коорд-х,у,имя файла,нач.скорость-х,у)
def __init__(self,xpos,ypos,filename,xspeed,yspeed):
self.x = xpos
self.y = ypos
self.image=pygame.image.load(filename) # создаем рисунок-загрузка из файла
self.rect = self.image.get_rect() # представляем его прямоугольником
self.w = self.image.get_width() #ширина
self.h = self.image.get_height() #высота
self.speed = (xspeed,yspeed) # скорость в виде кортежа
self.action = True
self.right = True# начальное движ вправо
self.doun = True# разрешение движения вниз
def bum (self):# проверка попадания мышки на объект
if self.x<mp[0]<self.x+self.w and self.y<mp[1]<self.y+self.h:
self.action = False
return self.action
def funtion (self):# функция движения
if self.action == True:
if self.right ==True:
self.x = self.x+self.speed[0]
if self.x>600-self.w:
self.right = False
if self.right == False:
self.x = self.x-self.speed[0]
if self.x<0:
self.right = True
if self.doun == True:
self.y =self.y+self.speed[1]
if self.y>600-self.h:
self.doun = False
if self.doun == False:
self.y = self.y-self.speed[1]
if self.y<0:
self.doun = True
def dif (self):#
if self.right ==True :# если объект двигался в право
self.right =False # меняем движения на лево
else:
self.right =True
if self.doun == True :# если объект двигался вниз
self.doun =False # меняем движения на вверх
else:
self.doun = True
def render (self):# отображение обьекта на игровом поле(экране)
screen.blit(self.image,(self.x,self.y))
def popal(self):
pygame.mouse.set_visible(False) # скрытие курсора
pos = pygame.mouse.get_pos()
# Теперь игрок имеет координаты мышки
self.x = pos[0]
self.y = pos[1]
def Intersect(x1,x2,y1,y2,w1,w2,h1,h2):# ----функция столкновения
if (x2<x1+w1) and (x2>x1-w2) and (y2<y1+h1) and (y2>y1-h2):
return 1
else:
return 0
hero = Sprite(20,35,'balla.gif',3,2)# создаём объект
hero1 = Sprite(200,35,'ball1a.gif',2,3)
b = [] # создаем пустой список
b.append(hero) # добавляем объект в список
b.append(hero1)
def rod(a):
for i in range(a):
# задаем случайные координаты в размерах поля
x = random.randrange(600)
y = random.randrange(600)
block = Sprite(x,y,'balla.gif',2,3)
# добавляем блок в списки-блоков и общий
b.append(block)
clock = pygame.time.Clock()
dum = True
while dum:# условие существования игрового цикла
screen.fill((0,0,90))
for e in pygame.event.get():# для любого события
if e.type == pygame.QUIT:# если было закрытие окна
sys.exit()
if e.type == pygame.MOUSEBUTTONDOWN : # если событие мышь
if pygame.mouse.get_pressed()[0]:#если была нажата лкм
mp = pygame.mouse.get_pos()
for i in b :#
i.bum() # остановили объект
if pygame.mouse.get_pressed()[1]:# если была нажата средняя кнопка
pygame.mouse.set_visible(True) # скрытие курсора
for i in b :
i.action = True# движение разрешено
for i in b:
if i.action == False:
i.popal()# передаем на перемещение мышкой
a = b[:]# клонирование списка объектов
for n in range (len(a)-1):
player = a[0]# получить первый элемент списка и создаём другую ссылку на него
del a[0] # удаляем нулевой элемент из списка ( а)
for i in a: # перебор по обновленному списку а
# если произошло столкновение первого элемента с остатком списка
if Intersect(player.x,i.x,player.y,i.y,player.w,i.w,player.h,i.h) == True:
i.dif() # изменяем направление обьекта из списка а
player.dif() # ссылка тоже использует метод класса - изменяем направление
if len(b)<30:# ограничение рождения при ударе новых объектов
rod(1) #функция рождения объекта
for i in b :#производим движение объектов (всего списка)
i.funtion()
for i in b :# отображаем объекты(список)
i.render()
window.blit(screen,(0,0))# на окне прорисовываем поле игры
clock.tick(60)
pygame.display.flip()# отображаем полностью дисплей(окно)
|