Уведомления

Группа в Telegram: @pythonsu

#1 Март 10, 2017 18:11:19

asdfr
Зарегистрирован: 2017-01-03
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по pygame

написал вот такую мини игру

 import pygame
window = pygame.display.set_mode((400, 400))
pygame.display.set_caption('Hello, pygame!')
screen = pygame.Surface((400, 400))
class Sprite:
    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))
    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+db2) and (y1 > y2-db1) and (y1 < y2+db2):
        return 1
    else:
        return 0
def Intersect1(x1, x2, y1, y2):
    if (x1 > x2-40) and (x1 < x2+40) and (y1 > y2-40) and (y1 < y2+40):
        return 1
    else:
        return 0
''' описание героя ''' 
hero = Sprite(350, 350, 'h.png')
''' описание цели '''
zet = Sprite(10, 10, 'z.png')
zet.right = False
zet.step = 1
zet2 = Sprite(10, 10, 'h1.png')
zet2.right = False
zet2.step = 1
''' описываем стрелу '''
strela = Sprite(-10, 350, 's.png')
strela.push = False
done = True
pygame.key.set_repeat(1,1)
pygame.mouse.set_visible(False)
while done:
    ''' обработчик событий '''
    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 -= 1
            if e.key == pygame.K_RIGHT:
                if hero.x < 350:
                    hero.x += 1
            if e.key == pygame.K_UP:
                if hero.y > 200:
                    hero.y -= 1
            if e.key == pygame.K_DOWN:
                if hero.y < 350:
                    hero.y += 1
            ''' запуск стрелы '''
            if e.key == pygame.K_SPACE:
                if strela.push == False:
                    strela.x = hero.x+15
                    strela.y = hero.y
                    strela.push = True
        ''' событие - движение мыши '''
        if e.type == pygame.MOUSEMOTION:
            m = pygame.mouse.get_pos()
            if m[0] > 10 and m[0] < 350:
                hero.x = m[0]
            if m[1] > 200 and m[1] < 350:
                hero.y = m[1]
        ''' событие - нажатие кнопок мыши '''
        if e.type == pygame.MOUSEBUTTONDOWN:
            if e.button == 1:
                if strela.push == False:
                    strela.x = hero.x+15
                    strela.y = hero.y
                    strela.push = True
            
            
    ''' заливка экрана '''
    screen.fill((50, 50, 50))
    
    ''' передвижение цели '''        
    if zet.right == True:
        zet.x -= zet.step
        if zet.x < 0:
            zet.right = False
    else:
        zet.x += zet.step
        if zet.x > 350:
            zet.right = True
            #////////
    if zet2.right == True:
        zet2.y -= zet.step
        if zet2.y < 0:
            zet2.right = False
    else:
        zet2.y += zet.step
        if zet2.y > 350:
            zet2.right = True
    ''' перемещение стрелы '''
    if strela.y < 0:
        strela.push = False
    
    if strela.push == False:
        strela.y = 350
        strela.x = -10
    else:
        strela.y -= 1
        
    ''' столкновение стрелы и цели '''
    if Intersect(strela.x, zet.x, strela.y, zet.y, 5, 40) == True:
        strela.push = False
        zet.step += 0.2
    if hero==zet2:
        sys.exit()
    
    ''' отрисовка объектов '''
    strela.render()
    zet.render()
    zet2.render()
    hero.render()
    window.blit(screen, (0,0))
    pygame.display.flip()
    pygame.time.delay(5)
Все отлично работает
Задался целью,что бы при столкновении 2 фигур hero и zet2 игра автоматически закрывалась
Пытаюсь это сделать с помощью
  if hero.y==zet2.y:
        sys.exit()
Но при столкновении не чего не происходит.
Подскажите в чем проблема,спасибо)
если записать вот так
 if hero==zet2:
        sys.exit()
то игра закроется сразу при пересечение по всей горизонтальной линии y. а нужно чтобы при соприкосновение срабатывал sys.exit()

Отредактировано asdfr (Март 10, 2017 18:34:26)

Офлайн

#2 Март 10, 2017 18:29:35

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

вопрос по pygame

asdfr
Но при столкновении не чего не происходит.
Подскажите в чем проблема,спасибо)
Как видно из кода, hero и zet2 - объекты, созданные на основе класса Sprite. Если при сравнении двух объектов типа Sprite операцией == ничего не происходит, значит, эта операция в классе Sprite не определена. Или может определена, но как-то иначе, не означает совпадение положений этих объектов хотя бы в одной точке, которое должно быть при столкновении.

Офлайн

#3 Март 10, 2017 18:37:20

asdfr
Зарегистрирован: 2017-01-03
Сообщения: 31
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по pygame

old_monty
так если я делаю так
  if hero.y==zet2.y:
        sys.exit()
то все работает,но не так как нужно,при пересечение по оси y происходит выход
в классе есть координаты,загрузка файла и заливка колоркей
и метод для вывода.
зачем в классе прописывать еще что то?

Отредактировано asdfr (Март 10, 2017 18:38:31)

Офлайн

#4 Март 10, 2017 18:56:53

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

вопрос по pygame

asdfr
в классе есть координаты,загрузка файла и заливка колоркей
и метод для вывода.
А проверки == для сравнения двух экземпляров класса Sprite нет? Тогда она и не будет выполняться.

asdfr
зачем в классе прописывать еще что то?
Я не говорил, что в классе нужно прописывать еще что-то. Сравнение координат двух объектов нужно делать иначе. Искать, есть ли у них хотя бы одна общая точка (совпадение координат х и у). Только это и будет означать столкновение.
Причем эта точка столкновения скорее всего не совпадает со свойствами hero.y или zet2.y. Эти свойства используются для указания положения всего объекта (рисунка из файла .png) относительно координатной оси.

Офлайн

#5 Март 10, 2017 19:07:45

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

вопрос по pygame

old_monty
А проверки == для сравнения двух экземпляров класса Sprite нет? Тогда она и не будет выполняться.
Это почему это вдруг???
old_monty
Если при сравнении двух объектов типа Sprite операцией == ничего не происходит, значит, эта операция в классе Sprite не определена
Что???



Офлайн

#6 Март 10, 2017 19:15:09

old_monty
Зарегистрирован: 2015-09-27
Сообщения: 238
Репутация: +  20  -
Профиль   Отправить e-mail  

вопрос по pygame

FishHook
В классе Sprite определена операция == ? Ну тогда наверное она означает не то, что подразумевает ТС?

Офлайн

#7 Март 11, 2017 05:07:45

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

вопрос по pygame

old_monty
В классе Sprite определена операция == ? Ну тогда наверное она означает не то, что подразумевает ТС?
Я не знаю, что подразумевает ТС, я не знаю, что подразумеваете вы, я вообще не умею читать мысли.
Но, я точно знаю, что для того чтобы сравнивать объекты совершенно не нужно явно определять операцию сравнения. Вы либо яснее выражайте свои мысли, либо не торопитесь с советами, потому то, что вы понаписали как минимум вызывает недоумение.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version