OpenGL ile Sıfırdan Oyun Motoru Yazma [kapalı]


15

Oyun motorumu öğrenme amacıyla sıfırdan yazmaya başlamak istiyorum, önkoşullar ve bunun nasıl yapılacağı, hangi programlama dilleri ve bana tavsiye ettiğin şeyler? Ayrıca bu konuda iyi makaleler ve kitaplar varsa harika olacak. Şimdiden teşekkürler!

Programlama dilleri ve araçlarım:

  • C / C ++ sadece C kullanmak iyi mi?
  • piton
  • OpenGL
  • Git
  • GDB

Ondan ne öğrenmek istiyorum:

  • Çekirdek Oyun Motoru
  • Görüntü Oluşturma / Grafikler
  • Oyun Oynama / Kurallar
  • Giriş (klavye / fare / denetleyiciler, vb.)

Görüntü Oluşturma / Grafiklerde:

  • 3 boyutlu
  • gölgeleme
  • Aydınlatma
  • Tekstüre

İki nokta: bu soru olduğu gibi çok geniş. Hangi özellikleri istiyorsunuz, hangi platform (ları) desteklemek istiyorsunuz, hangi paradigmaları keşfetmek istiyorsunuz, komut dosyası diline (varsa) ne kadar sorumluluk koymak istiyorsunuz ve bir sürü başka şey rahatsız olmayacak m listeye devam.
Tetrad

8
İki: Diğer insanların oyun olmadan bir motor yapmaya odaklanmamanız gerektiğine dair yaygın bir bilgelik var. Oyunsuz bir motor, motorunuzun yararlı olduğunu kanıtlayamayacağınız anlamına gelir . İyi motorlar insanların kendi köpek mamasını yemelerini gerektirir. Yaygın olarak bağlı-bu tartışmanın daha burada girmeden Blog: scientificninja.com/blog/write-games-not-engines
Tetrad

2
^ Sadece bu değil, aynı zamanda özellik gereksinimlerini motive etmek için oyun olmadan bir motor yazmak özellik sürünme ve kötü API tasarımı ile sonuçlanır. Neye ihtiyacınız olduğunu bilene kadar, oyun gereksinimlerine göre, motorunuza faydalı şeyler koyamayabilirsiniz. Aynı şekilde, motoru programlamak için kullanmak zorunda kalmadıysanız, kararlarınızın bazılarının gerçekten tıknaz olduğunu görebilirsiniz.
ChrisE

1
Girişlerinizdeki noktayı görmüyorum. Bildiğiniz C / C ++ ve Python bize yardımcı oluyor, ancak neden sürüm kontrolü ve bir hata ayıklayıcı kullanabileceğinizi listeliyorsunuz?
Komünist Ördek

2
@TheCommunistDuck: Hey, bu bazı geliştiricilerden daha iyi. :)
ChrisE

Yanıtlar:


11

Bir oyun motorunu, herhangi bir oluşturma yöntemini kullanarak hemen hemen her dilde yazabilirsiniz. Örneğin konsol çıktısını kullanarak bash'de bir oyun motoru yazabilirsiniz.

Bu yüzden, kendi motorunuzu yazarken tam olarak ne öğrenmek istediğinizi tanımlamak en iyisi olacağını düşünüyorum. Oyun geliştirmede çok fazla "alan" vardır.

  • Çekirdek Oyun Motoru

  • Görüntü Oluşturma / Grafikler

  • AI

  • Oyun Oynama / Kurallar

  • Ses

  • Giriş (klavye / fare / denetleyiciler, vb.)

vs .. Oradan alt konular bile olabilir. Görüntü Oluşturma / Grafik

  • 2d veya 3d?

  • Modelleme

  • gölgeleme

  • Aydınlatma

  • Tekstüre

  • GUI / Huds / Bağlantı.

  • vs vs

