Günümüzdeki güçlü PCler  ile birçok  demo efektini  yapmak oldukça  kolaylaşmaya
başladı ancak Atari 800XL, Atari ST, Spectrum, Amstrad, Commodore 64,  Amiga  ve
benzeri bazı  eski  platformlarda efekt  yapmak  hala zorluğunu  koruyor.  Amiga
bunların  arasından  sıyrılmayı  biraz  başarsa  da  elbette  ki  Amiga   500'de
çalışacak bir demo yazmak istiyorsanız yine aynı sorunla karşı karşıyasınız.

Yazınınn hemen  başında  belirtmeliyim  ki hayatım  boyunca  adam  akıllı  Linux
kullanmadığım için  anlatacağım  yöntemlerin  hepsi  Windows  platformuna  bağlı
olacaktır. Ancak PC  scene'inde en çok  kabul gören platform  Windows olduğu  ve
son yıllarda  DirectX'in  de  OpenGL'e  scenede  sağladığı  üstünlük  göz  önüne
alınırsa, 2005  yılı  itibariyle  platform  seçimimden  rahatsız  olmayacağınızı
ümit ediyorum.

Şimdi asıl konumuza gelelim.  PC'de demo efekti yapmak  kolay mı? Bence  oldukça
kolay çünkü  kullanabileceğiniz  yüzlerce  dil  var.  Bu  dillerden  birine  iyi
derecede hakim  olmanız  ve bu  dilden  grafik ekranına  erişebilmeniz  yeterli.
Ancak demoscenede kabul  görmeniz için  yeterli değil. PC  Scene'inde 15  yıldır
(zaten çok daha uzun bir  geçmişi yok PC sceneinin) kabul  gören ve bence de  en
iyi ikili  Assembler&C/C++'dır.  Ne  var ki  günümüzde  birçok  hazır  kütüphane
(library) kullanıldığı  için Assembler'a  eskisi  kadar ihtiyaç  duyulmuyor.  Bu
durumda herşey dönüp  dolaşıp C/C++'da  bitiyor. Peki C  mi C++  mı? Eğer  dosya
boyutunun  küçük   olmasını  istiyorsanız,   örnek  olarak   4KB'lık  bir   demo
hazırlıyorsanız, ANSI C kullanmanız  en ideali olacaktır.  Ancak büyük bir  demo
projesine  giriyorsanız,  nesneye  yönelik   programlama  (OOP)  ve   sınıfların
(class) kullanımı işinizi  kolaylaştırabilir (tabii  kolaylaştırmaya da  bilir).
Bu durumda C++ tercihiniz olmalı.

Bu ön bilgilerden  sonra gelelim  konumuza yani "test  platformu"ndan kastın  ne
olduğuna.  PC'de  Visual  C++,  Borland   C++,  LCC  ve  benzeri   derleyicileri
kullanarak aklınıza  gelen  bir demo  efektini  hızlıca test  etmek  tecrübe  ve
önceden  hazırlanmış  taslak  projeler  gerektirir.   Eğer  bu  tür  bir   bilgi
birikiminiz yoksa  efekti  hızlıca  test etmek  için  açtığınız  derleyici  size
bakar,  siz  derleyiciye.  Daha   sonra  kendinizi  Google'da  kaybolmuş   halde
bulabilirsiniz. İşte  bu döküman  yeni başlayanlara  bazı şeyleri  hızlıca  test
etme yöntemleri göstermek ve  PC harici platformlarda  efekt yapan kişilerin  de
efektlerini  PC'de   test  edip   kendi  platformlarına   nasıl  uygun   biçimde
aktarabileceklerini anlatmak amacıyla hazırlandı.

Öncelikle Windows'un  üzerinde gelen  hazır bazı  yapı ve  dillerle  başlayalım.
Test platformu için kullanışlı olanlar:

1) HTML ve ona  bağlı temel scripting dilleri  olan JavaScript, VBScript ve  VML
(Vector Markup Language).
2) VBScript  ve  JavaScript'in  HTML  harici,  VBS  ve  JS  dosya  uzantılarıyla
kullanımı ve ActiveX kontrolleri.
3) TinyPTC kütüphanesi.

Windows'un  üzerinde   hazır  gelmese   de  kullanımı   çok  basit   olan   bazı
kütüphaneler  vardır.   Bunlardan  benim   karşılaştığım  en   basit   kütüphane
TinyPTC'dir.

Elbette ki efektleri hızlıca  test etmenin QBasic, Turbo  C++ gibi başka  pratik
yolları  da   var  ancak   günümüzde   Windows  versiyonları   ilerledikçe   DOS
uygulamalarının  çalışmamaya   başlaması  nedeniyle   bu  yöntemleri   anlatmayı
gerekli görmüyorum. DarkBasic,  PureBasic, BlitzBasic gibi  basic dillerini  ise
kullanışlı olmaları  ve yüksek  kaliteli  sonuçlar üretmelerine  rağmen  scenede
kabul görmedikleri  için (ve  ben de  kullanmadığım için)  pas geçiyorum.  Ancak
elbette ki  bu basic  dilleri ve  Python, PHP  gibi diğer  scripting dilleri  de
benzer amaçlarla kullanılabilirler.

Şimdi   sırayla    yukarıda    maddelenen   konuları    anlatmaya    başlayalım.

HTML, Scripting Dilleri ve VML:

Aslında HTML tek başına efekt programlamada hemen hemen hiçbir işe  yaramaz.  En
fazla ekran  düzeni  gibi şeyleri  görmemiz  için kullanışlı  olabilir  ki  bunu
herhangi bir çizim programıyla da yapmamız mümkün. Ancak HTML'in  içersinde  yer
alan  form  objeleri,   DIV,  SPAN   gibi  bazı   tagler  scripting   dilleriyle
birleştirilince çok  güzel kullanım  alanlarına  sahip oluyorlar.  Özellikle  ön
hesaplamalarda (precalculation) çok  hızlı bir şekilde  kullanımı mümkün.  Hemen
bir örnek ile başlayalım.  HTML kullanarak bir  sinus tablosu hesaplatıp  ekrana
yazdıralım.

Standart HTML yapısıyla sinus tablosu oluşturma:

sinus1.htm
<html><head> <title>Sinus Hesaplama</title></head><body><script
language="JavaScript"><!--for(i = 0; i < 256; i++){ a = Math.sin(i / 128 *
Math.PI); document.write(a + "<br>");}//--></script></body></html>
 

Pratik yoldan sinus tablosu oluşturma:

sinus2.htm <script>for(i = 0; i < 256; i++){ a = Math.sin(i / 128 *
Math.PI); document.write(a + "<br>");}</script>
 

Her iki texti  de Notepad'de yazıp  .HTM ya da  .HTML uzantısıyla  kaydettiğiniz
ve bu dosyaları  açtığınız taktirde  browser ekranında  aynı sonucu  görürsünüz.
Elbette ki  çok  eski  ya  da  çok  tanınmamış  browserlarda  ikinci  yol  sorun
çıkarabilir ancak  günümüzde  kullanılan Internet  Explorer,  Firefox,  Mozilla,
Netscape, Opera gibi browserlarda her iki versiyon da çalışacaktır.

Burada  kullandığımız  dil  JavaScript.  Detaylı  bir  JavaScript  dersi  vermek
yerine;

http://www.w3schools.com/js/default.asp
http://javascript-reference.info/
http://www.dayanahost.com/downloads.cfm 

Bu  URL'leri,   matemetik   fonksiyonları   kullanmak   için   "Math"   sınıfını
kullanmanız  gerketiği  ve   ilk  harfinin   büyük  olmak   zorunda  olduğu   ön
bilgilerini veriyor ve bu konuda gerisini size bırakıyorum.

