tr-demoscene

the scene => coding => teori => Konuyu başlatan: spaztica - 18.03.2004 03:05:46

Başlık: Tekniker
Gönderen: spaztica - 18.03.2004 03:05:46
bu bölümde çeşitli teknikleri bilen arkadaşlardan bunları kolay anlaşılır şekilde anlatan, pseude-code ile örnekleyen yazılar bekliyoruz.

aklma gelen teknikler:
- plasma
- metaballs
- fire
- z clipping
- isometric engine
- jellyvectors
bu liste uzar gider zaten. bir yerlerden başlayalım, ha? yenilere de kolaylık olur sanki.
Başlık: Tekniker
Gönderen: bzdgn - 18.04.2005 01:21:46
Alıntı
Originally posted by spaztica@Mar 18 2004, 01:05 AM
bu bölümde çeşitli teknikleri bilen arkadaşlardan bunları kolay anlaşılır şekilde anlatan, pseude-code ile örnekleyen yazılar bekliyoruz.

aklma gelen teknikler:
- plasma
- metaballs
- fire
- z clipping
- isometric engine
- jellyvectors
bu liste uzar gider zaten. bir yerlerden başlayalım, ha? yenilere de kolaylık olur sanki.
[post=239]Quoted post[/post]
[/b]


Bmp uzantılı bir dosyayı nasıl okutacagımı bilmiyorum, dosya headerları hakkında fazla bir bilgim yok, oncelikle beyaz ile dolu olan bir bmp dosyası sonra da kırmız ile dolu olan bir bmp dosyaları yarattım sonra word ile actım , sonlardaki garip karakterlerin hepsi aynı idi(beklendigi gibi) kırmızı olanın birkarakterini kopyalaıp beyaz olanı word ile acıp sildigim kadar ctrl+v yaptım ve ust sol kosede gormem gereken kırmızılıgı alt sag kosede gordum. Aslında hicbir bilgim yok ama basit bir C kodu ile windows bmp dosyasını okutmak istiyorum.

Yapmak istedigim sey ise sudur. Amigada overdrive diye bir oyunun basında belli bir resim dosyaısnı yukarıdan asagı inen sütunlar ile asagıdan yukarı dogru cizme olayı vardı.

Eger kendim bir resim cizip sonra onu dosya olarak kaydedebilsem ki 320*200 tane R G B degeri olması gerekir , su sekilde bir seyler yapmak isterim.

for (j= 199 ; j>=0; j--)
   for (i = 0; i<319 ; i++)
     Line (0,0,i,j,Renk);

Eger belirli bir resim dosyası var ise bu sekilde o oyundaki gibi asagıdan yukarı minik sutunlar ile (ki temas ettigi renkler ile cizilecek bu sutunlar) resmi cizebilecegimi dusunuyorum ama sorun BMP dosyasını okutmayı bilmiyorum.

Bununla ilgili beni bilgilendirirseniz yeni adım attıgım grafik programlamada epsilon kadar yol almıs olacagım.

Saygılarımla
Ulgen717

Not: Bir ara (aralık veyahut subat ayı idi sanırım) buraya yazmıstım demo-introlara meraklı oldugumu sonra bir arkadas GRAPH13.CPP diye bir dosya yazmıstı buraya. O zamandanberidir pek ugrasamadım ta ki gecenlerde 3 boyutlu bir yıldız programı ile hasır nesir olana dek. O arkadasa tesekkuru borc bilirim bunu belirtmek istedim :) , bir emek harcandıgı zaman karsılıgını vermemek insanda yuz bırakmıyor o yuzden utana sıkıla tesekkur ediyorum. Forum o zamandan beri degismis, Eski yazıları bulamadım , bu konuda da yardımcı olursanız pek sevinecegim.
Başlık: Tekniker
Gönderen: bzdgn - 18.04.2005 01:25:03
Alıntı
Originally posted by spaztica@Mar 18 2004, 01:05 AM
bu bölümde çeşitli teknikleri bilen arkadaşlardan bunları kolay anlaşılır şekilde anlatan, pseude-code ile örnekleyen yazılar bekliyoruz.

aklma gelen teknikler:
- plasma
- metaballs
- fire
- z clipping
- isometric engine
- jellyvectors
bu liste uzar gider zaten. bir yerlerden başlayalım, ha? yenilere de kolaylık olur sanki.
[post=239]Quoted post[/post]
[/b]


Bir de üstteki iletiye ek olarak baslangıc icin FIRE efektini anlatmanızı isterim sahsi olarak, en basit oldugu icin.

Hersey icin simdiden tesekkurler.

Saygılarımla
Ulgen717

Not: TC , BC kullanmaktayım ve bunların dısında watcom, djgpp gibi compilerlar hakkında fazla bilgim yok. Aslında compilerın ne sekilde etkidigini de pek bilmiyorum , haybeye kullanıyoruz, bu konu hakkında da biraz bilgilendirme cok faydalı olacaktır.
Başlık: Tekniker
Gönderen: scg - 19.04.2005 03:03:25
:: Minimum kodla .bmp dosyalarini okumakk ::

Not: Kod çok ağır bir sınavdan çıktıktan sonra kazan gibi bir kafayla yazıldı. Şimdiden uyarıyom : lame coding hehehe..

Dosyalar (ne formatta olursa olsun) byte arrayler başka birşey değil.
Dosya içerdiği veri hakkında da bilgi içermek zorunda. (Data için data
yani anlıyacağın..). Bu bilgiler header kısmını oluşturan byte lar da tutuluyor.Bir dosya kaydedilirken önce header kısmı doldurulur , daha sonra gerçek data kaydedilir.

.bmp dosyalarının genel yapısı şöyle:

 -BITMAPFILEHEADER
 -BITMAPINFOHEADER
 -RGBQUAD array
 -Color index array

