Gönderen Konu: Tekniker  (Okunma sayısı 100838 defa)

Tekniker

« : 18.03.2004 03:05:46 »
Hızlı düğmeleri aç

spaztica

İleti: 1.493

Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
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.

Tekniker

« Yanıtla #1 : 18.04.2005 01:21:46 »
Hızlı düğmeleri aç

bzdgn

İleti: 13

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
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.

Tekniker

« Yanıtla #2 : 18.04.2005 01:25:03 »
Hızlı düğmeleri aç

bzdgn

İleti: 13

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
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.

Tekniker

« Yanıtla #3 : 19.04.2005 03:03:25 »
Hızlı düğmeleri aç

scg

İleti: 214

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
    • http://
:: 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ş

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

Tekniker

« Yanıtla #4 : 19.04.2005 09:45:43 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
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ı...

Tekniker

« Yanıtla #5 : 19.04.2005 12:39:00 »
Hızlı düğmeleri aç

spritus

İleti: 933

Çevrimdışı
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info
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

Tekniker

« Yanıtla #6 : 19.04.2005 14:42:57 »
Hızlı düğmeleri aç

scg

İleti: 214

Çevrimdışı
  • ***
  • Full Member
    • Profili Görüntüle
    • http://
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 ???

Tekniker

« Yanıtla #7 : 19.04.2005 16:07:53 »
Hızlı düğmeleri aç

skate

İleti: 5.245

A Sinner Scener
Çevrimdışı
  • Administrator
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://www.akaydin.com/
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.

Tekniker

« Yanıtla #8 : 24.04.2005 12:09:35 »
Hızlı düğmeleri aç

eirik

İleti: 312

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
    • http://localhost/
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.orgdan 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.

Tekniker

« Yanıtla #9 : 25.04.2005 20:24:50 »
Hızlı düğmeleri aç

tesla

İleti: 426

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
    • http://
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.

Tekniker

« Yanıtla #10 : 26.04.2005 14:01:43 »
Hızlı düğmeleri aç

spritus

İleti: 933

Çevrimdışı
  • *****
  • Hero Member
    • Profili Görüntüle
    • http://resident.tr-demoscene.info
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/javaadv.html
http://demo-effects.sourceforge.net/
http://equinox.planet-d.net/java/
http://www.cs.helsinki.fi/u/mourujar/java/

Tekniker

« Yanıtla #11 : 26.04.2005 17:40:19 »
Hızlı düğmeleri aç

tesla

İleti: 426

Çevrimdışı
  • ****
  • Sr. Member
    • Profili Görüntüle
    • http://
Gönderdiğin linkler sorunun cevabını hayli hayli karşılıyor. Çok sağol... spritus  ;)

Tekniker

« Yanıtla #12 : 07.08.2005 20:32:23 »
Hızlı düğmeleri aç

disq

İleti: 93

Çevrimdışı
  • **
  • Jr. Member
    • Profili Görüntüle
    • http://www.oynasana.com/
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);
}

alev

« Yanıtla #13 : 04.07.2009 04:15:34 »
Hızlı düğmeleri aç

hannibal

İleti: 17

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
    • http://site.mynet.com/arcokyazilim/
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
« Son Düzenleme: 05.07.2009 08:52:53 Gönderen: hannibal »
c64 ile doğdum, amiga ile büyüdüm, x86 ile yıprandım...

Plazma

« Yanıtla #14 : 04.07.2009 16:55:53 »
Hızlı düğmeleri aç

hannibal

İleti: 17

Çevrimdışı
  • *
  • Newbie
    • Profili Görüntüle
    • http://site.mynet.com/arcokyazilim/
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
« Son Düzenleme: 05.07.2009 08:53:45 Gönderen: hannibal »
c64 ile doğdum, amiga ile büyüdüm, x86 ile yıprandım...