Главная » 2016 » Март » 19 » Урок 9. Столкновения и отскок боьшого количества объектов.
19:25
Урок 9. Столкновения и отскок боьшого количества объектов.

УРОК 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()# отображаем полностью дисплей(окно)

Категория: игры на Python | Просмотров: 1293 | Добавил: kuzma | Рейтинг: 0.0/0
Всего комментариев: 0
avatar

Программирование игр на Python

Django - создание сайтов с нуля

Javascript - просто используем готовые решения