Global Game Jam 2013'ün son saatleri... Ceren Tecim ve Tülin Samav ile aralıksız, 48 saat boyunca geliştirdiğimiz oyun sonunda bitti!
Feed The Boss, Stairway To Earth'ten çok farklı değil, amacınız Karanlık Lord'a yaranıp sağ kolu olmak. Bunun için bölüm içinde bulduğunuz kalpleri ona götürmelisiniz. Tabi bunu rakibinizden önce yapmalısınız. Kalbi ilk alan rakibiniz olursa ona vurarak kalbini düşürmesini sağlayabilirsiniz. Kalp sizde iken rakibinize vuramazsınız.
Kontoller:
Sarı Hayalet:
Zıpla: yukarı yön tuşu
Sağa: sağ yön tuşu
Sola: sol yön tuşu
Vur: sağ shift
Kırmızı Hayalet
Zıpla: w
Sağa: a
Sola: d
Vur: sol shift
Birkaç tane de ekran görüntüsü koyayım:
Oyunu bu sayfadan indirebilirsiniz.
27 Ocak 2013 Pazar
5 Ocak 2013 Cumartesi
Particle In A Box son beta sürümü
Artık aklıma gelen ve yapmak istediğim her şeyi yaptım. Oyunun düzeltilecek bir tarafını bulamıyorum, o yüzden sanırım son hali böyle olacak. Bundan sonra sadece bölüm yapacağım. Bu sürümde şunları ekledim:
- Bölümler seviye atladıkça açılıyor
- Arkaplan ekledim ve menülerin görünümlerini değiştirdim
- "Credits" menüsü ekledim
- "How to play" menüsünü güncelledim
Daha önce Particle In A Box oynadıysanız options'a girip oyun kayıtlarını silin. Özellikle bundan sonraki geri bildirimler benim için çok önemli. Herhangi bir eksik görürseniz ya da bir öneriniz olursa lütfen haber verin.
Birkaç ekran görüntüsü:
Windows ve Android betalarını bu sayfadan indirebilirsiniz.
- Bölümler seviye atladıkça açılıyor
- Arkaplan ekledim ve menülerin görünümlerini değiştirdim
- "Credits" menüsü ekledim
- "How to play" menüsünü güncelledim
Daha önce Particle In A Box oynadıysanız options'a girip oyun kayıtlarını silin. Özellikle bundan sonraki geri bildirimler benim için çok önemli. Herhangi bir eksik görürseniz ya da bir öneriniz olursa lütfen haber verin.
Birkaç ekran görüntüsü:
Windows ve Android betalarını bu sayfadan indirebilirsiniz.
Etiketler:
android,
anton,
anton semchenko,
particle,
particle in a box,
torreng,
torrenglabs,
unity,
unity3d
19 Aralık 2012 Çarşamba
Particle In A Box beta
Sonunda biraz boş zaman bulup Particle In A Box ile uğraşabildim. Başlıktan da anlaşıldığı gibi oyunu beta sürümüne kadar getirdim. Oyunun bu sürümünde getirdiğim en önemli özellik skorlarınızı kaydedebiliyor olmanız. Daha doğrusu skorlar otomatik olarak kaydediliyor, siz istediğiniz zaman silebiliyorsunuz. Bir de fark edeceğiniz gibi menüleri değiştirdim, çok daha güzel ve kullanışlı bir hale getirdim. Son olarak da oyunun Android versiyonunu yaptım ve onun da apk'sını indirip telefonlarınızda ya da tabletlerinizde oynayabilirsiniz. Bu aşamada oyunu daha çok teknik açıdan geliştirdiğim için sadece iki yeni bölüm yapabildim.
http://antonsemchenkoprojects.blogspot.com/2012/12/particle-in-box-alpha.html
Not: Yenilikler sadece yukarıda bahsettiklerimle sınırlı değil, diğerlerini oyunu oynayınca fark edersiniz zaten.
Not2: Herhangi bir sorunla karşılaşırsanız ya da öneriniz olursa mutlaka yazın.
http://antonsemchenkoprojects.blogspot.com/2012/12/particle-in-box-alpha.html
Not: Yenilikler sadece yukarıda bahsettiklerimle sınırlı değil, diğerlerini oyunu oynayınca fark edersiniz zaten.
Not2: Herhangi bir sorunla karşılaşırsanız ya da öneriniz olursa mutlaka yazın.
Etiketler:
android,
anton,
anton semchenko,
box,
particle,
particle in a box,
torreng,
torrenglabs,
unity,
unity3d
21 Kasım 2012 Çarşamba
Unity Dersleri
Gördüm ki Unity ile oyun geliştirmek çok basit, çok fazla bir şey bilmeye gerek yok. O yüzden Unity dersleri hazırlamaya karar verdim. Daha yeni olduğum için hemen başlamayacağım ama kendimi hazır hissettiğimde ilk dersi yapacağım.
20 Kasım 2012 Salı
Particle In A Box Alpha
Unity ile Android için geliştirmeye başladığım oynun, pc alpha versiyonudur. Şimdilik sadece dokuz bölümü var.
Kontolleri oldukça basit, topun "a"ya basarak yükselmesini sağlıyorsunuz. Bir de "s"ye basarak hızlandırabilirsiniz. Amacınız her bölümdeki bütün topları toplayarak finiş çizgisine ulaşmak.
Oyunu deneyenler şurası zor olmuş, burayı böyle yapsan daha güzel olur, bir de şöyle bir şey ekle şeklinde feedback verirse sevinirim.
Etiketler:
3d,
android,
anton,
anton semchenko,
particle,
particle in a box,
torreng,
unity,
unity3d
30 Ekim 2012 Salı
Projelerim
Yaptığım ve yapacağım bütün projeleri bir sayfada toplayayım dedim. Şimdilik sadece Stairway to Earth ve Goyun sayma uygulamasını koydum. Yakında şu anda üstünde uğraştığım oyunun da tanıtımını yapacağım. Buyurun siz de bakın: http://antonsemchenkoprojects.blogspot.com/
27 Haziran 2012 Çarşamba
Pygame (4)
Herkese tekrar merhaba. Bu sefer arayı fazla açmayım hemen yeni bir ders yazayım dedim. Geçen derste menü yapacağımızda bahsetmiştim, fazla uzatmadan benim kullandığım yöntemi anlatayım.
Yapacağımız şey oyunun döndüğü while döngüsünün içine bir while döngüsü daha eklemek. Menüye gireceğimiz zaman ikinci while'ın şartını doğru yapacağız, işimiz bitince de yine yanlış yaparsak asıl oyunun döndüğü while döngüsü kaldığı yerden devam edecektir. Tabi bunun için öncelikle menünün while döngüsünü yazmamız lazım.
Yapacağımız menüde önce butonları yapalım, sonra içlerine yazı yazarız. Bütün bunları bir sınıf ile halledebiliriz. Bu sınıf çağrıldığında butonun kendisi olan bir dikdörtgen ve içindeki yazıyı döndürecek. O halde sınıf dikdörtgenin boyutlarını, rengini ve yazıyı argüman olarak almalı. Ayrıca işimizi kolaylaştırmak için işlevini de argüman olarak alalım ve basıp basmadığımızı kontrol eden bir fonksiyon yazalım. Hemen hemen her şeyi düşündüğümüze göre sınıfı yazmaya başlayalım:
(x, y) = pygame.mouse.get_pos()
if self.kare.collidepoint((x, y)):
return True
else:
return False
Tabi bir önceki derste anlattığım gibi bizim_font'u tanımlamış olmamız lazım. Yukarıda kullandığım pygame.mouse.get_pos() fonksiyonu tahmin edebileceğiniz gibi mouse'un koordinatlarını (x, y) şeklinde döndürüyor. kare.colliedpont((koordinatlar)) fonksiyonu da aynı kare.colliderect() fonksiyonu gibi çalışıyor. Aralarındaki tek fark colliderect iki karenin çarpışıp çarpışmadığını kontrol ediyor, collidepoint ise bir noktanın karenin içinde olup olmadığını kontrol ediyor. Artık düme_ismi.bas() fonksiyonunu çağırdığımız zaman düğmeye basabildiysek True, basamadıysak False değerini döndürecek.
Bundan sonra istediğiniz düğmeyi kolayca yaratabilirsiniz. Hemen yapalım iki tane:
Yapacağımız şey oyunun döndüğü while döngüsünün içine bir while döngüsü daha eklemek. Menüye gireceğimiz zaman ikinci while'ın şartını doğru yapacağız, işimiz bitince de yine yanlış yaparsak asıl oyunun döndüğü while döngüsü kaldığı yerden devam edecektir. Tabi bunun için öncelikle menünün while döngüsünü yazmamız lazım.
Yapacağımız menüde önce butonları yapalım, sonra içlerine yazı yazarız. Bütün bunları bir sınıf ile halledebiliriz. Bu sınıf çağrıldığında butonun kendisi olan bir dikdörtgen ve içindeki yazıyı döndürecek. O halde sınıf dikdörtgenin boyutlarını, rengini ve yazıyı argüman olarak almalı. Ayrıca işimizi kolaylaştırmak için işlevini de argüman olarak alalım ve basıp basmadığımızı kontrol eden bir fonksiyon yazalım. Hemen hemen her şeyi düşündüğümüze göre sınıfı yazmaya başlayalım:
class düğme():
def __init__(self, renk, boyut, koordinat, yazı, yazının_rengi, işlevi):
self.işlev = işlevi
self.renk = renk
self.boyut = boyut
self.koordinat = koordinat
self.yazı = bizim_font.render(yazı, True, yazının rengi)
self.kare = pygame.Rect(self.koordinat, self.boyut) def bas(self):(x, y) = pygame.mouse.get_pos()
if self.kare.collidepoint((x, y)):
return True
else:
return False
Tabi bir önceki derste anlattığım gibi bizim_font'u tanımlamış olmamız lazım. Yukarıda kullandığım pygame.mouse.get_pos() fonksiyonu tahmin edebileceğiniz gibi mouse'un koordinatlarını (x, y) şeklinde döndürüyor. kare.colliedpont((koordinatlar)) fonksiyonu da aynı kare.colliderect() fonksiyonu gibi çalışıyor. Aralarındaki tek fark colliderect iki karenin çarpışıp çarpışmadığını kontrol ediyor, collidepoint ise bir noktanın karenin içinde olup olmadığını kontrol ediyor. Artık düme_ismi.bas() fonksiyonunu çağırdığımız zaman düğmeye basabildiysek True, basamadıysak False değerini döndürecek.
Bundan sonra istediğiniz düğmeyi kolayca yaratabilirsiniz. Hemen yapalım iki tane:
düğme1 = düğme((255, 255, 255), (120, 40), (çözünürlük[0] / 2 - 60, 100), "Yeni Oyun", (255, 0, 0), "başla")
düğme2 = düğme((255, 255, 255), (90, 40), (çözünürlük[0] / 2 - 45, 145), "Çıkış", (255, 0, 0), "çık")
Arkaplan renkleri beyaz, yazıları kırmızı olan, "Yeni Oyun" ve "Çıkış" diye iki tane düğme yarattık. Şimdi bunları ekrana çizdirelim. Bunu yapmadan önce bir şeyi daha hesaba katmalıyız, ileride bunlar gibi birçok düğme yaratmak isteyebiliriz. O halde hepsini daha kolay yönetebilmek için düğmeler_listesi diye bir liste yaratalım. Bu liste yardımı ile istediğimiz kadar düğmeyi ekrana tek bir fonksiyon ile çizdirebiliriz.
En son ilk while döngümüzün içine (devam şartına bağlı olan döngü) yeni bir while döngüsü koyalım (menü şartına bağlı olan döngü).
Satırları tek tek açıklayayım. for event ile başlayan sonraki satırlar zaten tanıdık, sadece pygame.MOUSEBUTTONDOWN kısmı farklı ki bu fonksiyon pygame.KEYDOWN'un mouse'a uyarlanmış hali. Mouse'ta bir tuşa basarsan anlamı taşıyor. Sonra yaptığımız listenin faydalarını göremeye başlıyoruz. Düğme sayısı ne olursa olsun hepsini tek bir for döngüsü ile kontrol edebiliyoruz (önemli not: for döngüsünü daha önce anlatmamış olduğumu fark ettim, ilk derse if elif else'ten sonrasına ekledim). Eğer mouse'un herhangi bir düğmesine basarsak, for döngüsü, düğmeler_listesi'ndeki her bir düğmeyi "acaba hangisine basıldı" diye kontrol edecek. Eğer gerçekten bir düğmeye basmışsak ve bas() fonksiyonu True değerini döndürmüşse o zaman oyunumuz tam olarak hangi düğmeye bastığımızı if ile kontrol etmeye başlayacak. Burada işlev değişkenini kullanmak yerine düğmenin üstünde ne yazdığına bakarak da aynı işi yapabilirdik.
Oyun içindeyken menüye girmek istersek daha önce yazdığımız, "for event in pygame ..." kısmına yeni bir tuş ekleyerek bunu yapabilirsiniz.
Şimdiye kadar yazdığınız kod, oyunu ilk açtığınızda karşınıza menü ekranını getirecek ve eğer Yeni Oyun düğmesine basarsanız yeni oyun başlayacaktır. Buna benzer bir kod yazmış olmanız lazım:
Menü yazılarının arkaplanlarını düzgün ayarladıktan sonra komple kaldırabilirsiniz. O karelerin tek işlevleri yazılara tıklayıp tıklamadığınızı kontrol etmek. pygame.draw.rect(pencere, i.renk, i.kare) satırını silerseniz o çirkin kareler kaybolacaklardır.
En son oyuna ses eklemek kaldı. Bu işlemi de resim eklemeye benzer bir şekilde yapıyoruz: pygame.mixer.Sound("ses.wav") komutu ile kullanacağımız sesi kullanıyoruz (ses.wav örnek bir isim, aynı resmi tanımlarken pygame.image.load("resim.jpg")'deki resim.jpg gibi). Hemen ates.wav dosyasını çalalım mesela:
Evet, her şey bu kadar basit. ates_sesi'ni resimleri tanımladığımız yerde tanımlayalım, mermiyi oluştururken de çalalım, yani ates_sesi.play()'i mermi sınıfının içine bir yere yazalım:
Bu derste anlatmak istediklerim de bu kadar. Ses ile ne yapabileceğinizi daha ayrıntılı bir şekilde öğrenmek için müzik ve mixer dokumentasyonlarına bakabilirsiniz. Bir sonraki derste görüşmek üzere.
En son ilk while döngümüzün içine (devam şartına bağlı olan döngü) yeni bir while döngüsü koyalım (menü şartına bağlı olan döngü).
düğmeler_listesi = [düğme1, düğme2]
menü = True
while devam:
while menü:
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
for i in düğmeler_listesi:
if i.bas():
if i.işlev == "başla":
menü = False
if i.işlev == "çık":
menü = False
devam = False
pencere.fill((0, 0, 0)) #menünün arkaplanı siyah olacak
for i in düğmeler_listesi: #bütün düğmeleri üç satır kod ile çizdirmemize yarayan fonksiyon
pygame.draw.rect(pencere, i.renk, i.kare) #düğmenin arkaplanı olan kareyi çizdiriyoruz
pencere.blit(i.yazı, i.yazı_koordinat) #düğmenin üstündeki yazıyı yazdırıyoruz
pygame.display.update()
time.sleep(0.0025)Satırları tek tek açıklayayım. for event ile başlayan sonraki satırlar zaten tanıdık, sadece pygame.MOUSEBUTTONDOWN kısmı farklı ki bu fonksiyon pygame.KEYDOWN'un mouse'a uyarlanmış hali. Mouse'ta bir tuşa basarsan anlamı taşıyor. Sonra yaptığımız listenin faydalarını göremeye başlıyoruz. Düğme sayısı ne olursa olsun hepsini tek bir for döngüsü ile kontrol edebiliyoruz (önemli not: for döngüsünü daha önce anlatmamış olduğumu fark ettim, ilk derse if elif else'ten sonrasına ekledim). Eğer mouse'un herhangi bir düğmesine basarsak, for döngüsü, düğmeler_listesi'ndeki her bir düğmeyi "acaba hangisine basıldı" diye kontrol edecek. Eğer gerçekten bir düğmeye basmışsak ve bas() fonksiyonu True değerini döndürmüşse o zaman oyunumuz tam olarak hangi düğmeye bastığımızı if ile kontrol etmeye başlayacak. Burada işlev değişkenini kullanmak yerine düğmenin üstünde ne yazdığına bakarak da aynı işi yapabilirdik.
Oyun içindeyken menüye girmek istersek daha önce yazdığımız, "for event in pygame ..." kısmına yeni bir tuş ekleyerek bunu yapabilirsiniz.
Şimdiye kadar yazdığınız kod, oyunu ilk açtığınızda karşınıza menü ekranını getirecek ve eğer Yeni Oyun düğmesine basarsanız yeni oyun başlayacaktır. Buna benzer bir kod yazmış olmanız lazım:
import pygame, time, random
pygame.init()
#### DEĞİŞKENLER ####
çözünürlük = (800, 600)
devam = menü = True #menü değişkenini burada tanımladım
son_düşman_ekleme = pygame.time.get_ticks()
pencere = pygame.display.set_mode(çözünürlük)
bizim_font = pygame.font.SysFont("arial", 30)
#### CLASSLAR ####
class oyuncu():
def __init__(self, boyut, resim):
self.skor = 0
self.can = 10
self.boyut = boyut
self.resim = pygame.image.load(resim)
self.kare = pygame.Rect((350, çözünürlük[1] - self.boyut[1]), self.boyut)
self.sağa = False
self.sola = False
def hareket(self, yön):
if yön == "sağa":
self.sağa = True
elif yön == "sola":
self.sola = True
def hareket_iptal(self, yön):
if yön == "sağa":
self.sağa = False
elif yön == "sola":
self.sola = False
class düğme():
def __init__(self, renk, boyut, koordinat, metin, yazının_rengi, işlevi):
self.işlev = işlevi
self.renk = renk
self.boyut = boyut
self.koordinat = koordinat
self.yazı = bizim_font.render(metin, True, yazının_rengi)
self.yazı_koordinat = (koordinat[0] + 3, koordinat[1] + 3)
self.kare = pygame.Rect(self.koordinat, self.boyut)
def bas(self):
(x, y) = pygame.mouse.get_pos()
if self.kare.collidepoint((x, y)):
return True
else:
return False
class mermi():
global çözünürlük
def __init__(self, oyuncu):
self.kare = pygame.Rect((oyuncu.kare.left + oyuncu.boyut[0] / 2, çözünürlük[1] - oyuncu.boyut[1]), (2,
3))
class düşman():
def __init__(self):
pos_x = random.randint(0, çözünürlük[0] - 50)
self.kare = pygame.Rect((pos_x, -50), (50, 50))
#### FONKSİYONLAR ####
def hareketler():
global oyuncu1, çözünürlük, mermi_listesi
if oyuncu1.sağa and oyuncu1.kare.right < çözünürlük[0]:
oyuncu1.kare.left += 1
if oyuncu1.sola and oyuncu1.kare.left > 0:
oyuncu1.kare.left -= 1
for i in mermi_listesi:
i.kare.top -= 3
if i.kare.bottom < 0:
mermi_listesi.remove(i)
for i in düşman_listesi:
i.kare.bottom += 1
if i.kare.top > çözünürlük[1]:
düşman_listesi.remove(i)
oyuncu1.can -= 1
def düşman_ekle():
global son_düşman_ekleme
if pygame.time.get_ticks() - son_düşman_ekleme > 3000:
son_düşman_ekleme = pygame.time.get_ticks()
düşman_listesi.append(düşman())
def çarpışma():
global oyuncu1, düşman_listesi, mermi_listesi
for i in düşman_listesi:
for k in mermi_listesi:
if i.kare.colliderect(k.kare):
düşman_listesi.remove(i)
mermi_listesi.remove(k)
oyuncu1.skor += 1
if i.kare.colliderect(oyuncu1.kare):
düşman_listesi.remove(i)
oyuncu1.can -= 1
oyuncu1 = oyuncu((50, 50), "uzay_gemisi.gif")
#düğmeleri yaratıyoruz:
düğme1 = düğme((255, 255, 255), (120, 40), (çözünürlük[0] / 2 - 60, 100), "Yeni Oyun", (255, 0, 0), "başla")
düğme2 = düğme((255, 255, 255), (90, 40), (çözünürlük[0] / 2 - 45, 145), "Çıkış", (255, 0, 0), "çık")
#### LİSTELER ####
mermi_listesi = []
düşman_listesi = []
düğmeler_listesi = [düğme1, düğme2] #düğmeler listesini yaratıp içine düğme1 ve düğme2'yi ekledik
while devam:
while menü:
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
for i in düğmeler_listesi:
if i.bas():
if i.işlev == "başla":
menü = False
if i.işlev == "çık":
menü = False
devam = False
pencere.fill((0, 0, 0)) #menünün arkaplanı siyah olacak
for i in düğmeler_listesi: #bütün düğmeleri üç satır kod ile çizdirmemize yarayan fonksiyon
pygame.draw.rect(pencere, i.renk, i.kare) #düğmenin arkaplanı olan kareyi çizdiriyoruz
pencere.blit(i.yazı, i.yazı_koordinat) #düğmenin üstündeki yazıyı yazdırıyoruz
pygame.display.update()
time.sleep(0.0025)
if oyuncu1.can == 0:
devam = False
for event in pygame.event.get():
if event.type == pygame.QUIT:
devam = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
oyuncu1.hareket("sola")
if event.key == pygame.K_RIGHT:
oyuncu1.hareket("sağa")
if event.key == pygame.K_SPACE:
mermi_listesi.append(mermi(oyuncu1))
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
oyuncu1.hareket_iptal("sola")
if event.key == pygame.K_RIGHT:
oyuncu1.hareket_iptal("sağa")
hareketler()
düşman_ekle()
çarpışma()
pencere.fill((0, 0, 0))
pencere.blit(oyuncu1.resim, oyuncu1.kare)
for i in mermi_listesi:
pygame.draw.rect(pencere, (255, 255, 255), i.kare)
for i in düşman_listesi:
pygame.draw.rect(pencere, (255, 255, 255), i.kare)
can_yazı = bizim_font.render(str(oyuncu1.can), True, (0, 255, 0))
skor_yazı = bizim_font.render(str(oyuncu1.skor), True, (255, 0, 0))
pencere.blit(can_yazı, (5, 5))
pencere.blit(skor_yazı, (5, 35))
pygame.display.update()
time.sleep(0.0025)
pygame.quit()
Menü yazılarının arkaplanlarını düzgün ayarladıktan sonra komple kaldırabilirsiniz. O karelerin tek işlevleri yazılara tıklayıp tıklamadığınızı kontrol etmek. pygame.draw.rect(pencere, i.renk, i.kare) satırını silerseniz o çirkin kareler kaybolacaklardır.
En son oyuna ses eklemek kaldı. Bu işlemi de resim eklemeye benzer bir şekilde yapıyoruz: pygame.mixer.Sound("ses.wav") komutu ile kullanacağımız sesi kullanıyoruz (ses.wav örnek bir isim, aynı resmi tanımlarken pygame.image.load("resim.jpg")'deki resim.jpg gibi). Hemen ates.wav dosyasını çalalım mesela:
ates_sesi = pygame.mixer.Sound("ates.wav")
ates_sesi.play()Evet, her şey bu kadar basit. ates_sesi'ni resimleri tanımladığımız yerde tanımlayalım, mermiyi oluştururken de çalalım, yani ates_sesi.play()'i mermi sınıfının içine bir yere yazalım:
class mermi():
global çözünürlük
def __init__(self, oyuncu):
self.kare = pygame.Rect((oyuncu.kare.left + oyuncu.boyut[0] / 2, çözünürlük[1] - oyuncu.boyut[1]), (2,3))
ates_sesi.play()Bu derste anlatmak istediklerim de bu kadar. Ses ile ne yapabileceğinizi daha ayrıntılı bir şekilde öğrenmek için müzik ve mixer dokumentasyonlarına bakabilirsiniz. Bir sonraki derste görüşmek üzere.
Etiketler:
oyun,
oyun yapımına giriş,
oyun yapma,
oyun yazmak,
programlama dilleri,
pygame,
pygame giriş,
pygame ile oyun yazmak,
pygame.mixer.Sound(),
python,
python ile oyun yazmak
Kaydol:
Kayıtlar (Atom)









