APyGM OpenGL


Oyuna görsellik kazandırmak için ufaktan OpenGL konusuna giriş yaptım. Python kodlarıyla PyOpenGL kütüphanesini kullanıyorum. Çeşitli sitelerde örnekler mevcut ama kodları biraz eski olduğu için bu örnekleri yenilemem gerekti. Şimdilik basit bir menü tasarımı yapmaya çalışıyorum. Sağ tıklandığında çeşitli fonksiyonlar döndürecek. Oyun bu zamana kadar konsol üzerinde geliştiği için dönüşler konsol üzerinde gözüküyor ama bunu yakında halledeceğim. Kasım ayına kadar bazı temel şeyleri halledip kasımdan sonra 3D modelleme ile ilgilenmek istiyorum. Örneklerde GLUT kullanılmış ama bu araç özgür değilmiş, lisans bilgisini tam olarak bulamadım ama sanırım kullanmayacağım. PyGame gibi SDL kullanmayı düşünüyorum ki onu kullanırsam uğraşmaya gerek yok direkt PyGame kullanabilirim, can sıkıcı bir durum. Başa dönüyoruz bu durumda Panda3D mi PyGame mi? Cevabını zaman gösterecek.

Ek: Ogre3D kullanmaya başladım.

APyGM Gelecek

Projeyi İngilizce’ye çevirmiş olsam da bazı fikirlerimi paylaşmak istiyorum, böylelikle takip etmeye başlayan arkadaşlar ne yaptığımı anlayabilir. Öncelikle uzun zamandır oyun yapımı konusuna meraklı olduğumu söylemeliyim, tahminimce orta okul sonu – lise başları gibi internet üzerinden çeşitli oyun yapım ekiplerini takip ettim. Çoğu başarısız oldu, kimisi yön değiştirdi. Kendim bile lisede bir oyun yapmaya çalışmıştım hatta bu amaçla hazırladığım senaryo ayrı bir hikâyeye dönüştü ama oyun projesi durmuştu.

Linux ve Özgür Yazılım şenliğine konuşmacı olarak katılan Google mühendisi abimizin bazı söyledikleri bana fikir verdi. Öncelikle diğer ekiplerin hatalarını düşündüm. Ya gerekli bütçeleri yoktu ya da çok büyük işler yapmaya çalışıyorlardı, bu yüzden olsa gerek bir noktada tıkanıyorlar ve devam edemiyorlardı. Projeleri kapalı kaynak kodlu olduğu için kimse onların yerine projelerini devam ettirmedi. Mezara gömülmüş o kadar emek…

Mühendis abimizin ilk söylediği şey bir fikir ortaya atmadan önce bir şeyleri başlatmamızdı. Önce kodu yaz işe başla ondan sonra insanların katılmasını bekle. Çalıştığınızı bir şeyler ürettiğinizi görmeden kimse size durduk yere katılmaz. Hele hele oyun yapıyorum diye ortaya çıkarsanız çoğu kişi bir tarafıyla size gülecektir. Ama bir yerden başlarsanız… ufak da olsa bir şeyleri başarırsanız insanlar sizi takip etmeye başlar ve zaman içerisinde projeniz büyür. Benim yaptığımda o ilk adımı atmak oluyor.

APyGM şuan çok erken bir safhada. Sadece konsol üzerinde kullanıcının girdiği verilerle benim girdiğim veri tabanı değerleri arasında çeşitli hesaplamalar yapıp kullanıcıya döndürüyor. Şimdilik yaptığım “neyi nasıl yapacağıma karar vermek” ve süreçleri test etmek. Bu bir RPG oyunu olacak ama sizlere World of Warcraft gibi bir oyun sunmayı düşünmüyorum. Sonuçta ne ben profesyonel bir programcıyım ne elimde böyle bir şeyi başaracak ekip var ne de para var. PS oyunlarına benzeyen bir RPG olacak. Turn based bir savaş sistemi düşünüyorum ama onu oyun motoruna geçmeden test etmeyeceğim.

XNA ve PyGame ile yaşadığım tecrübelerden sonra hız konusunda sıkıntı yaşayabileceğimi fark ettim. C gibi bir dil kullanmadığımız sürece araya sürekli çeşitli katmanlar girmekte ve bu katmanları aşmaya çalışırken oyunumuz yavaşlamakta. Şimdilik sadece konsol üzerinde çalıştığım ve fazla değişken olmadığı için bir sorun yok ama oyun geliştikçe bu sorunu yaşayacağım. İşte bu yüzden kodlama sırasında olabildiğince az modülü import edeceğim. Belleğe minimum düzeyde veri atıp işlemleri en alt düzeyde yapmayı planlıyorum. Gereksiz hesaplamalar olmamalı, işlemler hemen yapılıp bitmeli.