Peki   HTML+JavaScript   kullanarak   yalnızca   hızlı   ön   hesaplamalar   mı
yapabiliyoruz? Başka  bir espirisi  yok mudur?  Olmaz mı.  Gelin  JavaScript'den
bir küp çevirelim.

küp1.htm <html>
<head>
<title>Cube3D Demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9">
</head>
<body bgcolor="#000000" onResize="return false" onContextMenu="return false"
onSelectStart="return false" onScroll="return false">
<script>
// Küplerin Köşelerini Temsil Eden Grafik Parçalarının Yer Aldığı Tabakaları
Hazırla
for(i = 0; i < 8; i++)
    document.write("<div id='v" + i + "' style='position:absolute; left:0px;"
+ "top:0px; width:30px; height:30px; z-index:1'><b id='s" + i +
"'>•</b></div>");

// Global Değişkenleri Tanımla
var firstCoorX = new Array(100, 100, 100, 100, -100, -100, -100, -100);
var firstCoorY = new Array(100, 100, -100, -100, 100, 100, -100, -100);
var firstCoorZ = new Array(100, -100, 100, -100, 100, -100, 100, -100);
var coorX = new Array();
var coorY = new Array();
var coorZ = new Array();
var zoom = 300, dist = 350;
var midX = 200, midY = 200;
var PI = 3.1415926535;
var angleXaxis = 0, angleYaxis = 0, angleZaxis = 0;
var hexN = new Array();
hexN[0] = "0";
hexN[1] = "1";
hexN[2] = "2";
hexN[3] = "3";
hexN[4] = "4";
hexN[5] = "5";
hexN[6] = "6";
hexN[7] = "7";
hexN[8] = "8";
hexN[9] = "9";
hexN[10] = "A";
hexN[11] = "B";
hexN[12] = "C";
hexN[13] = "D";
hexN[14] = "E";
hexN[15] = "F";

// Küp Çevirme Fonksiyonu
function rotateCube()
{
    for(i = 0; i < 8; i++)
    {
        // X Ekseninde Çevir
        coorY[i] = firstCoorY[i] * Math.cos(angleXaxis / 180.0 * PI) + 
        firstCoorZ[i] * Math.sin(angleXaxis / 180.0 * PI);
        coorZ[i] = firstCoorY[i] * Math.sin(angleXaxis / 180.0 * PI) -
        firstCoorZ[i] * Math.cos(angleXaxis / 180.0 * PI);
        // Y Ekseninde Çevir
        coorX[i] = coorZ[i] * Math.cos(angleYaxis / 180.0 * PI) + 
        firstCoorX[i] * Math.sin(angleYaxis / 180.0 * PI);
        coorZ[i] = coorZ[i] * Math.sin(angleYaxis / 180.0 * PI) - 
        firstCoorX[i] * Math.cos(angleYaxis / 180.0 * PI);
        // Z Ekseninde Çevir
        temp = coorX[i];
        coorX[i] = coorX[i] * Math.cos(angleZaxis / 180.0 * PI) + 
        coorY[i] * Math.sin(angleZaxis / 180.0 * PI);
        coorY[i] = temp * Math.sin(angleZaxis / 180.0 * PI) - 
        coorY[i] * Math.cos(angleZaxis / 180.0 * PI);
    }
    // Dönüş Açılarını Arttır
    angleXaxis = (angleXaxis + 1) % 360;
    angleYaxis = (angleYaxis + 2) % 360;
    angleZaxis = (angleZaxis + 3) % 360;
}

// İzdüşüm ve Plot Fonksiyonu
function setCube()
{
    for(i = 0; i < 8; i++) // Her 8 Köşe İçin
    {
        if(coorZ[i] + dist > 0) // Eğer Görünür Durumdaysa
        {            // FORMÜL: projection_x = x / (z + distance) * zoom
            px = coorX[i] / (coorZ[i] + dist) * zoom;            // FORMÜL:
projection_y = y / (z + distance) * zoom 
            py = coorY[i] / (coorZ[i] + dist) * zoom;            // FORMÜL:
vertex_position_x = center_of_the_area + projection_x
            document.all("v" + i).style.left = midX + px;            //
FORMÜL: vertex_position_y = middle_of_the_area + projection_y
            document.all("v" + i).style.top = midY + py;
            document.all("s" + i).style.fontSize = (300 - coorZ[i]) / 5;
            document.all("s" + i).style.color = "#" +               
conv2Hex(parseInt((550 - coorZ[i]) / 3, 10)) + "0000";
        }
    }
}

// 10'ludan 16'lı Sayı Sistemine Dönüşüm Fonksiyonu
function conv2Hex(decval)
{
    leftval = parseInt(decval / 16, 10);
    rightval = decval % 16;
    hexval = hexN[leftval] + hexN[rightval];
    return hexval;
}

// Ana Rutin
function cubeAnim()
{
    rotateCube(); // Kübü Çevir
    setCube(); // İzdüşüm Al ve Çiz
    setTimeout("cubeAnim()", 20); // 20 Milisaniye Sonra Bir Sonraki Ekranı
Çiz
}
cubeAnim(); // İlk Ekranı Hesapla</script>
</body>
</html>
 

Not: Sayfa  genişliğine  sığması için  bazı  alanlar alt  satıra  kaydırılmıştır
ancak kes&yapıştır yöntemiyle alındığında program çalışacaktır.

Bu örnekte de  görüldüğü üzere HTML  ve JavaScript temel  bazı demo  efektlerini
yapmak için yeterlidir. Zaten Demoscene'de "Scripting" isimli bir  demo  yarışma
kategorisinin oluşumunda Action Script'in ardından en önemli dillerden  biri  de
Java Scripttir.

Yukardaki kodu  açıklamıyorum, yalnızca  bir örnek  olarak veriyorum.  Ancak  bu
örnekte dikkatinizi çekmek  istediğim bir nokta  var. O da  küpün yalnızca  köşe
noktalarından ibaret olması. O  noktalar da aslında  birer ASCII karakter.  Peki
bizim bu noktalar yerine wireframe yani çizgilerden oluşan bir  vektör  yapmamız
mümkün değil  mi? Aslında  pek  de mümkün  sayılmaz.  Çünkü HTML  üzerine  pixel
basmak diye  bir mantık  yok. Pixel  basmak yerine  her bir  hücresi 1x1  pixele
denk gelen tablolar oluşturulabilir. Ancak bu tabloların da  boyuları  büyüdükçe
HTML  inanılmaz  derecede  yavaşlamaktadır.   Örnek  olarak  320x200  bir   alan
kullanmak imkansıza  yakındır.  Aksi taktirde  saniyede  1 frame  bile  görmemiz
mümkün olmayabilir.  Peki ne  yapmak gerekiyor?  Bu durumda  VML (Vector  Markup
Language)  yardımımıza  yetişiyor.  Hemen  ilgili  linkleri  verip  bir   örneğe
geçiyorum.

http://www.w3.org/TR/1998/NOTE-VML-19980513
msdn.microsoft.com/library/default.asp?url=/workshop/author/vml/default.asp


