Shading
Shading adalah Pemantulan
bayangan pada permukaan yang rata dan disetiap permukaannya mempunyai tingkatan
pencahayaan yang sama sehingga menghasilkan warna yang sama. Efek gradasi
tersebut akan memantulan bayangan pada permukaan yang rata, ditambah
dengan pengaruh sudut dan jarak antara objek terhadap cahaya sehingga di
setiap permukaannya mempunyai tingkatan pencahayaan yang tidak sama
maka terbentuklah shading tersebut.
Contoh dari pemberian shading pada objek :
Contoh dari pemberian shading pada objek :
Ambient
Ambient adalah efek pencahayaan
yang telah membaur dengan lingkungan sehingga arah cahaya tidak dapat
diketahui, seakan-akan cahaya datang dari segala arah. Efek ini akan
mempengaruhi terang atau tidaknya suatu lingkungan yang terlihat oleh mata.
Semakin banyak lampu maka ruangan semakin terang, sebaliknya jika lampu sedikit
maka ruangan remang-remang.
Intensitas
ambient pada suatu obyek dapat dicari dengan persamaan :
I = Ia * Ka
dimana,
I= Intensitas
yang dihasilkan
Ia =
Intensitas ambient
Ka = Koefisien
ambient
Diffuse
Jenis pencahayaan yang kedua
ialah diffuse. Diffuse adalah pencahayaan yang tergantung dari besarnya sudut
yang dibentuk antara sinar dari lampu ke titik tabrak pada obyek dengan normal
obyek. Sehingga posisi lampu sangat mempengaruhi efek diffuse ini. Intensitas
diffuse dapat dicari dengan hukum.
Lambertian
sebagai berikut:
I = Ip * Kd
(cosθ )
Dari persamaan
intensitas diffuse tersebut cos θ dapat dihitung dengan melakukan dot product
antara sinar dari lampu ke titik tabrak obyek dengan normal obyek itu,
masing-masing merupakan unit vektor. Sehingga didapat persamaan baru.
I = Ip * Kd *
( L • N )
dimana,
I= Intensitas
yang dihasilkan
Ip =
Intensitas diffuse dari sumber cahaya ‘x’
Kd = Koofisien
diffuse
N = Vektor
normal dari obyek
L = Vektor
dari titik tabrak ke sumber cahaya
θ = Sudut
antara N dan L
Specular
Specular adalah efek pencahayaan
dimana bayangan sumber cahaya terlihat pada permukaan obyek. Efek specular
terlihat pada obyek yang mengkilap. Semakin mengkilap permukaan suatu obyek
maka makin jelas bayangan sumber cahaya yang terlihat pada permukaan obyek
tersebut. Untuk mencari intensitas specular dapat digunakan persamaan sebagai
berikut :
I = Ip * Ks
(cos θ ) n
Dari persamaan
intensitas specular tersebut cos θ menggunakan dot product antara arah pantulan
dengan negasi dari arah sinar.
I = Ip * Ks *
( R • V ) n
dapat dihitung
dengan dimana,
I= Intensitas
yang dihasilkan
Is =
Intensitas specular dari sumber cahaya ‘x’
Ks = Koofisien
specular
n = Variabel
yang menentukan luas area yang berkilau jika terkena cahaya yang dipancarkan
oleh sumber cahaya (bila n semakin besar maka cahaya semakin terfokus atau area
yang berkilau menjadi lebih kecil)
R = Arah
pantulan, berupa unit vektor
V = Negasi
dari arah sinar
Sedangkan
vektor R diperoleh dari − S + 2 * ( S • N ) * N
dimana,
S = Vektor
dari titik tabrak ke sumber cahaya
N = Vektor
normal dari obyek
Mapping
Mapping : suatu teknik untuk
menirukan detail permukaan dengan pemetaan gambar (tekstur) menjadi polygons.
Jenis – jenis Mapping :
1. Texture map : suatu teknik untuk
menirukan detail permukaan dengan pemetaan gambar (tekstur) menjadi polygons.
Terdiri dari :
- bitmap :
memilih file gambar image
- checker :
pola papan catur
- marble :
tekstur berupa marmer
- gradien :
tekstur dari gradasi tiga buah warna
- water :
menampilkan efek air
- wood :
menampilkan tekstur kayu
2. Mapping coordinate :
- offset :
menggeser posisi bitmap pada material
- tilling :
mengatur duplikasi bitmap pada material
- mirror :
mencerminkan bitmap pada material
- tile :
pengkotakkan material
- angle :
perputaran material pada objek
- uv/vw/wv :
orientasi mapping
- blur :
memberikan efek kabur
Rancanglah Game Sederhana
Disini kami membuat game sederhana
yang berjudul “Jakarta Keras Boss!!” menggunakan Strawberry Prolog.
Rancangannya yaitu, pertama-tama
kami menentukan target rancangan game ini. Disini kami hanya membatasi sampai
animasi sederhana saja, ada 2 orang yang sedang berkelahi, di game ini player
memainkan “Internazionale” sedangkan AI nya adalah “Primavera”, kedua pemain
harus menyerang sampai salah satu kehabisan darah, atau sampai waktunya habis
dengan cara memukul dan menendang.
Berikut ini adalah kodingannya:
?-
G_title is bitmap_image("gambar\\GENKSMA.bmp",_), %ini
gambar awal
G_latar1 is bitmap_image("gambar\\latar1.bmp",_), %ini gambar latar1
G_char1 is bitmap_image("gambar\\char1.bmp",_), %ini gambar jagoan
1 stand biasa
G_char2 is bitmap_image("gambar\\char2.bmp",_), %ini gambar musuh
1 stand biasa
G_char1pukul is bitmap_image("gambar\\char1-1.bmp",_),
%ini gambar jagoan lagi mukul
G_char1tendang is bitmap_image("gambar\\char1-2.bmp",_), %ini gambar jagoan
lagi nendang
G_x1:=30, %posisi x
jagoan
G_y1:=350, %posisi y jagoan
G_x1lawan:=680, %posisi x lawan
G_y1lawan:=355, %posisi y lawan
G_waktu:=120, %lamanya waktu
dalam 1/detik
G_darah1:=320, %ini nyawa jagoan
G_darah2:=280, %ini nyawa lawan
G_jarak:=0, %ini
jarak kedua permain
%---------------------------- INI WINDOW 1 ------------------------------%
window(G_layar1,_,win_func(_),"JAKARTA KERAS BOSS",250,100,1000,830).
win_func(paint):- %fungsi
win_func()
draw_bitmap(0,0,G_title,_,_),
fail.
%----------------------- INI
TOMBOL WINDOW 1 -------------------------%
win_func(init):-
button(_,_,mulai_game(_),"START",400,400,250,40),
button(_,_,about(_),"HELP",400,450,250,40),
button(_,_,keluar_game(_),"DROP OUT",400,500,250,40).
%----------------
MULAI GAME --------------------%
mulai_game(press):-
window(G_layar2,_,win_func2(_),"JAKARTA KERAS BOSS",250,100,810,630),
close_window(G_layar1),
update_window(_).
win_func2(init):-
%lawan_berkurang(_),
G_timer is set_timer(_,1,time_func).
%---------------
KELUAR GAME --------------------%
keluar_game(press):-
close_window(G_layar1).
fail.
%--------------
TENTANG GAME ------------------%
about(press):-
shell_execute("help.html").
%------------------------ FUNGSI
TIMER --------------------------------- %
time_func(end):-
G_waktu:=G_waktu-1,
E:= printq(G_waktu),
font(15,50,"Times New Roman"),
text_out(360,20,E),
(G_waktu=0->
message("TIME","PERMAINAN BERAKHIR\nAnda dinyatakan SERI",i), close_window(_)),
lawan_berkurang(_),
fail.
%--------------------FUNGSI
HITUNG JARAK----------------------------%
hitung_jarak(end):-
G_jarak:=G_x1lawan-G_x1,
T:= printq(G_jarak),
font(8,10,"Times New Roman"),
text_out(20, 570, T),
fail.
%--------------------- FUNGSI
LAWAN GERAK -------------------------%
lawan_berkurang(end):-
(G_jarak>200->
G_x1lawan:=G_x1lawan-50,update_window(_)
), %jika
jarak lebih dari 200
(G_jarak<190->
G_x1lawan:=G_x1lawan+50,update_window(_)
), %jika
jarak kurang dari 190
(G_darah2>550->
message("TIME","PERMAINAN BERAKHIR\nAnda dinyatakan MENANG",i), close_window(_)
).
fail.
win_func2(paint):-
draw_bitmap(0,0,G_latar1,_,_),
draw_bitmap(G_x1,G_y1,G_char1,_,_), %ini
karakter jagoan
draw_bitmap(G_x1lawan,G_y1lawan,G_char2,_,_), %ini karakter
musuh
font(10,20,"Impact"), %ini font untuk 2 biji yang
dibawah
text_out(10, 20, "Internazionale"), %ini nama jagoan
text_out(580, 20, "Primavera"), %ini nama musuh
pen(20,rgb(100,0,0)), %ini
fungsi draw pen nya
line(20,50,G_darah1,50), %ini
darah jagoan
line(G_darah2+175,50,770,50), %ini
darah lawan
hitung_jarak(_),
fail.
kiri(paint):-
P:=G_x1+20,
draw_bitmap(P,G_y1,G_char1,_,_),
update_window(_),
G_x1:=P.
kanan(paint):-
Q:=G_x1-20,
draw_bitmap(Q,G_y1,G_char1,_,_),
update_window(_),
G_x1:=Q.
pukul(paint):-
P1:=G_y1,
draw_bitmap(G_x1,P1,G_char1pukul,_,_),
wait(0.2),
G_y1:=P1,
(G_jarak<200->
G_darah2:=G_darah2+30,update_window(_)
).
tendang(paint):-
Q1:=G_y1,
draw_bitmap(G_x1,Q1,G_char1tendang,_,_),
wait(0.2),
update_window(_),
G_y1:=Q1,
(G_jarak<200->
G_darah2:=G_darah2+50,update_window(_)
).
%----------------------------fungsi
Charcode--------------------------------------
win_func2(key_down(39,_)):- %kiri
kiri(_).
win_func2(key_down(37,_)):- %kanan
kanan(_).
win_func2(key_down(38,_)):- %atas
update_window(_).
win_func2(key_down(90,_)):- %tombol
z
pukul(_).
win_func2(key_down(88,_)):- %tombol
x
tendang(_).
fail.
Scenario Game
Skenario game ini adalah dimana
kedua pemain (player dan AI) bertarung sampai darahnya habis, dan juga akan ada
waktu selama 120 detik. Player akan dinyatan menang jika berhasil mengalahkan AI sampai darahnya
habis dan sebaliknya, Player akan dinyatakan kalah jika darahnya habis. Jika
waktu sudah habis tetapi tidak ada yang kalah, maka darahnya yang paling
sedikit akan dinyatakan kalah.
Pendeklarasian Objek Game
Objek pada game ini ada 2 yang
penting. Pertama Player yang bernama”Internazionale, yang kedua adalah AI yang
bernama “Primavera”, ini diatur dalam :
win_func2(paint):-
draw_bitmap(0,0,G_latar1,_,_),
draw_bitmap(G_x1,G_y1,G_char1,_,_), %ini
karakter jagoan
draw_bitmap(G_x1lawan,G_y1lawan,G_char2,_,_), %ini karakter
musuh
font(10,20,"Impact"), %ini font untuk 2 biji yang
dibawah
text_out(10, 20, "Internazionale"), %ini nama jagoan
text_out(580, 20, "Primavera"), %ini nama musuh
pen(20,rgb(100,0,0)), %ini
fungsi draw pen nya
line(20,50,G_darah1,50), %ini
darah jagoan
line(G_darah2+175,50,770,50), %ini
darah lawan
hitung_jarak(_),
fail.
Bagian penting lainnya adalah private class KeyManager.
Digunakan untuk menangkap event yang dilakukan pada keyboard.
%----------------------------fungsi
Charcode---------------------------
win_func2(key_down(39,_)):- %kiri
kiri(_).
win_func2(key_down(37,_)):- %kanan
kanan(_).
win_func2(key_down(38,_)):- %atas
update_window(_).
win_func2(key_down(90,_)):- %tombol z
pukul(_).
win_func2(key_down(88,_)):- %tombol x
tendang(_).
fail.
Screenshot
Game
REFERENSI :
rekan kerja :