Ответы пользователя по тегу pygame
  • Как сделать чтобы точка падала?

    TalismanChet
    @TalismanChet
    Лицо зла
    просто добавляйте скорость по у каждой здездочке, при покидании области экрана - del zvezdy[idzvezdy].
    Ответ написан
    Комментировать
  • Как удалить объект с экрана в Pygame?

    TalismanChet
    @TalismanChet
    Лицо зла
    del pygameObject_zombie
    Ответ написан
    Комментировать
  • Как сделать коллизию в Pygame?

    TalismanChet
    @TalismanChet
    Лицо зла
    if obj1.rect.colliderect(obj2.rect):
        <collision>
        pass
    else:
        <not collision>
        pass
    Ответ написан
    Комментировать
  • Не понимаю в чем ошибка?

    TalismanChet
    @TalismanChet
    Лицо зла
    Зачем для этого вообще нужны группы? всегда без них обходился. я вот что скажу: рисуй фон дважды:

    class Background(dict):
        def __init__(self, image, x=0):
            self['i'], self['x'] = image, x
            pass
        def draw(self, surface):
            surface.blit(self['i'], (self['x'], 0))
            surface.blit(self['i'], (self['x']-self['i'].get_width(), 0))
            self['x'] += 1
            if self['x'] >= self['i'].get_width(): x = 0
            pass
        pass
    Ответ написан
    Комментировать
  • Как реализовать выход из приложения, если игрок не находится на одном из pygame.Rect?

    TalismanChet
    @TalismanChet
    Лицо зла
    псевдокод:

    прог
    нач
      алг элемент_жиз_цикла_программы
      нач
        для тчк из getallpoint(trailRect)
        нач
          если не playerRect.collidepoint(nxr) то
          нач
            sys.exit()
          кон
        кон
      кон
      алг getallpoint(rct: Rect = Rect(0, 0, 100, 100))
      нач
        верн: список = []
        для х из промежутка rct.x, rct.x+rct.w
        нач
          для у из промежутка rct.y, rct.y+rct.h
          нач
            добавить [х, у] к верн
          кон
        кон
      вернуть верн
      кон
    кон.
    Ответ написан
    Комментировать
  • Как сделать коллизию между гранатой и полом в pygame?

    TalismanChet
    @TalismanChet
    Лицо зла
    Давайте представим ситуацию: изображение гранаты перекрыло изображение земли:

    Пусть Rect земли = Rect(0, 90, 100, 10) с окном 100х100рх

    Случай 1.

    Пусть х и у гранаты хранятся отдельно.
    Тогда нужно создать новый Rect с координатами гранаты и размером желаемого хитбокса. Если включить отрисовку такого Rect'а, то можно увидеть такую картину:

    6224b13196b27565859800.png

    То есть, это и есть хитбокс гранаты.

    Далее мы должны взять каждую точку хитбокса на картинке (это хорошо работает с маленькими целевыми и большими проверяющими хитбоксами, если бы земля была маленькой, а граната - огромной, то проверку нужно было бы делать и от земли к гранате и от гранаты к земле) и сравнить перекрывание с хитбоксом земли:
    groundRect.collidepoint(granadeRectPoint)
    # True если перекрывается

    А далее можно производить требуемые действия, например, уничтожить экземпляр гранаты или обнулить её вектор движения.

    Случай 2.

    Пусть х и у гранаты равны х и у изображения.
    Тогда нужно извлечь Rect с координатами гранаты из изображения:

    granadeRect = granadeImage.get_rect()

    Если включить отрисовку такого Rect'а, то можно увидеть такую картину:

    6224b13196b27565859800.png

    То есть, это и есть хитбокс гранаты.

    Далее мы должны взять каждую точку хитбокса на картинке (это хорошо работает с маленькими целевыми и большими проверяющими хитбоксами, если бы земля была маленькой, а граната - огромной, то проверку нужно было бы делать и от земли к гранате и от гранаты к земле) и сравнить перекрывание с хитбоксом земли:
    groundRect.collidepoint(granadeRectPoint)
    # True если перекрывается

    А далее можно производить требуемые действия, например, уничтожить экземпляр гранаты или обнулить её вектор движения.
    Ответ написан
    Комментировать
  • Как реализовать управление под андроид на pygame?

    TalismanChet
    @TalismanChet
    Лицо зла
    Управление на андроид работает почти также, как на ПК, только вместо MOUSBUTTONDOWN там FINGERDOWN, а вместо MOUSEBUTTONUP - FINGERUP. Если же нужна информация по типу "как сделать свайп в pygame на Android", то переформулируйте вопрос.
    Ответ написан
    Комментировать
  • Как реализовать гравитацию и коллизию с такой структурой?

    TalismanChet
    @TalismanChet
    Лицо зла
    возьмите Rect изображения бомбы и для каждой точки этого Rect'а top_left, top_right, top, left, right, bottom_left, bottom_left, center проверьте коллайд с, например, Rect'ом земли или персонажа с помощью Rect.collidepoint(point) -> bool вернет True при коллизии
    Ответ написан
    Комментировать
  • С помощью чего и как можно стилизовать счетчик на pygame?

    TalismanChet
    @TalismanChet
    Лицо зла
    1. Эта задача выполнима, не понял причины этого вопроса.
    2. Я написал пример программы с счетчиком(как его использовать, понять не сложно)
    import threading, sys
    from pygame import *
    font.init()
    
    def thread(func):
        def _sugar(*args) -> threading.Thread:
            ret = threading.Thread(target = func, args = [*args,])
            ret.start()
            return ret
        return _sugar
    
    class Counter(object):
        def __init__(s, w, h, bind, fg = Color(0, 255, 0), bg = Color(0, 0, 0),value=0, fnt = font.SysFont(None, 14)):
            s.w,\
                  s.h,\
                  s.fg,\
                  s.bg,\
                  s.vl,\
                  s.fnt =\
                  w,h,fg,bg,value,fnt
            s.bnd = bind
            pass
        def increase(s, step = 1):
            s.vl += step
            pass
        def decrease(s, step = 1):
            s.vl -= step
            pass
        def render(s):
            ret = Surface((s.w, s.h), HWSURFACE|SRCALPHA)
            ret.fill(s.bg)
            ret.blit(transform.smoothscale(s.fnt.render(str(s.vl), 1, s.fg), ret.get_size()), (0, 0))
            return ret
        @thread
        def bnd(s):
            pass
        pass
    #
    @thread
    def bind(counter, event):
        if event.type in (MOUSEBUTTONDOWN, MOUSEBUTTONUP):
            counter.increase()
            pass
        pass
    #
    def main(argv):
        display.init()
        font.init()
        sc = display.set_mode((800, 600), HWSURFACE|SRCALPHA)
        counter = Counter(600, 400, bind, fnt = font.SysFont(None, 1024))
        ticker = time.Clock()
        target_FPS = 120
        real_FPS = 0
        while True:
            ticker.tick(target_FPS)
            real_FPS = ticker.get_fps()
            for e in event.get():
                if e.type == QUIT:
                    display.quit()
                    quit()
                    sys.exit()
                    pass
                counter.bnd(counter, e)
                pass
            sc.fill((255,100,100))
            sc.blit(counter.render(), (100, 100))
            display.flip()
            display.set_caption(f"Clicker based on counter [FPS: {int(real_FPS)}]")
            pass
        pass
    
    if __name__ == '__main__':
        main(sys.argv)
        pass
    Ответ написан
    Комментировать
  • Как сделать сетку для объектов а pygame?

    TalismanChet
    @TalismanChet
    Лицо зла
    Скорее всего, вы имеете в виду "изображение должно быть выравнено" по центру клетки.

    1. реализация сетки

    Для создания сетки много не нужно: достаточно научится верно представлять координаты. Для нахождения позиции отрисовки в левом-верхнем углу, достаточно умножить координаты по сетке на размер 1 кл.

    2. реализация отрисовки по центру клетки

    Для отрисовки по центру клетки, нужно больше сделать. Я написал функцию, которая возвращает поверхность, которую следует отрисовывать слева-сверху клетки. Возможно, вы сами разберётесь, как она работает. Простая геометрия)

    import pygame
    
    
    def align_center(cell_width, cell_height, surface_to_align, not_return_surface_but_coords=False):
        cw, ch, sf = cell_width, cell_height, surface_to_align
        cx, cy  = cw//2, ch//2
        dx, dy = sf.get_width()//2, sf.get_height()//2
        tx, ty = cx-dx, cy-dy
        ret = pygame.Surface((cw, ch), pygame.SRCALPHA)
        ret.blit(sf, (tx, ty))
        if not not_return_surface_but_coords:
            return ret
        else:
            return [tx, ty]
        return -1
    #


    Если помимо всех аргументов передать переменную или значение, НЕ равное 0 или False, то вместо поверхности вы получите координаты, где отрисовывать. Это может быть полезно для оптимизации, если игру нужно оптимизировать, то воспользуйтесь не готовой выровненной поверхностью, а координатами, и уже добавив их к основнным координатам клетки, отрисуйте.

    3. реализация нахождения клетки по координате

    Здесь всё просто.

    x = mx // cw
    y = my // ch
    ,
    где mx, my - координаты клика, а cw, ch - ширина и высота клетки.

    Удачи в разработке!
    Ответ написан
    Комментировать
  • Не получается создать персонажа с помощью класса?

    TalismanChet
    @TalismanChet
    Лицо зла
    Вы используете image как аргумент для Flopa.__init__,
    просто поменяйте
    def __init__(self, image, x, y,):
    на
    def __init__(self, _image, x, y,):
    и вместо
    self.image = transform.scale(image.load("flopa.png"), (50, 50))

    используйте
    self.image = transform.scale(image.load(_image), (50, 50))

    Tакже, у вас имеется излишняя запятая здесь:
    def __init__(self, image, x, y>>,<<)
    Ответ написан
    Комментировать
  • Почему не получается создать персонажа с помощью класса?

    TalismanChet
    @TalismanChet
    Лицо зла
    Вы используете image как аргумент для Flopa.__init__,
    просто поменяйте
    def __init__(self, image, x, y,):
    на
    def __init__(self, _image, x, y,):
    и вместо
    self.image = transform.scale(image.load("flopa.png"), (50, 50))

    используйте
    self.image = transform.scale(image.load(_image), (50, 50))

    Tакже, у вас имеется излишняя запятая здесь:
    def __init__(self, image, x, y>>,<<)
    Ответ написан
  • Почему выдает ошибку AttributeError: 'Enemy' object has no attribute 'get_height'?

    TalismanChet
    @TalismanChet
    Лицо зла
    Вы создали Enemy, и, следуя из того, что у вас написано, возможно, следует использовать enemy.ship_img.get_height() вместо enemy.get_height() если вы желаете получить высоту изображения enemy.
    Ответ написан
    Комментировать