küp2.htm <html xmlns:v="urn:schemas-microsoft-com:vml">
<head>
<title>Cube3D Demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9">
<style>
        v\:* { behavior: url(#default#VML); }
</style>
</head>
<body bgcolor="#CCCCCC" onResize="return false" onContextMenu="return false" 
onSelectStart="return false" onScroll="return false">
<script>
// Küplerine Kenarlarını Temsil Eden Grafik Parçaları
for(i = 0; i < 12; i++)
    document.write("<v:line id='l" + i + "' from='0 0' to='0 0'/>");

// Global Değişkenleri Tanımla
var firstCoorX = new Array(100, 100, 100, 100, -100, -100, -100, -100);
var firstCoorY = new Array(100, 100, -100, -100, 100, 100, -100, -100);
var firstCoorZ = new Array(100, -100, 100, -100, 100, -100, 100, -100);
var coorX = new Array();
var coorY = new Array();
var coorZ = new Array();
var px = new Array();
var py = new Array();
var zoom = 300, dist = 350;
var midX = 200, midY = 200;
var PI = 3.1415926535;
var angleXaxis = 0, angleYaxis = 0, angleZaxis = 0;
var hexN = new Array();
hexN[0] = "0";hexN[1] = "1";hexN[2] = "2";hexN[3] = "3";
hexN[4] = "4";hexN[5] = "5";hexN[6] = "6";hexN[7] = "7";
hexN[8] = "8";hexN[9] = "9";hexN[10] = "A";hexN[11] = "B";
hexN[12] = "C";hexN[13] = "D";hexN[14] = "E";hexN[15] = "F";

// Küp Çevirme Fonksiyonu
function rotateCube()
{
    for(i = 0; i < 8; i++)
    {
        // X Ekseninde Çevir
        coorY[i] = firstCoorY[i] * Math.cos(angleXaxis / 180.0 * PI) + 
                   firstCoorZ[i] * Math.sin(angleXaxis / 180.0 * PI);
        coorZ[i] = firstCoorY[i] * Math.sin(angleXaxis / 180.0 * PI) - 
                   firstCoorZ[i] * Math.cos(angleXaxis / 180.0 * PI);
        // Y Ekseninde Çevir
        coorX[i] = coorZ[i] * Math.cos(angleYaxis / 180.0 * PI) +
                   firstCoorX[i] * Math.sin(angleYaxis / 180.0 * PI);
        coorZ[i] = coorZ[i] * Math.sin(angleYaxis / 180.0 * PI) -
                   firstCoorX[i] * Math.cos(angleYaxis / 180.0 * PI);
        // Z Ekseninde Çevir
        temp = coorX[i];
        coorX[i] = coorX[i] * Math.cos(angleZaxis / 180.0 * PI) + 
                   coorY[i] * Math.sin(angleZaxis / 180.0 * PI);
        coorY[i] = temp * Math.sin(angleZaxis / 180.0 * PI) - 
                   coorY[i] * Math.cos(angleZaxis / 180.0 * PI);
    }
    // Dönüş Açılarını Arttır
    angleXaxis = (angleXaxis + 1) % 360;
    angleYaxis = (angleYaxis + 2) % 360;
    angleZaxis = (angleZaxis + 3) % 360;
}

// İzdüşüm ve Plot Fonksiyonu
function setCube()
{
    for(i = 0; i < 8; i++) // Her 8 Köşe İçin
    {
        if(coorZ[i] + dist > 0) // Eğer Görünür Durumdaysa
        {
            // FORMÜL: projection_x = center_of_the_area + (x / (z + distance)
                       * zoom)
            px[i] = midX + (coorX[i] / (coorZ[i] + dist) * zoom);
            // FORMÜL: projection_y = middle_of_the_area + (y / (z + distance) 
                       * zoom)
            py[i] = midY + (coorY[i] / (coorZ[i] + dist) * zoom);
        }
    }
    // Taban Yüzeyini Çiz
    drawLine(0,1,"l0");
    drawLine(1,3,"l1");
    drawLine(3,2,"l2");
    drawLine(2,0,"l3");
    // Tavan Yüzeyini Çiz
    drawLine(4,5,"l4");
    drawLine(5,7,"l5");
    drawLine(7,6,"l6");
    drawLine(6,4,"l7");

    // Tavan ve Taban Yüzelerini Birleştiren Çizgilerini Çiz
    drawLine(0,4,"l8");
    drawLine(1,5,"l9");
    drawLine(2,6,"l10");
    drawLine(3,7,"l11");
}

// 10'ludan 16'lı Sayı Sistemine Dönüşüm Fonksiyonu
function conv2Hex(decval)
{
    leftval = parseInt(decval / 16, 10);
    rightval = decval % 16;
    hexval = hexN[leftval] + hexN[rightval];
    return hexval;
}

// Çizgi Çizen Fonksiyon
function drawLine(p1, p2, obj)
{
    document.all(obj).from = px[p1] + " " + py[p1];
    document.all(obj).to =
    px[p2] + " " + py[p2];
}

// Ana Rutin
function cubeAnim()
{
    rotateCube(); // Kübü Çevir
    setCube(); // İzdüşüm Al ve Çiz
    setTimeout("cubeAnim()", 20); // 20 Milisaniye Sonra Bir Sonraki Ekranı
Çiz
}
cubeAnim(); // İlk Ekranı Hesapla
</script>
</body>
</html> 

Not: Firefox  gibi  bazı  browserlar  henüz  VML'i  desteklemiyorlar.  Yukardaki
script  en   güvenli   biçimde   Internet   Explorer'ın   yeni   versiyonlarıyla
çalışacaktır.

Evet, gördüğünüz  gibi  derleyici  bile  yok,  yalnızca  Notepad'i  açıyoruz  ve
yazıyoruz. Ancak  amaç demomuzu  HTML platformunda  yapmak değil.  Burdaki  amaç
hızlıca aklımıza gelen  bazı efektleri test  etmek ya da bu  efektler için  veri
üretmek.

VBS ve JS:

Evet, gelelim  HTML  harici  scripting dillerinin  kullanımına.  HTML  scripting
örneklerinde JavaScript kullanmıştık.  Her iki  dilin de  yapısı hakkında  genel
bilginiz olması için HTML harici kullanımda Visual Basic Script kullanacağım.

İlk  olarak  JavaScript'den  ilk   yaptığımız  örneği  uygulayalım,  yani   HTML
kullanmadan Visual Basic Script'den bir sinus tablosu üretelim.

sinus1.vbs Dim i, a
Const pi = 3.1415926536

For i = 0 to 255
    a = a & sin(i / 128 * pi) & ", "
Next
MsgBox a
 

Evet işte oldu...  mu? Tam olarak  değil. Çünkü çıktıyı  artık browser  ekranına
veremiyoruz. Mesaj kutusu kullanarak ekrana yazdırdık ancak yine  sorunlar  var.
Birincisi mesaj çok uzun  olunca tamamı ekrana  gelmiyor. İkincisi mesaj  olarak
ekranda görsek de kes&yapıştır işlemini gerçekleştiremiyoruz. Peki  ne  yapmamız
gerekiyor? En iyi yöntem  sonuçları bir dosyaya yazdırmak.  Bunun için de  artık
ActiveX kullanmaya başlayabiliriz.

sinus2.vbs Dim i, a
Dim oFSO, tf
Const pi = 3.1415926536 
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set tf = oFSO.CreateTextFile("sonuclar.txt", True)
For i = 0 to 255
    tf.WriteLine(sin(i / 128 * pi))
Next
tf.Close
Set tf = Nothing
Set oFSO = Nothing
			
 

İşte  şimdi   oldu.   Ancak   sonuçlara   dikkat   edecek   olursanız   bazıları
"4,90676743275773E-02"  şeklinde  biçimlendirilmiş.  Bu  sorunu  gidermek   için
Visual  Basic   ve   Visual   Basic   Scripting'in   desteklediği   FormatNumber
fonksiyonunu kullanabiliriz. Bu durumda scriptin son hali;

sinus3.vbs Dim i, a
Dim oFSO, tf
Const pi = 3.1415926536 
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set tf = oFSO.CreateTextFile("sonuclar.txt", True)
For i = 0 to 255
    tf.WriteLine(FormatNumber(sin(i / 128 * pi), 7))
Next
tf.Close
Set tf = Nothing
Set oFSO = Nothin
 