Önümde iki seçenek var en azından şimdilik PyGame ve Panda3D. Bunlar başarılı projeler ama kendimde OpenGL üzerinde çalışabilirim. Sonuçta geliştireceğim oyun fazla karmaşık olmayacağı için kendi yazacağım ufak bir motor yeterli olabilir, deneyerek karar vereceğim zaten sizlerde benle öğreneceksiniz.

Sınıf yapısını kullanmaya gerek görmemiştim ama dün sabah yaptığım commit ile ilk sınıfı oluşturdum. Oyuna görsel ögeler eklemeye yaklaştıkça kodları sınıf yapısına geçireceğim. Zaten temiz kodluyorum ve her şey fonksiyonlar üzerine kurulu, onları sınıfların altına almak zor olmayacaktır.

Şimdilik yaptıklarım düşününce daha uzun bir yolum olduğu görüyorum. Kullanıcıyla etkileşim sonunca çeşitli verileri alıp savaşıyor, savaş sonunda da experience alıp bunların toplamıyla level alıyoruz. Level alınca da statleri birer puan arttırıyoruz. Bundan sonrası için karakterimize kıyafet giydirmeye ve elimize birer silah almaya çalışacağım. Onlara göre savaş sistemini yenileyeceğim. Elbette bunu yapmak için öldürdüğümüz yaratıklardan bir şeyler elde etmemiz gerekecek. Çoğu oyunda küçücük solucanlardan ya da diğer hayvanlardan çeşitli kıyafetler düşüyor. Ben onun yerine bu hayvanlardan deri falan elde edip onları bir yere satmayı ve oradan gelen parayla kuracağım bir market üzerinden alışveriş yaptırma yolunu seçeceğim. Bu mesela şimdi geldi aklıma 😀 Nasıl yapacağım diye düşünüyordum yazarken aklıma geldi 😀

Neyse bizi izlemeye devam edin efendim. İyi geceler!

APyGM v0.6 Released

Here we are! APyGM’s new version is released under GPLv3. With this version we star to gain exp, gain lvl and ofcourse loose exp. I added new mounsters to our db. From now on if you ever see a polar bear, run as fast as you can! When you level up all your stats gain +1 points. At the beginning of game you have to select your stats wisely my advice just give 10 hp and 10 power point because at this point these 2 stats are very important. All stats must be 30, i had control over them but with new level system i lost it and have to re-write it. So dont cheat. I really need your advice, you can send me your suggestions via my e-mail adress [email protected] . You should know this is very early stage and im just working on game mechanics i will use a game engine after i finish the mechanics and storyline. Still you can advice me about it.

Anyway here your download link for APyGM version 0.6

New mounsters:
-crow
-snake
-tiger
-wolf
-bear
-ghost
-werewolf
-polar bear(boss)

I hope you enjoy it(not possiable? :P) Goog luck

APyGM

APyGM means Another Python Game. it is my new project name. 🙂
Well i released new version because i traslated the project to english. From now on i will keep it in english. With this version we start to take mounster’s information from our new database(npc.db). You have a script named gm.py which helps to adding your random mounsters. I just added 2 for testing the battle system.

At older versions we got this information from a python dictionary it was hard to add more on it, maybe not so hard but it just makes the code dirty.
With this version i activate the defance value of mounster for the battle system. Im working on experience and level system. I hope i can finish it soon. I would like to hear your ideas anything can help me. Anyway here the link for version 0.5.
To play the game just open files in same directory and run the game.py. Good luck.

Oyun Yapımı -4

Versiyon 0.4 hazır!

Yaptıklarımıza gelecek olursak öncelikle artık bir run() fonksiyonumuz var. Bu fonksiyon sayesinde siz istemedikçe oyun kapanmayacak. Tamamen metinden oluşan bir arayüz oluşturdum ve size iki seçenek verdim. Ya savaşırsınız ya da korkak gibi sys.exit() çekersiniz. İki dosyamız var bundan sonra ana dosyayı kurcalamadan fun.py dosyası üzerinde çalışacağım. Uygulamayı çalıştırmak için bir dizine arşivi açın sonrada oyunv0.4.py dosyasını çalıştığın.