BITMAPFILEHEADER ve BITMAPINFOHEADER strcut lari dosya hakkında çeşitli bilgiler (dosyanın size i, .bmp nin uzunluğu , genişliği,renk formati,sıkıltırılmış mı vs ..) içeriyor. RGBQUAD array ve index array ise
pixellerin renk bilgilerini içeriyor. Kişisel olarak .TGA dosyalarini tercih ettiğim için .bmp 'nin detaylarini fazla kurcalamadim. 24 bit per - pixel dışındaki renk seçenekleri ve color table olaylarina girmiyorum..
24bpp renk derinliğinde BITMAPINFOHEADER dan sonra gelen byte lar direkt olarak pixellerin renk değerleri..

Kod: [Seç]

bmpinfo* ReadBitmap(char *filename)
{
FILE *fp;
BITMAPFILEHEADER   fileheader;
BITMAPINFOHEADER   infoheader;

int i;
unsigned char temp;


bmpinfo *bmp = (bmpinfo*)malloc(sizeof(bmpinfo));


fp = fopen(filename,&quot;rb&quot;);

fread(&fileheader,sizeof(BITMAPFILEHEADER),1,fp);
fread(&infoheader,sizeof(BITMAPINFOHEADER),1,fp);

bmp->w = infoheader.biWidth;
bmp->h = infoheader.biHeight;
bmp->data = (unsigned char*)malloc(sizeof(unsigned char) * bmp->w * bmp->h * 3);


if(infoheader.biBitCount == 24)
  fread(bmp->data,sizeof(unsigned char),bmp->w * bmp->h * 3,fp);
else return NULL;

// OpenGL icin düzeltme  bmp BGR OpenGL RGB
for(i=0;i<bmp->w * bmp->h;i++)
{
  temp = bmp->data[3*i];
  bmp->data[3*i] = bmp->data[3*i + 2];
  bmp->data[3*i + 2] = temp;
}  

return bmp;

}



 Yukardaki kod için :

* İlk önce dosyayi diskten RAM e okuman lazim. Bunun için C nin
  standart kütüphanesinin file IO fonksiyonlarina ve FILE structure  na  ihtiyaç var. (stdio.h i include et.)

* Dosyayi açmak için fopen(...) kullanıyoruz. Binary dosya okuduğumuz için format "rb" olacak. (Fonksiyonun ikinci argümanı)

* Dosya hakkında bilgi almak için  Yazdığımız okuyucuda dosya header'lari tanımlamalıyız.Yani dosya headerlarinin karşılıklari bizim programimizda da olmalı. Bu sayede RAM de pixel data için ne kadar yer açacağımızı falan öğrenmiş olacaz..
   
                BITMAPFILEHEADER   fileheader;
   BITMAPINFOHEADER   infoheader;

tanımlandıktan sonra bu structlar doldurulacak. Bunu da fread ile yapıyoruz.Bu işlemler yapılırken dosya pointerinin (fp) değeri sürekli artıyor. Headerlar okunduktan sonra fp nihayetinde data section a gelmiş oluyor.

* 24 bitlik .bmp ler okuduğumuz için (Yani her kanal için 8 bit)
  unsigned char tipinde veri tipi seçtim. Her pixel için 3 kanal (r,g,b
  olduğundan uzunluk*yükseklik*3 byte lık yer açmamız lazım.
  (Toplam pixel sayımız : uzunluk * yükseklik kadar) Bu bilgilerin hepsini header dan aldık hatırlatıyim.

* Ha unutmadan bitmap i temsil eden bir veri tipi tanımlamıştım o da şöyle :

Kod: [Seç]

typedef struct _bmpInfo
{
unsigned short w,h;
unsigned char *data;
}bmpinfo;


kodun geri kalan kısmında opengl için bir düzeltme var. .bmp de renkler BGR sırasında fakat opengl byte lari RGB sırasında istiyor.

Dosyayi diskten ram e aldıktan sonra istediğin herşeyi yapabilirsin bu datayla.. Ben şöyle birşeyler yaptım:

Kod: [Seç]

void ShowBitmap(bmpinfo *bitmap,int posx,int posy)
{
glRasterPos2f(posx,posy);
glDrawPixels(bitmap->w ,bitmap->h,GL_RGB,GL_UNSIGNED_BYTE,bitmap->data);

}

bu fonksiyon ram deki pixel datayi ekranda gösteriyor.

Neyse umarım bir fikir vermiştir.

ateş (http://www.gamedev.net/reference/list.asp?categoryid=72)

Bu linkte bir sürü fire tutorial i var..

Ayrıca forum aynı forum değiştiği yok , skin değişti sadece.. eski postlari görmek istiyosan topic title larin altında combo box lar var. Ordan istediğin zamani seç , mesela show all  la herşeyi gör ..

Valla bir coder in compiler dan daha  fazla önemseyeceği bir yazılım olamaz herhalde.. compiler seni rezil eder vezir de heheeh .. (sabaha karşı 2:56 esprileri..) İşler ciddileşince , mesela size optimizasyonu , hız optimizasyonu gibi şeylerde iyi compilerlar kendini hemen belli ediyor..Burada resmi olarak deklere ediyorum ki : Microsoft RULAZZ !!
Hakikaten compiler'lari çok iyi , özellikle düşük size da kod üretmek istiyorsan..Ve VC++ da compiler'in üzerine muhteşem bir IDE si var. Yaklaşık 6 -7 aydır MS VC++ 2005 Express Edition beta kullanıyorum , harika, istediğim herşeyi fazlasıyla sağlıyor. Hem de bedava. MSDN den download edebilirsin. Tek eksik yani , o da express edition olduğu için , resource compiler'inin olmamasi ve MFC desteği vermemesi. Yani GUI si olan programlar geliştiremezsin..Benim için hiç problem değil..

Kızaran gözlerle yatağa gider...


scg
Başlık: Tekniker
Gönderen: skate - 19.04.2005 09:45:43
Eline sağlık SCG, kafa karıştırmadan kısa ve öz anlatmışsın olayı. Bu sitenin tutorial ya da tips&tricks bölümü açılsa da oraya yollasak keşke bu tür dökümanları...
Başlık: Tekniker
Gönderen: spritus - 19.04.2005 12:39:00
Alıntı
Originally posted by skate@Apr 19 2005, 09:45 AM
Bu sitenin tutorial ya da tips&tricks bölümü açılsa da oraya yollasak keşke bu tür dökümanları...
[post=1219]Quoted post[/post]
[/b]

skate infonda admin yazıyo?? :D
Başlık: Tekniker
Gönderen: scg - 19.04.2005 14:42:57
Ne demek skate ciğim , bildiğim her konuda yardımcı olmaya çalışırım.
Tips & Tricks ve articles kısımlari olsa hiç fena olmazdi hani.
Bir de Gallery kısmını falan aktif hale getirecektiniz ???
Başlık: Tekniker
Gönderen: skate - 19.04.2005 16:07:53
Admin yetkim var ancak bunu sadece mesajları düzenlemek, forumdaki kategorileri düzenlemek v.s. işler için kullanıyorum. Sonuç olarak forumun kodu ve root ayarlarıyla Spaztica ilgileniyor. Aslında ben de kurcaladım bir kez yapıyı, tam birşeyler eklemeyi planladım, Spaztica komple forumu değiştirdi :) O'nun ellerinden öper bu işler.
Başlık: Tekniker
Gönderen: eirik - 24.04.2005 12:09:35
24bitlik bitmaplarde yanli$ hatirlamiyorsam bit pixel icin B G R X olarak 4 pixel vardI , X pixeli bo$ 00 yada alpha olarak gecse de kullanilmiyor zaten (yukarIdaki koda bakmadIm fakat hatirlatmak istedim) header kIsmInI wotsit.org (http://www.wotsit.org/)dan indirecegin bi dokumandan kolaylikla ogrenebilirsin

bunun haricinde bmp dosyalar binary dosyalardIr , ancak word text dosyalarI okur, bu dosyalarIn binary lerden en buyuk farkI , ornegin 0d 0a $eklinde iki byte yanyana ise bunu enter olarak kabul edip bi alt satira gecer oysa binary dosyada bunun cok farkLI bir anlamI olabilir, kod ise OR AX,bilmemne gibi yada R degeri 0d G degeri 0a olan bir pixel gibi. dosya acma ve kaydetme icin onun yerine hexeditor kullanirsan cok daha rahat edersin cunku word de dosyayI kaydetmeye cali$irken butun dosyanIn icine sicilabilir ama hexeditorde olmaz, ben yillardIr degi$tirmeden hexpert diye bi editor kullaniyorum ufak ve i$levsel ama istersen dos daki edit.com u edit /70 hede.bmp $eklinde de kullanabilirsin gerekirse.

neyse gelelim bitmap dosyasIna , eger okutman gereken sabit bir bitmapse (yani butun bitmaplarI acacak bir editor yada gosterici yazmiyorsan)  header'daki ilgili ponter i okutup dosyayI o noktadan okutarak (buradaki kodu incelersen orada BMPINFOHEADER in gectigi satir) eri$irsin. dosyanIn enini boyunu bildigin icin ba$ka yerleri okutmana gerek olmaz. ba$ka bitmap dosyalar microsoft'un denyolugu nedeniyle (kusura bakma SCG :) ) ilk okudugun satiri yani ornegin 320*200 icin ilk okudugun 320 pixeli en alt satir olarak ayarlami$tir bu yuzden eger tum pixelleri ekrana oldugu gibi yazacak olursan elde edecegin goruntu ba$a$agI olur , bunu engellemek istiyorsan ya for dongusunde for i=320 to 0 step -1 kullanacaksIn yada dosyayI bi editorle acIp altini ustune getireceksin (yani flip) programda da oyle kullanacaksIn. bu arada pcx dosyalar da bitmap dosyalardIr , bmp den farkI bir headerinda digeri de satIrLarI olmasI gerektigi yerde kaydetmesindedir bir pcx dosyayI hicbi$ii yapmadan satIr satIr ekrana yazarsan duzgun goruntu elde edersin.

bunun haricinde 8bit (256 renk) 4bit (16 renk) ve siyah beyaz bitmaplar var. 2 renk haricinde diger dosyalar palet kullanIr, palet header ile bitmap datalarInIn arasInda bi yerde konu$lanmi$tir bmp dosyalarda

[header]
[palet]
[datalar]

palet yapIsInda bir X degeri icin, o X degerine RGB degeri herhangi bi$i olan renk atanir, bunu palettten okutursun demek istedigin $ey:

00 <> 12 34 56
01 <> 23 45 67
....

gibi , bundan sonra dosyadan 00 degerini gordugunde ekrana 12 34 56 degeri olan rengi yazman gerekir (eger kendin de 256 renk derinliginde cali$iyorsan o zaman palet yuklemek icin 03c8h ve 03c9h portlarInI kullanacaksIn bunun nasIL yapilacagInI bilahare anlatirim istersen) 8 bitte her byte bir pixelken 4 bitte her 4bit (bir nibble) bir pixeldir , 4bit icin yanyana pixelleri degi$tirmene gerek yok yani 0,0 pixeli X 1,0 pixeli Y ise dosyada XY olarak bir byte olu$turur. 2 bitte de tahmin edecegin gibi her bit bir pixeldir bue byte 'da 8 pixel olur , fakat 2 bitte eger satir sonuna geldiginde 8k $eklindeki geni$ligi olan bir dosya onemli olmayabilir ama tam 8in kati olmayan dosyalarda satir sonuna gelindiginde dosyanIn byte I 00 ile 8in katIna tamamlanir.

son olarak bir de $unu sooliyim , 8 bitte her zaman paletle ugra$mak zorunda degilsin, eger kullandigin moddaki mesela mod13 deki paleti paint shop pro nun tanidigi .pal formatInda elde edersen daha sobnra dosyayI da paint shop pro da acIp load palette diyip o pal dosyasInI yuklersen paint shop pro resmi elindeki paletin en yakIn renklerine donu$turup yeniden kaydeder, yani resmin kendi paletinin mod13 deki palete en yakIn degerine uydurdur bu sayede bicbir palet i$lemine gerek kalmadan resmi dogrudan dogruya 8bit icin en kucuk bir kodla gosterebilirsin.
Başlık: Tekniker
Gönderen: tesla - 25.04.2005 20:24:50
Alıntı
Originally posted by spaztica@Mar 18 2004, 01:05 AM
bu bölümde çeşitli teknikleri bilen arkadaşlardan bunları kolay anlaşılır şekilde anlatan, pseude-code ile örnekleyen yazılar bekliyoruz.

aklma gelen teknikler:
- plasma
- metaballs
- fire
- z clipping
- isometric engine
- jellyvectors
bu liste uzar gider zaten. bir yerlerden başlayalım, ha? yenilere de kolaylık olur sanki.
[post=239]Quoted post[/post]
[/b]

Nasil yapildiklarindan önce bu efektlerin tanimlarini yazabilir misiniz? Bircok demoda intro da elbet ki defalarca gormusumdur ama isimlerini bilmiyorum.
Başlık: Tekniker
Gönderen: spritus - 26.04.2005 14:01:43
Alıntı
Originally posted by tesla@Apr 25 2005, 08:24 PM
Nasil yapildiklarindan önce bu efektlerin tanimlarini yazabilir misiniz? Bircok demoda intro da elbet ki defalarca gormusumdur ama isimlerini bilmiyorum.
[post=1228]Quoted post[/post]
[/b]

teslacığım şu linklerden efektlerin isimlerini açıklamalı olarak öğrenebilirsin.. :D

http://www.mandrixx.net/javasimple.html (http://www.mandrixx.net/javasimple.html)
http://www.mandrixx.net/javaadv.html (http://www.mandrixx.net/javaadv.html)
http://demo-effects.sourceforge.net/ (http://demo-effects.sourceforge.net/)
http://equinox.planet-d.net/java/ (http://equinox.planet-d.net/java/)
http://www.cs.helsinki.fi/u/mourujar/java/ (http://www.cs.helsinki.fi/u/mourujar/java/)
Başlık: Tekniker
Gönderen: tesla - 26.04.2005 17:40:19
Gönderdiğin linkler sorunun cevabını hayli hayli karşılıyor. Çok sağol... spritus  ;)
Başlık: Tekniker
Gönderen: disq - 07.08.2005 20:32:23
TGA okuyan kod. goruldugu uzere 1999'dan kalma. kesin yavastir da. linux'da compile oluyodu o siralar win32'de ne yapar bilemem ama calismasi lazim.

Kod: [Seç]
/*
TGA reader

disq, Mon Jun 21 21:51:34 1999
*/
#include <stdio.h>
#include <malloc.h>

/*
reads uncomressed, RGB, 24 bpp TGA files

returns in a 32bpp pointer, return width and heigth in sizeX and sizeY
*/
unsigned long *readtga(char *file, int *sizeX, int *sizeY)
{
FILE *f;
char *scr;
unsigned long l;
char dum,dum1,dum2;

f=fopen(file,&quot;r&quot;);
if (f==NULL) return(NULL);

dum=fgetc(f); /* length of image identification string */

fseek(f,0x0C,SEEK_SET);
dum1=fgetc(f);
dum2=fgetc(f);
*(sizeX)=dum2*256+dum1;

dum1=fgetc(f);
dum2=fgetc(f);
*(sizeY)=dum2*256+dum1;


fseek(f,dum+0x12,SEEK_SET);
scr=(char *)malloc(*(sizeX)**(sizeY)*4);


l=0;
while(!feof(f))
{
*(scr+l)=fgetc(f);
*(scr+l+1)=fgetc(f);
*(scr+l+2)=fgetc(f);
*(scr+l+3)=0;
l+=4;
}

fclose(f);
return((unsigned long *)scr);
}
Başlık: alev
Gönderen: hannibal - 04.07.2009 04:15:34
Alev efekti;

Tam göbekte beyaz, arada sarı ve en dışta da kırmızı renkler olursa, bu renkler güzel bir tonlama ile birbirine kaynaşırsa,

en dışta en soluk, en içte en parlak ton olursa, sözüm ona 'BLUR' etkisi eklenirse bir alevimiz olur.

Yukarıdaki koşulları teker teker sağlayalaım, bunun için qb4.5 kodu ile örneklerde verelim;

1 - Renk tonlaması
   En dışta koyu, en içte parlak olacak, kabuğun kırmızı, çekirdeğin beyaz olduğu bir renk tayfı üretelim...
Kırmızı, sarı ve beyaz olmak üzere 3 ana rengimiz var;
Alev yüksekliğini bulup, bu yüksekliği 3 e bölelim. Bu şekilde koyu kırmızıdan bembeyaza giden tayfımız eşit şekilde dağılmış

olur...
   Alevi, 320x200x8 ekranında yapıcaz. Bu ekranda, bir renk yazmacı, 0 - 63 arası KYM ton alabilir... Tüm tayf, alev

yüksekliği kadar renk kullanacak. Yani, diyelim ki 21 yüksekliğinde bir alev yapacağız;

   O zaman, kırmızı ton 7, sarı ton 7, beyaz ton 7 renk kullanır. 0 dan 63 e kadar değer alabilen bu renklerde, kırmızı ton 0

dan başlayıp, 63 görmeli. O halde, her bir ton 63/7 kadar artmalıdır.

Kod: [Seç]

Screen 13                         '320x200x8 lik Ekran
Yukseklik% = 31                   'Alev max yuksekligi
k% = Yukseklik%\3                 'Ana renklerin ton sayısı
l% = 63 \ k%                      'Tonlar arası mesafe

Baslama% = 199 - Yukseklik        'Dikey Tarama baslangicimiz
En% = 63                          'Yangının tabanı
x1% = (320 - En%) \ 2             'Yatay taratma baslangici
x2% = x1% + En%                   'Yatay tarama sonu.


   şimdi, kırmızı, sarı ve beyaz için her birisi eşit (nerdeyse :D) sayıda farklı renk sayısı bulduk. Bu farklı renk sayısını

k% değişkeni ile gösterdik. Madem, her renk 0 - 63 arası ton alabiliyorsa, 63 ü k% ya bölüp, her tonda yapacağımız atlamayı

bulduk. Bunuda l% ile gösterdik.

   Renkler, Kırmızı - Yeşil - Mavi tonlarından oluşur. Alevde, Kırmızı ilk ana rengimiz. En kısık değerden yani 0 dan

başlayacak. k% kadar ilerleyip en parlak tona 63 değerine ulaşacak. Bundan sonra Sarıyı elde etmek için, yeşil k% kadar

ilerleyip her adımda l% kadar değer alıp 63' e ulaşacak. Bu parlaklığa ilerlerken kırmızı 63 değerinde sabit kalacak.

Böylece, kırmızıdan sarıya en yumuşak şekilde geçmeye çalışacağız. Son adımda, kırmızı ve yeşil en parlak noktasında, sap

sayı (sap sarı kedimize 'sap sayı' diyoz biz :D) iken, mavi hafifçe artacak ve sarıdan, beyaza bir yumuşak geçiş daha yapmış

olacağız.

   Siyah ==> Kırmızı ==> Sarı ==> Beyaz
   Hadi yapalım bu işi :D

Kod: [Seç]


For t% = 0 to k%                            'k% kadar rengi boyucaz
  Out &H3C8, t%                             '3C8h portuna ilgili rengi yazıcaz.
  Out &H3C9, kirmizi%                       'Siyahtan başlıyoruz
  Out &H3C9, 0                              'Yeşil ve
  Out &H3C9, 0                              'Mavi renkler susçak.
  kirmizi% = kirmizi% + l%                  'her adımda l% kadar artan ton, k% adımda 0 dan 63 e ulaşır ;)
  IF kirmizi% > 63 THEN kirmizi% = 63    
Next


For t% = 0 to k%                            'k% kadar rengi boyucaz yine.
  Out &H3C8, t% + k%                        'k% kadar rengi boyadık. şimdi 2. k% kadar renjte sıra.
  Out &H3C9, 63                             'Burası zaten kıpkırmızı oldu
  Out &H3C9, yesil%                         'sarartalım hafif hafif
  Out &H3C9, 0                              'Mavi renk bekle...
  yesil% = yesil% + l%                      'her adımda l% kadar artan ton, k% adımda 0 dan 63 e ulaşır ;)
  IF yesil% > 63 THEN yesil% = 63    
Next


For t% = 0 to k%                            'Son k% kadar renk.
  Out &H3C8, t% + k% + k%                   '2 * k% kadar rengi boyadık. şimdi 3. k% kadar renjte sıra.
  Out &H3C9, 63                             'Burası zaten kıpkırmızı oldu
  Out &H3C9, yesil%                         'Burası da yemyeşil. Al sana Sap sayı :)
  Out &H3C9, mavi                           'Mavi renk artınca, sarıdan beyaza dönüyoruz.
  mavi% = mavi% + l%                        'her adımda l% kadar artan ton, k% adımda 0 dan 63 e ulaşır ;)
  IF mavi% > 63 THEN mavi% = 63    
Next



tataam :D

Siyah =>(kırmızı artıyor) => kırmızı => (yeşil artıyor, kırmızı max ta sabit) => sarı => (mavi artıyor) => beyaz

3C8h portuna, 0 dan 255 e kadar olan renk sayılarından birisi girilir ve hemen ardından, 3C9h portuna sırasıyla KYM tonları

yazılır. Portlar, bellek noktaları/pointer lar gibi değildirler, farklı zamanda farklı işler yaparlar...


şimdi alev için renk tayfımzı yaptıktan sonra düşünelim;

   Bir kıvılcım çıksın, yukarı ilerlesin, ilerlerken rengi hafif hafif değişsin ve siyaha ulaşıp kaybolsun. Bunun için, bir

sütundaki okuduğumuz bir noktanın rengini, çevre diğer birkaç rengi <=== BLUR okuyup, bir üst noktaya ortalama bir renk

yazacağız.

Kod: [Seç]

Do                                              'Ana döngü
  a$ = INKEY$                                   'Tus kontrol
  Gosub Isik                                    'Baslama kivilcimi
  For y% = baslama% to 199                      'Dikey tarama
    For x% = x1% to x2%                         'Yatay tarama
      c1% = POINT(x%, y%)                       'Taranan nokta
      c2% = POINT(x% + 1, y%)                   'bir yatay ilerisi
      c3% = POINT(x% - 1, y%)                   'bir yatay gerisi
      c4% = POINT(x%, y% + 1)                   'bir aşağısı
      c5% = POINT(x%, y% - 2)                   'iki aşağısı
      C% = (C1% + C2% + C3% + C4% + C5%) \ 5    'BLUR (hepsinin ortalaması)
      PSET (X%, Y% - 1), C%                     'Taranan noktanın bir üstüne bu rengi koyalım
    NEXT
  NEXT
LOOP UNTIL A$ <> ""                             'Tusabasacika :D
END
 
Isik:
x% = x1% + RND * En%                            'Yangın tabanından rastgele bir yer seç
PSET (x%, 199), RND * Yukseklik%                'rastgele boya
PSET (x% - 1, 199), RND * Yukseklik%            'önü ve
PSET (x% + 1, 199), RND * Yukseklik%            'arkayıda boya  
RETURN




   şimdi ekranınız yanacak :D. Burda, basic dilinde, Ekran Ana Bölümüne direk geçiş yaparak boyama ve okuma yaparsanız

hızınız oldukça artacaktır. Bu bölüm yüzünden koskoca Arcok kütüphanesinde problemler yaşamaktayım, yardımlarınızı (Beta

testerları) bekliyorum :D. Ayrıca kıvılcımlar yangın tabanında rahatsız edici görünmektedirler, bunuda düzeltebilirsiniz.

Bundan başka biraz daha uğraşıp Yangına belirli bir biçimde verebilirsiniz. şekil 1-A;

Kod: [Seç]

'Tolga Arçok
'Ekranınızı yakacak :P


SCREEN 13
RANDOMIZE TIMER


yukseklik% = 63
baslama% = 199 - yukseklik%
o& = CLNG(baslama%) * 320&
b& = o&
en% = 128
x1% = (320 - en%) \ 2
x2% = x1% + en%
taban& = 63680

k% = yukseklik% \ 3
l% = 63 \ k%
FOR t% = 0 TO k%
kirmizi% = kirmizi% + l%
OUT &H3C8, t%
OUT &H3C9, kirmizi%
OUT &H3C9, 0
OUT &H3C9, 0
NEXT

FOR t% = 0 TO k%
kirmizi% = kirmizi% + l%
IF kirmizi% > 63 THEN kirmizi% = 63
yesil% = yesil% + l%
OUT &H3C8, t% + k%
OUT &H3C9, kirmizi%
OUT &H3C9, yesil%
OUT &H3C9, 0
NEXT


FOR t% = 0 TO k%
yesil% = yesil% + l%
mavi% = mavi% + l%
IF yesil% > 63 THEN yesil% = 63
OUT &H3C8, t% + k% * 2
OUT &H3C9, 63
OUT &H3C9, yesil%
OUT &H3C9, mavi%
NEXT



DEF SEG = &HA000
DO
GOSUB DrawLine
o& = b&
FOR y% = baslama% TO 199
 FOR x& = x1% TO x2%
  oo& = o& + x&
  c1% = PEEK(oo&)
  c2% = PEEK(oo& - 640&)
  c3% = PEEK(oo& + 320&)
  c4% = PEEK(oo& + 1)
  c5% = PEEK(oo& - 1)
  c% = (c1% + c2% + c3% + c4% + c5%) \ 5
  IF c% > 0 THEN POKE oo& - 320&, c%
 NEXT
 o& = o& + 320&
NEXT
LOOP UNTIL INKEY$ <> ""
DEF SEG
END

DrawLine:
kk% = (RND * ((RND * en% \ 5) + en% \ 5))
x& = x1% + kk%
bb& = x& + taban&
c% = INT(RND * yukseklik% \ 3)
t% = (RND * en%)
FOR t& = 0 TO 3
  POKE bb& + t&, c%
NEXT
x& = x2% - kk%
bb& = x& + taban&
c% = INT(RND * yukseklik% \ 3)
t% = (RND * en%)
FOR t& = 0 TO 3
  POKE bb& + t&, c%
NEXT

ll% = kk% + (RND * (en% - kk% * 2))
x& = x1% + ll%
bb& = x& + taban&
c% = yukseklik% - INT(RND * yukseklik% \ 3)
t% = (RND * en%)
FOR t& = 0 TO 3
  POKE bb& + t&, c%
NEXT
RETURN


tam çalışır yangın programı;
http://www.uploadyeri.com/index.php/files/get/u-QpJYVE-9/yangin.rar
Başlık: Plazma
Gönderen: hannibal - 04.07.2009 16:55:53
Plasma nedir ? Yenilirmi ? Napılır bilmem :D.
Plasma efekti denilen şeyi nasıl yaparız ? ışte bunun için bildiğim bir yol var...

Alev nasıl yapılır konusunda yazdıklarımı okuduğunuzu varsayıyorum. şimdi alev kodunda, renk tonlarını hiç değiştirmeyin.

Kodun başındaki, OUT komutlarına REM çakın. Programı çalıştırın. Ve izleyin...

Alev programında, 3 ana rengin, eşit bir biçimde birbirine yumuşak olarak kaynaşmasını, ve çekirdek rengin yavaş yavaş

yükselerek kabuk renge ulaşmasını yazmıştık. Bu yumuşak geçiş için, önüm arkam sağım solumdaki noktaların renk değerlerini

alıp, ortalama bir renk değeriyle bir üst noktaya boyama yapmıştık.

Biraz daha dairesel bir BLUR efekti ve yumuşak geçişli renk tonları kullanırsak, bu tonları döngüde değiştirirsek plasma

efektini yakalamış olacağız.

Plasma etkisinde, değişen ekrandaki noktaların renk değeri değil, renklerin ton değerleridir. Bir resim hazırlanır ve o
resim sabittir. Bu resim kulanacağımız ana renklerin BLUR edilmiş halidir. Bunun için ekranımıza rasgele noktalar koyalaım.

SOnra ekranımızı baştan aşağıya taratalım ve her noktaya, o noktanın çevresindeki noktaların renk ortalamasını yazalım...

Kod: [Seç]

DEFINT A-Z                              'Tüm değişkenler Tam sayı. % işaretine gerek yok!
SCREEN 13                               '320x200x8
RANDOMIZE TIMER
Ana% = 6                                'Ton atlama
Son% = 21 * Ana%                        'Max ton (63 ile VE işlemine tabidir)
FOR t% = 0 TO 21                        
  OUT &H3C8, t%
  OUT &H3C9, t% * Ana%
  OUT &H3C9, 0
  OUT &H3C9, 0
NEXT

FOR t% = 0 TO 21
  OUT &H3C8, t% + 21
  OUT &H3C9, 0
  OUT &H3C9, t% * Ana%
  OUT &H3C9, 0
NEXT


FOR t% = 0 TO 21
  OUT &H3C8, t% + 42
  OUT &H3C9, 0
  OUT &H3C9, 0
  OUT &H3C9, t% * Ana%
NEXT


For y = 0 to 199                        'Rasgele kıvılcımlar çakalım
  For x = 0 to 319
    l = (RND * 35)
    IF l = 1 THEN
      k = 21
      LINE (x - 2, y - 2) - (x + 2, y + 2), k, BF
    END IF
    IF l = 12 OR l = 7 THEN
      k = 41
      LINE (x - 1, y - 1) - (x + 1, y + 1), k, BF
    END IF
    IF l = 5 OR l = 9 THEN
      k = 63
      LINE (x - 2, y - 2) - (x + 2, y + 2), k, BF
    END IF
  Next
Next



Temel bir ekran üretmiş olduk. Bulandırma etkisinin iyi gözükebilmesi için, renkleri şimdiden boyadım. şimdi ekranda, alev

efektinde olduğu gibi, temel kıvılcımları çakmış olduk. Bundan sonra, bu kıvılcımları çevre nokta renkleriyle bulunan bir

ortalama değerle yeniden boyayalım;


Kod: [Seç]

'BLUR

For Blur = 0 to 4
  For y = -30 to 229
    For x = -30 to 349
      a1 = POINT(x, y)
      a2 = POINT(x + 1, y)
      a3 = POINT(x + 1, y - 1)
      a4 = POINT(x + 1, y + 1)
      a5 = POINT(x - 1, y - 1)
      a6 = POINT(x - 1, y + 1)
      a7 = POINT(x, y + 1)
      a8 = POINT(x, y - 1)
      a9 = POINT(x + 2, y)
      a10 = POINT(x + 2, y - 1)
      a11 = POINT(x + 2, y + 1)
      a12 = POINT(x + 2, y - 2)
      a13 = POINT(x + 2, y + 2)
      a = (a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12 + a13) \ 13
      IF a THEN PSET (x, y), a
    NEXT
  NEXT
NEXT        



Buraya kadar, renk değerleri, blur etki gücü gibi değişkenleri istediğiniz gibi değiştirebilirsiniz. Bundan sonra ana döngüye gireceğiz. Birbirine kaynaşmış ve yumuşak geçişleri olan bir resmimiz var. Ana döngüde yanlızca bu resmin oluştuğu renklerin tonlarını koyudan parlağa kaydırıcaz...

Kod: [Seç]

dk% = 1
dy% = 1
dm% = 1
DO
a$ = INKEY$
FOR t% = 2 TO 63
  OUT &H3C7, t%                             'Bu porttan, rengin tonlarını OKURUZ!
  k% = INP(&H3C9) + dk%
  y% = INP(&H3C9) + dy%
  m% = INP(&H3C9) + dm%
  IF k% > Son% THEN k% = Son%: dk% = -dk%
  IF y% > Son% THEN y% = Son%: dy% = -dy%
  IF m% > Son% THEN m% = Son%: dm% = -dm%
  IF k% < 0 THEN k% = 3: dk% = -dk%
  IF y% < 0 THEN y% = 3: dy% = -dy%
  IF m% < 0 THEN m% = 3: dm% = -dm%
  OUT &H3C8, t%
  OUT &H3C9, k%
  IF t% > 21 THEN OUT &H3C9, y% ELSE OUT &H3C9, 0
  IF t% > 42 THEN OUT &H3C9, m% ELSE OUT &H3C9, 0
NEXT
WAIT &H3DA, 8
LOOP UNTIL a$ <> ""



şimdi ekranda vıcık vıcık bişeyler görebilirsiniz. Tekrar anlatıyorum;
Ne yaptık ?
1 - Ekranda, yumuşatılmak üzere, rastgele noktalar yaptık.
2 - Bu noktaların renklerini, çevre noktaların renkleriyle ortaladık ve yeni bir renk elde edip bu noktaya yazdık.
3 - Renk tonlarını döngüde, parlattık...

Bu kadar(mış) :D...

Bu plazma etkisi, yazdığım ilk plazma örneği olduğundan bazı eksiklikler, otlar vs vs bulunabilir. Ama eminim ki, plazma etkisi nedir denildiğinde artık bir cevabınız var...

Bu etki ile yapabileceğiniz çok farklı işler var;
http://www.uploadyeri.com/index.php/files/get/vYK6450r4k/plazma.rar
Başlık: Bilmediğiniz renkler...
Gönderen: hannibal - 04.07.2009 17:43:25
Bu alev ve plazma etkileri için, QB4.5 dilini ve belli renk tayflarını kullandık. Peki ya 'PROTECTED MODE' da işler nasıl
olurdu ? Bu etkiler için, 32 bit lik ortamda nasıl ton ataması yapılır ?

   Bilgisayarda renkler nasıl gösterilir ? Aslında, yukarıda yazmış olduğum örneklerde bu konuyu anlamış olmanız gerekir.

Renkler, içerdiği tonlardan bağımsız bir şekilde bulunurlar. 320x200x8 lik bir ekranda, 0 dan 255 e toplam 256 adet RENK YAZMACI bulunur. Bu yazmaçlara, 0 - 63 arası değerde, KYM tonları yazılabilinir. Yani, renk yazmaçları ve bu renklerin tonları diye iki adet kavram vardır. şimdi büyük bir yanlış anlamayı düzeltelim. Dikkat edin, içeriği az ama bulunması zor bir bilgidir. 32 bitlik bir derinliğe sahip ekranda, Alpha tonları ekarte edilirse, 16,777,216 tane renk yazmacımız var demektir. (Ağlayasım geldi biz hala 256 tanesiyle uğraşıyoz :D) 16M ekranında okunulan bir noktadan 4 hecelik (bytes) bir veri döner;

  P = NOKTA(x, y)

  Eğer bu nokta siyah ise P  = 0, kıpkırmızı ise P = 255, sap sayı :D ise P = 65535 olarak döner, işte burda küçük bir yanlış anlama yapmaktayız;

