Teimpähän tässä ajankulukseni pienen demoefektin, joka on mielestäni suhteellisen hieno. Pieniä pukkeja löytyy, ja koodissa on käytetty huonoja purkkaviritelmiä, ja optimointikin on jäänyt vähän puolitiehen. Jos haluat kokeilla tuota, muista tehdä kuva.pcx:ään 256 värinen kuva, jonka koko on 320x200, sillä muuten efekti saattaa jäädä luonnollisesti hieman vaisuksi :P
#include <dos.h> #include <stdio.h> #include <sys/farptr.h> #include <math.h> #define flip _dosmemputl(dblbuf, 64000/4, 0xA0000); char *dblbuf; char *texture; // PCX kuvan lataus on kopioitu laamatutista suoraan. Itse en ole vieläkään // vaivautunut tekemään omia ;p void loadpcx(char *filename, char *buffer) { int xsize, ysize, tavu1, tavu2, position=0; FILE *handle=fopen(filename, "rb"); if(handle==NULL) { printf("Virhe PCX-tiedoston avauksessa: Tiedostoa ei löydy!\n"); exit(1); } fseek(handle, 8, SEEK_SET); xsize=fgetc(handle)+(fgetc(handle)<<8)+1; ysize=fgetc(handle)+(fgetc(handle)<<8)+1; if(xsize != 320 || ysize != 200) {printf("Väärä kuvan koko\n"); exit(1);} fseek(handle, 128, SEEK_SET); while(position<xsize*ysize) { tavu1=fgetc(handle); if(tavu1>192) { tavu2=fgetc(handle); for(; tavu1>192; tavu1--) buffer[position++]=tavu2; } else buffer[position++]=tavu1; } fclose(handle); } void loadpal(char *filename, char *palette) { FILE *handle=fopen(filename, "rb"); int c; if(handle==NULL) { printf("Virhe PCX-tiedoston palettia luettaessa:" " Tiedostoa ei löydy!\n"); exit(1); } fseek(handle,-768,SEEK_END); for(c=0; c<256*3; c++) palette[c] =fgetc(handle)/4; fclose(handle); } void setpal(char *palette) { int c; outportb(0x3C8, 0); for(c=0; c<256*3; c++) outportb(0x3C9, palette[c]); } int main() { int n; dblbuf = (char *)malloc(64000); texture = (char *)malloc(64000); //Tähän ladataan tekstuuri char palette[256*3]; textmode(0x13); loadpcx("kuva.pcx", texture); loadpal("kuva.pcx", palette); setpal(palette); float sintab[256]; int loop; for(loop=0; loop<256; loop++) { //Tässä luodaan lookup sintab[loop] = sin(3.1415*2*(float)loop/256.0); } unsigned char l1=0; int l=0, k = 0; while(!kbhit()) { for(loop = 1; loop < 199; loop++) { // Tähän on tehty karmea purkkaviritelmä, mutta kyllästyin kehittämään // tätä koodia, joten se on jäänyt tälläiseksi :/ k=0; if(l1+loop > 256) k=1; if (k==0)memcpy(&dblbuf[loop*320+(int)(sintab[l1+loop]*100)], &texture[loop*320], 320); if (k==1)memcpy(&dblbuf[loop*320+(int)(sintab[l1+loop-256]*100)], &texture[loop*320], 320); } for(n = 0; n < 320; n++){ dblbuf[n] = 0;} for(n = 63680; n < 64000; n++){ dblbuf[n] = 0;} flip; l++; if(l>10) {l1++; l=0;} } textmode(0x3); }
Valmiiksi käännetty versio löytyy http://koti.mbnet.fi/~haraa/files/aalto.zip
Se on vähän vanhempi versio, kuin tuo, joten ylä, ja alareunissa näkyy pieni bugi.
Asiaa
Aijjaijjaijj, jonnekin on hävinnyt */, värikoodaus vituroillaan.
Muutin vähän kommenttimerkintöjä, systeemiä pitänee parannella...
Ei toimi, kaatuu kokoajan :'(
sori väärää paikkaan piti tota yht tois kommentoida :-)
Mitä toi "malloc(64000);" tekee?
Aihe on jo aika vanha, joten et voi enää vastata siihen.