İlk açtığınızda karakter ismini ve özelliklerini soracak 5 özelliğin toplam değeri 20’yi geçemez. Oyun sistemi üzerinde daha karar vermediğim için şimdilik sadece belli bazı teknikleri deniyorum. Yoksa adının oyun olması dışında bunun bir oyunu benzer hali yok gibi 😛 Teknoloji demosu efendim bu. 😀 Ama oyun yapımıyla ilgili mantıkları öğreniyorsunuz dediğim gibi her şey birer döngüden ibaret(loop loop) bizde döngülerimizi arttırmaya devam edeceğiz.

Mavi Düşler


Özgürlükiçin’in tema bölümüne yeni özellikler eklene dursun bende orada yapılan çalışmalara heves edip azıcık görünüm ayarlarıyla oynamaya başladım. Normalde masaüstümü olabildiğince sade tutarım, malum işletim sistemini kullanırken ne kadar sade o kadar hızlı mantığı ya da bilgisayarcı büyüklerimin “bilgisayarcı dediğin sade olur” desturuyla olsa gerek hep klasik takılırdım. Bu kötü bir alışkanlıktı; tamam eski sistemlerde klasik takılıyorsun da öyle bir alışıyor ki insan artık süper bilgisayarlarla karşılaştığında bile önce sistemi sadeleştiriyorum.

Klasik tema, klasik menüler ve diğer sıkıntılardan sonra Pardus 2009’umuz ile birlikte ekranımızı şenlendirmeye karar verdik. Blend temasının arka planına güzel mas mavi bir resmi döşedik. Panelin boyutunu küçültebildiğimi bilmiyordum! O da iyi oldu^^ Son olarak sistem ayarlarında renklere baktım ve temaya uygun mavili bir paleti seçtim, harika oldu. En çok sevdiğim yanı bilgisayarı kapatırken karşımıza çıkan seçeneklerin tasarımı. Tuşlar parlıyor 🙂 Neyse şöyle bir ekran görüntüsü ekleyelim de herkes mavi düşlere dalsın!

Oyun Yapımı -3

Vakit bol olunca uğraşıp duruyoruz. Bundan böyle kodlar uzadığı için google code üzerinde oluşturduğum bir proje üzerinden sizlere dosyaları ulaştıracağım. Oyunumuzun adı gmsgame oldu ve bundan böyle gplv3 ile lisanslı. 0.3 numaralı versiyon şu adresten indirilebilir. Şimdi gelelim bu versiyonla birlikte neler yaptığımıza. Öncelikle artık girdiğimiz verileri bir veritabanında tutuyoruz. Veritabanı olarak Sqlite’ı tercih ettim, kullanım gayet basit ve Pardus 2009’da Python bağlantıları kurulu geliyor.

İlk açtığımızda dosya ile aynı dizinde test.db isimli bir dosyayı okumaya çalışıyoruz. Dosya yoksa ya da silmişseniz tekrardan bir karakter oluşturuyoruz. Bundan böyle veritabanına sahip olduğumuz için her açtığımızda karakter bilgilerini girmekle uğraşmayacağız ve direkt aksiyona dalacağız. Sadece yaratıklar değişecek ve farklı sonuçlar olacak. İkinci yazıda gözden kaçırdığım bir “break” ifadesi yüzünden bizde savaşın sonunda ölüyorduk. Bu hatayı giderdim. Örnek olması açısından geliştirmeye devam edeceğim bu sayede bende bilgilerimi güncelliyorum, veritabanı ile uğraşmayalı çok olmuştu iyi oldu 🙂

Düzeltme: Dosyayı yanlışlıkla sildim, eski versiyon üzerinde çalıştığım için eski kodları ve dosyayı yapıştırmam imkansız. Bir sonraki versiyona bakın.

Oyun Yapımı -2

Gece yazdığım uygulamaya sabah ek yapıyorum. Şimdi dediğim gibi rastgele çekebilirdik canavarı bende öyle yaptım ama sadece sağlığını değiştirdim. Saldırı puanını bir sonraki yazıda düzenlerim. Rastgele seçim yapmak için önce canavarlar isimli bir sözlük nesnesi oluşturdum sonra random modülünün choice() fonksiyonunu kullanarak bu sözlüğün anahtarlarından rastgele bir seçim yaptım. Aşağıda ki while döngüsüne tekrardan bir ek yapma gereği duydum sorun şuydu eğer canavarın canı 3’e iner ve bundan saldırı puanımız yüksekse negatif olarak işlem devam ediyor ve sonunda ölüyorduk. Buraya bir ek yapıp canavarın canı güçten ufak olduğundan değerini otomatik sıfır yapıyoruz ve biz kazanıyoruz. Ayrıca while döngüsünün başına tekrardan bir koşul koydum. Oyuncu canını 0 olarak işaretlerse oyuna başlamadan kaybedecek.



#!/usr/bin/env python

# -*- coding: utf-8 -*-

import random


print "Karakter yaratım işlemi başlamak üzere lütfen hazırlanın gireceğiniz değerlerin toplamı 20 olmalı"

zeka = raw_input("Zeka puanı: ")

guc = raw_input("Güç puanı: ")

karizma = raw_input("Karizma puanı: ")

ceviklik = raw_input("Çeviklik puanı: ")

can = raw_input("Can puanı: ")

toplam = int(zeka)+int(guc)+int(karizma)+int(ceviklik)+int(can)


if toplam == 20:

  print "işlem başarılı."

  canavarlar = {"kutupayisi":"50","demon":"30","bildircin":"20","solucan":"5"}

  sans = random.choice(canavarlar.keys())

  canavar = canavarlar[sans]

  sal = 2

  saglik = int(can) * 5


  print "deneme savaşı başlatılıyor..."

  if saglik == 0:

    print "Tebrikler başlamadan kaybettiniz"

  else:

    while saglik > 0:

      saglik = int(saglik) - int(sal)

      print "canınız %s'e indi" % saglik

      canavar = int(canavar) - int(guc)

      print "canavarın canı %s'e indi" % canavar

      if saglik == 0:

	print "öldünüz ühühü"

	break

      elif canavar == 0:

	print "kazandınız ohh yeahhh"

	break

      elif canavar

Oyun Yapımı -1

Arada sırada Python bilgimi tazelemek için boş işlerle uğraşırım. Bu da uğraştığım boş işlerden birisi. Oyun programlamaya girdiğinizde tüm oyunların birer döngüden ibaret olduğunu göreceksiniz. En basitinden tutunda en karmaşık oyunlara kadar hepsi döngüler üzerine kuruludur. Zaten çoğunda Panda3d yazılarında bahsettiğim gibi loop() fonksiyonu gibi fonksiyonlar kullanırsınız. Hazır bir oyun motoru kullanırsanız bu fonksiyonlar önceden tanımlanmış olur, kullanmazsanız da verdiğim örnekteki gibi döngüleri kendiniz hazırlamak zorundasınız.

Örnekte önce kullanıcıdan karakteri için bazı bilgiler isteniyor. İki tanesini kullanmış olduk. Sonra aldığımız bu değerleri işleyip hazırladığımız rakip değerler ile işleme tabi tutuyoruz. Mesela burada canavar diye bir nesne oluşturdum. Bu ileride şöyle geniş bir tüp içinde belli sayıda nesne olabilir ve bu nesneler içerisinden karakter karşısına rastgele bir rakip çıkarabiliriz. Neyse yaptığımız işlem toplama ve çıkarmadan ibaret while döngüsüyle ölene kadar çıkartma yapıyoruz eğer rakiplerden birisinin canı sıfıra inerse işlemi kesip sonucu bildiriyoruz.


#!/usr/bin/env python
# -*- coding: utf-8 -*-

print "Karakter yaratım işlemi başlamak üzere, gireceğiniz değerlerin toplamı 20 olmalı"
zeka = raw_input("Zeka puanı: ")
guc = raw_input("Güç puanı: ")
karizma = raw_input("Karizma puanı: ")
ceviklik = raw_input("Çeviklik puanı: ")
can = raw_input("Can puanı: ")
toplam = int(zeka)+int(guc)+int(karizma)+int(ceviklik)+int(can)

if toplam == 20:
print "işlem başarılı."
canavar = 20
sal = 2
saglik = int(can) * 5

print "deneme savaşı başlatılıyor..."
while saglik > 0:
  saglik = int(saglik) - int(sal)
  print "canınız %s'e indi" % saglik
  canavar = int(canavar) - int(guc)
  print "canavarın canı %s'e indi" % canavar
  if saglik == 0:
    print "öldünüz ühühü"
    break
  elif canavar == 0:
    print "kazandınız ohh yeahhh"
    break
  else:
    continue

else:
print "işlem başarısız."