Форум программистов, компьютерный форум, киберфорум
Python: PyGame
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
5 / 3 / 1
Регистрация: 28.09.2016
Сообщений: 195
1

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

30.12.2019, 21:02. Просмотров 1298. Ответов 12
Метки нет (Все метки)


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

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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)
0
Миниатюры
Как избавиться от дрожания?  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.12.2019, 21:02
Ответы с готовыми решениями:

GLUT, как сделать так, чтобы была анимация дрожания у слов?
Сделал, слова, и надо сделать так, чтобы они дрожали, но не знаю как :с #include <Windows.h>...

Как избавиться от вируса создающего ярлыки на флэшке? как исправить,подскажите
Проверяла Вебом,нашёл и удалил BackDoor!На этом всё???Но нашёл его на компе,а не на фдэщке

Статический метод как точка входа в поток - как избавиться
Привет всем.Вопрос такой: использую потоки в своей программе,они создаются и уничтожаются в классе,...

Как избавиться от nobody ?
Почему при получении письма в поле ОТ все время стоит nobody? Вот код отправки: ...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы Fullstack-разработчиков на Python
12
1266 / 656 / 360
Регистрация: 07.01.2019
Сообщений: 2,123
31.12.2019, 01:30 2
Переходите на pyglet http://pyglet.org/

Вот пример бесконечного фона

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import pyglet
 
window = pyglet.window.Window()
image = pyglet.resource.image('background.jpg')
 
batch = pyglet.graphics.Batch()
 
back = pyglet.sprite.Sprite(image, x=0, y=0, batch=batch)
back2 = pyglet.sprite.Sprite(image, x=650, y=0, batch=batch)
back_sprites = [back, back2]
 
@window.event
def on_draw():
    window.clear()
    batch.draw()
 
def update(dt):
    for b in back_sprites:
        b.x -= 1
    for i in range(len(back_sprites)):
        if back_sprites[i].x < -650:
            b = back_sprites[i]
            back_sprites.remove(b)
            back_sprites.append(pyglet.sprite.Sprite(image, x=650, y=0, batch=batch))
 
pyglet.clock.schedule(update)
pyglet.app.run()
0
5 / 3 / 1
Регистрация: 28.09.2016
Сообщений: 195
31.12.2019, 19:18  [ТС] 3
Вы считаете, что Pygame не может справиться с такой простой задачей?
В этом случае им бы никто не пользовался.
Я не нашёл в сети данных о неоспоримом превосходстве Pyglet
Думаю, что дело в моих кривых руках. Надеюсь, что мне посоветуют как решить этот вопрос с помощью Pygame
0
es geht mir gut
11224 / 4701 / 1178
Регистрация: 27.07.2011
Сообщений: 11,426
31.12.2019, 20:20 4
pumaex, а если увеличить разрешение ?
0
5 / 3 / 1
Регистрация: 28.09.2016
Сообщений: 195
31.12.2019, 21:54  [ТС] 5
Разрешение чего?
На мониторе стандартное разрешение - 1920*1080
0
1266 / 656 / 360
Регистрация: 07.01.2019
Сообщений: 2,123
31.12.2019, 22:32 6
Все-таки это проблема pygame, вот пример, сейчас фон движется сверху вниз и вполне плавно, но стоит переделать на движение слева на право и начинаются рывки

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import pygame
from pygame.locals import *
 
winWidth=600
winHeight=480
color_CYAN=(0,255,255)
color_BLACK=(0,0,0)
bkgs=[]
bkg_texture_str="background.jpg"
all_sprites_list = pygame.sprite.Group()
clock = pygame.time.Clock()
 
 
class Background(pygame.sprite.Sprite):
    x = 0
    y = 0
    maxY=0
    def __init__(self, texture,x=0,y=0, width = 1, height = 1):
        super(Background,self).__init__()
        self.image=texture
        self.x=x
        self.y=y
        self.width=width
        self.height=height
        pygame.draw.rect(self.image,(0,0,0), [self.x, self.y, width, height])
        self.rect = self.image.get_rect()
 
    def scroll(self,speed):
        self.y+=(speed)
        if self.y>winHeight:
            self.y=-winHeight
 
    def update(self):
        self.scroll(1)
    
    def draw(self, surface):
        surface.blit(self.image, (self.x, self.y))
 
 
class Ship(pygame.sprite.Sprite):
    
    def __init__(self, texture,x=0,y=0, width = 1, height = 1):
        super(Ship,self).__init__()
 
