flash網遊開發日誌

來源:互聯網
上載者:User
本文是本人學習flash網路應用的過程,源碼、說明陸續推出;
先做一下自我介紹,為想學的朋友好上手;
Flash 2004 MX學習了45天,包含AS文法在內;
Flash Communication學習了10天;
Flash Remoting看了一點點資料,沒學;

C#學習文法10天;Bc,十五年前看過5天資料,沒學成,呵;C和Vc和Bc一樣十五年前看過資料,學不下去;VB十五年前看過一陣子資料,寫過幾個非常簡單的程式,現在忘得一乾二淨;ASP學習加應用共十年左右,應該說相當熟悉;SQL也還行,資料庫總不能說不會吧,呵;JavaScript呢還行,強強牛牛的東西做不來,正常東西都可寫;其它一些做圖軟體都會用,不能說會做圖;

電腦硬體非常熟,以前做這行的,呵好像和這個關係不大,其實有點關係,因為對作業系統和硬體搭配後的效能心裡有底,對自已要開發面向的使用者群使用的機器做一個分析,這樣自已開發出來的flash運算強度和美工強度,flash多大都有很直接的關係,因為機器好的人都去玩3D了;

舉例說一下:
Flash做遊戲,面向使用者是一般機器的,這此人的機器不會是非常好,所以他們所能玩的遊戲畫面都一般,因為好的畫面,他們的機器跑不動,顯示器大小,現在基本是15、17,機器一般顯示器就不會太好,所以上1024應該有困難,再說上了後,如果flash按1024做機器運行就很吃力,所以我們按800*600做。

引言

因為一直寫的是asp,重來沒有寫過傳統型應用程式,所以寫傳統型程式一直是我的夢想。開發遊戲更不用說,因為學電腦的原因就是因為玩遊戲,玩得多了就覺得沒意思,就想開發給別人玩,後來發現自已一個人是做不來的,所以就放棄了,這樣就走進了編程這個行當(十幾年前的事,呵,想想還算好,起碼選對了,現在就靠這個吃飯呀)。因為有點點VB知識,所以學ASP很快,就一直寫這個,寫了十多年。

開發娛樂項目對小團體和個人開發來說是難度最大的,因為涉及方面多廣,所以想學編程最好選這個來上手,學習東西必須要能提起你的興趣才會堅持下去,開發娛樂項目是我的興趣,因為也涉及方面多廣,所以寫完,基本就搞定這門語言了。

原由:
前面說過我的夢想,但一直沒有做過,萬事需要一個起因,公司的外部網站有一個flash,因為公司變動需要改,原改過一次,因為不懂,所以一改就需要找別人,我是最討厭去求人的,這次又要變,所以就馬上學flash,本來flash就不難,所以一下就搞定了。
改完後發現flash的語言和JavaScript很像,網上flash遊戲很多,興趣來了,公司年終有晚會,需要一個抽獎程式,用別的語言寫有點麻煩,因為畫面效果問題,用flash是最簡答的,所以借這個學習flash文法,寫完這個,加做美工45天,搞定flash了。
接著我對flash的興趣就很大了,想做遊戲,我知道flash可以和asp通訊,但效果不好,在網上查資料,發現了:
Flash Communication
Flash Remoting

這兩個東西,是做flash網路應用的,好做網遊有希望了。我在flash8發過貼,問Flash Communication、Flash Remoting做用,但這裡好像做flash網路應用的人不多,沒有得到答案,繼續找,終於得到答案:

Flash Communication是做視頻會議、聊天等東西的、Flash Remoting是做與資料庫通訊與存取的,知道要做什麼用後,可以開始了。
Flash Communication網上資料少得可憐,把網上搜便後,還用錢買了一本電子書《Flash Communication Server MX 1.5 參考大全》,可以開始著手寫了。

定位為回合遊戲,如象棋、麻將這些,如QQgame;10天把架構搭好了,遊戲大廳完成,但發現一個很大的問題:
SharedObject用起來怎麼都不爽;

SharedObject說明:flash的一種存取資料庫,可以存取比較簡單的資料,Flash Communication就是與本地SharedObject進行通訊來完成網路應用。SharedObject文法很麻煩,再加上Flash Communication本身不成熟,老是有一些莫名奇妙的問題,可能一個是我對Flash Communication的原理瞭解得太少,所以碰到很多問題。

為了自已的夢想,堅持著把與Flash Communication的通訊部分寫完,登陸大廳都正常了,再望向就要與資料庫通訊了,資料庫我定在SQL,Flash Communication本身不能操作資料庫,所以有了Flash Remoting這麼一個東西;

天呀,又得學Flash Remoting,這個網路的資料也是少得可憐,看資料說是和JAVA很像,可是我對JAVA是一點不懂,學JAVA太誇張了吧,所以開發開始挺住了。

為了自已的夢想實現,所以有空就上網看東西,原來在帝國BBS看到過自已寫與FLASH通訊的伺服器端文章,但我只會寫ASP,別的不會,所以一直不太理會,後來經過考慮,如果要學Flash Remoting的語言,不如學。NET,因為一直沒有時間學,二個是懶不想學,好,那麼定位為C#,這個現在比較火,學的人多,十多年前一直想學C沒有學成,現在終於可以逼迫自已去學了,因為找到理由了。

本文為原創,其實我現在還在學習C#中,所以一邊學一邊寫這個東西。

下面是我與Flash Communication通訊的一段代碼,我個人感覺太麻煩,所以一直寫都不爽SharedObject,我的AS語言剛學沒有多久,可能下面的代碼看起來比較醜,反正不用Flash Communication了,所以大家可以將就的看一下,不過如果要做視頻會議等東西,還需要用到Flash Communication,所以學東西不會白學,以後用得到,呵。

//是否點GAME案頭
//table案頭
//channel頻道
no_play = 0;
no_one = 0;
//桌的台號
var table_no;
//案頭左右
var table_place;
function run_program(str, str2, str3) {
var game_so = SharedObject.getRemote("game_room", client_nc.uri, true);
game_so.connect(client_nc);
game_so.onSync = function() {
//<2>
//for (a in game_so.data) {
// trace(a+": "+game_so.data[a]);
//}
//讀GAME案頭
for (i=1; i<=4; i++) {
dot_program(i);
}
//判斷是否點GAME案頭
if (no_play == 1) {
write_data(str, str2, str3);
no_play = 0;
}
};
//<2>
//=========================================================
function dot_program(str) {
//判斷GAME案頭資料
//if (eval("game_so.data.play_name"+str) != null) {
eval("_root.room_table.table_room.p"+str+"_u1").text = eval("game_so.data.play_room"+str+".play_name1");
eval("_root.room_table.table_room.p"+str+"_u2").text = eval("game_so.data.play_room"+str+".play_name2");
trace(eval("game_so.data.play_room"+str+".play_name1"));
//} else {
//eval("play_user"+str).text = "";
//}
}
//=========================================================
function write_data(str, str2, str3) {
//寫空離開遊戲
table_no = str;
table_place = str2;
if (eval("game_so.data.play_room"+str+".play_name"+str2) != "") {
if (eval("game_so.data.play_room"+str+".play_name"+str2) == myname) {
for (a in game_so.data) {
if (a == "play_room"+str) {
if (str2 == 1) {
game_so.data[a].play_name1 = "";
} else {
game_so.data[a].play_name2 = "";
}
break;
}
}
}
goto_list();
} else {
//寫開始遊戲
//eval("game_so.data.play_room"+str+".play_name2");
if ((eval("game_so.data.play_room"+str+".play_name1") != myname) && (eval("game_so.data.play_room"+str+".play_name2") != myname)) {
for (a in game_so.data) {
if (a == "play_room"+str) {
if (str2 == 1) {
game_so.data[a].play_name1 = myname;
} else {
game_so.data[a].play_name2 = myname;
}
break;
}
}
play();
}
}
}
}
//run_program();
setInterval(run_program, 2000);接著:
我在帝國BBS看到二篇文章《flash多人網路遊戲的實現的討論》和《視頻教程:用FLASH2004和VB建立聊天室》,剩了我不少力氣,在此多謝一聲。

flash 多人網路遊戲的實現的討論,原始碼陸續公開
http://flashempire.net/showthread.php?t=182045

想看看flash究竟能夠承受多大的網路資料轉送,
=======================================
我在flash登陸到伺服器以後,
每隔3毫秒就發送100次100個字元的串 "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" 給flash,
然後在flash裡面接收資料的函數裡面統計資料,
var g_nTotalRecvByte = 0;
var g_time = new Date();
var g_nStartTime = g_time.getTime();
var g_nCounter = 0;

mySocket.onData=function(xmlDoc)
{
g_nTotalRecvByte += xmlDoc.length;
// 每接收超過1k位元組的資料,輸出一次資訊,
if( g_nTotalRecvByte-g_nCounter > 1024 )
{
g_time = new Date();
var nPassedTime = g_time.getTime()-g_nStartTime;
trace( "花費時間:"+nPassedTime+"毫秒" );
g_nCounter = g_nTotalRecvByte;
trace( "接收總數:"+g_nTotalRecvByte+"位元組" );
trace( "接收速率:"+g_nTotalRecvByte*1000/nPassedTime+"位元組/秒" );

}結果十分令我意外,
這是截取的一段調試資訊,
//
花費時間:6953毫秒
接收總數:343212位元組
接收速率:49361.7143678988位元組/秒
花費時間:7109毫秒
接收總數:344323位元組
接收速率:48434.800956534位元組/秒
花費時間:7109毫秒
接收總數:345434位元組
接收速率:48591.0817273878位元組/秒
。。。
。。。
。。。
。。。
花費時間:8125毫秒
接收總數:400984位元組
接收速率:49351.8769230769位元組/秒
花費時間:8125毫秒
接收總數:402095位元組
接收速率:49488.6153846154位元組/秒
花費時間:8125毫秒
接收總數:403206位元組
接收速率:49625.3538461538位元組/秒

我檢查了幾遍來源程式,沒有發現邏輯錯誤,
如果程式沒有問題的話,
那麼我們得出的結論是,flash的xml socket每秒可以接收至少40K的資料,
這還沒有計算xmlSocket.onData事件的觸發,調試代碼、資訊輸出佔用的時間。

比我想象中快了一個數量級,
夠用了

視頻教程:用FLASH2004VB建立聊天室(1――7)

http://www.flashempire.com/school/tutorview.php?id=375

建議先看一下這兩篇文章,很有協助。

先確定要實用的幾樣東西:

Flash通訊方面:XMLSocket

這個比較簡單,操作也很方便,至少資料格式很明了,我操作起來方便。

註:需要注意的東西有二個,這個在伺服器端編寫時是要注意的,不然會把你搞得一頭水,今天就浪費了我大半天,本來就知道,可是就是沒有留意。

1. 資料格式flash端發送時會自動在代碼後加一個零位元組資料,這個很重要,不然就搞死人,這個是看不到的,不管在接收還是發送時都要注意。
伺服器收到flash發來的資料後先將最後一個字元切掉,然後再進行你想要的運算,返回給flash時記得加上一個如“\0”,這樣就可以了,這樣就表示一個零位元組資料,不然flash是收不到的,同時記得,伺服器一收到資料就先切掉這個零位元組資料,不要到與你運算的地方再切,和一個切一個,我最初也是這樣,其實是個人懶,給自已找麻煩,flash是不管你這麼多的,他只認零位元組資料,但偏偏零位元組資料在正常顯示是沒有問題的,也不換行不空格,所以跟本注意不到。
一個例子我要發送的資料是:
string aaa=” 使用者名稱\0”;
string bbb=” 登陸了”;
string ccc=aaa+bbb+”\0”;
Socket.send(ccc);大家看到了吧,使用者名稱如多出一個\0,如果是flash收到時就會是把他認為兩條資料,他就分別按兩條資料來收,所以一定要記得這個零位元組資料。

2. 伺服器端收到的資料是一種資料流,必須將他轉換為flash一樣的格式,不然中文中會是亂碼,在此也要注意一個地方,flash預設是utf8編碼,伺服器端收到轉為utf8就行了,不過在寫flash是,很多地方的文章都可以看到希望大家加上一句System.useCodepage = true;這句把我給害死了,這句我不知道到底有什麼做用,因為很多人說如果不加與asp、php動態交換資料時收到資料會是亂碼,我試過很多次都沒有這種情況,為了保險,所以我加上了,結果害了我,加了這句到了伺服器編碼就變了,我怎麼轉都轉不到utf8,後來刪了這句就正常了,暈死。。。

伺服器方面的C#需要用到:

using System.Net.Sockets; 這個就是winsocket,與flash通訊就靠他了。

using System.Text; 編碼轉換。

using System.Collections; 雜湊表。

using System.Threading; 多線程。

這是我目前用到的,C#我也剛學十多天,目前通訊的是完成了,等我把大廳完成,再著寫後面,因為是自學,理論我說不清,反正寫出能用,呵呵。

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。