Söylediğim şu kısma idi;
Verdiğim örnek, zaten bununla alakalı. Yani, daha fazla performans istersek, pygame; bize hardware erişimi için alternatif sunuyor. Göstermek istediğim buydu.
Kesinlikle bu kısma itirazım yok. Kütüphane kıyaslaması üzerinde gitmedim zaten, bana da sorarsanız pyglet tercih ederdim.
Ama baktığım noktadan, soruyu soran kişinin, tercihine ve bilgi seviyesine karşı empati kurmaya çalıştım. Hakim olduğu kütüphane pygame ise başa dön pyglet kullan demeden önce sorunun nereden kaynaklandığına ve nasıl çözülebileceğine bir bakış açısı getirdim.
Yine benzer şekilde sorun kütüphane yetersizliğinden değil, kodlama tarzından bunun için alternatiflerden biri opengl desteği ile çıkışı değiştirip ölçekleyebilmek, ama temelde zoom için scale faktörle çözülebileceğini düşündüm.
Önünde sonunda hayatın gerçekleri ile (opengl) ile karşılaşacak, dahası ses için de openAL ile karşılaşacak.
Burada opengl örneği ile çıkış ekranını ayarlamak daha kolay ve sizin hız endişenizi gidermek için örnekledim.
Baştan beri söylediğim şeylerden biri, bir kütüphane diğerinden iyidir kötüdür kıyaslaması değil. Bu görece bir konudur. Ve bir yere varmaz tartışmadır. Ben bu nedenle sadece mevcut kütüphane üzerinde neler yapılabilire baktım.
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
verticies = ((1, -1, -1), (1, 1, -1), (-1, 1, -1), (-1, -1, -1),
(1, -1, 1), (1, 1, 1), (-1, -1, 1), (-1, 1, 1))
edges = ((0,1), (0,3), (0,4), (2,1),(2,3), (2,7), (6,3), (6,4),(6,7), (5,1), (5,4), (5,7))
def drawCube():
global edges
glBegin(GL_LINES)
for edge in edges:
for vertex in edge:
glVertex3fv(verticies[vertex])
glEnd()
def drawText(x, y, text):
textSurface = font.render(text, True, (255, 255, 66, 255)).convert_alpha()
textData = pygame.image.tostring(textSurface, "RGBA", True)
glWindowPos2d(x, y)
glDrawPixels(textSurface.get_width(), textSurface.get_height(), GL_RGBA, GL_UNSIGNED_BYTE, textData)
pygame.init()
clock = pygame.time.Clock()
display = (400, 300)
pygame.display.set_mode(display, RESIZABLE| DOUBLEBUF | OPENGL)
font = pygame.font.SysFont('arial', 64)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)
glTranslatef(0.0, 0.0, -5)
run = True
while run:
clock.tick(100)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
glRotatef(1, 3, 1, 1)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
drawCube()
drawText(140, 120, "cube")
pygame.display.flip()
pygame.quit()
exit()
Tapi daha az manuel opengl içeren bir kod örneği üzerinde de çalışıyordum. Bu şekilde resize esnasında ölçek derdi olmuyor.
Text e mevcut çözünürlüğü aktaracak ken sizin yorumu gördüm.
Özetlemem gerekirse, pyglet tercihim olurdu. Ama neden pygame demem. Pygame yavaş da diyemem, gl desteğiyle hızlandırılır.
Başına dönersek, zaten 2d bir oyun, antialias yada fog yada diğer hesaplamalar çok da şu an olası görünmüyor. Sadece çıkışı /viewport ölçeklemek için basit bir yöntem sorulmuş, biri scale faktör belirlemek, diğeri ekranı opengl e teslim etmek.
Bu kadar açıklama ihtiyacı da pygame hız probleminden şüpheniz. Bu durumda da hız tedbirlerini çeşitlendirdim.
OpenGl ile hiç pygame yada pyglet de kullanmadan yapılabilir. Aslında kapsülledikleri çok fazla bir kod yok gerisinde. Ama hazır gütüphanelere kim hayır diyebilir.