Найти - Пользователи
Полная версия: Анимация в окне PyGame (техническая проблема)
Начало » Python для экспертов » Анимация в окне PyGame (техническая проблема)
1 2
caufman
У меня возникла проблема, когда запустил свой скрипт на домашнем (более мощном) компе (код писал на рабочем). Pygame как таковой не виснет, но почему то ВНЕЗАПНО окно pygame не рисует анимацию. Тупо рисует первую картинку и все. Дальше окно обновляется только при щелчке на заголовок окна. На рабочем компе такого не было (все отрисовывалось и обновлялось в режиме реального времени), хотя питоны и софт (портабельные) скопированы с одной папки.

На всякий случай прикладываю DxDiag домашнего компа
sp3
И у меня возникла проблема, когда подъехал по дороге домой(дорога лучше), машина перестала работать. Как бы работает, но не заводится. Возле работы машина ездила нормально.

На всякий случай прикладываю фото дороги возле дома.
caufman
sp3
И у меня возникла проблема, когда подъехал по дороге домой(дорога лучше), машина перестала работать. Как бы работает, но не заводится. Возле работы машина ездила нормально.На всякий случай прикладываю фото дороги возле дома.
Охренеть как остроумно!!! Ответь по существу, когда мозг включится.
4kpt
caufman
Не обижайтесь. Шутка достаточно оригинальная :)
sp3 имел ввиду, что DxDiag не иформативен. Информативен код. Как минимум, его запустят на своих машинах другие форумчане и Вы сможете узнать как этот код работает у них.
Если код представляет тайну, предварительно упростите его “до немогу” и потом выкладывайте.

P.S. Я вообще не работаю с pygame, просто рекомендую :)
caufman
4kpt
Информативен код.
три разных программера сказали, что дело не может быть в коде. Да это и логично. при всех равных (софт, версия языка, код, ос) тормоза только на одной машине. ==> проблема в машине, а не в коде. Вернее в окружении. Либо драйвер, либо видео, либо что-то из стороннего, что пользует pygame. Но что именно потыкать? Ибо pygame знаю поверхностно, а уж тем более его взаимоотношения с внешним окружением.

Сам код до ужаса банален и никакого секрета не представляет. Но если для диагностики проблем окружения нужен код питона (шизофрения, привет тебе!!!), то ладно… Выложу.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#--------------------------
# !!! Python 3.2
import pygame
from pygame.locals import *
from math import modf
white 	= (255,		255,	255	)
black 	= (0,		0,		0	)
red 	= (255,		0,		0	)
blue 	= (0,		0,		255	)
green 	= (0,		255,	0	)
yellow 	= (255,		255,	0	)
purple	= (255,		0,		255	)
grey	= (128,		128,	128	)
pygame.init ()
mainloop = True
# initial screen
screen_size = (640, 480)
screen = pygame.display.set_mode (screen_size, 0, 32)
pygame.display.set_caption('PyGame Project')
# initial clock
clock = pygame.time.Clock()
milli = 0.0
sec = 0.0
# initial data
osn = 32
shag_osn = 1
pers = Rect (osn*3, osn*3, osn, osn)
pers_color = blue
pers_speed = osn*8
new_pos = (pers.x, pers.y)
dest = Rect (0, 0, 30, 30)
dm = 0
while mainloop:
	for event in pygame.event.get():
		# "if-else" events
		if event.type == KEYDOWN:
			if event.key == K_w:
				pers.move_ip (0, osn)
				new_pos = (pers.x, pers.y)
		if event.type == KEYDOWN:
			if event.key == K_s:
				pers.move_ip (0, -osn)
				new_pos = (pers.x, pers.y)
		if event.type == KEYDOWN:
			if event.key == K_a:
				pers.move_ip (-osn, 0)
				new_pos = (pers.x, pers.y)
		if event.type == KEYDOWN:
			if event.key == K_d:
				pers.move_ip (osn, 0)
				new_pos = (pers.x, pers.y)
		if event.type == MOUSEBUTTONDOWN:
			if event.button == 1:
				new_pos = (int((modf(event.pos[0]/osn))[1]*osn),int((modf(event.pos[1]/osn))[1]*osn))
				print (new_pos, new_pos[0]/osn, new_pos[1]/osn)
		if event.type == QUIT:
			mainloop = False
		if event.type == KEYDOWN:
			if event.key == K_ESCAPE:
				mainloop = False
	# calc clock --------------------------------------
	milli = clock.tick() 
	sec = milli / 1000.0
	# -------------------------------------------------
	screen.fill(white)
	# create frame ------------------------------------
	dm = pers_speed*sec
	if pers.x != new_pos[0]:
		if (new_pos[0]-pers.x)>0:
			pers.move_ip(dm, 0)
		if (new_pos[0]-pers.x)<0:
			pers.move_ip(-dm, 0)
	if pers.y != new_pos[1]:
		if (new_pos[1]-pers.y)>0:
			pers.move_ip(0, dm)
		if (new_pos[1]-pers.y)<0:
			pers.move_ip(0, -dm)
	pygame.draw.rect(screen, pers_color, pers)
	pygame.display.update()
pygame.quit()
sp3
milli = clock.tick() 
milli = clock.tick(50) 
ps передавай привет трем программистам :)
caufman
sp3
ps передавай привет трем программистам
привет от программистов. Нихрена не изменилось
sp3
milli = clock.tick() - не ограничивая фпс на мощном компе и минимуме расчетов milli стремится к 0
sec = milli / 1000.0 - 0 разделить на 1000 будет 0
dm = pers_speed*sec - 0 умножить на что то будет 0
pers.move_ip(dm, 0) - передвинуть рект на 0 => оставить на месте
при тыкании в заголовок окна, движок приостанавливается, отдавая управление оси и поэтому получается задержка.
решение:
1. занизить производительность системы, понизить частоту проца или поменять на менее быстрый
2. загрузить какими либо расчетами каждый тик
3. поставить ограничение фпс
4. написать грамотно механизм анимации
caufman
sp3
решение:
1. занизить производительность системы, понизить частоту проца или поменять на менее быстрый
2. загрузить какими либо расчетами каждый тик
3. поставить ограничение фпс
4. написать грамотно механизм анимации
Вот за такой ответ - честь и хвала.
Исходя из этого, понятно почему код работает на рабочей машине (слабой с встроенной видеосистемой) и не работает на домашней.
Вариант 1-2 логичные, но кажутся костылями, причем дикими и грубыми. Думаю так делать нежелательно.
Вариант 3 погуглю. Думаю такое точно есть в pygame
Вариант 4 было бы любопытно взглянуть собственными глазами. Есть ссылки на готовый код, а лучше не описание правильных алгоритмов? А то что сам нашел - представлено выше.
sp3
caufman
Вариант 3
Я уже писал
milli = clock.tick(50)
ограничение в 50 фпс

caufman
Вариант 4
Ищи исходники игр. Скорее всего там будет грамотная реализация.
Туториалов в сети то же полно.
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