Найти - Пользователи
Полная версия: Как избавиться от дрожания?
Начало » Python для новичков » Как избавиться от дрожания?
1
panama555
Привет!
Пытаюсь с помощью Pygame сделать игрушку.
Нарисовал задний фон. Сделал его спрайтом. Двигаю его справа налево очень медленно.
Количество кадров в секунду - 50.
Сдвигаю спрайт на 1 пиксель каждый цикл.
Всё работает как-бы нормально.
Мне не нравится “визуальный” результат.
Дело в том, что я вижу как спрайт “дёргается” при каждом сдвиге?!
Но ведь я сдвигаю всего на пиксель,а сдвиг виден “не вооружённым глазом”
А если я ещё замедляю движение, т.е. сдвигаю спрайт через цикл, то “дёрганье” ещё заметнее.
Подскажите, как с этим бороться?
panama555
Вот сама программа:
 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
А если замедлить движение, то подёргивание ещё заметней:
 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)
Пытался картинку немного “размыть”, чтобы не было резких контуров.
Но лучше не стало.
Попробовал на другом компьютере - то же самое.
С этим можно как-то бороться?
AD0DE412
конечно такой совет но - а на джите смотрели как сделаны игрушки на этом же фромеворке?
https://itch.io/games/made-with-pygame
panama555
Я не понял, что вы хотели сказать.
Вопрос простой.
Есть какой-нибудь способ избавиться от дрожания или нет?
И если есть, то в чём он заключается?
FishHook
panama555
Я не понял, что вы хотели сказа

Я переведу. Найдите в сети какой-нибудь какой-нибудь проект написанный на интересующем вас фреймворке. Подозреваю, что на домашнем сайте самого фреймворка наверняка найдется несколько демо. Запустите программу и посмотрите, есть там ваша проблема или нет. Если её нет, то вам стоит изучить исходный код демки и понять, что вы делаете не так.
AD0DE412
точно! ммм … надо мне быть поточнее
зы фикс* git все же произносится как гит а не джит … таки да
doza_and
panama555
И если есть, то в чём он заключается?
Хм. По идее если смещение на пиксел вас тревожит то надо смотреть в сторону антиалиасинга. Обычно он включается целиком для всего приложения.

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

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

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

движение видете … а его нет
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