Tampilkan postingan dengan label Coretan tentang Pys60. Tampilkan semua postingan
Tampilkan postingan dengan label Coretan tentang Pys60. Tampilkan semua postingan

Rabu, 30 November 2011

Tutorial membuat game sederhana (bagian 1)

Yok bikin game !! Coretan ini membahas dasar2 cara bikin game sederhana. Saya usahakan agar mudah diikuti oleh anda2 yg masih baru atau belum mengenal Pys60. Yang saya tulis disini sebagian sudah pernah saya bahas pada postingan2 sebelumnya dan akan saya jelaskan dengan bahasa yg lebih sederhana step by step.




Pendahuluan


Pastikan Python interpreter dan modul/library Python standar sudah terinstal pada hp anda. Jika kesulitan mencari yang sesuai untuk type hp anda, silahkan bertanya di Symbian & Pys60 Center (grup fb) atau di blog temen2 yang membahas Pys60.



Selain itu kita juga membutuhkan aplikasi text editor. Dalam contoh ini saya menggunakan aplikasi file manager X-plore versi 1.22 karena multifungsi dan pengoperasiannya mudah (bagi saya). Ok cukup itu saja, lanjut ketahap berikutnya.





Pengenalan


Dalam pembuatan game ini saya menggunakan hp s60v1, namun saya menggunakan syntax2 Python dasar jadi bisa diterapkan pada versi2 s60 yg lainnya (mungkin dengan sedikit penyesuaian). Gameplay yang akan kita buat cukup sederhana yaitu pemain menggerakkan keranjang ke kiri dan kekanan untuk menangkap bola yang berjatuhan dari atas untuk mengumpulkan skor. Game berakhir jika ada bola yang tidak berhasil ditangkap. Pernah memainkan game sejenis? Sekarang kita akan membuatnya.




Tahap awal


Download file ini GameSayaAwal.zip. Didalam file tesebut terdapat satu file text biasa yang saya beri eksistensi ".py" agar program Python tahu kalau itu adalah script python. Jalankan aplikasi X-plore dan extrax/unzip file tersebut ke dalam folder E:\\System\Apps\Python\My\. File tersebut berisi sebuah class bernama Keyboard yang berfungsi untuk meng-handel input dari keyboard. Anda tidak harus mengerti syntax2 pada file tersebut. Class tersebut tidak akan saya jelaskan dengan detail karena saya mengusahakan agar tutorial ini semudah mungkin untuk diikuti. Nantinya kita menggunakan class tersebut untuk mengetahui apakah ada key/tombol yang ditekan atau tidak.
Sekarang kita edit file GameSaya.py (tekan angka 8) lalu buat baris baru (tekan angka nol 3 kali untuk membuat baris baru) tepat dibawah kode return False". Baris ini cuma untuk memisahkan atau mengelompokkan kode script agar mudah dibaca. Lanjut ke tahap berikutnya.





Meng-import module


Apaan module? Module adalah sekumpulan kode script yang dapat kita gunakan. Pada s60 1st dan 2nd module2 ini terletak di folder E:\\System\Libs\. Untuk membuat game ini kita akan menggunakan beberapa module standar/bawaan Python yaitu: appuifw, graphics, e32, dan key_codes. Buat apa module2 itu? Nanti saya jelaskan penggunaannya pada game. Agar module2 tesebut dapat kita gunakan, kita harus meng-import terlebih dahulu. Caranya dengan menuliskan syntax import dilanjutkan dengan nama module. Seperti ini:



besar kecilnya huruf harus sama dengan yang saya tulis pada gambar (huruf kecil semua). Setelah itu kita import module graphics pada baris selanjutnya. Caranya sama dengan meng-import module appuifw diatas. Setelah itu dilanjutkan dengan module e32 dan key_codes. Seperti ini:



Ingat, simbol, huruf, angka, dan spasinya harus sama persis seperti pada gambar, kalau tidak bisa menyebabkan error. Oke sekarang semua module telah kita import. Lanjut..




Instance class Keyboard


Instance sederhananya adalah memberi nama panggilan untuk memanggil satu atau sekumpulan script dengan tujuan untuk memudahkan pemanggilan. Pada kasus ini kita memberikan nama key untuk class Keyboard. Caranya dengan menuliskan kode seperti ini:



Atur User Interface


UI game kita menggunakan fungsi2 pada module appuifw. Sekarang kita mengatur UI program kita. Kita mulai dengan mengatur agar layar game kita fullscreen:



Karena yang kita buat adalah game yang pada dasarnya menampilkan gambar ke layar, maka kita akan menggunakan salah satu fungsi yang terdapat pada module appuifw yaitu Canvas untuk menampilkan gambar. Kita buat instance canvas dan mengaturnya agar meng-handle key (ingat, 'key' adalah instance class Keyboard dan jangan lupa apa itu instance).



Perhatian!! Mulai dari kanvas sampai dengan handle_event) adalah satu baris. Karena layar hp saya tidak cukup, maka ditampilkan menjadi beberapa baris (inilah repotnya scripting pakai hp). Selanjutnya kita gunakan kanvas sebagai body aplikasi.:



Pengaturan UI sudah selesai.




Atur graphics/gambar


Yang akan kita lakukan disini adalah mengatur gambar bukan menampilkan gambar pada layar (belum saatnya). Seperti menyiapkan kertas gambar dan pensil. Dimulai dengan membuat variabel berisi informasi ukuran layar hp:



Variabel? Apaan lagi nih?? Variabel adalah sebuah nama seperti nama panggilan pada instance. Tapi nama pada variabel berisi suatu data. Dan pada kasus diatas, variabel yang saya namai resolusiLayar menyimpan data (176,208).
Buat sebuah gambar dengan module graphics dan menggunakan varibel resolusiLayar sebagai ukuran gambar:



yang kita buat diatas adalah sebuah gambar putih polos sebesar ukuran hp kita. Nanti kita mengisi "gbr" dengan gambar bola dan keranjang. script diatas juga hanya satu baris.




Pengaturan game loop


Buat apa sih loop? Teori dasar animasi (ga tau ini pelajaran SMP ato SMA karena dulu saya ga di ajarin ini di SD) yaitu menampilkan sebuah gambar, lalu dilanjutkan dengan gambar selanjutnya secara cepat dan terus - menerus hingga seolah2 bergerak. Begitu juga pada game. Dan loop atau perulangan yang akan menjalankan teori animasi diatas. Sebelum loop dilakukan, kita harus membuat semacam saklar untuk mengatur loop tersebut. Jika saklar bernilai 1 maka proses loop berjalan, jika bernilai 0 maka proses loop dihentikan dengan kata lain game ditutup. Kita buat variabel saklar:



sebenanya bisa diberi nama apa saja, saya beri nama saklar untuk kemudahan. Dan kita beri nilai 1 agar saat script dijalankan looping juga berjalan.
Saklar sudah kita definisikan, sekarang membuat fungsi untuk menghentikan game:



Script diatas terdiri dari 3 baris. Pada baris pertama kita membuat fungsi yang saya beri nama keluarGame, sedangkan dua baris selanjutnya (yang mempunyai beberapa spasi sebelum kode syntax) adalah isi fungsi tersebut. Jika fungsi dipanggil maka semua isi fungsi akan dijalankan. Kegunaan "fungsi" adalah untuk mengelompokan beberapa kode script agar lebih mudah karena untuk menjalankan syntax2 yang berada didalam fungsi tersebut kita tinggal memanggil nama fungsinya. Pada baris kedua, global saklar adalah mengatur agar variabel saklar didalam fungsi tersebut menjadi variabel global. Pada baris ketiga, kita mengupdate nilai variabel saklar menjadi nol (nonaktif/menghentikan loop).
Selanjutnya kita mengatur tombol exit (right softkey) untuk menjalankan fungsi keluarGame saat ditekan.



syntax diatas terdiri dari satu baris.




Game loop


Sekarang masuk ke tahap perulangan. Untuk ini kita menggunakan while.



While akan menjalankan kode script didalamnya secara terus - menerus selama variabel saklar bernilai 1. Satuan proses perulangan disebut "frame".
Selanjutnya kita mengisi while dengan gbr dan sebuah fungsi dari module e32:



dua baris kode script diatas yang akan dijalankan while secara berulang-ulang. Pada baris kanvas.blit(gbr) kita menampilkan gbr pada kanvas. Pada baris dibawahnya kita menggunakan fungsi dari module e32 yang bernama ao_sleep. Fungsi ini digunakan untuk menghentikan loop selama 0.01 detik sebelum frame berikutnya dijalankan. Proses penghentian ini setahu saya untuk memberi waktu kepada UI untuk memproses setiap frame sebelum memproses ke frame berikutnya (tolong dibenarkan kalau salah).



Test script


Pada tahap ini script sudah dapat dijalankan. Cara menjalankannya:


  • Buka aplikasi Python

  • Tekan "Options" lalu pilih "Run script"

  • Cari script bernama "my\GameSaya.py" dan tekan ok



Jreng!! Muncul blank putih. Cuma itu? Iya, kan dari tadi kita cuma membuat gambar putih polos seukuran layar hp :). Cara menambah gambar bola yang jatuh dari atas? Cara menambah gambar keranjang yang bisa digerakkan kekiri dan kekanan? Insyaallah kita bahas pada bagian berikutnya.


Script yang anda buat error? Coba dibandingkan dengan script ini:

GameSayaTahap1.zip

Kamis, 08 September 2011

Dasar urutan kode logic game

Program game agar bisa jalan ada tahapan - tahapan tertentu. Berikut ini tahapan - tahapan dasar pada program gameplay:




- update objek

- gameplay logic

- render



- Update objek

Objek pada game misalnya karakter. Saat karakter begerak/berjalan, posisi karakter diupdate keposisi baru. Proses update disini bukan cuma update posisi objek tapi juga semua hal yang yang dibutuhkan tiap objek, misalnya: build objek, status, dll.



- Gameplay logic

contoh logic gameplay misalnya: proses tumbukan, pengecekan gameover, penambahan skor, dll.



- Render

render adalah proses menampilkan objek ke layar setelah diupdate



Jika tahapan - tahapan diatas terbalik dapat menjadi bug.



Contoh kasus:

Pada deteksi tumbukan, saat karakter berjalan dan menabrak tembok karakter berhenti berjalan. Urutan tahapan yang baik seperti ini:



- karakter berjalan

- logic tumbukan dengan tembok

- render karakter



jika urutannya terbalik misalnya seperti ini:



- karakter berjalan

- render karakter

- logic tumbukan dengan tembok



maka yang terjadi karakter berjalan masuk beberapa piksel (tergantung kecepatan berjalan) kedalam tembok lalu kembali kedepan tembok. Tidak langsung berheti didepan tembok.



Itulah contoh dasar urutan kode logic game. Semoga bermanfaat :D


Rabu, 20 April 2011

List, fungsi, class

Haha.. Bingung mau kasih judul apa, intinya cuma contoh bagaimana mengelompokan script dengan penggunaan multi dimensional list:




nama_list=[[nilai,nilai],[nilai,nilai]]



fungsi berargumen:




def nama_fungsi(argumen):

>>>>isi_fungsi




dan class:




class nama_class:

>>>>isi_class




Sekali lagi ini hanyalah contoh, bukan struktur script yang baik, sampai saat ini saya masih coba ini, coba itu berusaha membuat struktur yang rapi dan fleksibel, tp belum berhasil.. Hehe... Ganti tanda ">" pada awal syntax dengan spasi. Sebagai contoh, data disimpan dalam multi dimensional list




type1 = ["Alas kaki", ["sepatu","sandal"]]

type2 = ["Tutup kepala", ["topi","peci"]]




Lalu misal kita ingin membuat fungsi untuk memproses nilai2 list diatas




def cek_type1():

>>>>print "kategori "+type1[0]+" berisi:"

>>>>>>>>for i in range(len(type1[1])):

>>>>>>>>>>>>print type1[1][i]




def cek_type2():

>>>>print "kategori "+type2[0]+" berisi:"

>>>>>>>>for i in range(len(type2[1])):

>>>>>>>>>>>>print type2[1][i]




#pemanggilan
cek_type1()

cek_type2()



Jika list type banyak macamnya misalnya type1,type2,type3...type40, kita harus mencari cara yang lebih efisien. Salah satu solusinya yaitu membuat mesin untuk melakukan proses (dalam hal ini proses pengecekan). Untuk ini kita dapat menggunakan fungsi berargumen




def mesin_cek(type_barang):

>>>>print "kategori "+type_barang[0]+" berisi:"

>>>>>>>>for i in range(len(type_barang[1])):

>>>>>>>>>>>>print type_barang[1][i]



# pemanggilan

mesin_cek(type1)

mesin_cek(type2)





Fungsi mesin_cek diatas memproses data argumen yang dimasukkan. Dengan begini, kita cukup menggunakan satu fungsi diatas untuk mengecek semua data list type kita.



Jika fungsi kita banyak akan lebih mudah diorganisir jika disimpan didalam class. Jika script diatas dikelompokkan dengan class:




class pakaian:

>>>>type1=["Alas kaki", ["sepatu","sandal"]]

>>>>type2=["Tutup kepala", ["topi","peci"]]


>>>>def mesin_cek(self,type_barang):

>>>>>>>>print "kategori "+type_barang[0]+" berisi:"

>>>>>>>>>>>>for i in range(len(type_barang[1])):

>>>>>>>>>>>>>>>>print type_barang[1][i]




#pemanggilan

p=pakaian()

p.mesin_cek(p.type1)

p.mesin_cek(p.type2)






"self" digunakan untuk menandai bahwa objek tersebut berada pada class yang sama. Jika kita tidak menyertakan self maka objek yang dipanggil adalah objek global, dan jika tidak ada objek global yang dimaksud, maka pesan error muncul. Contoh:



#global variabel angka

angka=1


class percobaan:

>>>>#lokal variabel angka

>>>>angka=6

>>>>def test(self):

>>>>>>>>print angka # global

>>>>>>>>print self.angka # lokal



c=percobaan()

c.test()

# jika variabel lokal angka dipanggil dari luar class, harus menyertakan instance class nya



print c.angka

print angka



Udah ah, cape nulis hehe... Happy coding..

Sabtu, 09 April 2011

Meload gambar external dengan module image1st

Melanjutkan coretan Contoh script gambar (basic), kali ini coretan tentang cara meload gambar eksternal khususnya pada s60 1st, namun bisa juga digunakan pada s60 2nd.




Fungsi pada module graphics yang berfungsi untuk meload dan menampilkan gambar pada appuifw.canvas() yaitu: graphics.Image.open(). Sayangnya fungsi tersebut hanya berjalan pada s60v2 keatas dan tidak jalan pada N-Gage saya yang masih s60 v1. Beruntung ada modul buatan pihak ketiga yang berfungsi untuk menampilkan gambar pada s60 v1. Modul tersebut bernama "image1st". Sebenarnya ingin membahas fungsi Image.open() juga, tapi karena saya ndak punya hp buat ngetest jadi hanya cara menampilkan gambar dengan image1st yang saya bahas. Sebelumnya simpan gambar dibawah ini dan taruh di folder E:\images\




Dan monggo download scriptnya disini




Sekilas tentang blit


nah buat yang melanjutkan membaca coretan ini karena pengen tau apa itu "blit()" monggo diteruskan. Buat yang sudah tahu apa itu "blit" mohon koreksi penjelasan saya kalau salah (^_^).. Pada Pys60 setahu saya, blit() berfungsi untuk menampilkan gambar baik gambar external ataupun old graphics didalam ataupun diluar objek gambar external atau old graphics juga.



Dalam contoh script yang telah didownload, blit untuk menampilkan gambar external:


img.blit(file_gambar)

gambar tersebut ditampilkan
apa adanya dengan posisi pada pojok kiri atas. Posisi gambar dapat kita atur target posisinya:


img.blit(file_gambar, target=(20,20))


penjelasan:

target=(x, y)



selain mengatur posisi target, kita juga dapat memotong gambar yang ingin ditampilkan (croping):


img.blit(file_gambar, target=(20,20), source=(20,20,20,20))


penjelasan:

source=(PotongGambarKiri, PotongGambarAtas,PotongGambarKanan, PotongGambarBawah)

pemotongan sebanyak nilai yang dimasukkan (dalam piksel)



Masih kurang? Kita juga dapat me-resize gambarnya:


img.blit(file_gambar, target=(30,30,30,30), scale=1)


penjelasan:

python akan meresize gambar sebesar/sesuai target yang kita masukkan. Pengaturan posisi target sama dengan source. Misalnya kita ingin meresize ukuran gambar menjadi fullscreen 176x208 (resolusi layar hp saya) maka posish target dirubah menjadi (0,0,176,208). Namun resize gambar ini lumayan berat.



Ada satu pengaturan lagi yaitu "mask" ini digunakan untuk mentransparansi gambar sayang, masking ini hanya support pada s60 2nd fp2 keatas. Maaf, saya belum mencoba masking ini jadi tidak saya bahas.



Itulah penggunaan fungsi blit() yang saya tahu dan telah saya coba. Buat yang ingin tahu lebih banyak tentang blit(), silahkan googling hehe...


Minggu, 27 Maret 2011

Tehnik looping atau perulangan




Masih membahas seputar graphics programing, untuk menampilkan banyak objek gambar pada canvas dapat menggunakan perulangan. Bahkan jika objek tersebut mempunyai karakteristik yang berbeda - beda sekalipun. Sebagai contoh, kita akan membuat efek hujan salju sederhana seperti screenshot diatas. Pada program ini satiap partikel salju mempunyai kordinat posisi (x, y) dan mempunyai ukuran yang berbeda - beda, kecepatan partikel turun (gravitasi) ditentukan dari besar kecilnya partikel tersebut.



Langkah awal, kita buat script untuk menampilkan tiga buah gambar point pada canvas (nanti kita perbanyak), posisi X, Y gambar terserah mau diisi berapa saja, namun jangan melebihi ukuran layar hp sobat, kodenya seperti ini:





import appuifw

import graphics

import e32

import random



def tutup():

>>global run

>>run=0



img=graphics.Image.new((176,208))



c=None

# agar program berjalan lebih cepat, gambar kita handel



def handel_gambar(rect):

>>if c: c.blit(img)



c=appuifw.Canvas(redraw_callback=handel_gambar)

appuifw.app.body=c



appuifw.app.screen='full'

appuifw.app.exit_key_handler=tutup

run=1







#posisi objek pertama

posX1=61

posY1=40

size1=1



#posisi objek kedua

posX2=10

posY2=89

size2=4



#posisi objek ketiga

posX3=75

posY3=23

size3=2





while run:



>>img.clear(0)

>>#menampilkan objek

>>img.point((posX1,posY1),0xdddddd,width=size1)

>>img.point((posX2,posY2),0xdddddd,width=size2)

>>img.point((posX3,posY3),0xdddddd,width=size3)



>># menjalankan semua objek ke bawah seolah-olah salju turun

>># agar lebih realistis, kecepatan objek turun ditentukan dari besar kecilnya objek tersebut



>>posY1+=size1

>>posY2+=size2

>>posY3+=size3



>># deteksi tubrukan, setiap Y objek lebih besar dari 208 (tinggi layar),

>># Y objek dipindahkan ke atas layar, sedangkan X objek di-random antara 0-176 (lebar layar), ukuran objek juga di random



>>#objek 1

>>if posY1>208:

>>>>posX1=random.randint(0,176)

>>>>posY1=0

>>>>size1=random.randint(1,5)



>>#objek 2

>>if posY2>208:

>>>>posX2=random.randint(0,176)

>>>>posY2=0

>>>>size2=random.randint(1,5)



>>#objek 3

>>if posY3>208:

>>>>posX3=random.randint(0,176)

>>>>posY3=0

>>>>size3=random.randint(1,5)





>>handel_gambar(())

>>e32.ao_yield()




Copas dan simpan kodenya menjadi file txt dengan exsistensi *.py. Ganti semua tanda ">" pada awal baris kode dengan spasi. Kode yang saya beri warna hijau adalah kode program aplikasi, sedangkan yang merah adalah kode program efek salju yang kita buat. Bingung membuat scriptnya? Monggo download scriptnya disini. Silahkan dilihat2 scriptnya, masih bingung membaca scriptnya? Monggo simak yang ini dulu. Sudah nggak bingung kan? Mari kita lanjut ...



Coba lihat kode yang saya tulis diatas. Untuk menampilkan 3 butir salju saja butuh 27 baris kode (kode yang berwarna merah, tidak termasuk penjelasan), bagaimana kalau butiran saljunya buanyak seperti pada screenshot? Pasti sampai ratusan baris. Wah bisa copot jempolnya... Karena kita semua sayang jempol, mari kita ubah kodenya agar program yang kita buat lebih pintar dan dapat melakukan semuanya. Sebelumnya, kita gabungkan semua variabel yang menyimpan data - data objek kedalam list, ubah kode yang berwarna merah menjadi seperti ini:





# semua X objek di masukkan dalam satu list

posX=[61, 10, 75]



# begitupun Y dan ukuran objek

posY=[40, 89, 23]

size=[1, 4, 2]





while run:



>># karena penyimpanan data objek nya di ubah menjadi list, cara pengambilan data nya juga harus dirubah



>>#menampilkan objek

>>img.point((posX[0],posY[0]),0xdddddd,width=size[0])

>>img.point((posX[1],posY[1]),0xdddddd,width=size[1])

>>img.point((posX[2],posY[2]),0xdddddd,width=size[2])



>># menjalankan semua objek ke bawah seolah-olah salju turun



>>posY[0]+=size[0]

>>posY[1]+=size[1]

>>posY[2]+=size[2]



>># deteksi tubrukan



# objek 1

>>if posY[0]>208:

>>>>posX[0]=random.randint(0,176)

>>>>posY[0]=0

>>>>size[0]=random.randint(1,5)



>>#objek 2

>>if posY[1]>208:

>>>>posX[1]=random.randint(0,176)

>>>>posY[1]=0

>>>>size[1]=random.randint(1,5)


>>#objek 3

>>if posY[2]>208:

>>>>posX[2]=random.randint(0,176)

>>>>posY[2]=0

>>>>size[2]=random.randint(1,5)




Simpan perubahan yang telah kita lakukan. Hmm... Sudah sedikit lebih ringkas, tapi masih belum bersahabat dengan jempol jika objek nya banyak. Yang kita lakukan diatas adalah menggabungkan semua data yang jenisnya sama (posX, posY, size). Selanjutnya meggabungkan pengolahan data yang prosesnya sama (program yang di while). Proses pengolahan pada program ini ada tiga macam, yaitu: proses menampilkan gambar, proses animasi salju turun kebawah, dan proses deteksi tubrukan. Salah satu cara penggabungannya adalah menggunakan perulangan "for". Apa itu "for"? Agar lebih jelas, saya ambil contoh perulangan for yang buanyak beredar diinternet seperti ini:



for i in range(2):

>>print i



hasil:

0

1

2




for menjalankan event yang berada didalamnya (pada contoh diatas event adalah print) sebanyak nilai yang kita tentukan (pada contoh diatas 2). Default nya dimulai dari angka nol. Didalam " i " tersimpan nilai - nilai proses perulangan. Berikut ilustrasi proses yang dilakukan for:



i = 0

print i # hasil: 0

i = i+1

print i # hasil: 1

i = i+1

print i # hasil: 2



Proses diatas akan terus berjalan sampai nilai " i " sama dengan nilai batasan yang ditentukan.



Seperti yang kita ketahui, untuk memanggil semua nilai list posX secara manual seperti ini:



print posX[0] # hasil: 61

print posX[1] # hasil: 10

print posX[2] # hasil: 75



Perhatikan angka - angka yang kita gunakan untuk memanggil list posX diatas (0, 1, 2). Angka - angka tersebut sama dengan nilai " i " pada contoh perulangan "for" bukan? Nah.. Jika kita memanggil semua list menggunakan for, kodenya:




for a in range(2):

>>print posX[a]



hasil:

61

10

75


Lho.. kok "a", Bukan "i"? "a" dan "i" adalah nama varibel, sama seperti nama list. Jadi terserah mau dikasih nama apa saja, misalnya:



for tomat in range(8):

>>print tomat



hasil:

0

1

2

3

4

5

6

7

8


Sebenarnya banyak variasi looping menggunakan for, tapi karena efek salju yang akan kita buat cukup menggunakan looping basic ini, jadi cuma satu ini yang saya jelaskan pada coretan ini. Silahkan googling jika ingin mengetahui lebih banyak tentang "for". Nah, sekarang pengaplikasian for pada program kita. Ubah semua kode yang berada didalam while yang berwarna merah menjadi seperti ini::




while run:



>># len() digunakan untuk mengetahui jumlah elmen yang terkandung pada sebuah list

>># kita menggunakan len(posX untuk memberi nilai batasannya agar kita tidak repot menggonta-ganti nilai batasan sesuai jumlah objek



>>for j in range(len( posX )):

>>>>img.point((posX[j],posY[j]),0xdddddd,width=size[j])



>>>>posY[j]+=size[j]



>>>>if posY[j]>208:

>>>>>>posX[j]=random.randint(0,176)

>>>>>>posY[j]=0

>>>>>>size[j]=random.randint(1,5)



Sekarang berapapun jumlah objek yang ingin kita tampilkan, for akan memproses semuanya. Untuk menambah objek, kita tinggal menambahkan nilai pada list posX, posY, dan size. Namun perlu diingat bahwa satu gambar point membutuhkan data posX, posY dan size. Jadi jumlah list posX, pos Y dan size harus sama.



Script diatas sudah selesai jika partikel salju yang ingin kita tampilkan sedikit misalnya 8. Masalah datang ketika kita ingin menampilkan banyak partikel. Misalnya 50 partikel maka list data nya juga akan panjang. Atau kita ingin mengubah jumlah salju yang ditampilkan kita harus mengedit - edit semua list tersebut. Agar masalah diatas tidak muncul kita tambahkan fungsi untuk men-generate data objek dengan sendirinya. Untuk membuat generator kita masih menggunakan perulangan juga, namun perulangan yang kita gunakan adalah " while ". Berbeda dengan for, while akan terus melakukan perulangan tanpa menyimpan proses perulangannya hingga exception terjadi. Kita tambahkan kode yang berfungsi sebagai generator sebelum while utama:





# Semua list kita kosongkan

posX=[]

posY=[]

size=[]



partikel=20 # jumlah partikel





# proses generating (bukan while utama)

while len(posX) < partikel:

>>proses pengisian data

>># data - data yang dimasukkan nilainya kita acak

>>posX.append(random.randint(0,176))

>>posY.append(random.randint(0,208))

>>size.append(random.randint(1,5))





while run:


Kode yang berwarna biru adalah generatornya. Nah, akhirnya selesai juga. Sekarang untuk mengubah jumlah butiran salju yang ditampilkan kita tinggal merubah nilai variabel "partikel". Awas!! Jangan menampilkan partikel salju terlalu banyak (misalnya 1000), jika dilakukan mungkin dapat menyebabkan ponsel hang karena keterbatasan kemampuan ponsel. Dengan Pys60 kita dapat membuat simulasi hujan salju, namun bukan berarti dapat membuat simulasi badai salju hehe... Jumlah partikel maksimal yang telah saya coba pada ponsel N-Gage QD adalah 100 dan sudah terasa beratnya. Jadi jika ponsel sobat nge-hang dikarenakan menampilkan partikel salju terlalu banyak jangan salahkan saya :D.



Tehnik perulangan ini tidak hanya digunakan untuk membuat efek salju saja, coba lihat pesawat - pesawat musuh pada game Sky Force reloaded ini:







Tehnik memunculkan banyak musuh pada game tersebut basic nya kurang lebih mirip dengan efek salju yang kita buat, namun kita tidak mungkin membuat game seperti ini pada Pys60 khususnya s60 1st dikarenakan banyak faktor.



Coretan ini hanya berdasarkan hasil coba - coba saya (trial & error), mohon maaf jika ada penjelasan - penjelasan yang salah. Sampai disini dulu, semoga bermanfaat dan happy coding ...


Updated:

Kelupaan ga nampilin hasil akhirnya hehe... Buat yang pengen langsung nyoba script yang sudah jadi download disini.


Rabu, 16 Februari 2011

Contoh program game Gunting batu kertas

Pada coretan ini ane akan kasih contoh pembuatan program game sederhana. Game yang akan kita buat adalah sebuah game text based "Gunting batu kertas". Sebagai contoh penggunaan variabel, dictionary, definisi dan percabangan (else if) pada program game. Ok mari kita mulai:


- Import beberapa module yang akan kita gunakan



import appuifw, e32, random

- Mendefinisikan dictionary bernama "pilih" yang berisi tiga pasang key value, yaitu key Gunting yang kita beri value 0, key Batu yang kita beri value 1, key Kertas yang kita beri value 2



pilih = {"Gunting": 0, "Batu": 1, "Kertas": 2}

- Membuat variabel yang kita kasih nama "Pemain". Nantinya variabel ini akan kita gunakan untuk mendefinisikan nilai yang dipilih player/pemain nilainya diambil dari dictionary (0, 1, atau 2). Saat ini variabel ini kita buat tidak terdefinisi (None).



Pemain=None


- Kita buat variabel lagi yang kita kasih nama "Musuh". Nantinya variabel ini akan kita gunakan untuk mendefinisikan nilai yang dipilih cpu/musuh nilainya kita acak (0, 1, atau 2). Saat ini variabel ini kita buat tidak terdefinisi (None).



Musuh=None


- Membuat variabel kosong yang kita kasih nama "konf" (konfirmasi) yang akan dipakai untuk menyimpan konfirmasi "menang", "kalah", atau "seimbang".



konf=None


- Mendefinisikan fungsi yang kita berinama "gameplay" sebagai otak game untuk membandingkan apa yang dipilih pemain dengan apa yang dipilh musuh (random) dan menentukan siapa yang menang.


Skripnya disini




- Untuk memanggil fungsi gameplay diatas kita buat tiga fungsi, masing2 memberi nilai berbeda kepada gameplay yaitu 0 (Gunting), 1 (Batu), 2 (Kertas).


Skripnya disini



- Agar player dapat meng-input apa yang dipilih kita membutuhkan fungsi untuk menerima data dari player. Pada game sebenarnya menggunakan tombol navigasi dan keypad, namun pada program ini kita memakai menu dari module appuifw.



appuifw.app.menu=[(u"Pilih gunting", memilihGunting),(u"Pilih batu", memilihBatu),(u"Pilih kertas", memilihKertas)]


- Membuat fungsi penutupan aplikasi dan menunggu tombol exit ditekan dengan module appuifw dan e32


Skripnya disini



- Mengetes game (^_^). Silahkan download script lengkapnya:



http://tigan.fiz.su/files/blog/gbk/Gunting_batu_kertas.zip

Coretan diatas hanya berdasarkan apa yang ane bisa, jika ada penjelasan yang salah, mohon dibenarkan. Atau jika punya yang algoritma yang lebih bagus, mohon dishare. Selamat koding... :D

Minggu, 06 Februari 2011

Sedikit penjelasan identasi pada Python

Dalam pemrograman kita sering mengelompokkan beberapa kode dengan tujuan agar lebih mudah dibaca. Atau terkadang kode memang harus dibuat dalam blok-blok statement agar dapat berjalan, misalnya kita membuat sekumpulan kode yang akan berjalan ketika suatu event terjadi.



Blok - blok statement pada Pyhon di tandai dengan jumlah spasi pada awal kode pada setiap baris, perhatikan contoh berikut ini:



Ilustrasi 1



Penjelasan:

kode X=2 adalah sebuah statement, kode Y=2 juga merupakan sebuah statement. Setiap statement pada python dipisahkan dengan ganti baris



kode if X == Y: merupakan awal sebuah blok statement (kita sebut saja blok statement pertama), sedangkan kode print"Tubrukan terdeteksi" adalah statement blok pertama tersebut (ditandai dengan memberi spasi pada awal baris, ane gunakan 2 spasi).



Sedangkan kode else: merupakan awal sebuah blok statement kedua dan print "Tidak terjadi tubrukan" adalah statement blok kedua.



Berikut ilustrasi yang menjelaskan penggunaan blok statement dalam psoudo code:



Ilustrasi 2



contoh kedua:



Ilustrasi 3




Berikut ilustrasi contoh penulisan kode yang salah:



Ilustrasi 4



Sebuah statement juga dapat dipotong2 menjadi beberapa baris dengan menggunakan tanda "\" berikut contohnya:



print "Sudah adzan\
saatnya sholat"