if __name__=="__main__":
    pygame.init()
 
    caption="Image Test"
    pygame.display.set_caption(caption)
 
    Game_Window=pygame.display.set_mode((winWidth,winHeight))
    Game_Window.fill(color_CYAN)
 
    bkg_texture=pygame.transform.scale((pygame.image.load(bkg_texture_str)),(winWidth,winHeight))   
    BkgSprite1 = Background(bkg_texture,0,winHeight*(-1))
    BkgSprite2 = Background(bkg_texture,0,0)
    BkgSprite3 = Background(bkg_texture,0,winHeight)
 
    all_sprites_list.add(BkgSprite1)
    all_sprites_list.add(BkgSprite2)
    all_sprites_list.add(BkgSprite3)
    while True:
        for event in pygame.event.get():
            if event.type==QUIT:
                pygame.quit()
                exit()
        all_sprites_list.update()
        Game_Window.fill(color_CYAN)
        BkgSprite1.draw(Game_Window)
        BkgSprite2.draw(Game_Window)
        BkgSprite3.draw(Game_Window)
        clock.tick(60)
        pygame.display.flip()
0
5 / 3 / 1
Регистрация: 28.09.2016
Сообщений: 195
31.12.2019, 22:46  [ТС] 7
При такой скорости как у вас (60 пикс/сек) всё смотрится нормально. И сверху вниз, и справа налево.
Но если скорость уменьшить до 1-3 пикс/сек дёргается в любом случае
0
Просто Лис
Эксперт Python
4246 / 2656 / 911
Регистрация: 17.05.2012
Сообщений: 7,916
Записей в блоге: 9
02.01.2020, 17:48 8
У меня так камера дёргалась при сильно резких изменениях. Я прикрутил медианный фильтр с большим окном (где-то 10-20 значений). Стало полегче. Правда, это была lua…

Цитата Сообщение от pumaex Посмотреть сообщение
А если я ещё замедляю движение, т.е. сдвигаю спрайт через цикл,
Попробуйте сдвигать на полпикселя и каждый цикл отрисовки.

Добавлено через 1 минуту
И про фильтр для сглаживания подумайте, вдруг, поможет. То есть вызываете команду "сдвинуть на 1 пиксель вправо", а фильтр сглаживает рывок и уже выдаёт реальный результат, насколько нужно сдвинуть.
0
5 / 3 / 1
Регистрация: 28.09.2016
Сообщений: 195
02.01.2020, 21:18  [ТС] 9
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Попробуйте сдвигать на полпикселя и каждый цикл отрисовки.
Вы шутите?
Пиксель это неделимая частица! Он не может быть наполовину окрашенным.
Для замедления приходится сдвигать на пиксель, но не каждый цикл, а через несколько циклов.
Я так и написал:
Цитата Сообщение от pumaex Посмотреть сообщение
А если я ещё замедляю движение, т.е. сдвигаю спрайт через цикл, то “дёрганье” ещё заметнее.
Я уже понял, что слишком придираюсь к компьютеру. Слишком крупные у него пиксели. С этим ничего не поделать.
Разве что поставить монитор меньшего размера
0
Просто Лис
Эксперт Python
4246 / 2656 / 911
Регистрация: 17.05.2012
Сообщений: 7,916
Записей в блоге: 9
03.01.2020, 07:48 10
Цитата Сообщение от pumaex Посмотреть сообщение
Вы шутите?
Нет. Но надо проверять, как хранятся координаты фона. Если во float, то ничего не мешает сдвинуть на полпикселя. Если в int - то работать не будет.
0
1266 / 656 / 360
Регистрация: 07.01.2019
Сообщений: 2,123
03.01.2020, 08:26 11
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Но надо проверять, как хранятся координаты фона.
Целые числа
0
5 / 3 / 1
Регистрация: 28.09.2016
Сообщений: 195
03.01.2020, 12:30  [ТС] 12
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Нет. Но надо проверять, как хранятся координаты фона. Если во float, то ничего не мешает сдвинуть на полпикселя. Если в int - то работать не будет.
Координаты могут быть ТОЛЬКО int. Это логично. Пиксель нельзя закрасить наполовину

Но я уже понял, что слишком придираюсь к компьютеру. У него слишком большие пиксели. С этим ничего не поделать. Можно только монитор поменьше поставить
0
0 / 0 / 0
Регистрация: 15.01.2020
Сообщений: 1
19.01.2020, 01:31 13
pumaex, здравствуй, если ты не используешь pygame 2, то сработает этот код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
import os
os.environ['SDL_VIDEODRIVER'] = 'directx'
 
    def update(self):
        self.scroll(0.1)
 
if __name__=="__main__":
    ...
    Game_Window=pygame.display.set_mode((winWidth,winHeight), pygame.HWSURFACE | pygame.DOUBLEBUF)
    ...
        clock.tick(0)
        ...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.01.2020, 01:31

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Как избавиться от \r\n
Привет) Получаю строку из json &quot;Pf\u00E4lzer Weinbrand&quot;,&quot;Obstbrand&quot;,&quot;2008er Dornfelder QbA...

Как избавиться от If-ов)
Привет. У меня такая ситуация, есть большая форма в ней много проверок, многие исключением. И у...

Как избавиться от предупреждения?
char Number; double Result = atof(Number); Result=(-1)*Result; ...

Как избавиться от редиректа?
https://lurkmore.to/Идентификация_пользователей_в_интернете В статье написано о редиректе при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.