Найти - Пользователи
Полная версия: вопрос по pygame
Начало » Python для новичков » вопрос по pygame
1
asdfr
написал вот такую мини игру
 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()
old_monty
asdfr
Но при столкновении не чего не происходит.
Подскажите в чем проблема,спасибо)
Как видно из кода, hero и zet2 - объекты, созданные на основе класса Sprite. Если при сравнении двух объектов типа Sprite операцией == ничего не происходит, значит, эта операция в классе Sprite не определена. Или может определена, но как-то иначе, не означает совпадение положений этих объектов хотя бы в одной точке, которое должно быть при столкновении.
asdfr
old_monty
так если я делаю так
  if hero.y==zet2.y:
        sys.exit()
то все работает,но не так как нужно,при пересечение по оси y происходит выход
в классе есть координаты,загрузка файла и заливка колоркей
и метод для вывода.
зачем в классе прописывать еще что то?

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

asdfr
зачем в классе прописывать еще что то?
Я не говорил, что в классе нужно прописывать еще что-то. Сравнение координат двух объектов нужно делать иначе. Искать, есть ли у них хотя бы одна общая точка (совпадение координат х и у). Только это и будет означать столкновение.
Причем эта точка столкновения скорее всего не совпадает со свойствами hero.y или zet2.y. Эти свойства используются для указания положения всего объекта (рисунка из файла .png) относительно координатной оси.
FishHook
old_monty
А проверки == для сравнения двух экземпляров класса Sprite нет? Тогда она и не будет выполняться.
Это почему это вдруг???
old_monty
Если при сравнении двух объектов типа Sprite операцией == ничего не происходит, значит, эта операция в классе Sprite не определена
Что???
old_monty
FishHook
В классе Sprite определена операция == ? Ну тогда наверное она означает не то, что подразумевает ТС?
FishHook
old_monty
В классе Sprite определена операция == ? Ну тогда наверное она означает не то, что подразумевает ТС?
Я не знаю, что подразумевает ТС, я не знаю, что подразумеваете вы, я вообще не умею читать мысли.
Но, я точно знаю, что для того чтобы сравнивать объекты совершенно не нужно явно определять операцию сравнения. Вы либо яснее выражайте свои мысли, либо не торопитесь с советами, потому то, что вы понаписали как минимум вызывает недоумение.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB