PyS60 Mesajlaşma

Bu bölümde PyS60 ile mesajlaşma imkanı sağlayan messaging modülünü inceleyecez. Bu modül ile SMS ve MMS gönderebiliriz. Örnek olması açısından sms_send() fonksiyonunu kullanalım.


import messaging
messaging.sms_send("+90534XXXXXXX", u"Selamlar")

Elbette öncelikle modülümüzü import ettik, ardından fonksiyonu kullanarak yazdığımız numaraya selamlarımızı ilettik.

sms_send için söz dizimi şu şekilde:
sms send(number, msg, [encoding=’7bit’, callback=None, name=”” ])
numaramızı giriyoruz, mesajı yazıyoruz, istersek encoding değerini belirtiyoruz(7bit, 8bit, UCS2), name kısmında isim belirtebiliyorsunuz callback mesajın durumuyla ilgili veriler hakkında ki bir seçenek aşağıdaki örnekte ne işe yaradığını anlayacaksınız.

mms_send için söz dizimi:
mms send(number, msg, [attachment=None ])
Burada attachment kısmı göndereceğiniz resmin tam adresidir. number telefon numarası msg ise mesajınız. Bu özellik 3.0 versiyonlarında kullanılabilir. Messaging modülü ile bazı verileri kullanabilirsiniz demiştim işte aşağıda:

import messaging
def cb(state):
if state==messaging.ESent:
print "**Mesaj yollandı**"
if state==messaging.ESendFailed:
print "**Mesaj gönderilemedi**"

messaging.sms_send("1234567", "Selamlar!", '7bit', cb, "Ceyhun")
**Mesaj yollandı**

Messaging modülümüzü import ettik ardından “cb” isimli bir fonksiyon tanımladık. Buna göre eğer state, messaging.ESent’e eşit olursa (ESent fark ettiğiniz gibi mesajın başarıyla yollandığına ait veridir) mesaj yollandı yazısını print ederiz. Eğer state, ESendFailed verisi ile eşleşirse bu sefer mesajın yollanamadığı hatasını almış oluruz. Bu fonksiyonu oluşturmayı bitirdiğimizde normal şekilde sms_send() fonksiyonunu kullandık 1234567 numarasına selamlarımızı ilettik callback olarak yazdığımız fonksiyon sonucunda sms._send() ifadesini girmemizin ardından Mesaj yollandı cevabını aldık.

Şimdilik bu kadar arkadaşlar bir sonra yazımda uygulama çatısı hakkında bazı bilgiler verecem, kolay gelsin.

Mobile Python Kullanıcı Arayüzü(UI)

PyS60’ın sunduğu kullanıcı arayüzü modülü appuifw dır. Çalışmalarımızda önce diğer python programları gibi önce kullanacağımız modülü import ederiz. Şimdi gelin appuifw modülünün fonksiyonlarına göz atalım:

query
Bu tek satırlık dialogtur. Veri girişi sağlar. Söz dizimi şu şekilde olur:
query(label, type[, initial value ])

Label kısmına isteğinize göre bir yazı girebilirsiniz, type girilecek verinin türüdür bu şunlardan biri olabilir :
“text”, “number”, “date”, “time”, “code”, “query”, “float”

Bir örnek yazalım
appuifw.query(u”Birsey yaz ey muhterem:”, “text”, u”baslangic degeri bu”)
dikkat ettiyseniz baslarinda u bu yazdığınız satırın Unicode olduğunu belirtir. Symbian OS bir çok dilde kullanıldığı için yazı olarak Unicode standart kabul edilir.

note
Bu fonksiyon bir popup mesjı gösterir. Örneğin yükleme tamamlandı penceresi açılır yada mesaj gönderildi diye bir pencere çıkar ya karşınıza işte o işi yapar note.
Söz dizimi “note(text[, type[, global ] ])” şeklindedir. Bir örnek verelim:
appuifw.note(u”Yükleme tamamlandı!”, “info”)
Label kısmına metinimizi yazdık, tip olarakda info, error, conf seçeneklerinden infoyu seçtik. Bunlar seçeneğe göre mesajınızın yanında simge belirmesini sağlıyor.

multi_query
Adından anladığınız üzere bu sefer tek satır değil çoklu satırda veri girişi alıyoruz.
Söz dizimi “multi query(label1, label2)” şeklinde olur. Örnek verelim:
appuifw.multi_query(u”Adınız:”, u”Soyunuz:”) Elime Mobile Python kitabı geçti onun içinde bu konuyla ilgili güzel bir örnek var ona benzer birşey yazalım.


