Selasa, 05 Mei 2015

Membuat Game Online Multiplayer Bagian 3

pada kesempatan kali ini saya akan melanjutkan seri membuat game online multiplayer, ok, yang pertama anda siapkan semua perlengkapan yang dibutuhkan yaitu adobe flash minimal cs3, microsoft visual c# (saya memakai versi 2008) dan tentunya koneksi internet untuk mengakses playerio sebagai API, jalankan aplikasi flash dan buat 5 layer seperti gambar berikut lalu buatlah frame seperti gambar berikut, berilah nama frame pada layer frame sehingga akan menghasilkan gambar berikut


pada frame 1 letakkan background pada layer latar, textfield dan button pada layer interface sehingga akan menghasilkan tampilan sebagai berikut


catatan: 
dynamictext : statusTxt
dynamictext : usernameTxt
button : loginBtn


setelah itu kita menuju frame 11, isikan layer latar untuk background, lalu isikan layer interface textfield, button dan text sehingga tampilannya akan seperti berikut


catatan
dynamictext : chatTxt
dynamictext : inputTxt
button : sendBtn
button : newGameBtn

pada layer popup isikan movieclip sehingga akan tampil seperti berikut

catatan
movieclip : informationMC
button : newGameBtn (didalam informationMC)

yang perlu anda perhatikan adalah sesuaikan nama instansi sesuai dengan gambar, bila tidak anda perlu modifikasi nama instansi pada actionscript, kita kembali di frame 1, pada layer script tuliskan actionscript 3 berikut
import playerio.*;
stop();
var explodeSND:Sound = new ExplodeSND();
var musicSND:Sound = new MusicSND();
var shootSND:Sound = new ShootSND();
var client:Client;
var connection:Connection;
var playerArr:Array = [];
var laserArr:Array = [];
loginBtn.addEventListener(MouseEvent.CLICK,onLogin);
function onLogin(event:MouseEvent):void
{
if(usernameTxt.text != "")
{
PlayerIO.connect(
stage, "asteroid-duel-j78zcsnz1kwadwxvinhuyq", "public", usernameTxt.text, "",
handleConnect, handleError );
statusTxt.text = "Connecting...";
}else
{
statusTxt.text = "Please fill your username first.";
}
}
function handleConnect(client:Client):void{ if(client != null)
{
statusTxt.text = "Connected!\nChecking room...";
this.client = client;
//this.client.multiplayer.developmentServer = "localhost:8184"; }
this.client.multiplayer.listRooms("asteroidduel",{},100,0, onGetRoomList);
};
function handleError(error:PlayerIOError):void
{
trace("got "+error)
}
function onGetRoomList(rooms:Array):void
{
trace("get rooms, "+rooms);
for each(var room:RoomInfo in rooms)
{
trace("joing room "+room.onlineUsers);
if(room.onlineUsers < 5)
{
joinRoom(room.id);
return;
}
}
trace("create room");
createRoom();
}
function joinRoom(roomId:String):void
{ client.multiplayer.joinRoom(
roomId,
{}, handleJoin,
handleError );
gotoAndStop("game");
}
function createRoom():void
{ client.multiplayer.createRoom(
null, "asteroidduel", true, {},
joinRoom, handleError );
}
function handleDisconnect():void
{
for(var i:int=playerArr.length-1;i>=0;i--)
{
removeChild(playerArr[i].rocket);
playerArr.pop();
}
for(i=laserArr.length-1;i>=0;i--)
{
removeChild(laserArr[i]);
playerArr.pop();
}
gotoAndStop("login");
}
setelah itu kita menuju ka frame 11, lalu pada layer script tuliskan actionscript 3 berikut
stop();
musicSND.play(0,999);
informationMC.visible = false;
informationMC.newGameBtn.visible = false;
function handleJoin(connection:Connection):void
{ if(informationMC.visible) informationMC.visible = false;
chatTxt.text = "";
this.connection = connection;
connection.addDisconnectHandler(handleDisconnect);
connection.addMessageHandler("join", function(m:Message,playerUserId:String,posX:int,posY:int):void
{
var rocketMC:MovieClip = new Rocket1MC();
rocketMC.x = posX;
rocketMC.y = posY;
addChild(rocketMC);
playerArr.push({playerUserId:playerUserId,rocket:rocketMC});
});
connection.addMessageHandler("addRocket", function(m:Message,playerUserId:String, posX:int, posY:int, rotation:int):void
{
if(playerUserId != client.connectUserId)
{
var rocketMC:MovieClip = new Rocket1MC();
rocketMC.x = posX;
rocketMC.y = posY;
rocketMC.rotation = rotation;
addChild(rocketMC);
playerArr.push({playerUserId:playerUserId,rocket:rocketMC});
}
});
connection.addMessageHandler("left", function(m:Message,playerUserId:String):void
{ for(var i:int=0;i<playerArr.length;i++)
{
if(playerArr[i].playerUserId == playerUserId)
{
removeChild(playerArr[i].rocket);
playerArr.splice(i,1);
break;
}
}
});
connection.addMessageHandler("reset", function(m:Message,isSelf:int):void
{
trace("Reset! "+isSelf); });
connection.addMessageHandler("ChatJoin", function(m:Message,playerUserId:String):void
{
chatTxt.appendText(playerUserId+" join the game!\n"); });
connection.addMessageHandler("ChatLeft", function(m:Message,playerUserId:String):void
{
chatTxt.appendText(playerUserId+" leave the game!\n");
});
connection.addMessageHandler("Chat", function(m:Message,playerUserId:String,messageText:String):void
{
chatTxt.appendText(playerUserId+": "+messageText+"\n");
});
connection.addMessageHandler("UpdateRocket", function(m:Message,playerUserId:String, posX:int, posY:int, rotation:int):void
{ for(var i:int=0;i<playerArr.length;i++)
{
if(playerArr[i].playerUserId == playerUserId)
{
playerArr[i].rocket.x = posX;
playerArr[i].rocket.y = posY;
playerArr[i].rocket.rotation = rotation;
break;
}
}
});
connection.addMessageHandler("Shoot", function(m:Message,playerUserId:String):void
{
shootSND.play(0,1);
for(var i:int=0;i<playerArr.length;i++)
{
if(playerArr[i].playerUserId == playerUserId)
{
var laserMC:MovieClip = new LaserMC();
laserMC.x = playerArr[i].rocket.x;
laserMC.y = playerArr[i].rocket.y;
laserMC.rotation = playerArr[i].rocket.rotation;
laserMC.addEventListener(Event.ENTER_FRAME,onUpdateLaser);
addChild(laserMC);
laserArr.push({playerUserId:playerUserId,laser:laserMC});
break;
}
}
});
connection.addMessageHandler("HitRocket", function(m:Message,playerUserId:String,laserIndex:int):void
{
explodeSND.play(0,1);
for(var i:int=0;i<playerArr.length;i++)
{
if(playerArr[i].playerUserId == playerUserId && laserArr[laserIndex] != null)
{
playerArr[i].rocket.alpha = 0.4;
var timer:Timer = new Timer(2000,1);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, function():void { playerArr[i].rocket.alpha = 1; });
timer.start();
laserArr[laserIndex].laser.removeEventListener(Event.ENTER_FRAME,onUpdateLaser);
removeChild(laserArr[laserIndex].laser);
laserArr.splice(laserIndex,1);
break;
}
}
});
connection.addMessageHandler("EndGame", function(m:Message,resultText:String):void
{
trace("EndGame, result="+resultText);
informationMC.visible = true;
informationMC.informationTxt.text = resultText;
informationMC.newGameBtn.visible = true;
connection.disconnect();
});
}
newGameBtn.addEventListener(MouseEvent.CLICK,onNewGame);
informationMC.newGameBtn.addEventListener(MouseEvent.CLICK,onNewGame);
function onNewGame(event:MouseEvent):void
{
for(var i:int=playerArr.length-1;i>=0;i--)
{
removeChild(playerArr[i].rocket);
playerArr.pop();
}
informationMC.visible = true;
informationMC.informationTxt.text = "Exiting and Rejoining room...";
connection.disconnect();
handleConnect(null);
}
sendBtn.addEventListener(MouseEvent.CLICK,onChat);
function onChat(event:MouseEvent):void
{
if(inputTxt.text != "")
{
connection.send("Chat",inputTxt.text);
inputTxt.text = "";
}
}
stage.focus = stage;
stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
function onKeyDown(event:KeyboardEvent):void
{
switch(event.keyCode)
{
case 37: connection.send("RotateLeft");
break;
case 38: connection.send("MoveUp");
break;
case 39: connection.send("RotateRight");
break;
case 40: connection.send("MoveDown");
break;
case 32: connection.send("Shoot");
break;
}
}
function onUpdateLaser(event:Event):void
{
var laserMC:MovieClip = event.currentTarget as MovieClip;
    laserMC.y += (int)(Math.sin((laserMC.rotation - 90) * (Math.PI / 180)) * 10);
    laserMC.x += (int)(Math.cos((laserMC.rotation - 90) * (Math.PI / 180)) * 10);
var laserIndex:int = getLaserIndex(laserMC);
if(laserArr[i].playerUserId == client.connectUserId)
{
for(var i:int=0;i<playerArr.length;i++)
{
if(laserMC.hitTestObject(playerArr[i].rocket) && playerArr[i].rocket.alpha==1 && playerArr[i].playerUserId != laserArr[laserIndex].playerUserId)
{ connection.send("HitRocket", playerArr[i].playerUserId, laserIndex);
}
}
}
if(laserMC.x < 0 || laserMC.x > 550 || laserMC.y < 0 && laserMC.y > 400)
{
laserMC.removeEventListener(Event.ENTER_FRAME,onUpdateLaser);
removeChild(laserMC);
laserArr.splice(laserIndex,1);
}
}
function getLaserIndex(laserMC:MovieClip):int
{
for(var i:int=0;i<laserArr.length;i++)
{
if(laserMC == laserArr[i].laser)
{ return i;
}
}
return -1;
}

