EA Canada tarafından geliştirilen UEFA Euro 2008'de, daha hızlı ve kontrollü bir motor bulunacak. Euro 2007'e katılan tüm takımları ve resmi stadyumları içerecek. 50'nin üzerinde Avrupa milli takımıyla oynama imkanı olacak. Ülke Kaptanı isimli yeni mod sayesinde oyuncular sahaya takımlarının kaptanı olarak çıkacaklar. Ayrıca turnuvanın atmosferini geliştirecek olan interaktif kutlamalar yoluyla sahada başarılarını kutlayabilecekler. Buna ek olarak Ülkeler Savaşı modunda, diğer oyuncularla başarıya ulaştırmak için birlikte mücadele edebilecekler.
Euro 2008'in yapımcısı Simon Humber yapımla ilgili olarak, milli takımlar arasındaki rekabeti oyuna taşııdıklarını ve oyunculara ülke kaptanı veya kahramanlarından biri rolüne bürünme imkânı vererek oyuncuların milli takımları için hissettikleri coşkuyu kucaklayacaklarını söylüyor. Ayrıca oyunun motorunu yeni bir düzeye taşıdıklarını ve gerçek turnuva deneyimini ve yaşanan duyguları yakalayabilecek bir oyun yaratmak için pek çok yenilikçi özellik eklediklerini belirtiyor.
UEFA Euro 2008'in diğer bir özelliği ilk defa tüm Avrupa'da, önde gelen cep telefonu operatörleri vasıtasıyla cep telefonlarına da indirilebilecek. Yeni tek düğme kontrol sistemi sayesinde cep telefonlarında rahatça oynanacak. Oyun 11 Nisan'da Avrupa'da, 20 Mayıs'ta ise Amerika'da piyasaya sürülecek. Bence en iyi futbol oyunu KONAMI yapar. PES 2008 mesela ... Konami yaptığı futbol oyunlarında yapay zeka olarak daha önde ...
25 Nisan 2008 Cuma
Euro 2008 Oyunu
Etiketler:
Genel,
Oyun Haberleri,
Sektör Haberleri
Windows Sayısal Loto Oyunu
Madem daha directx öğrenemedik o zaman windows ta bişeyler yapayım dedim (can sıkıntısından) ve Sayısal Loto tahmin oyunu yaptım. Oldukça basit bir şey ama c# ile ilgilenenler için Properties(özellik tanımlama) nasıl olur? bunu öğretebilir ... Download Kaynak kodu : http://www.dosyaupload.net/download.php?file=82505
22 Nisan 2008 Salı
Yapay Zeka - Arama Algoritması
Öngörüsel (heuristic) arama işlemlerinden gerçekleştirmesi en kolay olanlardan birisi Best First Search ya da diğer adıyla Hill Climbing Search olarak adlandırılan bu arama stratejisidir. Hill Climbing algoritmasında arama işleminde o anda aktif olan düğüm genişletilir ve çocuk düğümler değerlendirilir. Bunlardan en iyi değerlere sahip olan düğüm bir sonraki genişletme işleminde kullanılmak üzere seçilir.
Arama işlemi çocukların hepsinden daha iyi bir duruma erişildiğinde sona erer. Bu sistemde hatalı öngörüsel (heuristic) değerler sonsuz yollara, dolayısıyla arama işleminin başarısızlıkla sonuçlanmasına neden olur. Bu nedenle bu algoritmanın başarısı için öngörüsel değerlerinin doğru belirlenmesi büyük önem taşır. Algoritmada önceki basamaklarla ilgili bilgi tutulmamaktadır dolayısıyla hata durumu ile karşılaşıldığında eldeki yanlış çözüm üzerinde bir düzeltme yapılabilmesi söz konusu değildir. Algoritma, tüm çocuklardan daha iyi durumdaki bir düğüme erişildiğinde sona erdiğinden yele maksimum noktaları da sorun yaratmaktadır. İyi mutlak açıdan en iyi olmak zorunda değildir. Hill Climbing algoritması yerel ve global maksimum arasındaki ayrımı yapamamaktadır. Algoritmamızda AÇIK olarak adlandıracağımız gidilebilecek durumların tutulduğu bir liste ve KAPALI olarak adlandırdığımız ziyaret ettiğimiz durumların tutulduğu bir liste kullanılmaktadır. Algoritma aşağıdaki gibidir.
Best First Search Algoritmasının Açık Metin Hali:
1. AÇIK listesine Start düğümünü ekle
2. KAPALI listesini boşalt
3. AÇIK listesinde eleman olduğu surece
4. AÇIK listesinin en solundaki elemanı listeden çıkart . Bu elemanı X olarak adlandıralım.
5. X'ın çocuklarını bul
6. X'in tüm çocukları için
6.1. Eğer child AÇIK ve KAPALI listesinde değil ise
6.1.1. Child'e bir herustik değer ver ve AÇIK listesine ekle.
6.2. Child AÇIK Listesinde ise
6.2.1. Eğer daha kısa bir yol ile ulaşılmış ise AÇIK lisesindeki Child kayıdının Herustik değerini değiştir.
6.2.2. Child'ın ebeveyn bilgisini günceller.
6.3. Eğer child KAPALI listesinde ise
6.3.1. Eğer daha kısa bir yol bulunmuş ise KAPALI listesinden çıkartıp yeni bilgilere göre güncelleyip AÇIK listesine ekle.
7. X nodunu KAPALI listesine ekle
8. AÇIK listesini herustik değerlerine göre yeniden sırala (En iyi seçenek sola gelecek şekilde)
Best First Search Algoritmasının Arakod Hali:
Procedure best_first_search* (Hill Climbing Search)
Begin
Open := [Start];
Closed :=[];
While open <> [] do Begin
Remove the leftmost state from open, call it X;
If X =goal then return the return the path form the Start to X
Else begin
Generate children of X;
For each child of X do
Case
The child is not on open or closed: Begin
Assign the child a herustic value;
Add the child to open
End;
The child is already on open:
If the child was reached by a shorter path
Then give the state on open the shorter path
The child is already on closed:
If the child was reached by a shorter path then Begin
Remove the state from closed;
Add the child to open
end
end;
put X on closed;
re-order states on open by heuristic merit (best leftmost)
end;
return failure
end.
Algoritma her iterasyonda AÇIK listesinden bir elemanı (anlık olarak en iyi -çözüme en yakın- olan elemanı) çıkartır. Eğer algoritma hedef şartlarına erişirse hedefe ulaşılmasını sağlayan yol bilgisini geri döndürür. Burada dikkat edilecek nokta algoritmanın her düğümün kendi (babası) ebeveyni hakkında bilgi içerdiğini kabul ettiğidir.
kaynak: www.yapay-zeka.org
Etiketler:
Genel,
Yapay Zeka
17 Nisan 2008 Perşembe
Manged Directx Örnek Uygulama - 3
Örnek Uygulama 3 Şimdi de birden çok texture’ü nasıl temel şekilimizin üzerinde görüntüleyeceğimizi görelim. kaynak: Öğretim Görevlisi Murat GÜNEŞ
Manged Directx Örnek Uygulama - 2
Örnek Uygulama 2 Bu uygulamada da ekrana çizdirdiğimiz teel şekilin(dörtgen) üzerine texture kaplayacağız. kaynak: Öğretim Görevlisi Murat Güneş
16 Nisan 2008 Çarşamba
Managed Directx Örnek Uygulama - 1
Bu uygulamada ekrana temel şekillerin nasıl çizdirildiğini inceleyeceğiz. İlk uygulama olduğu için texture yerine şimdilik vertexleri boyamayı tercih ediyoruz. Yani kullanacağımız vertex tipi “TransformedColored” olacak.
using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using Direct3D = Microsoft.DirectX.Direct3D;
namespace Oyun1
{
public class oyun : Form
{
Device device=null;
VertexBuffer vertbuffer=null;
public oyun()
{
this.ClientSize = new Size(450,450);
this.Text = "Oyun Deneme!";
}
public bool grafik_hazirla()
{
try
{
PresentParameters d3dpp = new PresentParameters();
d3dpp.Windowed = true;
d3dpp.SwapEffect = SwapEffect.Discard;
device = new Device(0,DeviceType.Hardware,this,CreateFlags.SoftwareVertexProcessing,d3dpp);
vertbuffer = new VertexBuffer(typeof(CustomVertex.TransformedColored),4,device,Usage.WriteOnly,CustomVertex.TransformedColored.Format,Pool.Default);
GraphicsStream stm = vertbuffer.Lock(0,0,0);
CustomVertex.TransformedColored[] verts = new Microsoft.DirectX.Direct3D.CustomVertex.TransformedColored[4];
verts[0].X = 100; verts[0].Y = 100;verts[0].Z = 0;verts[0].Rhw = 1;verts[0].Color = System.Drawing.Color.Blue.ToArgb();
verts[1].X = 300; verts[1].Y = 100;verts[1].Z = 0;verts[1].Rhw = 1;verts[1].Color = System.Drawing.Color.Black.ToArgb();
verts[2].X = 100; verts[2].Y = 300;verts[2].Z = 0;verts[2].Rhw = 1;verts[2].Color = System.Drawing.Color.Red.ToArgb();
verts[3].X = 300; verts[3].Y = 300;verts[3].Z = 0;verts[3].Rhw = 1;verts[3].Color = System.Drawing.Color.Brown.ToArgb();
stm.Write(verts);
vertbuffer.Unlock();
return true;
}
catch(DirectXException hata)
{
MessageBox.Show(hata.ToString());
return false;
}
}
private void render()
{
if(device==null)
return;
device.Clear(ClearFlags.Target,System.Drawing.Color.BlueViolet,1.0f,0);
device.BeginScene();
device.SetStreamSource(0,vertbuffer,0);
device.VertexFormat = CustomVertex.TransformedColored.Format;
device.DrawPrimitives(PrimitiveType.TriangleStrip,0,2);
device.EndScene();
device.Present();
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
this.render();
}
protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
{
if ((int)(byte)e.KeyChar == (int)System.Windows.Forms.Keys.Escape)
this.Close();
}
static void Main()
{
using(oyun f1=new oyun())
{
if(!f1.grafik_hazirla())
{
MessageBox.Show("Grafik Hazırlanamıyor!");
return;
}
f1.Show();
while(f1.Created)
{
f1.render();
Application.DoEvents();
}
}
}
}
}
Managed Directx Bölüm - 7 Temel Şekillerin Çizilmesi ve Texture
Temel Şekillerin Çizilmesi ve Texture Artık çalışmaya başlayabiliriz: Adaptörlerin ve Device’ların ne olduğunu biliyoruz, görüntü modlarının ne olduğunu anladık, temel Direct 3D program yapısını biliyoruz ve projeksiyonlar, kameralar ve dönüşümlerle ilgili bilmemiz gerekenleri(şimdilik) biliyoruz. Şimdi tek ihtiyacımız olan şey ortaya koyacağımız sahnelerde rol alacak aktörler: Temel şekilleri çizmek. Temel şekillerin çizimi, tekil 3D objelerin vertex koleksiyonlarının oluşturulması anlamına gelir. Direct 3D, diğer 3D objeleri oluşturmak için temel olarak poligon – üçgen – kullanır. Çünkü sadece üç nokta ile tanımlanan bir şekil kesinlikle bir düzlemde olacaktır, konveks olacaktır ve bu karakteristikler mümkün olan en hızlı rendering’i sağlayacaktır. Örneğin ekrana bir kare çizmek istersek, iki tane üçgen kullanmanız gerekir. Bir küp çizmek istersek 12 adet üçgen kullanmalıyız(herbir yüz için iki adet). Şekilde görüldüğü gibi;Burada bir konudan bahsetmek gerekecek. Birinci bölümde de bahsettiğim gibi 3D objeler ikiye ayrılıyor: Katı modeller ve Meshler. Direct 3D’nin kullandığı objeler, sadece yüzeylerden oluşan meshlerdir. Bu yüzdendir ki eski oyunlarda(yenilerinde bu yavaş yavaş aşılıyor) ekrandaki bir objenin içine giren kamera objenin içerisini ve hatta ötesini gösteriyordu. Üçgenlerle çalışırken Direct 3D bize, genellikle debug amaçlı kullanımı olan, çizgilerin ve noktaların listesini tanımlamamız için izin verir. Bu sayede içgen kullanırken objemizin wireframe(tel-kafes) görüntüsünü görebilir ve gizli yüzeyleri kontrol edebiliriz. Direct 3D’de obje oluşturma adımları aşağıdaki gibidir: 1. Verteks tipinini tanımlanması, 2. Bir verteks tamponu(vertex buffer) oluşturulması, 3. Tanımlanmış verteks tipine göre, objenin herbir verteksiyle tamponun doldurulması, 4. Tamponun Device’ta çizilmesi, diğer bir deyişle temel şekil tipinin bildirilmesi. Şimdilik bütün vertekslerin x,y ve z koordinatlarında tanımlandığını varsayalım(bununla ilgili daha detaylı bilgiyi ileride göreceğiz), bu sayede temel şekil tiplerinin çizimine konsantre olabiliriz. Verteks tamponu bir kez doldurulduğunda, bunu ekrana çizmek için aşağıdaki kodlar kullanılır: D3Ddevice.SetStreamSource(0,vb,0); D3Ddevice.DrawPrimitives(
,0, ); Burada vb, VertexBuffer’dan, D3Ddevice da Direct3D.Device’tan türetilmiş birer objedir. Temel şekil tipi, aşağıdaki PrimitiveType enumeration değerlerinden biri olabilir: PointList:Herbir verteks diğerlerinden izole edilerek render edilir, bu sayede bir kayan noktalar(floating points) görebiliriz. Çok kullanışlı bir yöntem değil çünkü, DirectX’in 8.0 sürümünden sonra PointSprites isimli yeni bir özelliğe sahibiz. Partikül efektini PointSprites ile vermek daha mantıklı. Aşağıdaki şekil, bir nokta listesi(PointList) olarak renderlenmiş vertekslerin kurulumunu gösteriyor. LineList:Verteksler, her çifti bir çizgi birleştirmek üzere, çift çift renderlenir. Bu enumeration, eğer vertekslerin sayısına dikkat etmezsek, hata üretir.
LineStrip:Tampondaki(buffer) bütün verteksler tek bir polyline(çoklu çizgi) olarak renderlenir. Bu yöntem özellikle debug amaçlı kullanışlıdır çünkü, bu temel şekil tipi(primitive type) bize, verteks sayısından bağımsız olarak, objemizin wireframe(tel-kafes) görüntüsünü görme imkanı sunar.
TriangleList:Verteksler, izole edilmiş üçgenler gibi, üçerli gruplar halinde renderlenir. Bu bize, kompleks sahneleri(scene) renderlerken en büyük akıcılığı sağlar fakat, eğer bağlantılı üçgenler çizmek istiyorsak ikilenen(üzerinden geçilen) vertekslerin tekrar çizdirilmesi sözkonusudur.
• TriangleStrip:Bu temel şekil tipini, bağlantılı üçgenler çizerken kullanacağız. Bu, karmaşık sahneleri(scene) renderlemek için en çok kullanılan temel şekil tipidir. Çünkü ikilenen verteksleri tekrar çizmek zorunda kalmayız. Çizilen ilk iki verteksten sonra çizilen herbir verteks, bu ilk iki verteksi kullanarak, yeni bir üçgen oluşmasını sağlar.
• TriangleFan:Bu temel şekil tipinde, bütün üçgenler ortak bir verteks kullanır(buffer’daki ilk verteks) ve her yeni verteks, ilk verteksi ve kendinden önce ekleneni kullanarak, yeni bir üçgen oluşturur.
Üçgenleri çizerken, eğer Direct 3D’nin, bir üçgenin sadece ön yüzünü çizmesini (renderlemesini) istiyorsak, üçgenin verteks sıralamasına özel önem göstermeliyiz. Arka yüzeyleri gizleme özelliği “culling” olarak anılır. Bir culling modunu seçtiğimizde, eğer ön yüzün saat yönünde veya saat yönünün tersinde olmasını istiyorsak, bunu belirtmeliyiz; bu sayede aynı verteks düzenini kullanarak bütün üçgenleri çizebiliriz. Pekala, muhtemelen “bu temel şekil tipleri ilginç ama ekrana tek bir şekil çizmek istersem, bir bitmap ya da diskteki bir dosya gibi. Bunu direkt ekrana çizdiremez miyim?” diye düşünüyorsunuz. Yanıt; hayır. Bir dörtgen oluşturmalısınız(iki üçgenden oluşan) ve resminizi bir texture olarak onun üzerine uygulamalısınız. Yokarıdaki Mesh&Texture başlığı altındaki örneği hatırlayın. kaynak: Öğretim Görevlisi Murat GÜNEŞ
15 Nisan 2008 Salı
Managed Directx Bölüm - 6 Kameranın Yerleştirilmesi
Kameranın Yerleştirilmesi 3D koordinat sistemiyle çalışırken ekstra bir özellik olarak, DirectX, aynı sahneyi farklı noktalardan görebilmemiz için kamerayı yerleştirmemize izin verir. Kamera pozisyonu, objenin World koordinatlarına uygulanan bazı özel dönüşümlerle(transformations) hesaplanır. Bu dönüşümler için gerekli olan matrisi manuel olarak hesaplayıp.Transform.View özelliğine setleyebiliriz veya yardımcı fonksiyonlar da kullanabiliriz; Matrix.LookAtLH ve Matrix.LookAtRH gibi. Bu yardımcı fonksiyonlar kameranın pozisyonunu ve baktığı yönü üç nokta ile tanımlar: 1. Kameranın 3D pozisyonu, 2. Kameranın baktığı yerin 3D pozisyonu, 3. (Genellikle y ekseni olan) yukarı doğrultusu. Eğer bir görüntü(kamera) matrisi tanımlamazsak, DirectX bizim için varsayım bir matris tanımlayacaktır ama bu akılda tutulması gereken önemli bir konsepttir. İlk Prince of Persia oyununu hatırlayın. Burada Prens, oyunun bir sahnesinde, bir yere düşüyordu ve ekran yukarı-aşağı doğrultusunda değişiyordu. Bu özelliği tek bir satır kodla oluşturabileceğinizi hayal edin: Kamera matrisini 1800 döndürerek(bir yönlendirme matrisi ile çarparak). Buradan da anlaşılıyor ki; Direct 3D, 2D oyunlarda dahi büyük avantajlar sağlıyor. kaynak: Öğretim Görevlisi Murat GÜNEŞ
Managed Directx Bölüm - 5 Matrisleri ve 3D Dönüşümleri Anlamak
Matrisleri ve 3D Dönüşümleri Anlamak Direct 3D ile çalışırken en önemli nokta, dönüşüm matrislerinin nasıl çalıştığını bilmektir. Matrisleri kullanarak, 3D dünyadaki(veya eğer z bileşenini ihmal edersek, 2D dünyadaki) herhangi bir objenin rotation(yönlendirme), scaling(ölçeklendirme, boyutlandırma) veya translation(çevirimini) yapabiliriz ve bu işlemlerin doğru bir şekilde uygulanması, projeksiyon tipini tanımlamamıza(bir önceki konuda belirttiğimiz gibi) ve hatta aynı sahneyi farklı noktalardan görmek için kamerayı hareket ettirmemize yardımcı olacaktır. Şimdi basit bir translation yaparak dönüşüm matrislerinin kullanımına bir göz atalım ve sonra bu operasyonu daha kompleks işlemler için dallandıralım. Bir üçgeni y ekseni boyunca yukarıya doğru hareket ettirmek istediğimizi farz edelim. Şekil 1'i inceleyin.Üçgenimizin aşağıda verilen noktalarla tanımlandığını varsayalım.
y ekseni boyunca 40 birim yukarıya hareket ettirmek için ihtiyacımız olan şey, her y pozisyonunu 40 ile toplamak. Bu durumda vertexler için yeni koordinatlarımız aşağıdaki gibi olacaktır.
Aynı sonuç, her bir verteksi bir satır ve dört sütundan oluşan bir matris gibi göstererek de alınabilirdi. Bu durumda aşağıdaki gibi üç tane matris elde ederdik:
İlk üç sütun vertex koordinatları, 1 de son sütun değeri olacak şekilde sıralanırdı. Ve bu matris özel bir matrisle çarpılarak, ki bu özel matris de vertex matrisinden translation transformation (çevirim dönüşümü) üretmek için oluşturulmuştur, her bir vertexin yeni koordinatları bulunabilirdi.
Sonuç matrisini hesaplamak için, ilk matrisin satırındaki her bir değeri almalı ve ikinci matriste karşılık gelen sütundaki her bir değer ile çarpmalıyız. Daha sonra bütün sonuçların toplamını işletmeliyiz. Bu durumda yukarıdaki örneğin hesaplanması aşağıdaki gibi olur:
Burada fazla detaya girmeden şunu bilmemiz yeterli olacaktır: Transformation(dönüşüm) matrisinin son satırına vereceğimiz değerler, vertex matrisindeki ilgili koordinat değerini(x,y,z) artıracaktır. Ayrıca, dönüşüm matrisindeki 1 değerini değiştirerek scaling(ölçeklendirme, boyutlandırma) yapabiliriz. Bu değerleri diyagonalden kesirliye çevirerek küçültme veya daha büyük değerler vererek objemizi genişletmemiz mümkündür. Veya herhangi bir eksen etrafında şekli döndürmek için sinüs ve kosinüs kombinasyonlarını bu matriste kullanabiliriz. Şanslıyız ki programımızda dönüşüm kullanmak için bütün bu detaylara kafa yormak zorunda değiliz. Transformation(dönüşüm) yapabilmemiz için bilmemiz gerekenler: • Dönüşüm matrisleri bilgi kaybetmeden birbirleri ile çarpılabilirler. Bir objeyi aynı anda çevirmek(translate) ve yönlendirmek(rotation) istersek, basit bir şekilde, translation(çevirim) matrisini yönlendirme(rotation) matrisi ile çarparız ve sonucu vertex matris(ler)imiz ile çarptığımızda istenen sonucu elde ederiz. • Device objesi üç kullanışlı özelliğe sahiptir: Birincisi projeksiyon matrisini getirmek için kullanılır:
.Transform.Projection ‘önceki konuda açıklanmıştır. İkincisi 3D dünyamızda istediğimiz dönüşümleri göstermek için kullanılır: .Transform.World ‘bu konuda açıklanmıştır. Ve üçüncüsü de kamera pozisyonunu belirtmek için kullanılır: .Transform.View ‘bu konuda açıklanmıştır. • D3DX isimli kütüphane bütün dönüşüm(transformation) matrislerini oluşturmak için, matrislerin çarpımları için ve tanımlama(identity) matrisi döndürmek için birtakım fonksiyonlar içerir. (Tanımlama(identity) matrisi, World matrisini güncellemeden önce temizlemek için kullanılan, dönüşmemiş verteksler döndüren özel bir matristir.) kaynak: Öğretim Görevlisi Murat Güneş
Kaydol:
Kayıtlar (Atom)












