PROLOG:
tak jsem před pár začal dloubat do pythonu
jako někdejší mladiství pascalíř / assemblerař, jsem hledal něco, v čem se programy píšou (ne malujou jako např. v delfnovi, tam jsem se neodvážil ani na hello world)
tak se mi ten python i začal líbit, když jsem po pouhých třech večerech dokončil hru "Tajdrlák na poli" (je na ulož.to, kdyby někdo,,)
TEĎ O CO KRÁČÍ:
rozhodl jsem se, že nejlépe si python osvojím tak, že do něj přepíšu nějaké své staré hračky z pascalu a narazil jsem nemile na fakt, že pygame (a dokonce i pygame.surfarray) je neskutečně neschopný pracovat s pixely,,,,,
takže plamen i při 320*200 jel rychlostí frame za deset sekund
tak jsem se na plamen vyplác a dal se do hvězdiček,,,
200 hvězd 45 fps (!!) a to ty hvězdy maluju přes draw.rect, přes pixely to bylo cca 2fps
a teď bych strašně rád nemazal staré hvězdy po updatu, ale nechal je rozmazat (dělával jsem to tak, že jsem projel obrazovku, všechny body světlejší než dejme tomu 10 jsem ztmavil o 10 a naopak všechny body pod 10 nastavil na nulu) takže hvězdičky měly krásné ocásky,,
což je v pygamu nemožné :-(
tak jsem to vyřešil tak, že každá hvězdička nechává 5 stop, a postupně jsou vykreslovány tmavšími barvami až (0,0,0)
framerate kolem 33,, při 500 hvězdičkách už to de na 15..
takže,,,,, je nějaké řešení jak tohleto dělat lépe (jinej modul než pyžamo?)
jo a ještě jedna věc,, nejdou malovat rect o velikosti (1,1), minimálně (2,2),, to je schválně, nebo bug, nebo fičura?
import os, sys
import pygame
from random import *
from pygame.locals import *
class star (pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.x = 3200
self.y=2400
self.reset()
self.rect2=self.rect
self.rect3=self.rect
self.rect4=self.rect
self.rect5=self.rect
self.color2 = (0, 0, 0)
self.color3 = (0, 0, 0)
self.color4 = (0, 0, 0)
self.color5 = (0, 0, 0)
def reset(self):
self.speed = randint (10, 20)
u=1
self.x = randint (200, 6200)
self.y = randint (200, 4600)
while u:
if (self.x in range (3100,3301))and(self.y in range (2300,2501)) :
self.x = randint (200, 6200)
self.y = randint (200, 4600)
else: u=0
self.size=randint(2,3)
self.rect = (self.x/10, self.y/10, self.size, self.size)
self.r = randint (10, 20)
self.g = randint (20, 25)
self.b = randint (25, 30)
self.color = (0, 0, 0)
def update (self):
a = (int(((self.rect[0]-320)**2 + (self.rect[1]-240)**2)**0.5)+280)/8
self.color= (self.r*a/10, self.g*a/10, self.b*a/10)
self.color2= (self.r*a/12, self.g*a/12, self.b*a/12)
self.color3= (self.r*a/14, self.g*a/14, self.b*a/14)
self.color4= (self.r*a/16, self.g*a/16, self.b*a/16)
if self.x >= 3200:
self.x += ((self.x-3200)*self.speed)/700
else:
self.x -= ((3200-self.x)*self.speed)/700
if self.y >= 2400:
self.y += ((self.y-2400)*self.speed)/700
else:
self.y -= ((2400-self.y)*self.speed)/700
self.rect5 = self.rect4
self.rect4 = self.rect3
self.rect3 = self.rect2
self.rect2 = self.rect
self.rect = (self.x/10, self.y/10, self.size, self.size)
if not (self.rect[0] in range (0, 640)) :
self.reset()
if not (self.rect[1] in range (0, 480)) :
self.reset()
def toggle_fullscreen():
obrazovka = pygame.display.get_surface()
tmp = obrazovka.convert()
caption = pygame.display.get_caption()
cursor = pygame.mouse.get_cursor() # Duoas 16-04-2007
w,h = obrazovka.get_width(),obrazovka.get_height()
flags = obrazovka.get_flags()
bits = obrazovka.get_bitsize()
pygame.display.quit()
pygame.display.init()
obrazovka = pygame.display.set_mode((w,h),flags^FULLSCREEN,bits)
obrazovka.blit(tmp,(0,0))
pygame.display.set_caption(*caption)
pygame.key.set_mods(0) #HACK: work-a-round for a SDL bug??
pygame.mouse.set_cursor( *cursor ) # Duoas 16-04-2007
return obrazovka
pygame.init()
obrazovka = pygame.display.set_mode((640, 480))
pozadi = pygame.Surface(obrazovka.get_size()).convert()
obrazovka.blit(pozadi, (0, 0))
pozadi.fill((0,0,0))
pygame.display.flip()
hvezd=200
hvezdicka = star(),
for n in range (1, hvezd) : hvezdicka+=star(),
stars=pygame.sprite.RenderPlain((hvezdicka))
pocitadlo=0
#toggle_fullscreen()
obrazovka=pygame.display.get_surface()
konec=0
while not konec :
if pocitadlo==0 : a = pygame.time.get_ticks()
pocitadlo= (pocitadlo+1) % 100
for udalost in pygame.event.get():
if (udalost.type == QUIT) or (udalost.type==KEYDOWN and udalost.key == K_ESCAPE):
konec=1
stars.update()
for n in range (0, hvezd) :
pygame.draw.rect(obrazovka, (hvezdicka[n].color5), (hvezdicka[n].rect5))
pygame.draw.rect(obrazovka, (hvezdicka[n].color4), (hvezdicka[n].rect4))
pygame.draw.rect(obrazovka, (hvezdicka[n].color3), (hvezdicka[n].rect3))
pygame.draw.rect(obrazovka, (hvezdicka[n].color2), (hvezdicka[n].rect2))
pygame.draw.rect(obrazovka, (hvezdicka[n].color), (hvezdicka[n].rect))
pygame.display.flip()
if pocitadlo==99 :
b=pygame.time.get_ticks()
print ( 1000/((b-a)/100)), " FPS"
pygame.quit()