DirectX ile Tank Oyunu

Benzer belgeler
DirectX ile FPS Oyunu

Pürüzlü Yüzey Üretimi

PÜRÜZLÜ YÜZEY ÜRETİMİ

KARADENİZ TEKNİK ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ BİLGİSAYAR GRAFİKLERİ LABORATUARI. MAYA ile Animasyon

MAYA ile 3D Modelleme

COM337 Bilgisayar Grafiği. OpenGL ile Grafik Programlama. Dr. Erkan Bostancı

Robot İzleme (Robot Tracing)

DIRECTX 10 ve SHADER PROGRAMLAMA

Yeni Nesil Tüik e-vt işlemleri. Kullanıcı Kılavuzu

BİLGİSAYAR UYGULAMALARI Şırnak Üniversitesi Mühendislik Fakültesi Güz Dönemi Arş.Gör. Eren DEMİR ve Arş.Gör. Veysel KIŞ (

Görünmeyen Yüzey ve Arkayüz Kaldırma

1. Mutabakat.zip dosyası açılır. 2. Mutabakat klasörü içindeki Mutabakat.exe dosyası çalıştırılır.

MATLAB a GİRİŞ. Doç. Dr. Mehmet İTİK. Karadeniz Teknik Üniversitesi Makine Mühendisliği Bölümü

Docmage.exe dosyasını çalıştırılır ve karşımıza Şekil-1 deki ekran gelecektir.

Yüzey Doldurma Teknikleri

KARADENİZ TEKNİK ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ BİLGİSAYAR GRAFİKLERİ LABORATUARI. MAYA ile Animasyon

NB Macro Kullanımı Hakkında Genel Bilgiler

C# ile NJ Simulatöre Bağlanmak

Skecher (Çizim) Komutları

TradeAll TR Tablet&Web Uygulaması Kullanım Kılavuzu

CAEeda TM OM6 KANADI MODELLEME. EDA Tasarım Analiz Mühendislik

WEB SAYFASI KULLANIM KILAVUZU

1. Excel Dönüşümü : 2. Rapor Master Tanımları :

YENİ NESİL 720 MUHTASAR VE PRİM HİZMET BEYANNAMESİ DEĞİŞİKLİKLERİ

MUĞLA SITKI KOÇMAN ÜNİVERSİTESİ MUWİS. Web İçerik Sistemi. Bilgi İşlem Daire Başkanlığı-WEB GRUBU

20 Mayıs İlgili Versiyon/lar : ETA:SQL, ETA:V.8-SQL. İlgili Modül/ler : Muhasebe IV

UZAKTAN EĞİTİM YÖNETİM SİSTEMİ (MMYO)EĞİTMEN YARDIM KILAVUZU

T.C. İSTANBUL ÜNİVERSİTESİ HASAN ALİ YÜCEL EĞİTİM FAKÜLTESİ PEDAGOJİK FORMASYON BAŞVURU KILAVUZU

Broker, Acente, Banka Online Sigortacılık Portali

MALİ MÜHÜR SERTİFİKA KULLANIM REHBERİ (MİLKO)

İÇİNDEKİLER. Elektronik İmza... 3 Tanım... 3 Mevzuat... 3 Giriş... 3 Akıllı Akis Kart Alındıktan Sonra İzlenecek Adımlar Adım:...

Sisteme giriş yapıldığında ana sayfa üzerinde işlem menüleri, Hızlı erişim butonları ve mail gönderim istatistikleri yer alır.

Bu uygulama saatinde, dinamik sistemlerin simülasyonu (benzetimi) için geliştirilmiş olan, oldukça kullanışlı bir arayüz, Simulink, tanıtılacaktır.

İNSAN KAYNAKLARI YAZILIMI PERSONEL BAŞLANGIÇ İŞLEMLERİ KULLANIM KILAVUZU

HSancak Nesne Tabanlı Programlama I Ders Notları

Ege Üniversitesi Elektrik Elektronik Mühendisliği Bölümü Kontrol Sistemleri II Dersi

FONKSİYONLARIN TABLO ŞEKLİNDE HESAPLANMASI

NİTELİKLİ ELEKTRONİK SERTİFİKA KURULUM AŞAMALARI

BM 102 Bilgisayar Programlama II. Windows Form Application

DesignCad Basit İmalat Adımları

Kullanım Kılavuzu RADYOLOJİ MODÜLÜ

Önsöz. İçindekiler Algoritma Algoritma Nasıl Hazırlanır? Yazılımda Algoritma Mantığı Nedir? 1.2. Algoritma Örnekleri ve Sorular

Analitik Geometri (MATH172) Ders Detayları

Yapılacak Đşlemler: Koşuyolu, Asmadalı Sk No:29 Kadıköy Tel : Faks: (216)

İŞLETMELERDE BECERİ EĞİTİMİ DERSİ MİCROSOFT WORD 2007 ÇALIŞMALARI

TEMEL BAŞLANGIÇ KILAVUZU

STEM komutu ayrık zamanlı sinyalleri veya fonksiyonları çizmek amacı ile kullanılır. Bu komutun en basit kullanım şekli şöyledir: stem(x,y).

1. Web Sitesine Giriş 1. Giriş Yapmak için tıklayın tıklanır.

Okul Web Sitesi Yönetim Paneli Kullanımı

E-BELEDİYE İŞYERİ E-RUHSAT KULLANIM KILAVUZU

ULUSAL ELEKTRONİK TEBLİGAT SİSTEMİ

DigiPara Liftdesigner Hidrolik Üniteleri Geliştirici Eğitimine Hoş Geldiniz

UFRS ANALİZ DOKÜMANI

NOT : Kuruluma başlamadan önce bilgisayarınızda 32 ve 64 bit Java Programı yüklü olmalıdır. Java Kurulum Dökümanı

NB Ekran Seri Port Üzerinden Veri Okuma/Yazma. Genel Bilgi Protokol Oluşturma Veri Okuma Veri Yazma

CBS Arc/Info Kavramları

ARLAB ARaştırma LABoratuvar Projesi Kullanım Kılavuzu

BLG4134 Görsel Programlama III. Öğr. Grv. Aybike ŞİMŞEK

k ise bir gerçek sayı olsun. Buna göre aşağıdaki işlemler Matlab da yapılabilir.

Pro/E. Sketch ( Taslak Çizim) Ortamı

MALİ MÜHÜR SERTİFİKA KULLANIM REHBERİ

Okul Web Sitesi Yönetim Paneli Kullanımı

OYAK YATIRIM FX Meta İşlem Platformu Kullanma Kılavuzu

NAVİGASYON CİHAZLARI ÇÖZÜM ÖNERİLERİ

Dijital Kontrol Sistemleri Prof.Dr. Ayhan Özdemir. Dengede bulunan kütle-yay sistemine uygulanan kuvvetin zamana göre değişimi aşağıda verilmiştir.

HESAP MAKİNASI YAPIMI

Ana Sayfaya Git. Yukarıdaki adrese tıklayıp, sizlere e-posta ile iletilen, «Kullanıcı adı» ve «Şifre» bilgileriniz ile giriş yapınız.

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

ÖNYÜKLEME 1 ÖĞRENCİ İŞ DEFTERİ

MPLAB IDE ve ISIS ile ASSEMBLY DİLİNDE UYGULAMA GELİŞTİRMEK

Data Structures Lab Güz

Ege Üniversitesi Elektrik Elektronik Mühendisliği Bölümü Kontrol Sistemleri II Dersi

e-arşiv Suite8 kullanım kılavuzu

Zorunlu BES Kılavuzu PERSONEL BORDROSU PROGRAMINDA ZORUNLU BES İŞLEMLERİ KULLANICI KILAVUZU. Datasoft Yazılım

Bireysel Emeklilik Sistemine Otomatik Katılım & Logo İnsan Kaynakları Ürün Geliştirmeleri. Mart 2017

problemlerde ekders bürosu ile iletişime geçiniz. Programın kullanımı;

İşletme Fakültesi Bil. Kullanımı Ders notları 2

MAPINFO PROFESSIONAL TEMEL VE İLERİ SEVİYE KURS İÇERİĞİ

MESS BULUT SİSTEMİ ÜYE PORTALI KULLANIM KILAVUZU

NetCAD te EnKesit ve BoyKesit Çizimleri

MUĞLA SITKI KOÇMAN ÜNİVERSİTESİ MUWİS. Web İçerik Sistemi. Bilgi İşlem Daire Başkanlığı-WEB GRUBU

Proje Takip Platformu Kullanım Kılavuzu

MapMAP Mobile Aplikasyon ve Parsel Gezgini Version.1.0

HESAP İŞLEMLERİ MODÜLÜ

SAKARYA ÜNİVERSİTESİ BİLGİSAYAR VE BİLİŞİM BİLİMLERİ FAKÜLTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ GÜZ DÖNEMİ PROGRAMLAMAYA GİRİŞ DERSİ

Eğitsel Oyun Projesi Raporu İNGİLİZCE MESLEKLERİ ÖĞRENİYORUM

DATA STRUCTURES. Lab II Metotlar, Diziler ve Hata Ayıklama. Doç. Dr. Aybars UĞUR

Konik ve Kavisli yüzey Tornalamada izlenecek işlem sırası şu şekildedir

2. KUVVET SİSTEMLERİ 2.1 Giriş

obs.mku.edu.tr/oibs/bologna

Yürürlük Tarihi: 12/09/ Kodu: ED Rev. No/Tarihi: 00 1 / 22

KONTROL SİSTEMLERİ-1 LABORATUVARI DENEY -1. Öğr. Gör. Güzin ÖZMEN Arş. Gör. Fehmi SEVİLMİŞ

ANONİM ŞİRKET KURULUŞ İŞLEMLERİ

DATA STRUCTURES. Lab II Metotlar, Diziler ve Hata Ayıklama. Prof. Dr. Aybars UĞUR

UZAKTAN EĞİTİM SİSTEMİ ÖĞRENCİ EKRANLARI KULLANIM KILAVUZU

Bölüm 2: Kuvvet Vektörleri. Mühendislik Mekaniği: Statik

PÜRÜZLÜ YÜZEY ÜRETİMİ

FRONT PAGE EĞİTİM NOTLARI BAŞLANGIÇ. 1- Open araç çubuğu düğmesinin yanındaki aşağı oku tıklayarak, web seçeneğini işaretleyin

HASTA ORDER İŞLEMLERİ

1. HAFTA. Statik, uzayda kuvvetler etkisi altındaki cisimlerin denge koşullarını inceler.

Transkript:

KARADENİZ TEKNİK ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ BİLGİSAYAR GRAFİKLERİ LABORATUARI DirectX ile Tank Oyunu 1. Giriş Oyunlar, Bilgisayar Grafiklerinin en popüler uygulama alanlarından biridir ve kişisel bilgisayarlara ek olarak tabletler ve cep telefonları gibi farklı donanımları da destekleyen oyunların yaygınlaşmasıyla birlikte artan oranda popüler olmaya devam edeceği öngörülmektedir. Bu deneyde DirectX 11 API ile basit bir Tank Oyununun nasıl geliştirilebileceğinden bahsedilecektir. 2. Tank Oyunu Fonksiyonları ve Görevleri Genel olarak DirectX uygulamalarında ve özellikle oyunlarda 3 temel fonksiyon kullanılır: InitDevice() : Oyuncular bufferlara (vertex, index) yüklenir. Bazı matris ve vektörler ilk değerlerine setlenir. Update() : Klavye/Mouse etkileşimine göre oyuncuların yeni konumu hesaplanır. Birbirlerine ateş etmişlerse isabet (kesişim) testleri yapılır. Render() : Oyuncular, World matrisleri yeni konumlarına göre güncellenerek çizilir. InitDevice(), uygulama çalıştırıldığında ilk koşan ve bir kere koşan fonksiyondur. Dolayısıyla oyuncuların yüklenmesi gibi uygulamada bir kez yapılacak işlemlere dair kodlar burada yazılmalıdır. Ayrıca vektörlere/matrislere ilk değer atama da burada yapılır. Deneyde yapılacak tank oyunu uygulamasında oyun ortamını oluşturan zeminin, duvarların, oyuncular olan tankların InitDevice() fonksiyonunda kendilerine ait köşe noktası, doku ve normal koordinatları bilgilerini içeren (.obj formatında) model dosyaları okunup ilgili vertex/index bufferlara yüklenir. InitDevice() fonksiyonunda ayrıca Eye, At ve Up vektörleri ilgili vektör değerlerine setlenir bu vektörler kullanılarak XMMatrixLookAtLH() ile View matrisi setlenir (934-937. satırlar arası). Eye = XMVectorSet(0.0f, 3.0f, -60.0f, 0.0f); At = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f); Up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f); g_view = XMMatrixLookAtLH(Eye, At, Up); 1

InitDevice() fonksiyonunda son olarak, görüş açısı (field of view angle), pencerenin yatay/düşey oranı (aspect ratio), yakın ve uzak z-düzlemlerini (near/far z-planes) parametre olarak alan XMMatrixPerspectiveFovLH() ile perspektif projeksiyon matrisi setlenir (940. satır). Update işlemi iki fonksiyon ile gerçeklenmiştir: DetectInput() UpdateCamera() DetectInput() içinde klavye/mouse etkileşimine göre ilgili değişkenler setlenmektedir. Örneğin tankın W,A,S,D tuşları ile hareket etmesi için Translation vektörü hesaplanmaktadır. Bu tuşlarla oyun ortamında ilerlerken duvarların içinden geçilmemesi için ray tracing yöntemi kullanılır. Buna göre Ro ve Rd vektörleri hesaplanır ve IntersectTriangle() dan dönen t-uzaklığı belli bir değerin altına inince hareket engellenir. Tank düşmana (enemy) SPACE tuşu ile ateş etmektedir. Bu tuşa basıldığında namlunun ucundan top mermisi çıkmakta ve düşmana doğru hareket etmektedir. Merminin başlangıç noktası namlunun ucu olacak şekilde şöyle setlenir (programda 396-401. satırlar arası): XMVECTOR Namlu_Ucu = 6 * XMVector3Normalize(At - Eye); XMFLOAT4 Namlu_Ucu_F4; XMStoreFloat4(&Namlu_Ucu_F4, Namlu_Ucu); g_world_ball = g_world_tank; g_world_ball._41 = g_world_ball._41 + Namlu_Ucu_F4.x; g_world_ball._42 = g_world_ball._42 + 1.5 + Namlu_Ucu_F4.y; g_world_ball._43 = g_world_ball._43 + Namlu_Ucu_F4.z; Namlunun boyu 6 birim olduğundan merminin hareket doğrultusu olan (At-Eye) vektörü 6 ile çarpılıp merminin World matrisinin (g_world_ball) Translation bileşenlerine eklenmiştir. Merminin 4x4 World matrisinin Translate (öteleme) işlemi yapan bileşenleri _41, _42 ve _43 tür. _42 ye ayrıca 1.5 değeri eklenmiştir. Bu da namlunun yerden yüksekliğidir. Merminin (At-Eye) doğrultusu (balldirection) boyunca ilerlemesi Render() fonksiyonunda yine _41, _42 ve _43 bileşenleri benzeri şekilde setlenerek yapılmaktadır (1128-1133. satırlar arası). 2

UpdateCamera() içinde (DetectInput() ta) basılan tuşa göre Eye, At ve Up vektörleri setlenir. Sonra bu vektörler kullanılarak g_view matrisi setlenir: g_view = XMMatrixLookAtLH(Eye, At, Up); Hareket ettikçe g_view matrisi Eye, At ve Up vektörlerinin yeni değerlerine göre sürekli güncellenir. UpdateCamera() içinde ayrıca merminin düşmana isabet edip/etmediği de ray tracing ile test edilir. Yollanacak ışının başlangış noktası ve doğrultusu: Ro = Eye + XMVectorSet(0.0f, -1.5f, 0.0f, 0.0f); Rd = XMVector3Normalize(At - Eye); ile hesaplanır. Burada Ro, Eye vektörünün y-bileşeninden 1.5 çıkarılarak hesaplanmıştır. Çünkü Eye vektörünün y-bileşeni 3 tür. Namlunun yerden yüksekliği 1.5 olduğundan 3-1.5=1.5 olması için 1.5 çıkarılmıştır. IntersectTriangle() ile kesişim testleri yapılır ve dönen t-uzaklıklarının minumumu düşmana aitse ve mermi düşman tankına değmişse düşmanın canlı olup/olmadığını test eden renderenemy değişkeni false yapılarak düşman öldürülür (artık render edilmez). Aynı zamanda rendertankball de false yapılarak mermi de artık çizilmez (463-543. satırlar arası). Düşman tankı canlandırmak (tekrar çizmek) için sol mouse butonuna tıklanır. Merminin düşman tankına değip değmediğinin belirlenmesi için IntersectTriangle() dan dönen t-uzaklığı ile düşman üzerindeki kesişim noktasının konumu RedDotPosition hesaplanır. Değişken ismi bu şekilde verilmiştir çünkü bu kesişim noktası oyunda sarı bir daire (nişangah) ile işaret edilmektedir. RedDotPosition ile merminin o andaki konumu currentballposition ın fark vektörünün boyu belli bir değerin (0.5) altına düşünce merminin düşmana isabet ettiği sonucuna varılır ve yukarıda da söylendiği gibi renderenemy/rendertankball değişkenleri false yapılır. XMVectorGetX(XMVector3Length(RedDotPosition - currentballposition)) < 0.5) XMVector3Length() aslında skaler bir değer döndürmelidir ama DirectX in matematik kütüphanesindeki vektörel işlem fonksiyonlarının tamamı vektör döndürmektedir. Dönen bu vektörden örneğin yukarıdaki gibi fark vektörünün boyunu okuyabilmek için XMVectorGetX() kullanılmıştır. Bunun yerine XMVectorGetY() ya da XMVectorGetZ() de olabilirdi. DirectX in matematik kütüphanesi fonksiyonlarına buradan erişebilirsiniz. Bu föyde kullanılan fonksiyonlar Geometric Functions ve Transformation Functions linklerindedir. Render() fonksiyonu bilindiği gibi çizim işlemleri için kullanılır. Burada sırasıyla ışık kaynakları, nişangah (reddot), zemin, duvarlar, oyuncuyu temsil eden tank, o tankın ateş etmesi sonucu yollanacak mermi ve son olarak düşman (enemy) tankı çizilir. 3

Bakış noktası yukarıda da söylendiği gibi yerden 3 birim yüksekliktedir. W,A,S,D tuşları ile bakış noktası güncellenirken önünde tankın da görülmesi için bakış noktası tanktan 4 birim geride setlenmiştir (1072-1078. satırlar arası). Deney Hazırlığı ve Deney Uygulaması bölümleri ile ilgili videoya buradan erişebilirsiniz. 3. Deney Hazırlığı Tank düşmana ateş ettiğinde mermi dönerek ilerleyecek şekilde kodu güncelleyiniz. Sağ mouse butonu tıklanılmış olarak tutulurken zoom yapılacak ve mousedan el çekildiğinde zoom öncesine dönülecek şekilde 415 ve 420. satırlardaki if(){} bloklarına gerekli kodları yazınız. İpucu Projeksiyon matrisinin görüş açısı daha küçük bir değere (örneğin XM_PI/12) setlenerek zoom yapılabilir. Projeksiyon matrisinin yeni değerini constant buffera (cbuffer) atıp UpdateSubresource() ile vertex shadera yollamayı unutmayınız. W,A,S,D tuşlarıyla oyun ortamında ilerlerken duvarların içinden geçilmemesi için föyde anlatılan yönteme göre 360 ve 370. satırlardaki if(){} bloklarına gerekli kodları yazınız. 4

4. Deney Tasarımı ve Uygulaması Duvar arkasından ateş edildiğinde mermi duvarı delip geçmeyecek şekilde kodu güncelleyiniz. Düşmanı temsil eden tank oyuncuya dönüp, ateş edip vuracak şekilde kodu güncelleyiniz. İpucu Düşman tankının dönüp ateş etmesi ile ilgili kod Render() içindeki if(renderenemy){} kod bloğuna eklenebilir: 1. Her bir Render() çağrısında g_world_enemy matrisi 0.03 gibi küçük bir açı ile y-ekseninde dönme yapacak şekilde XMMatrixRotationY(0.03) matrisi ile çarpılarak güncellenir. 2. (0,0,1) değerine setlenmiş namluyu temsil eden doğrultu vektörü, g_world_enemy matrisine göre XMVector3TransformNormal() fonksiyonu ile transform edilir. 3. Düşmanı temsil eden tanktan oyuncuyu temsil eden tanka doğru olan vektör hesaplanır. XMVector3Dot() ile bu vektör ile yukarıda transform edilen vektör arasındaki açının kosinüsü hesaplanır. Bu değerin 1 e yakın olduğu andaki namlu doğrultu vektörü boyunca mermi yollanır yani merminin World matrisi föyün 2. sayfasında anlatılanlara benzer bir şekilde güncellenir. XMMatrixRotationY(0) a setlenerek artık düşman tankı döndürülmez. Yollanan mermi ile tankın kesişip/kesişmediğini test edecek kod föyün 3. sayfasında anlatılanlara benzer bir şekilde UpdateCamera() içine eklenebilir. Kesişim testi için yollanan ışının Ro başlangıç noktası merminin World matrisinin (_41,_42,_43) bileşenleri ile setlenebilir. Rd de namlunun doğrultusudur. 5. Deney Raporu Kaynak kodlardaki Rapor.docx adlı şablon belge deney saatine kadar grup adına doldurulup Deney Hazırlığı olarak istenen kod güncellemelerini içeren Proje (.sdf ve Debug klasörleri silinip.rar lanıp) ile birlikte 61omercakir@gmail.com adresine e-mail ile yollanacaktır. 5