30 Nisan 2009 Perşembe

FLASHTA XML OKUMA

Flash Xml okuma konusunda cok fazla kolaylık sunan bir action script yapısına sahiptir.Xml belgenizi swf ile aynı yere kaydettiğinizi varsayarak yazıma baslıyorum.
Örneğin yazılar.xml adında bir belgeniz var.İçeriğinde
Root olarak yazılar ve node olarak yazı var.Nodların içerik ve isim olarak özellikleri olsun.Bu nodlara ve özelliklerine ulaşmak için actionscriptte şu kodu yazınız.

var xml:XML=new XML();
xml.ignoreWhite=true;
xml.onLoad=function()
{
var nodes=this.firstChild.childNodes;
numOfItems=nodes.length;
for(var i=0;i numOfItems;i++)
{
//Burada yazı isimleri nodlardayiz.
Text1.text+=nodes[i].attributes.isim;
//Şimdi ise nodelarda olan isim özelliğiklerinin tümünü //Text1 isimli flash textboxuna yazdırmış bulunuyoruz.

}
}
Xml.Load(“yazılar.xml”);

29 Nisan 2009 Çarşamba

FLASH İLE ASPDEN VERİ ALMA

var al:LoadVars = new LoadVars();
al.onLoad = function(success) {
if(success){
var ad = this.model;//this al değişkenini gösteriyor
var soyad = this.product;
m.text=ad;
n.text=soyad;

}
}
al.load("gonderici.asp");

Burada m ve n isimli iki textboximiz var.gonderici.asp den gelen
iki stringi bunlara atıyoruz.
Asp sayfamızın içeriğide şu şekilde olmalıdır.

<@LANGUAGE="VBSCRIPT"%>

<
Response.Write "&model=kamil&"
Response.Write "&product=deneme&

>

FLASHTAN ASPX/ASP/PHP…YE VERİ GÖNDERME

Öncelikle actionscript te var gonder:LoadVars=new LoadVars();
Tanımlamasını yapın.gonder içinde aspye gondereceğimiz verileri tutup bunları gönderecek değişkendir.Sonra
gonder.yazi1=”bunu gönder”;
gonder.yazi2=”bunuda gonder”

sonra mesela gonderme işlemini bir butona atayalım.Bir buton çizin.Adını gonder_buton koyun.
gonder_buton.onRelease=function()
{
Gonder.send(“alici.aspx”,”_blank”,”POST”);
}
Buraya kadar flash istediğimiz verileri gönderiri.
Kısacası flash şimdi boş bir sayfa açacak ve sayfanın urlsi şu şekilde olcak
Flashın bulunduğu adres+alici.aspx?&yazi1=bunu%20gönder&yazi2=bunuda%20gönder
Burada flashla işimiz bitti.
Alici.aspx te Request.QueryString(“yazi1”) şeklinde değişkenlerimizin değerlerini alabiliriz.Flashın gonderme işlemi asp,aspx,vs. hepsi için aynıdır.Karşı taraftan alma işi sadece farklıdır.

2 FARKLI MODELİN KESİŞİMİNİ BULMAK

public bool CheckCollision(Building b) {

bool value = false;

b.boundingsphere =

b.model.Meshes[0].BoundingSphere;

b.boundingsphere.Center = b.position-b.viewVector;

b.boundingsphere.Radius *= 0.8f *b.saphirescale;

BoundingBox bb=BoundingBox.CreateFromSphere(b.boundingsphere);

         

foreach (Building a in buildings)

{

  BoundingBox ba = BoundingBox.CreateFromSphere(a.boundingsphere);

  if (bb.Intersects(ba) && !b.Equals(a))

  value = true;

}

foreach (Road  r in carroads)

{

  if (bb.Intersects(r.bounds) )

  value = true;

}

return value;

}

Buradaki metodumuz girdi olarak bir bina modeli almaktadır.Bu modelin sınıfında kendine ait bir boundingsphere bulunmaktadır.Ancak yeri sürekli değiştiği için null dur.Değerini bu fonksiyonda atıyoruz.İlk olarak Sphere in merkezi ve çapını veriyoruz.Bu işlem sonucunda aşşa yukarı modelin alanına yakın bir yuvarlak elde etmiş oluyoruz.Eğer kullandığınız alanlar köşeli ise(örneğin strateji oyunlarında vs. köşeli alanlar kullanılır)

BoundingBox bb=BoundingBox.CreateFromSphere(b.boundingsphere);

Metodu ile modelinizin sphereini köşeli hale getiriyorsunuz.Sonrada tüm diğer binaların modelleriyle olan kesişime bakıyorsunuz.Bu da

bb.Intersects(ba) metoduyla yapılıyor.

