Уведомления

Группа в Telegram: @pythonsu

#1 Март 8, 2015 22:25:31

balabas
Зарегистрирован: 2015-02-21
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Pygame анимация, прошу помощи

Добрый день прошу помощи
Начал заниматься pygame 2.7.9, хочу хотел написать игру. Нашел видео лекций, и по шаблоны, как автор пытаюсь разбираться, но тут застопорился на анимации, причем вроде должно все работать

# -*- coding: cp1251 -*-
import random,pygame, sys
#Создаём окно программы
window = pygame.display.set_mode((600,630))
#Задаём имя окна
pygame.display.set_caption("hello world")
#создаём рабочую область 
screen = pygame.Surface((600,600))
#Строка состояния
info_string = pygame.Surface((600,30))
#создаём Sprite
class Sprite__init__():
 def __init__(self,xpos,ypos,filename):
     self.x = xpos
     self.y = ypos
     self.bitmap = pygame.image.load(filename)
     self.bitmap.set_colorkey((0,0,0))
     self.bitmap.set_colorkey((255,255,255))
 def render(self):
     screen.blit(self.bitmap,(self.x,self.y))
## взаймодействие фигур(сравнение координат)
def Intersect(x1,x2,y1,y2,db1,db2):
 if (x1 > x2-db1) and (x1 < x2+db1) and (y1 > y2-db2) and (y1 < y2+db2):
     return 1
 else:
     return 0
#создаём класс меню, для создания меню
class Menu():
    #создаём список меню, с расположением, именем, цветом, цвет выбранного меню
    #номер пункта 
    def __init__(self, punkts = [120, 140, u"punkt" , (250,250,30),(250,30,250)]):
    #передаём список команде Punkts
     self.punkts = punkts
     #отображаем повержность, где будем рисовать, экземпляр шрифта,номер активного элеменат                                             
    def render(self, poverhost, font, num_punkt):
     #цикл фор, кот перебирает совпадает ли номер переданной функций
     # если совпадает, то закрашивается цветом активного элемента
        for i in self.punkts:
          if num_punkt == i [5]:
             poverhost.blit(font.render(i[2],1,i[4]),(i[0], i[1]))
          else:
             poverhost.blit(font.render(i[2],1,i[3]),(i[0], i[1]))
#Основная функция, которая реализует систему меню                                         
    def menu(self):
         done = True
#задаём шрифт
         font_menu = pygame.font.SysFont("Blackoak Std",60)
         # деактивируем залипание клавишщь чтобы работала кнопка ESCAPE
         pygame.key.set_repeat(0,0)
         #Делаем видимый курсор в меню
         pygame.mouse.set_visible(True)
         #хранение и использование переменной
         punkt = 0
#цикл событий, закраска экрана, отрисовка объектов и отслеживание событий
         while done:
            info_string.fill((0,100,200))
            screen.fill((0,100,200))
#задаём возможность использование мыши
#А так же задаём цикл, который проверяет, активна мышь в диапозоне
#или нет
            mp = pygame.mouse.get_pos()
            for i in self.punkts:
                if mp[0]>i[0] and mp [0]< +270 and mp [1]>i[1] and mp[1]<i[1]+70:
                    punkt = i[5]
                    
            self.render(screen, font_menu, punkt)
            
            for e in pygame.event.get():
                if e.type == pygame.QUIT:
#Функция, которая при вызове закрывает приложение полностью в любом месте
                    sys.exit()
#прописываем закрытие с помощью эскейпа
                if e.type == pygame.KEYDOWN:
                   if e.key == pygame.K_ESCAPE:
                       sys.exit()                 
#Блок навигаций меню с помощью клавишь
                   if e.key == pygame.K_UP:
                        if punkt > 0:
                                 punkt -=1
                   if e.key == pygame.K_DOWN:
                        if punkt < len(self.punkts)-1:
                                 punkt += 1
#нажатие левой кнопки миши                                                  
                if e.type == pygame.MOUSEBUTTONDOWN and e.button == 1:
                        if  punkt == 0:
                             done = False
                        elif punkt == 1:                      
                             sys.exit()    
            window.blit(info_string,(0,0))               
            window.blit(screen, (0,30))
            pygame.display.flip()
##Класс создания анимаций 
class Animation:
    # sprite это содержание кадры, time время каждого кадра
    def _init_(self, sprites = None, time = 100):
        self.sprites = sprites
        self.time = time
        #счетчик времени
        self.work_time = 0
        #СКОЛЬКО кадров нужно пропустить
        self.skip_frame = 0
        #номер кадр, который показываем
        self.flame = 0
        #функция получения времени с помощью комнады pygame.time.Clock()
    def update(self, dt):
        #прибовляем это время к счетчику, чтобы узнать сколько кадров нужно пропустить
        self.work_time +=dt
        #вычесляем сколько кадров нужно пролестнуть 
        self.skip_frame = self.work_time/ self.time
        if self.skip_frame >0:
            self.work_time = self.work_time % self.time
            #прибавляем количество кадров, которе надо пролестнуть 
            self.frame +=self.skip_frame
            #проверяем не больше ли текущих кадров, чем есть вообще 
            if self.frame >=len(self.sprites):
                self.frame = 0
    def get_sprite(self):
        return self.sprites[self.frame]
##Загружаем изображение с раскадровкой
sprite = pygame.image.load('hero 2.png').convert_alpha()
                    #вырезаем кадры"
#контейнер для кадров будущей анимаций 
anim = []
anim.append(sprite.subsurface((0,0,40,40)))
anim.append(sprite.subsurface((40,0,40,40)))
anim.append(sprite.subsurface((60,0,40,40)))
anim.append(sprite.subsurface((40,0,40,40)))
#создаём кадровую ленту
time=180
target = Animation(anim, time)
    #'''Шрифты'''
#Добавляем шрифты
pygame.font.init()
#задаём стандартные шрифты, и размер 32
speed_font  = pygame.font.Font(None, 32)
inf_font    = pygame.font.SysFont("Calibri",24)
label_font  = pygame.font.SysFont("Blackoak Std", 24)
arrow_color = 250
hero      = Sprite__init__(0, 0, 'h.jpg')
zet       = Sprite__init__(1,100,"z.jpg")
zet.right = False
#задаём шаг скорости цели
zet.step = 1
#Клас стрела
strela = Sprite__init__(300,300,"strela.png")
# Задаём состояние push, то есть стрела может быть в 2 состояниях
#заряжена= True и выпущена = False
strela.push = False
                       #создаём меню
#расположение меню                                                  
punkts = [(120*2, 140*2, u"game",(250,250,30), (250,30,250),0),
          (130*2, 210*2, u"quit",(250,250,30), (250,30,250),1)]
#пункты меню
game = Menu(punkts)
game.menu()                                                 
                       #Подготовка к запуску игры
# Создаём цикл
done= True
#Дублирование нажатие клавиши 
#a=Сколько нужно подождать Мсек до следующего дублирование нажатие клавиши
#B= задержка между следующими дублирование
pygame.key.set_repeat(1,1)
pygame.time.delay(100)
enumerator = 0
#создаём таймер, который будет задавать темп игры
clock = pygame.time.Clock()
dt = 0
while done:
# цикл работает до тех пор, пока переменная E не станет False И будет 
#  присвоена к QUIT, далее сбрасивает все значения,с помощью команды
# event.get()
#Обработчик событий
#управление спрайтом
 for e in pygame.event.get():
     if e.type == pygame.QUIT:
         done = False
     if e.type == pygame.KEYDOWN:
         if e.key == pygame.K_LEFT:
             if hero.x > 10:
                 hero.x -=2
         if e.key == pygame.K_RIGHT:
             if hero.x<550:
                 hero.x +=2
######### ОСь Y
         if e.key == pygame.K_UP:
             if hero.y > 200:
                 hero.y -=2
         if e.key == pygame.K_DOWN:
             if hero.y < 550:
                 hero.y +=2  
    #запуск стрелы
         if e.key == pygame.K_SPACE:
             if strela.push == False:
                 strela.y= hero.y+15
                 strela.x = hero.x+15
                 strela.push = True
# Выход в меню с помощью escape                 
         if e.key == pygame.K_ESCAPE:
                 game.menu()
             
                 "Заливка"
 screen.fill((255,250,255))
 info_string.fill((45,80,40))
#Изменение цвета названия
 arrow_color +=2
 if arrow_color >254:
     arrow_color = 100
##Собитие движения мыши
 if e.type == pygame.MOUSEMOTION:
#скрываем курсор
     pygame.mouse.set_visible(False)
#задаем параметры мыши, и область ее действия
     m = pygame.mouse.get_pos()
     if m[0]>10 and m[0]<550:
         hero.x = m[0]
     if m[1]>200 and m[1] < 550:
         hero.y = m[1]
#cобытие нажатие мыши
 if e.type == pygame.MOUSEBUTTONDOWN:
     if e.button == 1:
         if strela.push == False:
             strela.x = hero.x+50
             strela.y = hero.y+50
             strela.push = True
 ######### движение цели
 if zet.right == True:
     zet.x -= zet.step
     if zet.x < 0:
         zet.right = False 
 else :
     zet.x += zet.step
     if zet.x >  550:
         zet.right = True
####### перемещение стрелы
 if strela.y < 0:
     strela.push = False
     enumerator -=1
 if strela.push == False:
     strela.y = hero.y
     strela.x = hero.x
 else:
     strela.y -= 1
    #Столкновение целей
 if Intersect(strela.x,zet.x,strela.y,zet.y,5,40)== True:
     strela.push = False
     zet.step += 1
     print("Есть!")
     enumerator +=1
     
##Отрисовка объектов
 strela.render()
 zet.render()
 target.update(dt)
 screen.blit(target.get_sprite(),(0,0))
 hero.render()
#отрисовка шрифтов
 info_string.blit (speed_font.render(u"cкорость:"+str(zet.step),1,(210,120,250)),(10,5))
 info_string.blit (inf_font.render(u"Счет:"+str(enumerator),1,(0,250,200)),(500,5))
 info_string.blit (label_font.render(u"Стрелялка",1,(100,arrow_color,250)),(280,5))
 
#создаём кадровую ленту
time=180
target = Animation(anim, time)
Проблемам тут(выше выделил), мы создаём контейнер для кадров, и разбиваем картинку на 3 кадра, которые должны сменяться, но он пишет, что this constructor takes no arguments

Отредактировано balabas (Март 8, 2015 22:28:43)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version