FC2ブログ

・・・

今年もおわりですね 

秋から少し調子を崩し気味だったのでブログの更新が滞っていました。
いまはゆっくり上向きのような気がします。

オンラインゲーム開発の話題は、基本的には僕の管理する「発達障害SNS」内で他の人たちと話しあいながら行っていくことにしました。
このブログでは技術的な進捗があったときに更新する形にしようと思います。

来年もよろしくお願いします。
よいお年を!
スポンサーサイト



オンラインゲームの開発事始め(3) Ajaxを使ったチャットのサンプルプログラム 

研究の過程で、通信対戦に対応したブラウザゲームを作るためには「非同期通信」という仕組みが必要だとわかりました。
また、非同期通信を実現するにはAjaxという技術の使い方をマスターする必要があるということもわかりました。

具体的にはAjaxのXMLHttpRequestオブジェクトの使い方?ですかね。
いざやってみたらそんなに難しいことはなかったです。
さっそくサンプルプログラムを組んでみました。

Ajaxチャットサンプル

見た目はただのチャットプログラムです。
ですが中身は非同期通信なので、発言を入力している間にも自動的に画面上のログが更新されていきます。
このサンプルでは10秒単位で更新するようにしてありますが、理論的にはミリ秒(1/1000秒)単位で更新頻度を設定することができます。

非同期通信がなぜ重要かと言うと、通常WEBサイトは、サイトを見ている人がリンクをクリックしたり、リロードした場合に初めてサーバからデータが送られてきます。
しかしゲームの場合は画面を更新するために毎回毎回そんな操作をプレイヤーに要求するわけにはいかないので、プレイヤーに意識させずに通信を自動で行う仕組みが必要というわけです。
これを非同期通信と呼ぶんですね。
僕も今回勉強して初めて知りました(笑)

これが出来たということは、もうオンラインゲームを作るための技術的な前提はクリアできたも同然です。
次回はこのチャットプログラムを拡張して、画面にアバターキャラクターを表示してそれを動かせるところまで作ってみたいと思います。
そこまで出来たらあとはもう対戦の仕組みを入れればほぼオンラインゲームの完成ですね。
残る技術的な課題は、レンタルサーバなのでできるだけ負荷がかからないスマートな仕様を考える必要がある点だけかな。

このAjaxチャットサンプルのコード。コメントとか適当です。

main.js

var gDstUrl = "output.php";
var gTimerId;
var gXHR;

window.onload = function() {
var elementInputName = document.getElementById("input_name");
var elementInputRemark = document.getElementById("input_remark");
var elementButtonSend = document.getElementById("button_send");
var elementTextareaLog = document.getElementById("textarea_log");

gXHR = XMLHttpRequestCreate();

// 周期呼び出し関数
intervalRequest = function() {
httpRequest(null);
}

// 送信ボタンが押された時の処理
postData = function() {
var postdata = Array();
postdata['data'] = elementInputName.value + ":" + elementInputRemark.value + "\n";
httpRequest(postdata);
elementInputRemark.value = "";
}

//
httpRequest = function(senddata) {
gXHR.open("POST", gDstUrl);
gXHR.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
gXHR.send(encodeHTMLForm(senddata));
}

// 送受信状態に変更がある場合に実行されるイベント
gXHR.onreadystatechange = function () {
switch (gXHR.readyState) {
case 0: // XMLHttpRequest オブジェクトを作成した状態
break;
case 1: // open() メソッドの呼び出しが完了している
break;
case 2: // レスポンスヘッダの受信は完了している
break;
case 3: // レスポンスボディを受信中
break;
case 4: // 完了
if (gXHR.status == 0) {
elementTextareaLog.value = "エラー";
} else if ((200 <= gXHR.status && gXHR.status < 300) || (gXHR.status == 304)) {
elementTextareaLog.value = gXHR.responseText;
}
break;
}
};

gTimerId = setInterval("intervalRequest()", 10 * 1000);
httpRequest(null);

// 「送信」ボタンが押されたらリクエストする
elementButtonSend.onclick = postData;

// 発言欄でEnterキーが押されたらリクエストする
elementInputRemark.onkeypress = function() {
if (window.event.keyCode == 13) postData();
}
}

// HTMLフォームの形式にデータを変換する
function encodeHTMLForm(data) {
var params = [];

for (var name in data) {
var value = data[ name ];
var param = encodeURIComponent(name).replace(/%20/g, '+') + '=' + encodeURIComponent(value).replace(/%20/g, '+');
params.push(param);
}
return params.join('&');
}


今回、Ajaxの学習のために以下のページを参考にさせて頂きました。
JavaScriptで非同期通信を実装する
JavaScript プログラミング講座 XMLHttpRequest について
XMLHttpRequestによるPOSTリクエスト

オンラインゲームの開発事始め(2)  

猛暑と言われている今年の夏だけど、個人的には例年と比べて湿度が低めで快適な夏だと感じます。
気温だけ見るとこのあたりも37度とか38度で昼間はクーラーつけてるけど、日が沈むと一気に涼しくなってクーラーなしでもぜんぜん平気なんですよね。
午前0時現在でも部屋の温度計は気温30度を指してるんだけど、カラっとしていてとてもそんなに気温があるようには思えないくらい快適。
2007年や去年の夏のほうが、昼も夜もずっと蒸し暑くてかなり体にこたえる暑さだったように思う。
例年よりも湿度が低めなのは東海地方だけなのかな?
あと、なぜか蚊とセミの数も少ない気がする・・・。

ゲーム開発のほうはまだ勉強段階で、人に見せられる成果物はまだなにもなし。
ゲーム開発の他に、サイト開発のためのフレームワークCakePHPの勉強と、英語の勉強、あとなぜか音楽理論研究にも興味を持ってしまってそれらを平行してやっているので頭の中がごちゃごちゃです(知るか)。

とはいえオンラインゲームのサーバ側の実装方法はだいたいわかってきて、あとはいちど何か作ってみて検証してみる段階にまできています。
問題はクライアント側で、やっぱりゲームと言うからには見た目の華やかさも必要なので、時間もけっこうかかりそうです。
ブラウザゲームを作るための描画や入力処理関連などのめんどくさい部分をささっとやってくれるようなライブラリとかフレームワークはないだろうかと色々探してみたところ、enchant.jsというものを見つけた。
とりあえずこれを使ってみようと思います。

オンラインゲームの開発事始め(1) 

いきなりだけどオンラインゲーム開発の勉強をはじめようと思う。
経緯は端折ります。
オンラインゲームの場合いろいろと制約があって、企画を立てるよりも先に決めておく事があるのでそのあたりから。

サーバ

個人レベルでやることだから、料金の関係で自前でサーバを立てる事は難しい。
そこでレンタルサーバを使うことになる。
レンタルサーバで使える通信は基本的にはHTTP通信だけっぽい。
つまりリアルタイムで人が繋がるMMORPGのようなものは作れなくて、SNSで流行っているようなソーシャルゲームのような感じになるね。
「どうしてもレンタルサーバでは制限がありすぎて作れない」となったら多少の出費は覚悟でVPS(仮想専用サーバ)を借りるかもしれない。
その場合は「サーバ構築」の勉強も必要になってくる。
サーバ構築経験者求むw

また、調べたところではHTML5関連技術の「WebSocket」を使えばリアルタイム通信も可能らしいのだが、まだ産声を上げたばかりの技術ということで仕様が固まっていないらしい。
まあ仮に使えるとしてもMMORPGのようなリアルタイム通信ゲームを作るには、WebSocketの勉強だけでなくて対戦を制御するアルゴリズムの研究も平行して行わなければいけなくて、仕事の合間にやっていると下手したら2年3年と時間がかかってしまいそうなので、とりあえずリアルタイム通信は保留。

通信の負荷と転送量の制限

レンタルサーバを使う場合は通信の負荷と転送量の制限も考えなきゃいけない。
要するに重い画像を何枚も使うようなゲームは難しいってこと。
ただしこれはクライアントがPCのブラウザでの話で、たとえばスマートフォンのアプリとして作れば一回のダウンロードで済むので、それなら転送量にもあまり頭を悩ませずに済むかもしれない。

最初はあくまで勉強を進める中で「通信できて対戦ができること」を第一目標に進める予定なので、第一弾は画像をほとんど使わないゲームにするかな。

そんなわけで、ざっと以下のような感じで行こうと思う。
・サーバはレンタルサーバか場合によってVPS
・プロトコルはHTTP
・サーバ側開発言語はPHP+MySQL ←ある程度経験あり
・クライアント側の開発言語はHTML5+JavaScript(予定) ←未経験なので勉強が必要

これに近い環境で作られているゲームがないか調べてみたところ、「ブラウザ三国志」というゲームが参考になりそうだった。

PHPでの大規模ゲーム開発事例〜『ブラウザ三国志』
http://www.gamebusiness.jp/article.php?id=2968

「DBのロックはしっかり行う」か・・・僕はトランザクション関係の理解度がいまいちだからこれも勉強しないとなぁ。
これだけでも勉強量かなり多い。
オンラインゲーム開発の勉強会があったら参加してみたい。

サーバはもちろん自社で用意しているだろうからその点で色々と敵わないとは思うけど、言語はPHP+HTML+JavaScriptのみで作られていると名言しているから、この形のゲームならレンタルサーバでも作れるわけだね。
ちょっとブラウザ三国志で遊んできます(参考のために)

6/15の独り言 

どうでもいい話だけど、携帯の充電速度が異常に遅くなった。

夜中ずっと充電してても20%くらいしか増えていない。
勝手に通信するような変なアプリでも入れたかなーと、通信監視アプリでチェックしても特に異常なし。

そうすると、本体の端子の故障か、充電ケーブルの故障か・・・。
本体の故障だったらショップに持っていかないとわからないので先に充電のUSBケーブルをチェック。
ちょうど機種変前のXperia用のUSBケーブルがあったのでそれと交換し、充電してみると、普通に充電された。

というわけで犯人はケーブルだった。
ケーブルが壊れた場合、まったく充電できなくなるようなイメージを勝手に持ってたんだけど「充電が遅くなる」という症状もあるんだなー・・・と、一つ勉強になった。

ついでにデジカメも壊れた。



いまは休日でも心が休まらない。
今月の1日、岐阜の高山方面へ一人で登山に行ったんだよ。
「彼女」の死から2ヶ月が経って、耐えがたいほどの苦しさはひとまず去った。
そこで、僕が休日のドライブや登山をようやくすこしでも楽しいと思えるようになったかどうかの実験的な意味での少旅行だった。
・・・出発して10分ですでにわかってはいたんだけど、結果は駄目だった。
高山まで行ったものの、やはりものすごく辛くなって、ほとんど何もせず帰ってきた。
ただ車を往復7時間運転しただけだった。疲れた(;´Д`)
「まだ駄目である」という確証を得たかったために、わかってはいてもあえて行って帰ってきたんだから後悔はしていない。

「彼女はいまどこにいて、何をしているだろうか。自分を責めていないだろうか。寒くないだろうか。お腹減ってないだろうか。そういうことを感じる世界にいるんだろうか。もう存在がなくなって何も感じなくなったんだろうか」
「僕と出会ってしまったから彼女を死なせることになったんじゃないか」
そんな考えがいつまでもぐるぐるぐるぐる頭の中を回ってしまう。

自分で言うのもなんだけど、僕は記憶力はかなり良い。
(他人から見て僕の物覚えが悪いように見えるときがあるとすれば、それは忘れるのではなく、僕が対象に興味をそそられず、最初から記憶していない場合が多い)

ある研究によると、人間が受けるストレスでもっとも強いものは、「大切な人を亡くした時のストレス」だと言う。
僕の記憶力が災いして人よりも長くこのストレスに耐え続けることになるのかもしれない。
いつまでかかるだろう。
10年か、20年か、それとも一生このままか。

旅行でとりあえずわかったことは、一人で出かけるよりは部屋で何かに没頭していた方がまだよっぽど気がまぎれるということだ。
またひさしぶりに絵でも描いてみるかな。