NOT : ARGB yada ABGR şeklinde sıralanmış olabilir. Ben ABGR ye göre yazıyorum!

Siyah.......:     0 = 00 00 00 00
Kırmızı.....:   255 = 00 00 00 FF
Sarı........: 65535 = 00 00 FF FF

P = Nokta(x,y) ile dönen 4 hecelik değerin ilk hecesi kırmızı tonu, ikinci hecesi yeşil tonu, üçüncü hecesi mavi tonu ifade

eder diye biliriz çoğumuz. Bu uygulamada doğrudur. Ancak burda dönen değer aslında renk yazmacının değeridir. Yani,

kıpkırmızı gördüğümüz noktada 255 nolu renk vardır, sapsayı da ise 65535 nolu renk vardır ve dönen değerler sadece renk

numaralarıdır. IBM pc açıldığında, bu renk yazmaçlarına sıralarına uygun olarak tonlar atandığı için, 32 bitlik noktadan dönen değer ABGR olarak ta kullanılabilmektedir. Ama sadece renk numarasıdır aslında....

Alev ve Plazma etkilerinde renklerin tonlarıyla nasıl oynadığımızı hatırlayın. Aynı şekilde, simsiyah gözüken noktanın yani,

0. rengin tonlarını değiştirerek bembeyaz yapabiliriz. Ve dönen noktadaki renk değeri yine 0 olur. Umarım anlatabilmişimdir.

ışte bu ton değiştirme özelliğini 32 bitlik ortamda da kullanabiliriz. Böylece, plazma etkisi için, tek tek renk değiştirmek

yerine daha hızlı olan ton değiştirme yöntemini yine kullanabiliriz. Ancak, !PROTECTED MODE' da VGA portlarına direk erişemezsiniz ama eminim bununda bir yolunu DXD ciler bulacaktır...
Başlık: Tekniker
Gönderen: darkBLACK - 05.07.2009 20:44:25
bu örnekler de belki birilerinin işine yarar...

hxxp://cyberdoomsystems.narod.ru/ripp.html
Başlık: Tekniker
Gönderen: spritus - 05.07.2009 22:54:07
ben de zamanında efektleri öğrenirken yazdığım qbasic kodlarını paylaşayım dedim

http://s2.dosya.tc/efct.rar.html
Başlık: Tekniker
Gönderen: hannibal - 06.07.2009 02:20:53
ındirdim baktım. Demekki aynı yollarda yürümüşüz. Çok Güzel Demolar bunlar, umarım indiren çok olur öğrenecekleri çok şey var.
Başlık: Tekniker
Gönderen: spritus - 06.07.2009 11:33:32
Alıntı yapılan: hannibal;20987
ındirdim baktım. Demekki aynı yollarda yürümüşüz. Çok Güzel Demolar bunlar, umarım indiren çok olur öğrenecekleri çok şey var.


teşekkürler :)
Başlık: Tekniker
Gönderen: hannibal - 06.07.2009 16:00:15
Hele o duman yok mu ? Alevi dikey değilde trigonometrik olarak dağıtma fikri. O çok güzel. Bence onun tutorunu yazmalısın. Kodlarımız 'yastık altında' kalmasın :D
Başlık: Tekniker
Gönderen: einhander - 07.07.2009 00:09:42
Ölesine bişiler yapmıştım
download:
http://rapidshare.com/files/252766853/efct2.zip.html
Başlık: Tekniker
Gönderen: hannibal - 07.07.2009 02:53:29
Fişekler çok tatlı olmuş. Bir game-end scene olabilir :)
Başlık: Tekniker
Gönderen: spritus - 07.07.2009 11:21:06
Alıntı yapılan: hannibal;20989
Hele o duman yok mu ? Alevi dikey değilde trigonometrik olarak dağıtma fikri. O çok güzel. Bence onun tutorunu yazmalısın. Kodlarımız 'yastık altında' kalmasın :D



heheh.. evet fire efektinden bozma birşey o :)

aşağıdaki demoda uygulamalı versiyonu var, ama çalıştırmakta güçlük çekebilirsin:
http://www.pouet.net/prod.php?which=11765

diğer prodüksiyonlar için:
http://resident.tr-demoscene.info/V2/Prods
veya http://www.pouet.net/groups.php?which=3381
Başlık: Tekniker
Gönderen: hannibal - 07.07.2009 18:09:38
Bu caret i sizmi yazdınız ? :D süper ya. Ben bu demoyu bi kaç yıl önce görmüştüm. Vay be gavurlara bak neler yazıyorlar demiştim. Zaman zamanda aklıma gelir dururdu tembelliğimden yazmazdım 3D ASCII li bir örnek. Tebrik ettim, anesthetic, decipher, spritus ve flexi ile ayrı ayrı gurur duydum.
Başlık: Tekniker
Gönderen: spritus - 07.07.2009 23:51:54
Alıntı yapılan: hannibal;20995
Bu caret i sizmi yazdınız ? :D süper ya. Ben bu demoyu bi kaç yıl önce görmüştüm. Vay be gavurlara bak neler yazıyorlar demiştim. Zaman zamanda aklıma gelir dururdu tembelliğimden yazmazdım 3D ASCII li bir örnek. Tebrik ettim, anesthetic, decipher, spritus ve flexi ile ayrı ayrı gurur duydum.


teşekkürler. o demo daha çok anes ve flexi'nin eseridir :)