Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 29, 2019 18:06:57

panama555
Зарегистрирован: 2019-02-19
Сообщения: 175
Репутация: +  4  -
Профиль   Отправить e-mail  

Как избавиться от дрожания?

Привет!
Пытаюсь с помощью Pygame сделать игрушку.
Нарисовал задний фон. Сделал его спрайтом. Двигаю его справа налево очень медленно.
Количество кадров в секунду - 50.
Сдвигаю спрайт на 1 пиксель каждый цикл.
Всё работает как-бы нормально.
Мне не нравится “визуальный” результат.
Дело в том, что я вижу как спрайт “дёргается” при каждом сдвиге?!
Но ведь я сдвигаю всего на пиксель,а сдвиг виден “не вооружённым глазом”
А если я ещё замедляю движение, т.е. сдвигаю спрайт через цикл, то “дёрганье” ещё заметнее.
Подскажите, как с этим бороться?

Офлайн

#2 Дек. 30, 2019 13:06:22

panama555
Зарегистрирован: 2019-02-19
Сообщения: 175
Репутация: +  4  -
Профиль   Отправить e-mail  

Как избавиться от дрожания?

Вот сама программа:

 import pygame
pygame.init()
clock=pygame.time.Clock()
class Background(pygame.sprite.Sprite):
    def __init__(self,left):
        super().__init__()
        self.image=pygame.image.load("C://Sunduk2/background1.png").convert()
        self.rect=self.image.get_rect(topleft=(left,0))
    def update(self):
        if self.rect.right==642:
            bg_group.add(Background(left=640))
        self.rect.x=self.rect.x-1
        if self.rect.right==0:
            self.kill()
        
win=pygame.display.set_mode((640,480))
bg_group=pygame.sprite.Group()
bg_group.add(Background(left=0))
while 1:
    for ev in pygame.event.get():
        if ev.type==pygame.KEYDOWN:
            if ev.key==pygame.K_q:
                pygame.quit()
    bg_group.draw(win)
    bg_group.update()
    pygame.display.update()
    clock.tick(50)

Отредактировано panama555 (Дек. 30, 2019 13:08:47)

Прикреплённый файлы:
attachment Background1.png (23,3 KБ)

Офлайн

#3 Дек. 30, 2019 13:24:41

panama555
Зарегистрирован: 2019-02-19
Сообщения: 175
Репутация: +  4  -
Профиль   Отправить e-mail  

Как избавиться от дрожания?

А если замедлить движение, то подёргивание ещё заметней:

 import pygame
pygame.init()
clock=pygame.time.Clock()
class Background(pygame.sprite.Sprite):
    def __init__(self,left,sdvig=0.1):
        super().__init__()
        self.image=pygame.image.load("C://Sunduk/background1.png").convert()
        self.rect=self.image.get_rect(topleft=(left,0))
        self.x=self.rect.x
        self.sdvig=sdvig
    def update(self):
        self.x-=self.sdvig
        if self.rect.right==642:
            bg_group.add(Background(left=640))
        self.rect.x=int(self.x)
        if self.rect.right==0:
            self.kill()
        
win=pygame.display.set_mode((640,480))
bg_group=pygame.sprite.Group()
bg_group.add(Background(left=0))
while 1:
    for ev in pygame.event.get():
        if ev.type==pygame.KEYDOWN:
            if ev.key==pygame.K_q:
                pygame.quit()
    bg_group.draw(win)
    bg_group.update()
    pygame.display.update()
    clock.tick(50)
Пытался картинку немного “размыть”, чтобы не было резких контуров.
Но лучше не стало.
Попробовал на другом компьютере - то же самое.
С этим можно как-то бороться?

Отредактировано panama555 (Дек. 30, 2019 13:26:16)

Офлайн

#4 Дек. 30, 2019 14:59:58

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Как избавиться от дрожания?

конечно такой совет но - а на джите смотрели как сделаны игрушки на этом же фромеворке?
https://itch.io/games/made-with-pygame



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Дек. 30, 2019 15:02:16)

Офлайн

#5 Дек. 30, 2019 16:48:58

panama555
Зарегистрирован: 2019-02-19
Сообщения: 175
Репутация: +  4  -
Профиль   Отправить e-mail  

Как избавиться от дрожания?

Я не понял, что вы хотели сказать.
Вопрос простой.
Есть какой-нибудь способ избавиться от дрожания или нет?
И если есть, то в чём он заключается?

Офлайн

#6 Дек. 30, 2019 17:29:08

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

Как избавиться от дрожания?

panama555
Я не понял, что вы хотели сказа

Я переведу. Найдите в сети какой-нибудь какой-нибудь проект написанный на интересующем вас фреймворке. Подозреваю, что на домашнем сайте самого фреймворка наверняка найдется несколько демо. Запустите программу и посмотрите, есть там ваша проблема или нет. Если её нет, то вам стоит изучить исходный код демки и понять, что вы делаете не так.



Офлайн

#7 Дек. 30, 2019 19:48:39

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Как избавиться от дрожания?

точно! ммм … надо мне быть поточнее
зы фикс* git все же произносится как гит а не джит … таки да



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#8 Дек. 30, 2019 20:16:06

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Как избавиться от дрожания?

panama555
И если есть, то в чём он заключается?
Хм. По идее если смещение на пиксел вас тревожит то надо смотреть в сторону антиалиасинга. Обычно он включается целиком для всего приложения.

p.s. Не думаю что в супермарио это когото волнует. там пикселы сантиметр на сантиметр обычно. ТС может и не обнаружить нужного эффекта.



Офлайн

#9 Дек. 31, 2019 21:33:23

panama555
Зарегистрирован: 2019-02-19
Сообщения: 175
Репутация: +  4  -
Профиль   Отправить e-mail  

Как избавиться от дрожания?

doza_and
ТС может и не обнаружить нужного эффекта.

Под словом “ТС”, что вы имели ввиду?
Антиальясинг насколько я понимаю это сглаживание (размытие) контрастных границ.
Я первым делом просто размыл свою картинку в фотошопе для пробы.
Не стал об этом упоминать в своём вопросе, потому что результат меня не порадовал.
Стало чуть лучше, но принципиально ничего не изменилось.
У меня возникает сомнение, что pygame обновляет картинку при каждом update().
Может быть он смотрит на то как много изменений на ней и если изменений мало, то не выполняется???
А потом сразу делает сдвиг на несколько пикселей.
Это я уже выдумываю, но как это можно объяснить.
А у кого-нибудь наблюдается дрожание в моей программе? Или нет?

Офлайн

#10 Янв. 2, 2020 10:18:51

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Как избавиться от дрожания?

panama555
Под словом “ТС”
топикстартер
panama555
просто размыл свою картинку в фотошопе
это не то см. pygame.display.gl_set_attribute() если не ошибаюсь
panama555
А у кого-нибудь наблюдается дрожание в моей программе
хз оно движится … но ведь так и должно быть
возможно попробуйте другую картинку так как

движение видете … а его нет



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version