tak na mě vysyp co mám používat, dev-cpp je jediný v čem se mi dobře psalo, btw chci programy PSAT a ne je MALOVAT, takže chci textový vývojový nástroj, jednoduchý a přehledný
tak ještě jednou,,,, program se zkompiluje vyrobí to exáč a ten funguje, ale z prostředí dev-cpp se nespustí, musim pro něj vlézt do adresáře kde ho to vyrobí a tam ho spustím bez keců,, a problém se vyskytl z ničeho nic
jestli chceš mocí mermou nějaký kód tak třeba tento, taková blbost
#include <SDL/SDL.h>
#include <stdlib.h>
#include <ctime>
#include <cmath>
using namespace std;
SDL_Surface *screen;
int vlocek = 0;
class snih {
public:
void reset(int pp);
void update();
private:
int x,y,z,size,p,color;
SDL_Rect rect; };
void snih::reset(int pp){
x = (rand()%1024)*25;
y = 25;
z = 1 + rand()%47;
color=((16+z)>>1) + ((16+z)<<5) + (((16+z)>>1)<<11);
p=pp;
size = 2 + rand()%3;
}
void snih::update(){
if (p == 0){
x+= (rand()%(z*2))-(z);
y+= z;
if (x<25) x = 25550;
if (x>25550) x = 25;
if (y>19150) reset(0);
rect.x= x / 25;
rect.y= y / 25;
rect.w= size;
rect.h=size;
SDL_FillRect(screen, &rect, color);
vlocek++;
} else p--;
}
#define pocet 5000
snih vlocka[pocet];
int FPS=0,cnt=0;
char nadpis[32];
int time0,time1;
int main(int argc, char *argv[]){
int n;
Uint8* keys;
srand(time(0));
for (n=0;n<pocet;n++) vlocka[n].reset(n);
if( SDL_Init(SDL_INIT_VIDEO) < 0 ){
printf("Inicializace SDL se nezdařila: %s", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
screen = SDL_SetVideoMode(1024, 768, 16, SDL_HWSURFACE|SDL_DOUBLEBUF);
if ( screen == NULL ){
printf("Vytvoření okna se nezdařilo: %s", SDL_GetError());
exit(1);
}
SDL_WM_SetCaption("Snizek", NULL);
bool hraj = true;
SDL_Event event;
while(hraj){
time0=SDL_GetTicks();
while(SDL_PollEvent(&event)){
if(event.type == SDL_QUIT) hraj = false;
if(event.type == SDL_KEYUP){
if(event.key.keysym.sym == SDLK_ESCAPE) hraj = false; }
}
SDL_FillRect(screen, NULL, 0);
vlocek=0;
for (n=0;n<pocet;n++) vlocka[n].update();
SDL_Flip(screen);
time1=SDL_GetTicks();
FPS+=1000/(time1-time0);
cnt++;
if (cnt==10) {
FPS/=10;
cnt=0;
sprintf(nadpis,"Snizek, %i FPS, %i vlocek",FPS,vlocek);
SDL_WM_SetCaption(nadpis, NULL);
FPS=0;
}
}
}
jsem po nějaký době pustil dev-cpp a nic mi na něm nefunguje co používá sdl (a dřív fungovalo)
respektive - program se zkompiluje,, ale nespustí,, vyrobí to .exe kterej pak funguje ale nespustí se z prostředí dev-cpp při stisku F9
je jasný co myslim? stalo se to už někomu? nevim jak to umoudřit :-(
p.s. projekty co nepoužívají sdl se spustí
chtěl jsem si hrát a najednou to nefunguje :-(
ahoj,, jde nějak vynulovat pole? samozřejmě ne po jednotlivých prvcích, ale naráz celé sakum prdum (nulovat pole s 400000 prvky po prvcích neskutečně spomaluje..)
imho by to mohlo jít přes assembler,, umí někdo?
nebo ukazatel, kterej by pojal třeba 64kB a když na něj pošlu nulu takse celá oblast vynuluje,,
v pascalu pod dosem se to řešilo právě přes takovej ukazatel, do kterýho se pustila instrukce rep stosw tušim,,
#6 Ovrscout
uh,, dík,, mrknu na to,, dneska už ne mám toho plný zuby :))
nicméně ANO, je to víceméně pokračování mých zapomenutých pokusů z pascalu
ten posun místo floatu je starej fígl, viz třeba ta tabulka sinů a cosinů, ve hře co teď páchám používám i tabulku arctanu a druhé odmocniny
tak si s tim zase zítra budu hrát
#4 ondra.holub
"Kdybys myslel dopředu, tak jsi ten první program udělal mnohem horší a pak se to určitě dalo zrchlit třeba 100x. A ostuda by byla ještě mnohem větší."
!! dobré !! bod + :)
jinak s tou ostudou to nesmíš brát tak vážně (vlastně nic co vyplodím by se nemělo brát vážně)..
spíš bych byl rád, kdyby to někdo prolít očima a řekl: "hele, tadyten výpočet" nebo "tadyto volání je v C zbytečně složitě překládáno, když místo abc napíšeš dbaght uhlmt tak tenhle konkrétní výpočet / volání / cokoliv proběhne za 1/3 času procesoru"
něco jako když jsem podobý kejkle dělal v pythonu a pak mi někdo řekl že if not (self.rect[0] in range (0, 640)) : je pomalé a if not (0 <= self.rect[0] <= 640) : je lepší a hned byl framerate o poznání vyšší
teda, to je ostuda, fakt...... nikdo nic jo? hm,, no už jsem si sobě splodil rychlejší vykreslovač sám,, zrychlení více než 2×
Uint16 *pix;
Uint16 *pxl;
Uint16 pit;
void line (int x1, int x2, int y, int z1, int z2, int rr, int gg, int bb){
int x,z,r,g,b;
if (x1>x2) {
x=x1; x1=x2; x2=x;
z=z1; z1=z2; z2=z;
}
pix=pxl + y*pit + x1;
if (ztable[y*800+x1]<z1) {
ztable[y*800+x1]=z1;
*pix=((bb*z1)>>20) + (((gg*z1)>>20)<<5) + (((rr*z1)>>20)<<11);
}
if (x1==x2) return;
z=(z1-z2)/(x1-x2);
for (x=x1+1; x<=x2; x++){
z1+=z;
pix++;
if (ztable[y*800+x]<z1) {
ztable[y*800+x]=z1;
*pix=((bb*z1)>>20) + (((gg*z1)>>20)<<5) + (((rr*z1)>>20)<<11);
}
}
}
void triangl(int x1, int y1, int z1,
int x2, int y2, int z2,
int x3, int y3, int z3,
int rr, int gg, int bb){
int x,y,z;
int kx1, kx2, mx1, mx2;
int kz1, kz2, mz1, mz2;
if (y3<y1) {
x = x1; x1 = x3; x3 = x;
y = y1; y1 = y3; y3 = y;
z = z1; z1 = z3; z3 = z;
}
if (y2<y1) {
x = x1; x1 = x2; x2 = x;
y = y1; y1 = y2; y2 = y;
z = z1; z1 = z2; z2 = z;
}
if (y3<y2) {
x = x2; x2 = x3; x3 = x;
y = y2; y2 = y3; y3 = y;
z = z2; z2 = z3; z3 = z;
}
if (y1==y2) line(x1,x2,y1,z1<<10,z2<<10,rr,gg,bb);
else {
mx1=x1<<10;
mx2=x1<<10;
kx1=((x1-x2)<<10)/(y1-y2);
kx2=((x1-x3)<<10)/(y1-y3);
mz1=z1<<10;
mz2=z1<<10;
kz1=((z1-z2)<<10)/(y1-y2);
kz2=((z1-z3)<<10)/(y1-y3);
for(y=y1; y<=y2; y++) {
line( mx1>>10, mx2>>10, y, mz1, mz2, rr,gg,bb);
mx1+=kx1;
mx2+=kx2;
mz1+=kz1;
mz2+=kz2;
}
}
if (y2==y3) return;
mx1=x2<<10;
kx1=((x2-x3)<<10)/(y2-y3);
kx2=((x1-x3)<<10)/(y1-y3);
mx2=(x1<<10)+((y2-y1)*kx2);
mz1=z2<<10;
kz1=((z2-z3)<<10)/(y2-y3);
kz2=((z1-z3)<<10)/(y1-y3);
mz2=(z1<<10)+((y2-y1)*kz2);
for(y=y2+1; y<=y3; y++) {
mx1+=kx1;
mx2+=kx2;
mz1+=kz1;
mz2+=kz2;
line( mx1>>10, mx2>>10, y, mz1, mz2, rr,gg,bb);
}
}
ahoj,
prosím, někdo zkušený, zběhlý.. potřeboval bych poradit, jak zrychlit vykreslování trojůhelníků!
(nechci slyšet nic o OpenGL apod., je to jen hračka)
každý trojúhelník je dán třemi body X, Y, Z, a je mu přiřazena barva.
trojůhelník je kreslen na obrazovku na X,Y, s přidělenou barvou (která je stínovaná podle Z)
zároveň se do tabulky ZTABLE zapisují hodnoty Z pro každé X,Y, to je z toho důvodu, aby se na obrazovce objevil pouze ten trojúhelník, který je nejblíž (má nejvyšší Z)
tadyta hračka mi běží akt. na 45 FPS (starodávnej semptron 2600 z roku 05), složitější hračky ale už dost trpí právě na ty přepočty..
#include <SDL/SDL.h>
#include <stdlib.h>
#include <ctime>
#include <cmath>
SDL_Surface *screen;
int time0, time1, FPS, cnt=0;
char nadpis[32];
int ztable[800*600];
void triangl(int x1, int y1, int z1,
int x2, int y2, int z2,
int x3, int y3, int z3,
int rr, int gg, int bb){
Uint16 *pix;
Uint16 *pxl;
Uint16 pit;
int x,y,vy1,vy2;
int vz1,vz2,z,c,r,g,b;
pxl=(Uint16 *)screen->pixels;
pit=screen->pitch/2;
if (x3<x1) {
x = x1; x1 = x3; x3 = x;
y = y1; y1 = y3; y3 = y;
z = z1; z1 = z3; z3 = z;
}
if (x2<x1) {
x = x1; x1 = x2; x2 = x;
y = y1; y1 = y2; y2 = y;
z = z1; z1 = z2; z2 = z;
}
if (x3<x2) {
x = x2; x2 = x3; x3 = x;
y = y2; y2 = y3; y3 = y;
z = z2; z2 = z3; z3 = z;
}
for (x=x1; x<x2; x++) {
vy1 =int(float(x-x1)/(x1-x2)*(y1-y2))+y1;
vy2 =int(float(x-x1)/(x1-x3)*(y1-y3))+y1;
vz1 =int(float(x-x1)/(x1-x2)*(z1-z2))+z1;
vz2 =int(float(x-x1)/(x1-x3)*(z1-z3))+z1;
if (vy1>vy2) {
y = vy1; vy1 = vy2; vy2 = y;
z = vz1; vz1 = vz2; vz2 = z;
}
for (y=vy1; y<=vy2; y++) {
pix = pxl + y*pit + x;
z = int(float(y-vy1)/(vy1-vy2)*(vz1-vz2))+vz1;
if (ztable[y*800+x]<z) {
ztable[y*800+x]=z;
r = rr*z/1024;
g = gg*z/1024;
b = bb*z/1024;
c = b + (g<<5) + (r<<11);
*pix=c; }
}
}
if (x2==x3) {
if (y2>y3) {
y = y2; y2 = y3; y3 = y;
z = z2; z2 = z3; z3 = z; }
for (y=y2; y<=y3; y++) {
z =int(float(y-y2)/(y2-y3)*(z2-z3))+z2;
pix = pxl + y*pit + x;
if (ztable[y*800+x]<z) {
ztable[y*800+x]=z;
r = rr*z/1024;
g = gg*z/1024;
b = bb*z/1024;
c = b + (g<<5) + (r<<11);
*pix=c; }
}
} else
for (x=x2; x<=x3; x++) {
vy1 =int(float(x-x2)/(x2-x3)*(y2-y3))+y2;
vy2 =int(float(x-x1)/(x1-x3)*(y1-y3))+y1;
vz1 =int(float(x-x2)/(x2-x3)*(z2-z3))+z2;
vz2 =int(float(x-x1)/(x1-x3)*(z1-z3))+z1;
if (vy1>vy2) {
y = vy1; vy1 = vy2; vy2 = y;
z = vz1; vz1 = vz2; vz2 = z;
}
for (y=vy1; y<=vy2; y++) {
pix = pxl + y*pit + x;
z =int(float(y-vy1)/(vy1-vy2)*(vz1-vz2))+vz1;
if (ztable[y*800+x]<z) {
ztable[y*800+x]=z;
r = rr*z/1024;
g = gg*z/1024;
b = bb*z/1024;
c = b + (g<<5) + (r<<11);
*pix=c; }
}
}
}
class tbl {
public:
int SIN;
int COS;
void reset(int n);};
void tbl::reset(int n){
SIN = int( sin( double(n)*M_PI/180 ) * 16384);
COS = int( cos( double(n)*M_PI/180 ) * 16384);
}
tbl t[360];
class bod {
public:
int x,y,z;
void reset(int rx, int ry, int rz, int size);
void rotate(int xa, int ya, int za);
void rotate(bod b, int xa, int ya, int za);
void morph(bod sc, bod tg, int step, int steps);
int xx,yy,zz,ss;
int nx,ny,nz;
int tx,ty,tz;
};
void bod::reset(int rx, int ry, int rz, int size){
xx = rx; yy = ry; zz = rz; ss=size;
z = nz+2048;
if (z<0) z=1;
x = (nx*ss/z);
y = (ny*ss/z);
z = 512-(nz/2);
if (z<0) z=0;
if (z>511) z=511;
}
void bod::rotate(int xa, int ya, int za){
// podle osy x
ty = (yy * t[xa].COS - zz * t[xa].SIN) >> 14;
tz = (zz * t[xa].COS + yy * t[xa].SIN) >> 14;
// podle osy y
tx = (xx * t[ya].COS - tz * t[ya].SIN) >> 14;
nz = (tz * t[ya].COS + xx * t[ya].SIN) >> 14;
// podle osy z
nx = (tx * t[za].COS - ty * t[za].SIN) >> 14;
ny = (ty * t[za].COS + tx * t[za].SIN) >> 14;
z = nz+2048;
if (z<0) z=1;
x = (nx*ss/z);
y = (ny*ss/z);
z = 512-(nz);
if (z<0) z=0;
if (z>1023) z=1023;
};
void bod::rotate(bod b, int xa, int ya, int za){
rotate(xa, ya, za);
b.reset(nx, ny, nz, ss);
}
void bod::morph (bod sc, bod tg, int step, int steps) {
if (step<0) return;
if (step>steps) return;
xx = sc.xx+((tg.xx-sc.xx) * step / steps);
yy = sc.yy+((tg.yy-sc.yy) * step / steps);
zz = sc.zz+((tg.zz-sc.zz) * step / steps);
ss = sc.ss+((tg.ss-sc.ss) * step / steps);
reset(xx,yy,zz,ss);
}
bod krychle[8];
int ctverec[6][4]={{0,1,2,3},{0,1,4,5},{0,2,4,6},{2,3,6,7},{1,3,5,7},{4,5,6,7}};
int r[6]={31,0,31,31,0,0};
int g[6]={63,63,0,0,63,0};
int b[6]={0,31,31,0,0,31};
int main(int argc, char *argv[]){
int n;
int x1,y1,z1;
int x2,y2,z2;
int x3,y3,z3;
int x4,y4,z4;
int r1,g1,b1;
int r2,g2,b2;
int r3,g3,b3;
int r4,g4,b4;
int xa=0,ya=0,za=0;
srand(time(0));
for (n=0; n<360; n++) t[n].reset(n);
for (n=0; n<12; n++) krychle[n].reset(512-1024*(n%2), 512-1024*((n/2)%2), 512-1024*((n/4)%4), 500);
Uint8* keys;
srand(time(0));
if( SDL_Init(SDL_INIT_VIDEO) < 0 ){
printf("Inicializace SDL se nezdařila: %s", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
screen = SDL_SetVideoMode(800, 600, 16, SDL_SWSURFACE);//|SDL_FULLSCREEN);
if ( screen == NULL ){
printf("Vytvoření okna se nezdařilo: %s", SDL_GetError());
exit(1);
}
SDL_WM_SetCaption("3D", NULL);
bool hraj = true;
SDL_Event event;
Uint16 *pix;
Uint16 *pxl;
Uint16 pit;
pxl=(Uint16 *)screen->pixels;
pit=screen->pitch/2;
while(hraj){
time0=SDL_GetTicks();
while(SDL_PollEvent(&event)){
if(event.type == SDL_QUIT) hraj = false;
if(event.type == SDL_KEYUP){
if(event.key.keysym.sym == SDLK_ESCAPE) hraj = false; }
}
SDL_FillRect(screen, NULL, 0);
for (n=0; n<800*600; n++)
ztable[n]=0;
for (n=0; n<8; n++)
krychle[n].rotate(xa,ya,za);
for (n=0; n<6; n++){
y1=(300+krychle[ctverec[n][0]].y);
x1=(400+krychle[ctverec[n][0]].x);
z1=(krychle[ctverec[n][0]].z);
y2=(300+krychle[ctverec[n][1]].y);
x2=(400+krychle[ctverec[n][1]].x);
z2=(krychle[ctverec[n][1]].z);
y3=(300+krychle[ctverec[n][2]].y);
x3=(400+krychle[ctverec[n][2]].x);
z3=(krychle[ctverec[n][2]].z);
y4=(300+krychle[ctverec[n][3]].y);
x4=(400+krychle[ctverec[n][3]].x);
z4=(krychle[ctverec[n][3]].z);
triangl(x1,y1,z1,x2,y2,z2,x3,y3,z3,r[n],g[n],b[n]);
triangl(x2,y2,z2,x3,y3,z3,x4,y4,z4,r[n],g[n],b[n]);
}
xa = (xa + 2)%360;
ya = (ya + 1)%360;
za = (za + 1)%360;
SDL_Flip(screen);
time1=SDL_GetTicks();
FPS+=1000/(time1-time0);
cnt++;
if ((cnt%10)==0) {
cnt=0;
FPS/=10;
sprintf(nadpis,"3D, %i FPS",FPS);
SDL_WM_SetCaption(nadpis, NULL);
FPS=0;
}
}
}
díík!
#5 lukas.balaz
ach,,,, tk to je jiné,,,,,,, já tomu blender nepřikládal důležitost,,,,, no co zkusit přímo blender fórum? http://blender3d.cz/forum/
#3 lukas.balaz
v google umiš robiť? pokial to chceš v tučňákov, stýhni si modul "pymouse" ten má podporu woken, tuxů i jablek
a ty děláš nějakou aplikaci co má vlastní okno?? jaký používáš modul? věřim, že moduly, které si umí vyrobit okno si i umí poradit i s eventy, popř. si jej vytvořit
j#14 Wrunx
já jsem tak prolejzal pyžamo.org a narazil jsem na prográmek jménem "numpy gumbo 0.5" který demonstruje nějaký hezký grafický vychytávky (plazma, oheň, bumpmapping atd..) a kupodivu to pracuje celkem rychle,, tak až najdu odvahu, mohl bych si ty kódy projít a dojít na to, kde je fígl (je to postavený na pyžamo a na numpy)
mohl by mi to někdo přeložit?
zlz : any idea, why i can't sign up to pygame.org? there is no contact to admin
vyrobil jsem si takovou hračku,,, původně jsem chtěl v pythonu udělat screenmate coby remake mého starého javascriptu očička (viz. http://petaklic.xf.cz/…ka/test.html ) ale při vývoji průhledného okna se to krapinku zvrtlo a vznikl soubor glass.py
je to teda pythonovsky pomalé, jak už jsem si jednou stěžoval,,
ale kdyby někdo chtěl napsat "tyjo to je skvělý, mazeec", klidně může
tak by mě zajímalo jestli mi někdo vyřeší tydle věci:
1) jak je to doprkic s globálníma proměnnýma? to je opravdu musím volat v každá funkci? :-(
2) nezobrazovat na startliště, ale v taskbaru (vedle hodin malá ikonka)
3) zachovat always on top, ale pouze vizuálně :
3.a) proklikatelnost, tedy abych mohl skutečně kliknout tam, kde mám kurzor, např. na odkaz
3.b) propsatelnost, tzn. abych mohl psát i "pod lupou"
3.c) na stisk např. F11 se screenmate "schová" a na další F11 se zase ukáže (tzn. nejlze ovládat přes pygame.event)
3.d) F12 by v tom případě nebyla na vypnutí aplikace ale dělala by aktivaci ovládání zoom, focus, size
# -*- coding: utf-8 -*-
# My 1st "screenmate" aplication in python using pygame
# use keys "+", "-" to set size of the glass
# use keys "z", "y" to set zoom
# use keys "f", "g" to set focus
# F12 to quit screenmate
# (c) Peta Klic, 2012 ..... petaklic@seznam.cz
import pygame, os, sys
from random import *
from pygame.locals import *
import pymouse
from PIL import ImageGrab
from ctypes import windll
def makeglass():
def glass(abc):
aaa=abc
f=0#(focus*size*zoom)/5
k=(3*(size*size/8))
for x in range (-size/2, 0):
for y in range (-size/2,0):
if x*x+y*y<size*size/4:
z=zoom*((k -(y*y + x*x) )/10)-f
if z==0 : z-=1
newy = 500*y/z
newx = 500*x/z
if (newx in range (-(size/2),1))and(newy in range (-(size/2),1)):
aaa[x+size/2][y+size/2]=abc[newx+size/2][newy+size/2]
aaa[-x-1+size/2][y+size/2]=abc[-newx-1+size/2][newy+size/2]
aaa[x+size/2][-y-1+size/2]=abc[newx+size/2][-newy-1+size/2]
aaa[-x-1+size/2][-y-1+size/2]=abc[-newx-1+size/2][-newy-1+size/2]
return aaa
global size
global show
global zoom
global focus
global x
global y
global obrazovka
global pozadi
global mouse
global oldx
global oldy
starepozadi=pozadi
pozadi=ImageGrab.grab((x,y,size+x, size+y))
pozadi=pozadi.tostring()
pozadi=pygame.image.fromstring(pozadi,(size,size),"RGB")
pozadi.blit(starepozadi,(oldx-x,oldy-y))
abc=glass(pygame.surfarray.array3d(pozadi))
abc=pygame.surfarray.make_surface(abc)
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (x,y)
obrazovka = pygame.display.set_mode((size,size), NOFRAME)
obrazovka.blit(abc,(0,0))
pygame.display.update()
def myinit():
global size
global zoom
global focus
global x
global y
global obrazovka
global pozadi
global mouse
global oldx
global oldy
size=120
mouse=pymouse.PyMouse()
x,y=mouse.position()
x-=size/2
y-=size/2
pygame.init()
focus=1
zoom=2
oldx=x
oldy=y
obrazovka = pygame.display.set_mode((size,size), NOFRAME)
pozadi=ImageGrab.grab((x,y,size+x, size+y))
pozadi=pozadi.tostring()
pozadi=pygame.image.fromstring(pozadi,(size,size),"RGB")
global size
global zoom
global focus
global x
global y
global mask
global mouse
global oldx
global oldy
SetWindowPos = windll.user32.SetWindowPos
myinit()
play=1
makeglass()
SetWindowPos(pygame.display.get_wm_info()['window'], -1, x, y, 0, 0, 0x0001)
change=0
while play:
x,y=mouse.position()
x-=size/2
y-=size/2
if (x<>oldx)or(y<>oldy)or(change):
makeglass()
SetWindowPos(pygame.display.get_wm_info()['window'], -1, x, y, 0, 0, 0x0001)
oldx=x
oldy=y
change=0
for udalost in pygame.event.get():
if (udalost.type==KEYDOWN):
if udalost.key == K_F12:
play=0
elif udalost.key==K_KP_PLUS:
if size<300: size+=20
elif udalost.key==K_KP_MINUS:
if size>120: size-=20
elif udalost.key==K_z:
if zoom<10: zoom+=1
change=1
elif udalost.key==K_y:
if zoom>2: zoom-=1
change=1
elif udalost.key==K_f:
if focus<5: focus+=1
change=1
elif udalost.key==K_g:
if focus>1: focus-=1
change=1
pygame.quit()
co to má znamenat ???
>>> ================================ RESTART ================================
>>> 500/345
1
>>> -500/-345
1
>>> 500/-345
-2
>>> -500/345
-2
>>>
no v podstatě jsi mi odpověděl (a odpověděly mi na to i nějaké pokusy provedené)
pygame (a zjevně python obecně sám o sobě) se nehodí tam, kde chci provádět více než dejme tomu 10**5 početních operací v sekundě
je fakt že těžko vymyslím hru, která to bude dělat
takže si budu muset najít jinou cestu jak si osvojit python a pygame
(a je to škoda, měl jsem v pascaloassembleru mooc hezký animace na podobných principech, jako průlet červí dírou, 3D objek celý z xyz bodů (a to si teď už v pythonu nedokážu představit zpětný přepočet xyz na xy/color) který rotoval, hořel a ještě se morfoval do několika podob, dokonce jsem i statečně ty objekty texturoval, a to všechno přes jakýsi pixelarray)
abych teda odpověděl kompletně,,,
dal jsem si do svého kódu na stěžejní místa časoměřiče a vypisoval jsem si časy jednotlivých operací..
výpočty hvězdiček cca 2/3 času
vykreslení rectú cca 1/3 času
display.flip nebo display.update cca 2-3ms
zkoušel jsem i přepsat kód do pixelarray - zpomalení při 200 hvězdičkách na 6fps
a čemu přesně nerozumíš na tom kódu?? já s OOP taky nikdy nebyl kamarád, ale nic jiného mi nezbejvá, jestli se chci vrátit po letech na pole ťukání programů
na začátku si definuju třídu jménem star, což je přízrak, mající nějaké ty svoje parametři, a má tři vložené funkce,, (__init__) té se nevyhneme, (reset) která nastaví hvězdičku někam náhodně do výchozí pozice a (update) která ji posouvá a v případě potřeby volá (reset)
pak jsem si udělal proměnnou typu tuple, do které nasázím těch 200 star, takže hned na začátku se mi pro 200 proměnných udělá jak (__init__) tak (reset) a mám 200 hvězdiček, které už jen čekají, až je namaluju
zbytek je hloupej cyklus, kterej dvěstakrát volá star.update(), pak to namaluje a jede znova
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()