Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: Aaltoefekti

Sivun loppuun

HtH [19.08.2002 16:34:42]

#

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);
}

HtH [20.08.2002 20:55:45]

#

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.

analous [18.09.2002 09:48:12]

#

Asiaa

HtH [27.12.2002 23:57:54]

#

Aijjaijjaijj, jonnekin on hävinnyt */, värikoodaus vituroillaan.

Antti Laaksonen [28.12.2002 00:48:00]

#

Muutin vähän kommenttimerkintöjä, systeemiä pitänee parannella...

Olli Vanhoja [27.06.2003 14:05:47]

#

Ei toimi, kaatuu kokoajan :'(

Olli Vanhoja [27.06.2003 14:07:28]

#

sori väärää paikkaan piti tota yht tois kommentoida :-)

toodles [13.08.2003 19:09:54]

#

Mitä toi "malloc(64000);" tekee?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta