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)
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;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
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);
}
}
}
}
}
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