MOUSE RAYI BULMA (MOUSE UN HERHANGİ BİR MODEL İLE KESİŞİMİNİ FARKETMEK)

XNA mousun kesişimini bulmak için direk bir metod sunmamaktadır.Bu yüzden bunu kendimiz birkaç satır kodla halletmeliyiz.

 

Vector3 nearsource = new Vector3((float)currentstate.X, (float)currentstate.Y, -.0001f);

//en sondaki değeri ufak tutmamızda fayda var.O değerin büyük olması sonucunda mouse un ekrandaki 3d yerini tam olarak tespit etmemiz bi hayli zor.En ufak ayrıntılarda da mevcut bölgeyi hesaba katmak istiyorsak şu anki değer ideal.

 Vector3 farsource = new Vector3((float)currentstate.X, (float)currentstate.Y, .0001f);

Matrix proj = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), aspect, 100f, 10000.0f);

Matrix cameraview2 = Matrix.CreateLookAt(cameraview, lookAt, Vector3.Up);

Matrix world = Matrix.CreateTranslation(groundposition) * Matrix.CreateRotationZ(camerarrotation.Z);

 

Vector3 nearPoint = g.GraphicsDevice.Viewport.Unproject(nearsource, proj, cameraview2, world);

 

Vector3 farPoint = g.GraphicsDevice.Viewport.Unproject(farsource, proj, cameraview2, world);

 

Vector3 direction = farPoint - nearPoint;

direction.Normalize();

Ray pickRay = new Ray(nearPoint, direction);

 

//Buraya kadar mouse un mevcut x ve y değerlerini x,y,z değerine çevirmiş olduk.Rayin kesişimi sonuc olarak float? Değer vericektir.Yani ya kesişimin uzaklığını yada null değer.Değer null değilse demekki kesişiyordur.

 

foreach (Building b in buildings)

        {

float? a = pickRay.Intersects(b.boundingsphere);

if (b.isDrawn && a.HasValue && currentstate.LeftButton == ButtonState.Pressed && laststate.LeftButton == ButtonState.Released)

          {//Kesişim varsa istediğimizi yaptırıyoruz.

Mesela buradaki kod mouse ile bastığınız yerde bir bina var ise bu binayı aktif bina yapıyor ve ilgili müziği çalıyor.

         foreach (Road r2 in carroads)

            {

              r2.color = new Vector3(1,1,1);

              r2.islastActive = false;

            }

         foreach (Building d in buildings)

            { d.lastActive = false; }

              b.lastActive = true;

              activeBuilding = new Building(b, content);

              if (activeBuilding.bclass.Equals("b"))

                 soundBank.PlayCue("house");

              if (activeBuilding.name.Equals("Small Factory") || activeBuilding.name.Equals("Infant Food Factory"))

                 soundBank.PlayCue("factory");

                if (activeBuilding.name.Equals("Village Clinic"))

                 soundBank.PlayCue("coughing");

                if (activeBuilding.name.Equals("Big Factory"))

                 soundBank.PlayCue("factory2");

                if (activeBuilding.name.Equals("Hospital") || activeBuilding.name.Equals("Grand Hospital"))

                 soundBank.PlayCue("hospital");

               if (activeBuilding.bclass.Equals("p"))

                soundBank.PlayCue("police");

              if (activeBuilding.bclass.Equals("sh") || activeBuilding.bclass.Equals("s"))

                soundBank.PlayCue("school2");

            }

}

XNA DE TRANSLATION

Xna de modelleri cizdirirken karsilasilan sorunlardan biride

 

effect.World = Matrix.CreateRotationZ(c.rotation.Z)*Matrix.CreateTranslation(

c.position);

 

ile

 

effect.World =

Matrix.CreateTranslation(c.position)* Matrix.CreateRotationZ(c.rotation.Z);

 

Kodlarinin aynhi isi yaptigini dusunmemizdir.

 

Halbuki 1. kod parcasi modeli cizerken genel yon degisimlerinde once modelin yonunu degistirip sonra posizyonuna cizerken , 2. kod parcasi once modeli cizip sonra yonunu degistirmektedir.Bu ayrimin farkinda olmadan 3d bir dunya yaratmamiz mumkun degildir.

XNA DE MODELIN RENGINI DEGISTIRMEK

Modelleri herhangi bir programdan Xna e aldigimiz zaman model tipki tasarladigimiz renklerdedir.Cunku herhangi bir renk degisimi vermedik ve DiffuseColoru default olarak White dir.

Bir modeli cizim aninda rengini degistirmemiz icin

effect.DiffuseColor=Red; kod parcasini modeli cizdirdigimiz koda ekloemeliyiz.Ornegin bir bina diger binayla kesisiyorsa rengini kirmizi yapip bunu kullaniciya belirtmek istiyoruz.

 