Bu alt alt başlıklardan sadece biri, saatler süren (veya yıllarca) eğitim yiyebilir!

Bu nedenle, önce ne öğrenmek istediğinizi tanımlayın. Basit başlayın.

Konforlu dilinizi kullanın - bazıları belirli görevler için daha uygundur. Örneğin, çekirdek motor ve oluşturma muhtemelen en iyi C / C ++ gibi bir "düşük" seviye diliyle yapılır (eğer performansa ihtiyacınız varsa); ancak yapay zeka veya Oyun Kuralları gibi bir şey daha üst düzey bir dilde daha iyi yapılabilir. Hiçbir şey karıştıramayacağınız ve eşleştiremeyeceğinizi söylemiyor. Motorunuzu C ++ 'da, renderınız C' de (OpenGL ile iyi çalıştığı için) yazabilir ve daha sonra Oyun Kurallarınızı kodlamak için LUA kullanabilirsiniz.

Örnek olarak, Slick2D adlı bir oyun motoru var. Java ile yazılmış ve açık kaynak kodlu. Gerçekten iyi yazılmış ve tasarlanmış basit bir 2d motor örneği. Oyun döngüleri, oyun durumlarını yönetme vb. Gibi temel kavramları öğrenebilirsiniz.

C / C ++ ile rahat ediyorsanız; SDL / OpenGL'ye göz atmanızı öneririm. Giriş, ses, pencere oluşturma vb.Gibi bazı temizlik işlemlerini gerçekleştirir ve diğer şeylere odaklanabilir.


4
Ahh C ++ öğrendiğim günler ve konsol oyunları çok eğlenceliydi ... [yeni konsol projesi yaratıyor ...]
Nick Bedford


4

SDL + OpenGL, özel bir oyun motoru başlatmak için mükemmel bir seçimdir.

Şahsen C ++ 'ın C-ish sürümünü kullanıyorum çünkü benim için en iyi sonucu buldum. Demek istediğim, herhangi bir istisna kullanmıyorum. Bunun iki nedeni vardır: ilk ve en önemli istisnalar, OpenGL ve SDL ile tam olarak kolay olmayan istisna güvenli kod gerektirir. Daha da önemlisi, bu şekilde, C ++ nesnelerini C ABI üzerinde göstermek çok kolaydır, bu da bir betik dilini karışıma getirmeye çalıştığınızda inanılmaz faydalıdır.

Sizinkine benzer bir tekneyim ve SDL ve OpenGL ile yaptığım maceralardan bazılarını bir blogda yazdım ( immersedcode.org başkasıyla ilgilenmesi durumunda ) .

Genel mimari için iki önerim var: 3D bir motor istiyorsanız Jason Lander'ın "Game Engine Architecture" adlı kitabına göz atın. İstediğiniz tek şey 2D ise, tasarımı mümkün olduğunca basit tutun ve XNA veya diğer projelere ilham verin.

Son olarak: OpenGL'yi her yerde aramayın. Kendinize bir iyilik yapın ve isterseniz birkaç yerde masaüstü OpenGL / OpenGL ES ve hatta DirectX arasında geçiş yapabilmeniz için birkaç yere ayırın.


0

Bir uygulama detayı sizi zorla tutmazsa C'yi kullanmayın. Aksi takdirde, C ++ kullanın, çünkü çok daha yetenekli bir dili düzeltir ve her zaman bu yetenekleri daha sonra kullanmamayı seçebilirsiniz. Şahsen Python'a karşı / karşı hiçbir şeyim yok, hiç kullanmadım.

DirectX'e karşı OpenGL'yi tavsiye etmem çünkü DX çok daha temiz ve daha anlaşılır / daha az hataya eğilimli modern bir nesne yönelimli yaklaşıma sahiptir. OpenGL tarafından sunulan arayüz karşılaştırıldığında son derece zayıf.