import appuifw
isimler=appuifw.multi_query(u"Adınız:", u"Soyunuz:")
if isimler:
first, last = isimler
appuifw.note(u"Adınız ve soyadınız: " + first + " " + last)
else:
appuifw.note(u"İptal!)

popup_menu
Açılır bir menü oluşturur. Bir listedeki itemleri gösteriri. Söz dizimi şu şekilde olur:
popup_menu(list[, label ])

Bir örnek verelim:


if index == 0:
appuifw.note(u"Python sectiniz")
elif index == 1:
appuifw.note(u"C sectin iyy")
elif index == 2:
appuifw.note(u"Java sectiniz")

Bir listeyi gösterdiğini söylemiştim, bu yüzden popup_menu fonksiyonunu kullanmadan önce secenekler isimli bir liste tanımladım. Ardından bu listeden yapılan seçime göre sonuç veren bir uygulama yazdım.

selection_list
Bunda bir listede arama yapma imkanı vardır. Örneğin telefonun rehberini kullanırken kullandığınız arama bölümü buna benzer. Söz dizimi “appuifw.selection_list(choices, search field)” şeklindedir. Bir örnek verelim:


import appuifw
secenekler = [u"Python", u"C", u"Java"]
index = appuifw.selection_list(secenekler, 1)
if index == 1:
print "Dogru"
elif index != None:
print "Hayırrr " + secenekler[index] + "dogru değil"

Uygulamamızda önce import ettik sonra secenekler isimli bir liste oluşturduk ardından kullanıcının seçecei dile göre bir fonksiyon yazdık. Python bilginiz olduğunu varsayarak bu örnekleri hızlı hızlı geçiyorum, eski blogumda bloggerın yasaklanması ve onu silmeden önce liste neydi tüp neydi ayrıntılı şekilde yazmıştım. Şimdi bu konularla zaman kaybetmeye gerek yok merak eden çeşitli kaynaklardan bilgi edinebilir örneğin örnekler konusunda bana örnek olan Mobile Python kitabı gibi veya şu link size faydaları olacaktır. Biz konumuza devam edelim…

multi_selection_list
Bunda kullanıcı birden fazla seçim yapma imkanına sahiptir seçeneklerin yanında birer kare vardır ve işaretlindiği zaman seçilmiş demektir(hadi canım?) Search_field gibi bir yardımcıya sahiptir default olarak 0 olarka gelir bu parametre eğer listeniz uzunsa bu değeri 1 yaparak kullanıcının daha rahat seçim yapmasını sağlayabilirsiniz. Fonksiyonun söz dizimi:
multi selection list(choices[, style, search_field ]) şeklindedir.
Gelin bir örnek ile bu özelliğede hakim olalım:

import appuifw
renkler = [u”kırmızı”, u”yeşil”, u”mavi”, u”portakal”]
secim = appuifw.multi_selection_list(renkler,’checkbox’,1)

Bir dahaki yazımda mesaj çekmeyi öğrenecez 🙂

Önemli NOT: Arkadaşlar Python kullananlar bilir if ifadesinden sonraki satırda dört birim boşluk bırakıp fonksiyonu yazarsınız her nedesen blogger sürekli bu kodları sola dayıyor. Biliyorum düzeltmek benim görevim ama bazen hepsiyle uğraşamıyorum. Bu yazılar Python bilen kullanıcılar için yazılmıştır. Uygulamalara geçmeden önce mutlaka Python hakkında bilgi edininiz, böylelikle benim yazım sırasında yaptığım hatalar sizide yanlışa sürüklemez.

PyS60 Telefona Kurulum

Uygulama yazmadan önce Python’u telefonumuza kurmamız gerekiyor nede olsa yazdığımız programları derleyecek olan o. Öncelikle telefonun modelini bilmeniz gerekiyor(6260’mış benim ki)
ardından geliştirilme platformunu öğrenmelisiniz S60 2nd Edition, Feature Pack 1 gibi bir şey öğreneceksiniz Nokia’nın sitesinden yada ufak bir google araştırmasından sonra bulabilirsiniz. Ardından şu adresten sisteminize uygun pythonu ve script shellini indirmelisiniz örnek olması açısından benim 6260 telefonum için şu dosyalar gerekliydi

PythonForS60_1_4_4_2ndEd.SIS
PythonScriptShell_1_4_4_2ndEd.SIS

Versiyon yanda yazıyor 2nd Edition , Feature Pack bende 1 olduğu için falzadan bir ek almadı dosya adı yoksa 2ndEdFP2 gibi isim uzardı.

İndirdiğiniz dosyaları telefonunuza bluetooth veya usb bağlantı yoluyla atınız. Ardından dosyaları çalıştırıp kurunuz. Sisteminizin ana menüsünde Python seçeneği eklenecek, içersinde bazı örneklerde mevcut run script seçeneği ile bu kodları çalıştırabilirsiniz. Bu arada yükleme esnasında ben bir sorun yaşadım, yükleme yapmadan önce telefonun saatinin ve tarihinin doğru olduğunu kontrol ediniz aksi takdirde güvenlik hatası verip yükleme başarısız olur. Kendi telefonumda denediğim için Symbian kullanan diğer sistemlerde nasıl bir protokol uygulanıyor bilmiyorum.

Not: Dosyalar bölümünde SDK var wikisinde ayrı olarak kurmaya gerek olmadığı, programlarınızı çalıştırmak için belirttiğim iki uygulamanın yeterli olduğu söylenmiş.

PyS60

Reklamlarda gelişmiş telefonları görüyorsunuz. Cep telefonları artık sadece bir “telefon” değil. Teknolojinin gelişmesiyle birlikte bir çok gelişmiş model bir ofise dönüştü. Bir çok dilde cep telefonları için hazırlanmış kütüphaneler mevcut olmalı(bilmem bakmadım), bu diller çalışırken Python boş duramazdı Nokia tarafından geliştirilen PyS60 işte bunun için var. Bu yazımda PyS60’ın ne olduğu üzerinde biraz duracağım bir noktadan sonrada konuyu ilerletip belki ufak yazılımlar hazırlamaya başlayabilirim.

Burada yazılanlar bir kaç kaynaktan alınmış konuların bir açıdan özetidir. Yazıyı okuyanların bunun bir nevi kendim için hazırladığım özet olduğunu unutmaması ve burada yapılacak hataların düzeltilmesi için katkıda bulunabileceklerini unutmalarını isterim. Hadi başlayalım

Evet PyS60 Nokia tarafından geliştirilmiştir, kullanılacağı yer Nokia’nın S60 serisi Symbian işletim sistemi kullanan telefonlarıdır. Özgürleşmiş Symbian üzerinde çalışmak için gerekli olan bu PyS60 kütüphanesi iki kısıma ayrılabilir:

Yerleşik(built-in) birinci kısım e32 ve appuifw isimli iki modül içerir. Bunlar standart python modüllerinin erişemediği Symbian işletim sistemi servislerine erişir ve kullanıcı arayüzü için bir çatı sağlar.
İkinci kısım dinamik şekilde yüklenebilen uygulamalardan oluşur. Bunlar S60’ın yazılım programa arayüzünün çeşitli fonksiyonlarına erişir. Yerleşik modüllerin tersine bunlar sadece gerektiğinde çağırılır. Bunlara ilerki yazılarda ayrıntı şekilde girecem, şimdilik 16 modül olduğunu bilmeniz yeterli. Bir kaçının adını verdiğimde ne işe yaradıklarını tahmin edebileceğinizden buyurun: audi, camera, telephone, calendar, sysinfo… anladınız sanırım 🙂

Python ile uygulamar yazarken çeşitli servislere bağlanacağız bunlar farklılık göstersede izleyeceğimiz yol temel üç aşamadan oluşmakta:

-kullanılacak servis objelerinin hazırlanması,
-gerekli ayarların yapılması,
-telefonun fonksiyonlarını kullanacak metotların çağırılması.

Eğer kullanacağınız modül bir yerleşik modülse birinci aşama kesinlikle gerekli ama dinamik modüller için başlangıçta hazırlamaya gerek yok çünkü onların fonksiyonlarına direkt olarak erişebilirsiniz. Bunun sebebi bu modüllerin statik olmasıdır örnek verelim

input= query(u”Text Girin”,”Text”)

Bunun yanında bir ses yüklemek istersek objeleri hazırlamamıza gerek yok. Çünkü Sound modülü statik(durağan) ve istediğimiz zaman open metodunu kullanarak .waw uzantılı dosyamızı çağırabiliriz. Örnek vereyim:

Sound.open(“deneme.waw”)

İkinci aşamada ise gerekli ayarları yapmamız gerekiyor statik metotlar kullanırsanız ayarlarıda statik ayarlayıcılar üzerinden yaparsınız. Tüm python sınıflarında olduğu gibi bu ayarları onjeleri kullanıma hazırlarken belirtebilirsiniz. Örnek olarak selection_list’in tüm erişilebilir fontları listelemesini sağlayalım aşağıdaki kodlar kullanıcının fontları listelemesini ve birini seçmesini sağlar.

li=avaliable_fonts()
si=selection_list(li,1)

Bununla birlikte ses düzeyini ayarlamak için basitçe set_volume() metodunu çağırabiliriz çünkü buda statiktir. Aşağıdaki örnekte ses 10 olarak ayarlanır.

Sound.set_volume(10)

Son aşamada ise kullanacağımız fonksiyonlar için gerekli metotlar çağırılır. Burada yine iki çeşit örnekleme mevcut mesela kullanıcıdan bir giriş alalım ve bunu yine kullanıcıya geri döndürelim, burada kullanıcıyla iletişime geçiyoruz:

data=entry(u”Koy istedini aga:”,”text”)
note(u”Bunu koydun sen:” +data,”info”)

veya cihazın Sound modülünün play() metodunu getirelim böylelikle cihaz bir sesi çalacak ve duracak onun özelliğini kullanmış olacaz(cihazla iletişime geçtik):

Sound.play()

İlerki yazılarımda ayrıntıya girmeyece başlayacağım, bu konuda kullandığım kaynaklar:
http://www.devshed.com/c/a/Python/Mobile-Programming-in-Python-using-PyS60-Getting-Started/2/ (ingilizce)
http://wiki.opensource.nokia.com/projects/Python_for_S60 (İngilizce)
http://downloads.sourceforge.net/pys60/PythonForS60_1_4_4_doc.pdf?modtime=1214578033&big_mirror=0 (Pdf – dökümasyon download linki- ingilizce)

Zamanda Yolculuk

Terminator: Sarah Connor Chronicles’ı izlerken aklıma lise yıllarım geldi. O zamanlar ingilizce hocamız popüler konularda tartışıp bizlerle kaynaşmaya çalışırdı yine böyle bir konuda “Zamanda Yolculuk” konusunda tartışırken şöyle bir soru sordu “Sizce mümkün mü? Değilse neden?” O sırada yanımda oturan Ali isimli arkadaşın da gazıyla bunun mümkün olmadığını çünkü Allah’ın böyle bir şeye izin vermeyeceğini söyledim. Görüşüm eğer böyle bir şeyin mümkün olması halinde evrenin tüm dengesinin allak bullak olacağı ve insanlığın böyle bir güce erişemeyeceği yönündeydi.

Yıllar geçti arada İstanbul Üniversite Fizik Bölümü’nde bir kaç fizik dersi de aldım. Hocalarım çeşitli yetenekleriyle beni bilimden de soğuttular ama yinede işte böyle filmleri(burada dizi) gördükçe ara sırada olsa bilime merak sarıp bazı teoriler üzerinde düşünmüyor değilim. Lise yıllarında temelini attığım bu paradoksun şuan hala arkasındayım ama burada işi tanrıdan çıkarıp insanın limitleriyle açıklayacağım. Zira bize direkt bir müdehale olmadan da zaten yaşadığımız evrendeki fizik kuralları gereği sınırlı durumdayız.

Zaman kavramının aslında insanla birlikte ortaya çıktığını söylemek yanlış olmaz ama biz biraz daha genişletip zaman kavramının madde ile ortaya çıktığını söylemeliyiz. Big Bang teorisi artık uçuk bir teori olmaktan çıkmış durumda. Evrenin tek bir noktadan büyük bir patlama ile oluştuğunu biliyoruz; galaksiler birbirlerinden uzaklaşıyor ve biz gittikçe o başlama noktasıyla bağımızı koparıyoruz. -Düşündümde bu yazıyı yazmayı uzun zamandır istiyordum şimdi nasip oldu, umarım birilerinin zihinleri açmaya faydalı olur(yada hata mesajı verdirmeye)- O patlamadan önce ne olduğunu merak ediyorsanız bunu bilimle ve özellikle fizikle açıklamaya çalışmamak zorundasınız. Fiziğin konusu o patlamadan sonrasını içerir, fizik bizim doğamızı incelediğinden dolayı bu doğa oluşmadan önce olanlar konusunda açıklama getirmeye pek yanaşmaz.

İşte zamanda madde ile birlikte(hatta maddenin yapı taşlarıyla birlikte diyelim daha doğru olsun)bu patlamadan sonra ortaya çıktı. Zamanı açıklarken kullandığımız tüm ifadeler, formülizasyonlar bu patlamanın sonrasını incelemekte ve dediğim o insan sınırları o patlama ile başlamakta. Aslında zamanın olmadığını söyleyeceğim yada hepimizin kafasında ki o mutlak zaman kavramının olmadığını. İnsan mantığının patlama öncesini anlayamaması ve zamanı o patlama önceside varmış gibi düşünmesi belkide tarihteki en büyük yanılsamadır. Bizler zaten sınırlandığımız bu evrende zamanda yolculuk yapıyoruz şuan, hala, şimdi bile… Bu yolculuk geleceğe doğru bir akış şeklinde olmakta. Ama burada dikkat etmemiz gereken aslında akış var mı yok mu değil bunun sadece bizim beynimizle oluşturduğumuz bir kavram üzerinden ifade edildiğidir. Zamanı ölçmek için yaptığımız aletler, fizik kanunları, dünyanın dönmesi, güneşin dönmesi, evrenin dönmesi neresinden bakacak olursanız olun hepsi temelde insanın kabullenimlerinden ortaya çıkmakta. Bir maddenin en küçük yapısı için zaman diye birşey yoktur. Bir kara delik için zaman yoktur. Zaman sadece insan için vardır ve oda görelidir. Onu ifade ederken hızlardan yararlanırız yada bir yoldan, yolu ifade ederken aslında sabit olmayan bir noktayı referans kabul ederiz bu nokta sadece bizim için bir referans noktasıdır. Başka biri için başka bir nokta referans kabul edilebilir ve bunun üzerinden başka bir zaman tanımı yapılırsa kimin neyin zamanına göre yolculuk yapıldığı soru işareti haline gelir.

Daha güzel bir noktaya bakalım. Zaman big bang’den sonra ortaya çıkmış bir kavramsa. Bir makine ile big bang öncesine gitmeye çalışırsanız ne olur? Onu geçelim bu evrenin bir gün yok olacağını biliyoruz evren tamamiyle yok olduğundan sonrasına makine ile gitmeye çalışırsanız ne olacak? Dizide de böyle bir saçmalık söz konusu, gelecekten gelen robotlar ve isyancılarla SkyNet’in insanlığa açtığı savaş durdurulmaya çalışıyor ama atlanılan bir nokta var. Eğer başarılı olsalardı zaten gelecekte bir savaş çıkmayacak kimse gelecekten geçmişe gelmeyecekti. Daha saçma olan kısmı aslında daha yapılmamış olan bir makinenin zamanda yolculuk yapıp kendisini yaptırmasıdır. Mantıken böyle bir şeyin olmaması gerekir. Şöyle bir örnek vereyim bir makine olsa ve siz geçmişe girip babanızı daha annenizle tanışmadan önce öldürseniz ne olur? Babanız annenizle tanışmadığına göre sizde dünyaya gelmemişsinizdir, siz dünyaya gelmediğinize göre geçmişe gidip babanızı öldürmüş olamazsınız, babanızı öldürmemişseniz o halde siz varsınız ama aynı zamanda yoksunuzda?

Sonuç ne oldu? Bu kadar uzun yazmaya gerek olmadığı ortaya çıktı 🙂 Zamanda yolculuk denilen kurgu bizi paradokslara götürür ve bu onun varolamayacağının kanıtıdır zira evrenin yapısını bozacak bu tarz şeyler mümkün değildir. Mümkün olsalardı biz burda olmazdık. Yoksa… biz burada değilmiyiz? asdkasdkaskda

Pygame Draw Modülü(Bitmedi)

pygame.draw.rect
pygame.draw.rect(Surface, color, Rect, width=0): return Rect
Bu diskdörtgensi bir şekil çizer. width kenarlığın değeridir. Verilen Rect dikdörtgenin alanıdır.

pygame.draw.polygon

pygame.draw.polygon(Surface, color, pointlist, width=0): return Rect
İstenilen sayıda köşesi olan bir şekil çizer. Pointlist argümanı köşe sayısını belirtir.

pygame.draw.circle
pygame.draw.circle(Surface, color, pos, radius, width=0): return Rect
Bir çember çizer. Pos argümanı çemberin merkezini radius ise büyüklüğünü belirtir.

pygame.draw.ellipse
pygame.draw.ellipse(Surface, color, Rect, width=0): return Rect
Eliptik bir şekil çizer. Rect argümanı elipsin doldurulacağı alanı belirtir.

pygame.draw.arc
pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1): return Rect
Yüzeye eliptik bir yay çizer. Angle değerleri başlangıç ve bitiş açılarını belirtir.

pygame.draw.line
pygame.draw.line(Surface, color, start_pos, end_pos, width=1): return Rect
Düzgün bir satır çizer.

pygame.draw.lines
pygame.draw.lines(Surface, color, closed, pointlist, width=1): return Rect
Çoklu satır çizer.

pygame.draw.aaline
pygame.draw.aaline(Surface, color, startpos, endpos, blend=1): return Rect


pygame.draw.aalines
pygame.draw.aalines(Surface, color, closed, pointlist, blend=1): return Rect

GmsFrekans v0.1

http://gmsfrekans.googlecode.com/files/gmsfrekansv01.py

Bu adresten ilk versiyonu indirebilirsiniz. Versiyon 0.2 üzerinde ki yapısal çalışmalar bitti, şimdi sıra veritabanına kanalları yüklemeye geldi.

Versiyon 0.2 ile birlikte gelen yenilikler:

-daha çok kanal,
-program bundan böyle kanalları veritabanından alacak,
-uydu seçme(aktif değil)

PyGame Maymun

Bu örnekte hareket eden bir şempanzeye vurmaya çalışıyoruz. Arkada vurduğumuz takdirde para kazanacağımızı söyleyen bir reklam var. Bu örnekte kodu parça parça inceleyip PyGame’in nasıl çalıştığını daha iyi anlamaya çalışacağız. Orjinal dökümana bu adresten ulaşabilirsiniz(ingilizcedir).

Modülleri Import Edelim

import os, sys
import pygame
from pygame.locals import *

if not pygame.font: print 'Warning, fonts disabled'
if not pygame.mixer: print 'Warning, sound disabled'

İlk satırda os ve sys modüllerini çağırdık bunlar platformdan bağımsız dosya yollarını belirleme gibi işlemlerde kullanılıyor.
İkinci satırda pygame import edildi ardındansa local bölümünden kullanışlı bazı fonksiyonlar modüller yükleniyor. Alttaki kısımda ise hata mesajları var eğer font ve ses modülleri yüklenememişse bu hatalar verilecek.

Kaynakları Yükleyelim


def load_image(name, colorkey=None):
fullname = os.path.join('data', name)
try:
image = pygame.image.load(fullname)
except pygame.error, message:
print 'Cannot load image:', name
raise SystemExit, message
image = image.convert()
if colorkey is not None:
if colorkey is -1:
colorkey = image.get_at((0,0))
image.set_colorkey(colorkey, RLEACCEL)
return image, image.get_rect()

Yukar ki kısımda ise oyun için gerekli kaynakları yüklüyoruz. Colorkey özelliği none olarka ifade edilmiş, saydam grafikler için kullanılan bir özellikmiş bu…
Alt kısımda image.load işlemi yapımış. Bir önceki yazıda bahsettiğimiz gibi load() can kurtaran gibi yetişiyor 🙂 Load() hadisesini birde try,except hata sistemine sokmuşuz eğer image.load edilemezse hata mesajı alacağız. Ardından bir convert() işlemi yapmışız bu resmin renk formatını ve derinliği kopyalayıp ekrana oldukça hızlı bir şekilde vermemize yarayacak. Ardından colokey konusuna bir dönüş yapıyoruz. Eğer kullanıcı colorkey için bir argüman sağlarsa biz bu değişkeni resmin colorkey değeri olarak kullanıyoruz. Burada -1 şeklinde bu işlemi geçiştirirsek program ekranın sol üst kısmındaki pixele bakarak oradaki değeri atar. Şimdi sesleri yükleyelim:


def load_sound(name):
class NoneSound:
def play(self): pass
if not pygame.mixer:
return NoneSound()
fullname = os.path.join('data', name)
try:
sound = pygame.mixer.Sound(fullname)
except pygame.error, message:
print 'Cannot load sound:', wav
raise SystemExit, message
return sound

Yukarda ne yapıldığına gelirse şimdi program önce mixer modülünün yüklenip yüklenmediğine bakıyor eğer yüklenmemişse sessiz şekilde çalışıyor eğer yüklenmişse uygulamam normal şekilde çalışıyor.

Oyun Obje Sınıfları

class Fist(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image, self.rect = load_image('fist.bmp', -1)
self.punching = 0

def update(self):
pos = pygame.mouse.get_pos()
self.rect.midtop = pos
if self.punching:
self.rect.move_ip(5, 10)

def punch(self, target):
if not self.punching:
self.punching = 1
hitbox = self.rect.inflate(-5, -5)
return hitbox.colliderect(target.rect)

def unpunch(self):
self.punching = 0

Yukarısı biraz karışık oldu biliyorum biraz daha açalım o zaman. Yukarıda yaptığımız oyuncunun yumruğunu oluşturmak. update metodu yumruğun faremizi takip etmesi için kullanıyor pos = pygame.mouse.get_pos() ile farenin pozisyonunu alıyoruz.


class Chimp(pygame.sprite.Sprite):
"""maymunu karşı tarafa geçirir vurursa döndürür"""
def __init__(self):
pygame.sprite.Sprite.__init__(self) #call Sprite intializer
self.image, self.rect = load_image('chimp.bmp', -1)
screen = pygame.display.get_surface()
self.area = screen.get_rect()
self.rect.topleft = 10, 10
self.move = 9
self.dizzy = 0

def update(self):
"yürüme veya dönme, maymunun durumuna göre"
if self.dizzy:
self._spin()
else:
self._walk()

def _walk(self):
"maymunu ekranın karşısına getirir oradan da geri döndürür"
newpos = self.rect.move((self.move, 0))
if not self.area.contains(newpos):
if self.rect.left < self.area.left or
self.rect.right > self.area.right:
self.move = -self.move
newpos = self.rect.move((self.move, 0))
self.image = pygame.transform.flip(self.image, 1, 0)
self.rect = newpos

def _spin(self):
"maymun resmini hareket ettirir, döndürür"
center = self.rect.center
self.dizzy += 12
if self.dizzy >= 360:
self.dizzy = 0
self.image = self.original
else:
rotate = pygame.transform.rotate
self.image = rotate(self.original, self.dizzy)
self.rect = self.image.get_rect(center=center)

def punched(self):
"maymuna vurulduğunda dönüşe başlattıracak"
if not self.dizzy:
self.dizzy = 1
self.original = self.image

Gittikeç karmaşıklaşıyor 🙂 bende anlatmakta zorlanıyorum ama ne demiş babaşakanımız “durmak yok yola devam!” Gördüğünüz gibi chimp sınıfı yumruğa göre daha fazla iş yapıyor. Bu sınıf maymunu hareket ettiriyor oyunda maymuna vurunca maymun dönüyor ve hızlanıyor ardından tekrardan normale dönüyor.

Kullanıma Hazırlayalım


pygame.init()
screen = pygame.display.set_mode((468, 60))
pygame.display.set_caption('Monkey Fever')
pygame.mouse.set_visible(0)


Arka Planı Oluşturalım

Ekranımızla aynı ölçüde bir bg oluşturuyoruz. ardından convert() yardımıyla bu ekran ile bg’ın aynı formatta olduğunu deklare ediyoruz. fill() ilede RGB rengini belirliyoruz o üç argüman rengi belirtiyor.(beyaza kaçan bir renk)

background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((250, 250, 250))

Arka Plana Yazıyı Oturtalım
öncelikle pygame.font modülünün yüklenmiş olduğundan emin olmamız lazım yoksa bu adımı geçiniz efendim. önce font objesini oluşturmamız ardından bunu yeni yüzeyimize render etmemiz gerekiyor. fontu oluştururken normalde none yerine font tipinizi yazabilirsiniz şimdi biz none değeri vererek default font’u kullanıyoruz. ardından rect objesi yardımıyla ortalıyoruz ardındn blit metoduyla yazımızı backgroun’a kopyalamış oluyoruz(blit kopyala/yapıştır işini görüyor)

if pygame.font:
font = pygame.font.Font(None, 36)
text = font.render("Pummel The Chimp, And Win $$$", 1, (10, 10, 10))
textpos = text.get_rect(centerx=background.get_width()/2)
background.blit(text, textpos)

Arka Planı Yükleyelim

screen.blit(background, (0, 0))
pygame.display.flip()

Objeleri Kullanıma Hazırlayalım
Iskalama sesini ve vuruş sesini sırayla yüklüoyurz. Ardından maymunu sonrada yumruğu kullanıma hazırlıyoruz. Clock objesi oyunun frame rateini kontrol etmemizi sağlıyor. allsprite adında bir grup oluşturarak bunu RenderPlanin grubuna bağlıyoruz RenderPlain tüm çizimlerin ekrana dökülmesini sağlıyor. Daha gelişmiş Render grupları mevcut ama bu örnekte sadece basit çizimler kullanıyoruz.

whiff_sound = load_sound('whiff.wav')
punch_sound = load_sound('punch.wav')
chimp = Chimp()
fist = Fist()
allsprites = pygame.sprite.RenderPlain((fist, chimp))
clock = pygame.time.Clock()

Main Loop
Burda pek bişi yapılmıyor saniyeden 60 frameden hızlı olmamasını sağladık oyunun.

while 1:
clock.tick(60)

Tüm verigirişlerini halledelim
Aşağıda artık veri girişlerini hallediyoruz, vuruş kısmına dikkat ses ekliyoruz 😉

for event in pygame.event.get():
if event.type == QUIT:
return
elif event.type == KEYDOWN and event.key == K_ESCAPE: #Esc basınca oyundan çık
return
elif event.type == MOUSEBUTTONDOWN:
if fist.punch(chimp):
punch_sound.play() #vurduysak bu ses çıkacak
chimp.punched()
else:
whiff_sound.play() #ıskaladıysak bu ses çıkacak
elif event.type == MOUSEBUTTONUP:
fist.unpunch()

Spriteları Güncelle(sprite konusuna da gelicez)
Sprite modülü update() metoduna sahip bu sayede tüm objeler etrafta dönmeye başlayacak. Maymun bir köşeden diğerine gidecek vurduğumuzda dönecez

allsprites.update()

Sahneyi Çizelim
Objeler doğru yerdeler, şimdi sıra onları çizmeye geldi. İlk blit arka planı çiziyor.draw() ile screen’i çiziyoruz son olarak flip() ile çizdiğimiz herşeyi ekrana vermiş oluyoruz.

screen.blit(background, (0, 0))
allsprites.draw(screen)
pygame.display.flip()

PyGame İle Resim Oynatmak – 2

Evet, konumuza devam ediyoruz.


screen = create_screen()
player = load_player_image()
background = load_background_image()
screen.blit(background, (0, 0)) #arkaplanı çiziyoruz
position = player.get_rect()
screen.blit(player, position) #player'ı çiziyoruz
pygame.display.update() #hepsini gösteriyoruz
for x in range(100): #100 frame canlandır
screen.blit(background, position, position) #temizle
position = position.move(2, 0) #player'ı hareket ettir
screen.blit(player, position) #yeni player'ı çiz
pygame.display.update() #hepsini göster
pygame.time.delay(100) #programı 1/10 saniye durdur

Evet biraz daha mantıklı bir oyun yaptık. Tabi buradan ileriye gitmemiz gerek, gelin devam edelim 🙂

“pygame.image.load()” fonksiyonu tamda işimizi görecek bir fonksiyon. Şöyle yaptık diyelim:


player = pygame.image.load('player.bmp').convert()
background = pygame.image.load('liquid.bmp').convert()

Burada verilen isimli resimleri yükledik. “convert()” metodu sayesinde bu yüklediğimiz resimler daha aynı piksel formatına sahip olacaklar bu sayede hızlı bir şekilde “blit()” fonksiyonunu kullanabileceğiz. Eğer bu resimleri convert etmeseydik blit işlemi uzun sürecekti.
Farkettiyseniz convert ve load fonksiyonlarının ikiside yeni yüzeyler oluşturdular. Bunun anlamı bu iki satırdada ikişer yüzey oluşturuyoruz. Normalde başka dillerde bu hafıza kaybına yol açar ama python bunuda hallediyor ve pygame kullanmadığımız yüzeyi temizliyor.
Yeni öğrendiğimiz bir diğer fonksiyon ise create_screen() pygame ile grafikler için yeni pencereler oluşturmak çok kolay örneğin 640*480’lik bir pencere oluşturmak için yapacağımız tek şey: screen = pygame.display.set_mode((640, 480))

Biraz veri alalım

Tüm oyunlarda kullanıcılar veri girer. Bu bir kalvye tuşu yoluyla olabileceği gibi bir mouse hareketi de olabilir. İşte size 100 frame ile bitmeyen, kullanıcı isteyene kadar hareket eden bir uygulama. “event” bizi ilgilendiren kısım 🙂


while 1:
for event in pygame.event.get():
if event.type in (QUIT, KEYDOWN):
sys.exit()
move_and_draw_all_game_objects()

Eğer birden çok resim hareket ettirmek istiyorsak şöyle bir örnek uygulayabiliriz:

class GameObject:
def __init__(self, image, height, speed):
self.speed = speed
self.image = image
self.pos = image.get_rect().move(0, height)
def move(self):
if self.pos.right > 600:
if self.pos.right > 600:
self.pos.left = 0

Birden fazla obje hareket edeceği zaman bunlarla başetmenin en güzel yolu bir sınıf oluşturmaktır. Yukarıda gördüğünüz gib iiki fonksiyon oluşturduk birisi(init) onjemizi oluştururken move fonksiyonu ile hareket ettirdik. Eğer çok fazla uzaklaşırsa tekrardan sola getiriyoruz objeyi.

Son bir örnek

screen = pygame.display.set_mode((640, 480))
player = pygame.image.load('player.bmp').convert()
background = pygame.image.load('background.bmp').convert()
screen.blit(background, (0, 0))
objects = []
for x in range(10): #10 obje oluşturduk
o = GameObject(player, x*40, x)
objects.append(o)
while 1:
for event in pygame.event.get():
if event.type in (QUIT, KEYDOWN):
sys.exit()
for o in objects:
screen.blit(background, o.pos, o.pos)
for o in objects:
o.move()
screen.draw(o.image, o.pos)
pygame.display.update()
pygame.time.delay(100)