Ana kod ekraninda

 

If(building.Kesisiyormu(AllBuildings))

                                                             

Building.color=Color.Red;

else

                                                             

Building.color=Color.White;

 

public void DrawBuilding(Building b, Vector3 pos)

        {

            

 

            foreach (ModelMesh mesh in b.model.Meshes)

            {

 

                foreach (BasicEffect effect in mesh.Effects)

                {

                    effect.EnableDefaultLighting();

                   

effect.PreferPerPixelLighting = true;

                   

effect.DiffuseColor = b.buildingcolor;

                  

 effect.World = Matrix.CreateScale(b.scale)*Matrix.CreateFromYawPitchRoll(b.rotation.X, b.rotation.Y,b.rotation.Z) * Matrix.CreateTranslation(pos)  ;

                    

effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), aspect, 1, 10000.0f);

                  

 effect.View = Matrix.CreateLookAt(cameraview, lookAt, Vector3.Up);

                }

               

mesh.Draw();

            }

        }

3DS MAXTEN XNA DE KULLANABILECEGINIZ CIKTILAR ALMA

3ds ten direk .fbx veya .x ciktisi alarak direk xna de kullanabileceginiz obje miktari cok azdir.Bu miktar genel olarak modeliniz karmasikligina bagli olarak azalmaktadir.Her tur modelin ciktisini alabilmek icin farkli exporterlar kullanabilirsiniz(pandaexporter gibi)Ancak her exporter ciktisini boyunu ve rotationini farkli verdigi icin oyununuzda ffarkli yerlerden export edilmis modelleri beraber kullanamazsiniz.

3dsin kendi fbx exporteri aslinda isinizi gorebilir.Bunun icin oncelikle modelinizin tum parcalarini secin.
Yukarida Rendering e tiklayin.Acilan secimlerden RendertoTexture i secin.
Buradan oncelikle Unwrap only e basin.
Projection Mapping altindan Add deyin.

Buradan Complete Map->Add Elements deyin.

Burada Map Size inizi modelinizin nekadar ayrintili olduguna gore fazla yada az kullanmanizi oneririm.

Texturenin name kismini sonra kargasa yasamamak icin degistirin.

Baked Material Settings ten Output into Source deyin.

Simdi File->Export fbx deyin bu yarattiginiz texture ozelliklerini kullanarak olusacak modeliniz elinizde su an.Xna de rahatlikla kullanabilirsiniz.(Bazi complex modife ylara maruz kalmis modelleri bu yontemle xna de kullanamazsiniz).

XNA DE SAYDAM CISIMLER CIZDIRMEK

1.      SAYDAM CISIMLER CIZDIRMEK

 

Xna de cizim yapisi size farkli olanaklar verebilcek sekilde hazirlanmistir.Eger spriteBatch.end(); den once bir model cizimi yapiyorsaniz bu modelin biraz saydam gorunmesi beklenir ki buda seklini alt ust ediyor.Boyle bir sorunla karsilasiyorsaniz alttaki kodu hemen modeli cizdirmeden once eklemeniz sorunu cozecektir.

 

 

g.GraphicsDevice.RenderState.AlphaBlendEnable = false; g.GraphicsDevice.RenderState.AlphaTestEnable = false;

 

                                                              Ayrica saydam modeller cizdirmek icinde bu kodu true yaparak kullanabilirsiniz.Ornegin life’i 1in altina dusen modelleri yavas yavas saydamlastirip yokedicekseniz;

                                                              public void DrawModel(Model c)

        {

            if (c.life <>

            {

                g.GraphicsDevice.RenderState.AlphaBlendEnable = true;

                g.GraphicsDevice.RenderState.AlphaTestEnable = true;

            }

  foreach (ModelMesh mesh in c.model.Meshes)

     {

 

         foreach (BasicEffect effect in mesh.Effects)

           {

             effect.EnableDefaultLighting();

             effect.PreferPerPixelLighting = true;

                   

             effect.World = Matrix.CreateFromYawPitchRoll(c.rotation.X,c.rotation.Y,c.rotation.Z) * Matrix.CreateTranslation(c.position);

 

             effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), aspect, 1, 10000.0f);

 

             effect.View=Matrix.CreateLookAt(cameraview,lookAt,Vector3.Up);

            

             effect.Alpha = c.alpha;//Modeli tanimladiginiz sinifta modelin alfasini zamanla azaltarak saydamlastirabilirsiniz. Alfa 0 ve 1 arasında olmali.

                }

                mesh.Draw();

            }

        }

Flash siteme beklerim...

Hazırlamış olduğum flash siteme beklerim.Görsel olarak hoşunuza gideceğine inandığım uniq bir tarza sahip. www.oyunyazarim.com