Latest Blog
Multimedia Interaktif Tata Surya
Membuat Multimedia Pembelajaran Interaktif tentang tata surya
ALL BLOG
;
Mendeteksi Tabrakan Antar Objek dalam Game
Tabrakan antar object atau disebut dengan collision adalah sebuah hal yang hampir ada disemua game. Dalam sebuah game Galaxian misalnya, terdapat tabrakan antara pesawat pemain dengan musuh, peluru pemain dengan musuh, dan peluruh musuh dengan pesawat pemain. Sehingga boleh dikatakan bahwa collision adalah hal mendasar dalam sebuah game.
Dalam tutorial ini kita akan menambahkan tabrakan antara ball dengan board_1 dan board_2. Akan tetapi perlu diperhatikan bahwa tabrakan yang akan dijelaskan dalam tutorial ini adalah tabrakan yang paling sederhana yaitu dengan memanfaatkan code hitTestObject. Metode tersebut adalah menghitung tabrakan antar objek berbasis segi 4, dimana aplikasi akan menghitung apakah titik-titik terluar dari objek saling bersinggungan. Dalam pengembangan selanjutnya anda dapat menambahkan metode tabrakan yang lebih baik seperti dengan memanfaatkan perhitungan matematika kompleks atau dengan menggunakan physic engine. Perhatikan langkah-langkah berikut :
- Pada langkah sebelumnya kita sudah dapat mengendalikan board_1 dengan input keyboard. Akan tetapi pada tutorial tersebut movieclip ball masih menembus papan pemain maupun papan musuh.
- Untuk menambahkan tabrakan antara ball dengan board_1 dan board_2 kita perlu menambahkan beberapa baris kode pada fungsi game_loop() menjadi sebagai berikut
- Pada baris 36 ditambahkan variabel just_hit. Variabel ini digunakan untuk menghindari bug bola menempel dipapan. Dengan variabel ini dipastikan bola akan segera memantul setelah kode hitTestObject bernilai true. Selanjutnya ketika bola menabrak papan, nilai variabel speed_y dibalik sehingga bola bergerak memantul.
- Jalankan (ujicoba) aplikasi dengan menekan Ctrl+Enter apabila anda tidak menemui kendala, maka anda akan dapat mengendalikan board_1 ke kanan dan ke kiri, dan bola dapat memantul ketika mengenai kedua papan
... private var just_hit:Number = 0; ...
private function game_loop(e:Event):void {
if (!is_goal){
ball.x += speed_x;
ball.y += speed_y;
if (ball.y<30 || ball.y>770) speed_y*=-1;
if (ball.x<30 || ball.x>450) speed_x*=-1;
if (board_1.x < 400 && is_right) board_1.x += 10;
if (board_1.x > 80 && is_left) board_1.x -= 10;
if (ball.hitTestObject(board_1) && just_hit == 0) {
just_hit = 10;
speed_y *= -1;
}
if (ball.hitTestObject(board_2) && just_hit == 0) {
just_hit = 10;
speed_y *= -1;
}
if (just_hit > 0) just_hit--;
}
}
Secara keseluruhan kode pada Main.as sampai dengan tutorial ini adalah sebagai berikut :
package
{
import flash.display.Bitmap;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
/**
* ...
* @author Wandah
*/
public class Main extends Sprite
{
[Embed(source = "../bin/arena.jpg")]
private var arena_bmp:Class;
[Embed(source = "../bin/board_1.png")]
private var board_1_bmp:Class;
[Embed(source = "../bin/board_2.png")]
private var board_2_bmp:Class;
[Embed(source = "../bin/ball_bmp.png")]
private var ball_bmp:Class;
private var board_1:MovieClip;
private var board_2:MovieClip;
private var ball:MovieClip;
private var game:MovieClip;
private var speed_x:Number = 0;
private var speed_y:Number = 0;
private var is_goal:Boolean = false;
private var is_left:Boolean = false;
private var is_right:Boolean = false;
private var just_hit:Number = 0;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
setup();
}
private function setup():void {
game = new MovieClip();
addChild(game);
var arena:Bitmap = new arena_bmp();
game.addChild(arena);
board_1 = new MovieClip();
var board_bmp:Bitmap = new board_1_bmp();
board_bmp.x = -63;
board_bmp.y = -11;
board_1.addChild(board_bmp);
board_1.x = 240;
board_1.y = 650;
game.addChild(board_1);
board_2 = new MovieClip();
board_bmp = new board_2_bmp();
board_bmp.x = -63;
board_bmp.y = -11;
board_2.addChild(board_bmp);
board_2.x = 240;
board_2.y = 150;
game.addChild(board_2);
ball = new MovieClip();
var ball_bitmap:Bitmap = new ball_bmp();
ball_bitmap.x = -28;
ball_bitmap.y = -28;
ball.addChild(ball_bitmap);
ball.x = 240;
ball.y = 400;
game.addChild(ball);
speed_x = Math.random() * 3+2;
speed_y = -20 + Math.random() * 10;
game.addEventListener(Event.ENTER_FRAME, game_loop);
stage.addEventListener(KeyboardEvent.KEY_DOWN, myKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, myKeyUp);
}
private function game_loop(e:Event):void {
if (!is_goal){
ball.x += speed_x;
ball.y += speed_y;
if (ball.y<30 || ball.y>770) speed_y*=-1;
if (ball.x<30 || ball.x>450) speed_x*=-1;
if (board_1.x < 400 && is_right) board_1.x += 10;
if (board_1.x > 80 && is_left) board_1.x -= 10;
if (ball.hitTestObject(board_1) && just_hit == 0) {
just_hit = 10;
speed_y *= -1;
}
if (ball.hitTestObject(board_2) && just_hit == 0) {
just_hit = 10;
speed_y *= -1;
}
if (just_hit > 0) just_hit--;
}
}
private function myKeyDown(e:KeyboardEvent):void {
if (e.keyCode == 39) is_right = true;
if (e.keyCode == 37) is_left = true;
}
private function myKeyUp(e:KeyboardEvent):void {
if (e.keyCode == 39) is_right = false;
if (e.keyCode == 37) is_left = false;
}
}
}
Selanjutnya
Pada tahapan berikutnya kita akan menggerakkan papan lawan (AI) Membuat AI (Kecerdasan Buatan) Sederhana
Share ( Ayo Berbagi )
Leave me a comment
untuk pertanyaan lebih baik di email langsung ke wandah [at] wandah [dot] com agar cepat direspon




