Pengantar Teknologi Game
Script dan Skenario
Skenario
adalah adalah naskah yang sudah diberi karakterisasi dan adegan yang disuguhkan
kepada para pemain dan team produksi. kalau di amrik biasanya mengatakannya dengan
screenplay
Script adalah acuan pembuatan produk audio-visual. Skenario bagian dari skrip. karena skrip juga dipae' untuk membuat program audio/radio, juga videoklip, film dokumenter,iklan. Hanya saja strukturnya yang beda2.
kepada para pemain dan team produksi. kalau di amrik biasanya mengatakannya dengan
screenplay
Script adalah acuan pembuatan produk audio-visual. Skenario bagian dari skrip. karena skrip juga dipae' untuk membuat program audio/radio, juga videoklip, film dokumenter,iklan. Hanya saja strukturnya yang beda2.
Konsep Pembuatan Scripting pada game
- Pemilihan Bahasa Pemrograman
Pemrograman
suatu game bisa menggunakan berbagai macam jenis bahasa pemrograman.
Diantaranya yang terkenal adalah C++, C dan Java.
Proses
pembuatan game modern bisa memakan waktu 1-3 tahun untuk menyelesaikannya.
Lamanya suatu pengembangan bergantung pada sejumlah faktor, seperti genre,
skala, platform pengembangan dan jumlah aset.
Sebagai
contoh, sebuah game puzzle yang sederhana dengan menggunakan grafik 2D akan
jauh lebih sedikit memakan waktu untuk dikembangkan daripada game role-playing
komputer 3D.
Walaupun
terdapat banyak sekali pilihan bahasa pemrograman untuk membuat game, namun
pada intinya bahasa tersebut harus memenuhi syarat sebagai berikut :
a)
Speed
Bahasa
scripting untuk game harus mampu berjalan secepat mungkin. Jika kita berniat
untuk menggunakan banyak script untuk perilaku karakter dan kejadian di level
game, maka script akan perlu untuk mengeksekusi sebagai bagian dari loop game
utama. Ini berarti bahwa script yang lambat akan memakan waktu yang kita
butuhkan untuk membuat suatu adegan, menjalankan mesin fisika, atau menyiapkan
audio.
b)
Kompilasi
dan Interpretasi (penyusunan dan penafsiran)
Bahasa
scripting secara luas diinterpretasikan,melalui susunan serangkaian byte.
Penafsiran bahasa diambil melalui format teks. Interpreter melihat setiap
baris, penyusunan bekerja sesuai yang maksud dari script, dan melakukan
tindakan yang spesifik.
Bahasa byte-terkompilasi dikonversi
dari teks ke format internal, yang disebut byte code. Kode byte biasanya jauh
lebih padat daripada format teks. Karena kode byte dalam suatu format
dioptimalkan ketika dieksekusi, agar dapat berjalan lebih cepat.
c)
Ekstensibilitas dan Integrasi
Bahasa
scripting perlu memiliki akses ke fungsi yang signifikan ke dalam game. Sebuah
script yang mengendalikan karakter, misalnya, harus mampu untuk menanyai game
untuk mencari tahu apa yang bisa dilihat dan kemudian membiarkan game tahu apa
yang akan dilakukan sebagai aksinya.
Serangkaian
fungsi yang dibutuhkan untuk mengakses ini jarang diketahui ketika bahasa
scripting telah diimplementasikan atau dipilih. Hal ini penting untuk memiliki
sebuah bahasa yang dapat dengan mudah memanggil fungsi-fungsi atau menggunakan
kelas main code dalam game. Biasanya, itu adalah penting bagi programmer untuk
dapat mengekspos fungsi baru atau kelas yang dengan mudah ketika pembuat script
memintanya.
d)
Re-Entrancy
(ikut serta ulang)
Fungsi
ini sering berguna untuk memanggil script menjadi diikutsertakan ulang. Mereka dapat
berjalan untuk sementara waktu, dan ketika anggaran waktu telah habis script
akan dapat ditunda. Ketika script selanjutnya mendapatkan beberapa waktu
kembali, maka akan dapat menjalankan kembali script yang ditunda sebelumnya.
Hal ini
sering membantu untuk membiarkan kontrol hasil script saat mencapai jeda
normal. Kemudian sebuah algoritma penjadwalan dapat memberikan lebih banyak
waktu untuk meminimalisasi penggunaan sumber daya.
Sebuah
script untuk mengendalikan sebuah karakter, misalnya, mungkin memiliki lima
tahapan yang berbeda (memeriksa situasi, memeriksa kesehatan, menentukan
gerakan, rencana rute, dan melaksanakan gerakan). Ini semua dapat dimasukkan
dalam satu script yang menghasilkan penyekat antara setiap bagian. Kemudian
masing-masing akan berjalan dengan setiap lima frame, dan beban dari eksekusi
AI akan didistribusikan.
Re-entrancy yang lebih canggih harus
memungkinkan penulis script untuk menandai bagian yang tidak boleh terputus.
- Embedding (penanaman)
Embedding
berhubungan dengan ekstensibilitas. Sebuah bahasa yang tertanam dirancang untuk
dimasukkan ke dalam program lain. Ketika kita menjalankan bahasa scripting dari
workstation, biasanya akan menjalankan program khusus untuk menafsirkan file
source code. Dalam game, sistem scripting perlu dikontrol dari dalam program
utama. Game yang menentukan jalannya script harus dijalankan dan harus dapat
memberitahu mesin terkait bahasa scripting yang cocok untuk memproses script
tersebut.
- Bahasa Open Source
Banyak
bahasa scripting game populer yang dirilis di bawah lisensi open source.
Software open-source dirilis di bawah lisensi yang memberikan hak user untuk
memasukkannya ke dalam perangkat lunak mereka sendiri tanpa membayar biaya
tambahan.
Memulai sebagai teks dalam sebuah
file teks, script biasanya melewati empat tahap:
- Tokenization :
Tokenizing
mengidentifikasi unsur-unsur dalam teks. Sebuah file teks hanya berisi
serangkaian karakter (dalam pengertian karakter ASCII). Hasil tokenizer keluar
sebagai kumpulan byte tertentu dan jenis dari kelompok tertentu yang membentuk
mereka.
- Parsing (penguraian) :
Makna dari
sebuah program adalah sangat hirarkis: nama variabel dapat ditemukan dalam
sebuah statement pemberian nilai, ditemukan di dalam pernyataan IF-, yang ada
di dalam tubuh fungsi, di dalam definisi kelas, maupun di dalam sebuah
deklarasi namespace, misalnya. Parser mengambil urutan token, mengidentifikasi
peran masing-masing kode dalam program, dan mengidentifikasi struktur hirarkis
keseluruhan program.
Contoh1
: if (a < b) return;
dapat dilakukan proses parsing
seperti pada bagan di bawah ini :
- Compiler :
mengubah
parse tree ke dalam kode byte yang dapat dijalankan oleh interpreter. Kode byte
biasanya berbentuk data biner berurutan. Compiler non-optimasi biasanya berisi
output kode byte sebagai terjemahan literal dari parse tree.
- Interpreting :
Tahap
akhir dari serangkaian ini ialah menjalankan kode byte. Dalam sebuah compiler
untuk bahasa seperti C atau C++, produk akhir akan menjadi mesin instruksi yang
dapat langsung dijalankan oleh prosesor. Dalam bahasa scripting, anda sering
perlu untuk menyediakan layanan (seperti re-entrancy dan eksekusi yang aman)
yang tidak mudah dicapai dengan bahasa mesin.Kode byte akhir
dijalankan pada sebuah “mesin virtual”. Ini secara efektif menjadi sebuah
emulator untuk sebuah mesin yang belum pernah ada di hardware. Anda menentukan
instruksi agar mesin dapat mengeksekusi, dengan instruksi kode byte.
Contoh Pembuatan game mengunakan
script bahasa Java.
Berikut
ini adalah contoh scripting pada Bahasa pemrograman java menggunakan Netbeans.
Ini
ilustrasinya:
Gambar
di atas memiliki gambar utuh dalam bentuk lingkaran yang berwarna merah, dan
garis sisi berwarna hitam. Berikut ini langkah-langkahnya:
1.
Buka
NetBeans IDE 6.8
2.
File
– New Project
3.
Klik
Java
4.
Klik
Java Application
5.
Klik
tombol Next
6.
Ketik
di kotak Project Name: MembuatPuzzle
7.
Tentukan
lokasi dan nama folder di Project Location, misal D:\100java
8.
Hilangkan
tanda centang pada kotak Create Main Class
9.
Klik
Tombol Finish
10.
Klik
kanan project MembuatPuzzle
11.
Klik New
12.
Klik
Java Package
13.
Lihat
gambar berikut:
14.
Ketik
di kotak Package Name: MembuatPuzzlePackage
15.
Klik
Tombol Finish
16.
Klik
kanan pada MembuatPuzzlePackage
17.
Lihat
gambar berikut:
18.
Ketik
di kotak Class Name: MembuatPuzzleJFrame
19.
Klik
tombol Finish
20.
Klik
tombol Source
21.
Lihat
gambar berikut ini:
22. Di bawah teks package
MembuatPuzzlePackage;
Ketik
script berikut:
import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.GridLayout;import java.awt.Image;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.image.CropImageFilter;import java.awt.image.FilteredImageSource;import javax.swing.Box;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;
23. Di bawah teks public class
MembuatPuzzleJFrame extends javax.swing.JFrame {
Ketik
script berikut:
private JPanel centerPanel;private JButton button;private JLabel label;private Image source;private Image image;int[][] pos;int width, height;
24. Ubah teks public class
MembuatPuzzleJFrame extends javax.swing.JFrame {
Menjadi:
public
class MembuatPuzzleJFrame extends JFrame implements ActionListener{
25.
Hapus
teks initComponents();
26.
Di
bawah teks public MembuatPuzzleJFrame() {
Ketik
script berikut:
pos = new int[][] {{0, 1, 2},{3, 4, 5},{6, 7, 8},{9, 10, 11}};centerPanel = new JPanel();centerPanel.setLayout(new GridLayout(4, 4, 0, 0));// ImageIcon sid = new ImageIcon(Puzzle.class.getResource("bulat.jpg"));ImageIcon sid = new ImageIcon(MembuatPuzzleJFrame.class.getResource("bulat.jpg"));source = sid.getImage();width = sid.getIconWidth();height = sid.getIconHeight();add(Box.createRigidArea(new Dimension(0, 5)), BorderLayout.NORTH);add(centerPanel, BorderLayout.CENTER);for ( int i = 0; i < 4; i++) {for ( int j = 0; j < 3; j++) {if ( j == 2 && i == 3) {label = new JLabel("");centerPanel.add(label);} else {button = new JButton();button.addActionListener(this);centerPanel.add(button);image = createImage(new FilteredImageSource(source.getSource(),new CropImageFilter(j*width/3, i*height/4,(width/3)+1, height/4)));button.setIcon(new ImageIcon(image));}}}setSize(220, 280);setTitle("Membuat Puzzle");setResizable(false);setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);setVisible(true);}public static void main(String[] args) {new MembuatPuzzleJFrame();}public void actionPerformed(ActionEvent e) {JButton button = (JButton) e.getSource();Dimension size = button.getSize();int labelX = label.getX();int labelY = label.getY();int buttonX = button.getX();int buttonY = button.getY();int buttonPosX = buttonX / size.width;int buttonPosY = buttonY / size.height;int buttonIndex = pos[buttonPosY][buttonPosX];if (labelX == buttonX && (labelY - buttonY) == size.height ) {int labelIndex = buttonIndex + 3;centerPanel.remove(buttonIndex);centerPanel.add(label, buttonIndex);centerPanel.add(button,labelIndex);centerPanel.validate();}if (labelX == buttonX && (labelY - buttonY) == -size.height ) {int labelIndex = buttonIndex - 3;centerPanel.remove(labelIndex);centerPanel.add(button,labelIndex);centerPanel.add(label, buttonIndex);centerPanel.validate();}if (labelY == buttonY && (labelX - buttonX) == size.width ) {int labelIndex = buttonIndex + 1;centerPanel.remove(buttonIndex);centerPanel.add(label, buttonIndex);centerPanel.add(button,labelIndex);centerPanel.validate();}if (labelY == buttonY && (labelX - buttonX) == -size.width ) {int labelIndex = buttonIndex - 1;centerPanel.remove(buttonIndex);centerPanel.add(label, labelIndex);centerPanel.add(button,labelIndex);centerPanel.validate();}}
27. Kemudian, hapus semua tulisan
berikut ini:
public static void main(String args[]) {java.awt.EventQueue.invokeLater(new Runnable() {public void run() {new MembuatPuzzleJFrame().setVisible(true);}});}
28. Simpan gambar dengan nama bulat.jpg
di D:\100java\MembuatPuzzle\src\MembuatPuzzlePackage
Atau
pada folder src\MembuatPuzzlePackage sesuai lokasi folder anda
Catatan:
Saya
sendiri membuat gambar bulat.jpg mengunakan Paint (Start – All Programs –
Accessories – Paint)
Atau
copy saja gambar ini:
29.
Jalankan
program di Netbeans (Run – Run File)
30.
Hasilnya
seperti ini:
Keterangan:
Yang
tanda bitang merah itu sebenarnya kotak kosong. Apabila salah satu pecahan
gambar yang paling dekat dengan kotak kosong tersebut diklik, maka potongan
gambar tersebut akan menempati kotak kosong tersebut.
Apabila
kita acak-acak, kemudian disusun kembali, maka permainannya cukup memusingkan
juga. he…he..
31.
Selesai.
StoryBoard
Referensi
: