Anonymní profil PiKey – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil PiKey – Programujte.comAnonymní profil PiKey – Programujte.com

 

Příspěvky odeslané z IP adresy 88.102.202.–

C / C++ › rozbilo se mi dev-cpp / sdl
14. 3. 2013   #172786

   

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ý   

C / C++ › rozbilo se mi dev-cpp / sdl
13. 3. 2013   #172773

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;
    }
  }
}
C / C++ › rozbilo se mi dev-cpp / sdl
11. 3. 2013   #172601

se na to vy** už sem to celý několikrát přeiinstaloval, avast sem vypnul,, to musí být nějaká krpa ve windowsech

C / C++ › rozbilo se mi dev-cpp / sdl
11. 3. 2013   #172599

jistěže  mám, pravím že všechno fungovalo, pak to  tři měsíce stálo a naráz to nefunguje 

C / C++ › rozbilo se mi dev-cpp / sdl
11. 3. 2013   #172593

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 :-(

C / C++ › vynulování pole,, (assembler…
29. 11. 2012   #167797

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,,

C / C++ › trojúhelník - optimalizace
26. 11. 2012   #167680

#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

C / C++ › trojúhelník - optimalizace
26. 11. 2012   #167645

#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šší

C / C++ › trojúhelník - optimalizace
26. 11. 2012   #167638

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);
    }
}
C / C++ › trojúhelník - optimalizace
25. 11. 2012   #167540

joo ještě jsem zapomněl, je to dělaný do 16BPP, odpovídá tomu i 16bitový zápis barev.. 

C / C++ › trojúhelník - optimalizace
25. 11. 2012   #167539

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!

Python › Zmena polohy kurzoru myši
4. 11. 2012   #165858

#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/

Python › Zmena polohy kurzoru myši
4. 11. 2012   #165855

#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

Python › pygame,, na co se nehodí,, ?
4. 11. 2012   #165850

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)

Python › pygame,, na co se nehodí,, ?
4. 11. 2012   #165841

#11 Wrunx
tk přednásobení přidalo cca 3-4fps při těch 500 hvězdiček (akt. jsem na 26-28)

Python › Zmena polohy kurzoru myši
4. 11. 2012   #165832

   

from win32api import SetCursorPos

setCursorPos ((x,y))
Python › pygame,, na co se nehodí,, ?
2. 11. 2012   #165776

#11 Wrunx
nojo,,,,,,,, teď se stydim, je vidět že jsem sedl k ťukání programů po dlouhý době,,

no možná by pomohlo i místo toho dělení provádět >> (v asm to bylo shr, >> jsem objevil až teď)

Python › pygame,, na co se nehodí,, ?
2. 11. 2012   #165750

#9 zlz
hooodně dobrý!

budu si teda pamatovat: nepoužvat range, kde to není nevyhnutelný

FPS se mi zrychlilo téměř 2× (starej semptron 2600 nebo kolik)

Python › pygame,, na co se nehodí,, ?
1. 11. 2012   #165711

#6 sputnikone
vůůbec se mi ho nepodařilo nainstalovat, asi je pythonovská angličtina mocnější soupeř než ostatní angličtina    jako by to nemohlo mít instalační balíček,,,,

zkusim kouknout na to pygame pypypy 

PiKey
Python › pygame,, na co se nehodí,, ?
1. 11. 2012   #165702

#4 kocourOggy
nepodařilo se mi rozchodit ani psyco (ten projekt už je zastavenej x let) ani pypy   

PiKey
Python › divná chyba Python 2.7
1. 11. 2012   #165700

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 

PiKey
Python › peťa vyrobil ScreenMate
1. 11. 2012   #165699

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()
PiKey
Python › divná chyba Python 2.7
1. 11. 2012   #165679

#4 KIIV
vypadat může,, ale není to tak,,,, když to počítáš ve floatech a převedeš do int tak to vyhodí správně

PiKey
Python › divná chyba Python 2.7
1. 11. 2012   #165674

#2 KIIV
cože? :D

tady jde o to, že když dělm mezi sebou záporné a kladné číslo, vyjde chybný výsledek (o 1 nižší)

nemůže přece když udělám -500 / 9999 vyjít -1

PiKey
Python › divná chyba Python 2.7
1. 11. 2012   #165671

co to má znamenat ???

>>> ================================ RESTART ================================
>>> 500/345
1
>>> -500/-345
1
>>> 500/-345
-2
>>> -500/345
-2
>>> 
PiKey
Python › pygame,, na co se nehodí,, ?
30. 10. 2012   #165540

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

PiKey
Python › pygame,, na co se nehodí,, ?
28. 10. 2012   #165475

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()

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032021 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý