TEST PLATFORMU

Günümüzdeki güçlü PC'ler 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ın hemen başında belirtmeliyim ki hayatım boyunca adamakı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ı itibarıyla 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 scene'inin) 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çerisinde yer alan form objeleri, DIV, SPAN gibi bazı tag'ler 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 text'i de Notepad'de yazıp .HTM ya da .HTML uzantısıyla kaydettiğiniz ve bu dosyaları açtığınız takdirde 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, matematik fonksiyonları kullanmak için "Math" sınıfını kullanmanız gerektiğini 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 esprisi yok mudur? Olmaz mı. Gelin JavaScript'ten 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 JavaScript'tir.

Yukarıdaki 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 boyutları büyüdükçe HTML inanılmaz derecede yavaşlamaktadır. Örnek olarak 320x200 bir alan kullanmak imkansıza yakındır. Aksi takdirde 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üplerin 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üzeylerini 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. Yukarıdaki 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. Buradaki 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'ten ilk yaptığımız örneği uygulayalım, yani HTML kullanmadan Visual Basic Script'ten bir sinüs 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 = Nothing

Bu hale geliyor. Burada 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'tan 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. Buradaki "red", "green" ve "blue" 0-255 arası değer alabilen birer byte olarak verilmelidir.

Elbette ki TinyPTC kütüphanesinin yukarıdaki 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 arabirimden 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ı:

Yukarıdaki 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 yukarıdaki 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 matematik 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; skate@glance.ws

Emir Akaydın Skate / Glance