Elimdeki son şey, GDB'ye tamamen, tamamen berbat olduğuna ve Visual Studio hata ayıklayıcısının çok iyi olduğuna güvendiğime inanıyorum. Bu benim kişisel deneyimim değil bu yüzden biraz tuz ile al.


4
"OpenGL ve DX". DirectX'in daha fazla OO olması gerçekten önemli değil. Daha anlaşılır olduğu kadar ... OpenGL (3'ten önce) oldukça basit bir arayüz ve C tarzı zorunlu bir metodolojide olduğu gibi taraması kolay bir arayüz ortaya koyuyor. "Projeksiyon matrisini buna ayarlayın. Üçgenleri başlatın. İşte bir dikey. İşte bir dikey. İşte bir dikey. Bitiş üçgenleri." 1.x OpenGL API serisi, grafik programlamada ayağınızı ıslatmak için iyidir ve SDL (veya hatta GLUT ... urg) ile birlikte 30-50 kod satırında bir uygulama elde etmenizi sağlar.
ChrisE

2
@ChrisE: Elbette. Denilen bir şey var extern "C"ve uygun kullanımı, C arayüzünü yazmayı oldukça önemsiz hale getiriyor - özellikle Boost içinde ona bağlanmayı kolaylaştıran bir dönüştürücünün bulunduğu Python için. C ++ dil özelliklerine ne dersiniz? Onlar konum harika . C ++ 'ın dil özelliklerinin daha fazla kullanılması, bir projenin güvenilirliğini ve kabul edilebilirden çok daha küçük bir performans değiş tokuşu için büyük ölçüde kodlama kolaylığını artırır. C'nin dil özellikleri mukayese edilir. Örneğin, modern bir C ++ derleyicisinin doğru kullanımı bellek sızıntısını garanti etmez. Bunu C.'de yap
DeadMG

1
@DeadMG: OOP gerçekten önemliyse, buradaki cevap C ++ değil, Java veya C #'dır. Kabul etmediğim şey, C ++ özelliklerinin kullanımının sihirli bir şekilde kodunuzu daha iyi, daha hızlı veya daha güvenilir hale getirmemesidir; Mecbur biliyor bu özellikleri nasıl kullanılacağı ve gerçekten bir motor kişinin zaman iyi bir kullanım mimarisi yanında bir dil öğreniyor? Hayır. Bunu ilk kez yapan biri için değil. Tüm C'yi bir veya iki gün içinde rahatça öğrenebilir ve dilin ne yaptığını asla merak edemezsiniz. Herhangi bir oranda ayarlanan kullanışlı temel çağrı olan OpenGL de aynı şeffaflığı sunar.
ChrisE

2
OOP bir anlaşma kadar büyük değil, yüksek performanslı oyun motorlarında değil. Elbette faydalıdır, ancak genellikle yanlış soyutlamadır. İyi bir veri akışı, yerellik ve bellek düzenine sahip olmak genellikle daha iyidir. Birçok takım C ++ kullanırken, C ++ özelliklerinin çoğunu kullanmazlar. İstisna yok, mümkün olduğunca az sanal, RTTI yok, STL / Boost yok. Neden? Birden çok platformda öngörülebilir ve hızlı yürütme ve küçük kod. C kodu ve sadece C ++ kullanmak istiyorum sadece iki alan vardır: Kapsamlı kilitleri ve genel diziler. Zorluk IMHO değmez.
geçersiz

4
GL ve D3D'de: GL3 / 4 çekirdeğinde matris yığını ve öznitelik yığını yoktur. Hem GL hem de D3D aynı donanım mimarisiyle eşleşir, ancak GL çok daha ince hissettirir. GL durum makinesinin biraz uğraştığından emin olun, ancak gerçek donanım da öyle;) Bunlardan herhangi birini öğrenmek iyidir ve gerçekte ne olduğunu anladığınız sürece kolayca diğerine (veya bir konsol API'sine) geçebilirsiniz.
geçersiz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.