Bu hale  geliyor. Burda  FormatNumber'a  verdiğimiz ikinci  parametre  değeriyle
virgülden sonra  7  basamağa hassas  bir  sayı olarak  biçimlendirmiş  oluyoruz.

ActiveX kullanımıyla birçok  şey yapmak, hatta  hatta OpenGL, DirectX  kullanmak
da mümkün ancak  Visual Basic  Script ya da  Java Script'i  bu amaçla  kullanmak
pek de anlamlı olmayacaktır. Bu scripting dillerini bu tür küçük  hesaplar  için
kullanmanızı tavsiye ederim.

TinyPTC:

Aslında TinyPTC yalnızca  ekrana nokta basmaya  yarayan bir grafik  kütüphanesi.
Yani çizgi  çizmek için  bile kendi  rutinlerinizi yazmanız  gerekiyor. Eğer  bu
tür şeylerin hazır geldiği  bir kütüphane istiyorsanız OpenPTC  ya da SDL  sizin
için daha  uygun olacaktır.  Ancak  kullanımı en  basit  ve en  temel  kütüphane
olması nedeniyle TinyPTC ile başlamayı uygun gördüm.

TinyPTC yalnızca 3 fonksiyondan oluşuyor.

• ptc_open
• ptc_update
• ptc_close

Hepsi bu kadar. Kullanımları  da oldukça basit. Aşağıda  çok basit bir  kullanım
örneği bulabilirsiniz.

test.c #include "tinyptc.h"

#define WIDTH 320
#define HEIGHT 200
#define SIZE WIDTH*HEIGHT

int buffer[SIZE];

int main()
{
    if(!ptc_open("Test Platformu", WIDTH, HEIGHT)) return 1;
    while(1)
    {
        // Programınızı Buraya Yazabilirsiniz
        ptc_update(buffer);
    }
    ptc_close();
    return 0;
}

Hepsi bu  kadar.  Yukarıda  tanımlanan  "buffer"  dizisine  24  bitlik  değerler
vererek  RGB  (kırmızı,  yeşil,   mavi)  renkler  tanımlayabiliyorsunuz.   Bunun
haricinde geri  kalan kullanım  DOS'dan  tanıdığımız 13h  (320x200x256)  moduyla
aynı.  Yani   (x,   y)  koordinatına   pixel   basmak  için   buffer   dizisinin
[y *  WIDTH +  x]inci elemanına  değer vermeniz  gerekiyor. 320x200  çözünürlüğü
için [(y  << 8)  +  (y <<  6)  + x]  şeklinde  optimize edilebilir.  Bu  elemana
vereceğiniz değer ise;

buffer[y * WIDTH + x] = (red << 16) | (green << 8) | blue;

Şeklinde ifade edilebilir. Burdaki  "red", "green" ve  "blue" 0-255 arası  değer
alabilen birer byte olarak verilmelidir.

Elbette  ki  TinyPTC  kütüphanesinin  yukardaki  dosya  haricinde  10  civarında
program dosyası ve  proje dosyaları  var. Ancak  siz yalnızca  tek bir  dosyayla
uğraşarak istediğinizi yapabiliyorsunuz. Bunun yanı sıra  "tinyptc.h"  dosyasını
düzenleyerek de  projenin çeşitli  parametrelerini değiştirmeniz  mümkün.  Örnek
olarak projenin  DirectDraw,  GDI ya  da  VFW arabirimlerinden  herhangi  birini
kullanmayı seçebiliyorsunuz.  Ayrıca  programınızın  tam  ekran  ya  da  pencere
modunda  çalışmasını,  pencere  modunda  çalışacaksa  pencere  özelliklerini  bu
dosyaya  yalnızca  comment  (açıklama,   yorum)  sembolleri  ekleyip   çıkararak
düzenleyebiliyorsunuz. Örnekler:

DirectDraw kullanmak için:
#define __PTC_DDRAW__
//#define __PTC_GDI__
//#define __PTC_VFW__

GDI kullanmak için:
//#define __PTC_DDRAW__
#define __PTC_GDI__
//#define __PTC_VFW__

VFW kullanmak için:
//#define __PTC_DDRAW__
//#define __PTC_GDI__
#define __PTC_VFW__

TinyPTC'yi indirebileceğiniz web adresi:

http://gaffer.scene.org/tinyptc/ 

Eğer TinyPTC'yi Visual Studio  ile kullanmak isterseniz  işiniz çok kolay  çünkü
zaten yukarıdaki linkten  indirebileceğiniz örnek proje  Visual Studio 6.0  için
hazır geliyor. VS.NET'e de kolayca çevrilebiliyor.

Ancak TinyPTC Assembler da kullanıldığı  için proje derlenirken NASM'ye  ihtiyaç
duyuyor.  Bu   tool  elinizde   yoksa  aşağıdaki   adreslerden  indirebilir   ve
kurabilirsiniz.

http://www.geocities.com/SiliconValley/Heights/1295/                            
http://nasm.sourceforge.net/doc/html/nasmdoc1.html

Projeyi LCC ile derlemek  isterseniz projede yalnızca  bir iki küçük  değişiklik
yapmanız gerekiyor.  Bunun haricinde  üretilen  objeleri linkleyecek  bir  batch
dosyası  hazırlamanız  ya   da  LCC   için  yazılmış  bir   arabirim  bulup   bu
arabilirimden linker ayarlarını  yapmanız gerekiyor. LCC  ile kullanım için  bir
batch dosyası örneği:

compile.bat @echo off
del test.exe
del ddraw.obj
del convert.obj
del test.obj
lcc ddraw.c -nw
lcc convert.c
@echo on
lcc test.c
lcclnk test.obj  mmx.obj ddraw.obj  convert.obj -o  test.exe -subsystem  windows
pause
test
 

Ancak LCC kullanmaya çalışırken başka problemler de  yaşayabilirsiniz.  Bunların
hepsinin çözümleri  Google'da biraz  dolaşarak  bulunabiliyor ancak  kolay  yolu
seçmek isterseniz Visual C++ 6.0'ı tavsiye ederim.

Bu Yöntemlerin Başka Platformlar İçin Kullanılması:

Yukardaki yöntemler ile PC'de  hızlıca bir efekti test  edebilir, daha sonra  bu
efektin daha profesyonel  bir biçimde  programlanmasına girişebilirsiniz.  Ancak
yukardaki  yöntemler  PC'de  olduğu  kadar   Commodore  64,  Amiga  gibi   diğer
platformlar için de  oldukça pratik  olabiliyor. Hatta  hatta diğer  platformlar
için scripting dilleri  ya da C/C++  kullanarak kaynak kod  bile üretmek  mümkün
ki zaten bu  sıkça kullanılan bir  yöntem. Bu sayede Commodore  gibi işlem  gücü
ve matemetik  fonksiyonları  konusunda  sıkıntı çeken  platformlar  için  birçok
tablo hazırlayabiliyor,  yalnızca  Commodore  kullanarak  hesaplatılması  günler
hatta  aylar  alabilecek  efektleri  (örnek:  vector  city)  hızlıca  hesaplatıp
Commodore'a aktarmak mümkün  olabiliyor. Ayrıca PC'nin  bizlere sağladığı  güçlü
toollar sayesinde bu efektler çok daha kaliteli olabiliyor. Ancak  PC'nin  başka
platformlarda demo yapmak için nasıl kullanıldığı çok kapsamlı bir  konu  olduğu
için bu  konuyu başka  bir sayıda  ele almayı  düşünüyorum. Şimdilik  bu  kadar.
Sizlere bol test platformlu günler diliyorum.


Benimle irtibata geçmek isteyenler için e-mail adresim;
[b]skate@glance.ws

Emir Akaydın
Skate / Glance[/b] 