Kirjoittaja: flob
Kirjoitettu: 17.07.2004 – 28.10.2012
Tagit: grafiikka, kirjaston käyttö, koodi näytille, vinkki
Pekin plasmaoppaan luettuani sain inspiraation tehdä tällaisen pienen ja yksinkertaisen plasmaefektin Pythonilla. Pygame ja numpy pitäis löytyä jos haluaa testailla.
import pygame
from pygame.locals import *
import math as M
from Numeric import *
def main():
# luodaan taulukko funktion avulla
# kaava on pekin loistavasta plasmaoppaasta
def plasma(x, y):
return 127 + 127 * sin(x / (50 + 10 * cos(y / 78.))) \
* cos(y / (60 + 10 * sin(x / 60.)))
screen_array = fromfunction(plasma, (1520, 1800)).astype(Int)
# alustetaan pygame ja asetetaan ikkunan koko
pygame.init()
screen = pygame.display.set_mode((320, 200), 0, 8)
# Clockin avulla framerate voidaan lukita
clock = pygame.time.Clock()
# toistetaan samaa kunnes jotain nappia painetaan
aika = 1
done = 0
while not done:
for event in pygame.event.get():
if event.type in (QUIT, KEYDOWN):
done = 1
# luodaan paletti ... tämä se vasta on kivaa!
tiheys = (M.sin(aika / 55) + 1.04) * 60
paletti = []
for k in range(256):
R = int((M.sin(k * 0.025 + aika / 6) + 1) * 127.5)
G = int((M.cos(k * 0.025 + aika / 5) + 1) * 127.5)
B = int((M.sin(k * 6 / tiheys + aika / 4) + 1) * 127.5)
# | | | |
# | | | |
# tiheys pyöritys| värien kirkkaus
# |
# |pyöritysnopeus
paletti.append([R, G, B])
screen.set_palette(paletti)
# pilkotaan taulukosta sopivat palaset ja heitetään näytölle
mx = int(M.cos(aika / 110) * 600)
my = int(M.cos(aika / 120) * 800)
pygame.surfarray.blit_array(screen, screen_array[600+mx : 920+mx, 800+my : 1000+my])
# asetetaan framerate
clock.tick(55)
aika += 0.5
if __name__ == '__main__': main()Juuri tälläistä olen tarvinnu, kiitokset sinulle ;)
Python 3.6.4 seuraavin muutoksin:
import pygame
from pygame.locals import *
import math as M
#from Numeric import *
from numpy import *
from numbers import *
#...
screen_array = fromfunction(plasma, (1520, 1800)).astype(int) #Int->int
#...Ja kyllä on hieno :) En vaan saa resoluutiota muutettua...