dari sini kita telah menyelesaikan game pada sisi client side, selanjutnya mari kita mulai menjajaki sisi server side, silahkan buka aplikasi microsoft visual c#, dan tuliskan script berikut
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using PlayerIO.GameLibrary;
using System.Drawing;
using System.Timers;
namespace MyGame
{
    public class Player : BasePlayer
    {
        public string Name;
        public int posX;
        public int posY;
        public int rotation;
        public int hit;
    }
    public class GameCode : Game<Player>
    {
        private Player[] playerArr;
        public override void GameStarted()
        {
            Console.WriteLine("Game is started: " + RoomId);
            playerArr = new Player[5];
        }
        public override void GameClosed()
        {
            Console.WriteLine("Game closed: " + RoomId);
        }
        public override void UserJoined(Player player)
        {
            Console.WriteLine("UserJoined: " + player.ConnectUserId);
            JoinGame(player);
            Broadcast("ChatJoin", player.ConnectUserId);
        }
        public override void UserLeft(Player player)
        {
            Broadcast("ChatLeft", player.ConnectUserId);
            for (int i = 0; i < playerArr.Length; i++)
            {
                if (playerArr[i] != null)
                {
                    if (playerArr[i].ConnectUserId == player.ConnectUserId)
                    {
                        playerArr[i] = null;
                        break;
                    }
                }
            }
            Broadcast("left", player.ConnectUserId);
        }
        public override void GotMessage(Player player, Message message)
        {
            for (int i = 0; i < playerArr.Length; i++)
            {
                if (playerArr[i] != null)
                {
                    if (playerArr[i].ConnectUserId == player.ConnectUserId)
                    {
                        player = playerArr[i];
                    }
                }
            }
            Console.WriteLine("GotMessage: " + message.Type);
            switch (message.Type)
            {
                case "Chat":
                    {
                        String messageText = message.GetString(0);
                        Broadcast("Chat", player.ConnectUserId, messageText);
                        break;
                    }
                case "RotateLeft":
                    {
                        player.rotation -= 5;
                        if (player.rotation <= 0) player.rotation = 360;
                        Broadcast("UpdateRocket", player.ConnectUserId, player.posX, player.posY, player.rotation);
                        break;
                    }
                case "MoveUp":
                    {
                        player.posY += (int)(Math.Sin((player.rotation - 90) * (Math.PI / 180)) * 10);
                        player.posX += (int)(Math.Cos((player.rotation - 90) * (Math.PI / 180)) * 10);
                        if (player.posX < 32 || player.posX > 365 || player.posY < 42 || player.posY > 290)
                        {
                            player.posY -= (int)(Math.Sin((player.rotation - 90) * (Math.PI / 180)) * 10);
                            player.posX -= (int)(Math.Cos((player.rotation - 90) * (Math.PI / 180)) * 10);
                        }
                        else
                        {
                            Broadcast("UpdateRocket", player.ConnectUserId, player.posX, player.posY, player.rotation);
                        }
                        break;
                    }
                case "RotateRight":
                    {
                        player.rotation += 5;
                        if (player.rotation >= 360) player.rotation = 0;
                        Broadcast("UpdateRocket", player.ConnectUserId, player.posX, player.posY, player.rotation);
                        break;
                    }
                case "MoveDown":
                    {
                        player.posY -= (int)(Math.Sin((player.rotation - 90) * (Math.PI / 180)) * 10);
                        player.posX -= (int)(Math.Cos((player.rotation - 90) * (Math.PI / 180)) * 10);
                        if (player.posX < 32 || player.posX > 365 || player.posY < 42 || player.posY > 290)
                        {
                            player.posY += (int)(Math.Sin((player.rotation - 90) * (Math.PI / 180)) * 10);
                            player.posX += (int)(Math.Cos((player.rotation - 90) * (Math.PI / 180)) * 10);
                        }
                        else
                        {
                            Broadcast("UpdateRocket", player.ConnectUserId, player.posX, player.posY, player.rotation);
                        }
                        break;
                    }
                case "Shoot":
                    {
                        Broadcast("Shoot", player.ConnectUserId);
                        break;
                    }
                case "HitRocket":
                    {
                        Console.WriteLine("HitRocket: " + player.ConnectUserId);
                        player.hit++;
                        Broadcast("HitRocket", message.GetString(0), message.GetInt(1));
                        if (player.hit >= 5)
                        {
                            EndGame();
                        }
                        break;
                    }
            }
        }
        private void EndGame()
        {
            String result = "";
            for (int i = 0; i < playerArr.Length; i++)
            {
                if (playerArr[i] != null)
                {
                    for (int j = i; j < playerArr.Length; j++)
                    {
                        if (playerArr[j] != null)
                        {
                            if (playerArr[j].hit < playerArr[i].hit)
                            {
                                Player tempPlayer = playerArr[i];
                                playerArr[i] = playerArr[j];
                                playerArr[j] = tempPlayer;
                            }
                        }
                    }
                }
            }
            for (int i = 0; i < playerArr.Length; i++)
            {
                if (playerArr[i] != null)
                {
                    result += (i + 1) + ". " + playerArr[i].ConnectUserId + ", " + playerArr[i].hit + "x hit\n";
                }
            }
            Console.WriteLine("EndGame: " + result);
            Broadcast("EndGame", result);
        }
        private void JoinGame(Player user)
        {
            Random rand = new Random();
            int posX = rand.Next(350) + 30;
            int posY = rand.Next(250) + 40;
            user.posX = posX;
            user.posY = posY;
            user.rotation = 0;
            user.hit = 0;
            for (int i = 0; i < playerArr.Length; i++)
            {
                if (playerArr[i] == null)
                {
                    playerArr.SetValue(user, i);
                    break;
                }
            }
            Broadcast("join", user.ConnectUserId, posX, posY);
            for (int i = 0; i < playerArr.Length; i++)
            {
                if (playerArr[i] != null && playerArr[i] != user)
                {
                    Broadcast("addRocket", playerArr[i].ConnectUserId, playerArr[i].posX, playerArr[i].posY, playerArr[i].rotation);
                }
            }
        }
    }
}
sampai disini kita telah menyelesaikan sisi server side, sekarang kita tinggal meletakkan script server side pada server playerio agar bisa diakses oleh siapapun pengguna internet, pertama buat file dengan ekstensi dll, caranya pada jendela visual c# klik built>>built solution


dengan demikian script c# telah menghasilkan output ekstensi dll, setelah itu marilah kita membuka playerio.com dan masuklah pada akun anda, setelah itu buatlah new game dan catatlah ID dari new game tersebut
//gambar//



setelah itu upload file dll tadi, setelah itu coba anda jalankan file swf atau ctr+enter pada jendela flash, bila telah benar maka anda bisa memainkan game ini secara bersamaan dengan teman anda


demikian tutorial membuat game online multiplayer, bila anda ada pertanyaan silahkan tinggalkan komentar pertanyaan dan sebisa mungkin akan saya jawab, anda bisa mendapatkan semua source dalam tutorial bagian 3 ini disini dengan pasword wahanaflash.com

Tidak ada komentar:

Posting Komentar