アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

Wallet Management

久しぶりに更新します。
今回もアプリの紹介をします。

アプリ名は「Wallet Management
です。
そしてこのアプリで、初めてのマーケット登録をしました。
なのでこの「Wallet Management」はGoogle Playからインストールできます。
今のところ「Wallet Management 家計簿」で検索すると出てきます。
Google playの このアプリへのリンクです。
Wallet Management

ジャンルは先に書いてしまったのですが「家計簿」です。
ただ、アプリ名が「財布管理」というだけあって、
主婦がつけるようなガッツリな家計簿ではありません。
学生や忙しい社会人の方に向けて作ったつもりです。

このアプリの機能一覧です。
デザイン性の高さ
10秒で登録できる「クイック登録」
登録データの柔軟性

それでは機能を一つずつ紹介していきます。

まず、このアプリ最大の特徴である「デザイン性の高さ」です。
アプリというのはそのデザインが作者の一存できまります。(当然ですが)
そのため、機能は良いがデザインが合わない、という経験をしたことはありませんか?
万人受けするデザインは存在しません。
なので、このアプリでは万人受けするデザインにするのではなく、
万人受けするデザインになれるように作りました。
どういうことかといいますと、このアプリは
背景から文字色、果ては文字フォントまでユーザーの思うが儘にデザインできるのです。
家計簿アプリというのは、ほぼ毎日使います。
毎日使うなら好きなデザインがいい。好きなデザインだから毎日使いたい。
そんなコンセプトでこの機能に注力しました。
画像やフォントは、端末もしくはSDカードに保存されているデータを指定して使用します。
なので使いたい画像やフォントは用意していただく必要があります。
以下のスクリーンショットは、
左がデフォルトのデザイン
中央がスマートフォンで撮った写真を背景に使用し、文字色を変更
右がイラストを背景に使用し、文字フォントをタイトル、テキストともに別々のものに変更して
さらに文字色も変更したものです。

このように自由自在にデザインを変えることができます。
デザインの変更方法は機能説明の後に記載します。



次に、10秒で登録できる「クイック登録」です。
これは最初に述べたように、学生や忙しい社会人の方をターゲットにしているため、
登録で無駄に時間を使わないよう考慮した結果です。
起動してすぐの画面が先ほどのスクリーンショットになります。
二つの入力欄と二つのボタンがありますね。
これが「クイック登録」です。
上の入力欄では「現金の出費」を 下の入力欄では「預金からの引出」を登録できます。
この二つを選んだ理由はターゲットにしている方たちは
コンビニなどでちょっとした現金の出費が多いだろう
学生ならば仕送りやバイトの給料などの引出が多い多いだろう
そう考えたからです。

最後に登録データの柔軟性です。
家計簿アプリはかなり多く作られています。
使った金額を登録するだけのシンプルなものから
用途ごとにジャンルで分けて登録し、月ごとの金額を計算したりといった高機能なものまであります。
ただ、ほとんどのアプリでは
シンプルなもので詳しく分類や、高機能なものでシンプルに使う
といったことができないのです。それはそういう用途で作っていなければ仕方のないことです。
この「Wallet Management」は、
ターゲットは学生や忙しい社会人としてシンプルな機能を今まで上げてきましたが
ある程度まで細かく分類することができるようになっています。
すなわち、デザイン性のように使う人にとってどこまで詳しく登録するかを選べるようにしています。
柔軟性を持たせることで多く方に使っていただきたいというのがこのアプリのコンセプトです。
さて、細かく登録する場合はトップ画面の左下にある「詳細登録」ボタンをタップします。
すると以下の画面に移ります。

この画面では
日付
収入or支出
現金or預金
カテゴリ
を選択して登録します。
日付は文字をタップすることで変更できます。この画像なら「2013/4/9」をタップです。
ほかの3つはスピナーをタップして変更します。
カテゴリには「通常、引出、預入」があります。
通常は現金もしくは預金のみの出入りです。
コンビニで現金で支払いをした、 家賃を振り込んだなど
それ単体での出入りを指します。

登録の流れとしては
1、日付を決める
2、登録するデータが収入なのか支出なのかを選択する
3、それが現金によるものなのか預金によるものなのかを選択する
4、それが単体の収支なのかどうかを選択する
5、金額を入力する
6、コメントを入力する
7、ボタンをタップする
ここでの登録ではコメント以外すべて入力する必要があります。
ジャンルごとに分けるのであればコメントを入力して
特に分けない場合は空欄、ということもできます。

日付変更は以下のカレンダー画面で行います。
変更したい日にちを選んでタップするだけです。
すでにデータが登録されている日にちは青色に変わります。


大まかな機能は以上です。

ここからは使い方やデザインの変更方法を記載します

まず、トップ画面から右下のボタン「各種内訳」をタップします。
すると以下の画面になります。


この画面では選択された日付のデータを一覧で表示します。
絞り込みに先ほどの「収入or支出」「現金or預金」「カテゴリ」を選択することで
表示する内容を絞れます。
日付の変更は左右の矢印ボタンでも、先ほどのようにカレンダーからの選択でもできます。

検索ボタンで検索画面を表示できます。
ブログの性能上スクリーンショットを載せれませんが、
先ほどから3つの選択項目、コメント、金額を指定して検索できます。
すべてを入力する必要はなく、たとえば
支出すべてを表示」「預金での出入りを表示」「コメントに食費を含むものを表示
1万円以上のものを表示」「1000円以上5000円以下のものを表示」など
柔軟に検索することができます。
検索結果は各種内訳と同じように表示されます。

各種内訳、検索結果画面で出てきたデータをタップすることで
データ修正や削除を行えます。

ここで変更が可能なのは
日付」「金額」「コメント」です。
修正ができたら「修正」ボタンで登録できます。
収入と支出を間違えた場合などは「削除」ボタンで消せます。

最後にデザインの変更方法です

デザインを変更するには設定画面を開きます。
設定画面の開き方は端末のボタンからメニューを表示させて設定をタップします。
設定画面の一番上には「リセット」ボタンがあります。
このボタンですべてのデザインを初期化できます。
デザインの変更は各項目をタップすることでできます。
ここで注意していただきたいのは
フォント変更に関しては、アストロファイルマネージャーのようなファイル管理アプリが必要です
インストールされていなければ変更できないのでご注意ください。
また、使用したいフォントはPCなどから端末やSDカードへ保存してください。
対応しているフォントは「.ttf」「.otf」です。
ブラウザで「フリーフォント」で検索すればたくさんヒットするので
気に入ったものを設定してください。

以上でこのアプリの説明を終わります。
初リリースということもあり、なかなかうまくできているか不安ですが
多くの方に使っていただけると嬉しいです。
意見、要望、感想などがあればどしどしコメント欄に書き込んでやってください。
たとえばAndroid2.3も使えるようにしてほしいなど笑
(Android4.0で作ったはずなので2.3では使えないと思いますが使えたらすいません笑)
最後まで読んでいただきありがとうございました。
【このカテゴリーの最新記事】

Free_AR 動画

Free_ARの動画をとってみました
画像よりも特徴がわかりやすいんじゃないでしょうか?


AndroidでマーカーレスのARアプリを作ってみた Free_AR(仮)

UDP hole punchingについて

そろそろ、やるやると言って後回しにしてきた事を書いていこうかと思いますよ〜

まずは、UDP hole punchingについてです
UDP hole punchingとは読んで字のごとく
UDPで穴をパンチしますww
わかりませんね笑

順をおって話をしましょう
ただ、自分も勉強中の身であるので解釈に間違いがあるかもしれません
多くの方がルータを使用してネットに接続しているのではないでしょうか?



雑な図ですがルータを使用している場合の図になります
そうすると図のようにPC1台ごとにプライベートIPアドレスが割り振られるのがわかります
(図だと逆にわかりにくいかもw)
グローバルIPアドレスはルータを指します

するとここで問題が起きます
それは、何回か前の記事に書いたソケット通信での問題です
ソケット通信では通信相手の「IPアドレス」を指定して通信を行います
ですがこの場合グローバルIPアドレスを指定しても
ルータまでは届きますが、ルータに属するどのPCに対するものなのかわからないので
パケットが破棄されてしまいます
かといってプライベートIPアドレスではインターネットを通じて通信を行うことはできません

しかしこれはルータに属するPCがサーバーの役割をする場合の問題です
なので、サーバーがグローバルIPで直接アクセスできるのならば問題ありません
TCPは常に接続した状態を維持します
図のPC1が外部サーバーに接続した場合
ルータはTCPのルートを保持するのでサーバーからデータを受け取ったときに
そのパケットが保持したルートである場合はしっかりとPC1にデータを届けてくれます

UDPでもTCPとあまり変わりません
UDPは送信して終わりの通信方式です
なのでルータはUDPを送信したポート番号を保持しておきます
そして、サーバーから送られてきたUDPの宛先ポートが保持したものと同じであれば
PC1にデータを送ります

では、P2Pのようにクライアント同士で通信する場合に
2つのクライアントがともに異なるルータに属する場合はどうでしょう
このような場合の接続問題を解決する方法の1つが
UDP hole punching であるのです

UDP hole punchingの原理はとても簡単です
それは先ほど説明したUDPにおけるルータの振る舞いを考えてください
ルータは自分が送信を行ったポートにパケットが届けば
返信が来たとしてPCまでデータを送ってくれます
すなわち、
自分が送信した相手と返信を行った相手が異なっていてもわからないのです

まずは図を見てください



この図で
Aはルータに属します
Bはグローバルなサーバーです
Cもルータに属します
前提条件として最低でもBとCはTCPで接続済みとします

まず、AはサーバーBにUDPを送信します
その後AのルータはBからの受信を受け付けます
そこでBは返信をするのではなくCにAのIPとポートを教えます
CはBから得たIPとポートでUDPを送信します
Cから送られたパケットをAのルータは先ほど送信したパケットに対する返信だと処理します
すると通常はできないCからAにUDPを送信することが可能になるのです

これはつまり
Aが返信受け付けるためにルータという壁に穴をあけておいて
Cがその穴にパケットを突っ込む
という感じですね笑
そうすると UDP hole punching の名前も納得がいきますよね

さてさて、ここまではPCを扱ってきましたが
実はAndroidでも全く同じです
調べたわけではないので確証はないのですが
Androidの3G回線やLTE回線での通信は
各キャリアの基地局というルータに属しての通信なのではないかと思うのです
なので、通常の方法ではAndroid同士の通信がうまくいかないのではないかと
しかし、Androidが基地局というルータに属していると仮定すれば
Android同士で通信を行う方法が見えてきますよね?
そう、UDP hole punching を使えば
Android同士でのP2P通信が可能になります
ただ、そのためにはグローバルなサーバーが必要になりますが
このグローバルというのは、グローバルIPアドレスでアクセスできるサーバーです
つまりルータのポート変換やらなんやらで自分のPCをサーバー化してもOKなんです
そこら辺の設定の仕方は調べてもらった方が早いと思いますww

手順としては
1、Android_A がサーバーにUDPを送信する
2、サーバーはAndroid_AのIPとポートをAndroid_BにTCPで送信する
3、Android_Bは受け取ったIPとポートあてにUDPを送信する
4、Android_Aは受信したパケットからIPとポートを取り出して使用する
5、Android_Bはサーバーから受け取ったIPとポートを使用する
6、Android_A B ともに相手のIPとポートを取得したのでP2Pを行える状態になる

となります
パケットからIPとポートを取り出す方法はJava APIなどを参照してもらえればすぐだと思います
Andoid同士の通信がどれほど需要があるのかわかりませんが
参考になるといいです(あくまで参考にして、しっかり調べて使ってください笑)

最後にSkySwiftでの通信モデルを載せておきます
ただ、企画段階での構想なので若干ことなりますw




まったく関係ないですが明日、というか今日(3月9日)は
オープンソースカンファレンス2013 Tokushima
が開かれます
最先端の技術にふれて、勉強のモチベーションを上げたいと思います

Free_AR

少しずつブログを書き進めていこうかと思います^^

今回は、前回紹介したアプリがだいぶ形になってきたので
途中経過として載せたいと思います。

まず、このARアプリで使用しているモデルについて書いておきます
この初音ミクのモデルは
アノマロかりんとうさんが作成して、公開されていたのを使っております
キャラクターの版権はクリプトンと絵の作者KEI氏にあります
版権等を侵害しない範囲内で利用させていただいてます

さて、前回はmqoファイルの内容がいまいち理解できておらず、
モデルの材質を読み込めていませんでしたが、
1週間かけて理解してきました!笑



現状の問題点としては、モデルの質感がごつごつしてるところでしょうか
パッと見でわかると思いますが、なんか角ばって見えますよね?
アノマロかりんとうさんが作成されたモデルは滑らかで
とても素晴らしい作品なのですが、
どうやらプログラム側の処理で問題があるようです
後は光のかげんでしょうか
ちょっとモデルが暗すぎる気がします
ただ、ARとしては結構な完成度なんじゃないかな〜と笑

ARアプリ

ブログの更新をさぼりつづけてますww

散々「〜について書いていこうと思います」
って言っておいて全く更新していませんでしたね(^_^;)
そして今回も書く気がありません!←

今回はふと思いついて勢いで作ったARアプリの紹介をしようと思います

その名もFree_AR(仮)
タイトルは適当ですが
名前の通りフリーなARです

何がフリーなのかと言うと
ARで使うモデルの出現位置がフリーなのです
一般的なARではARマーカーという紙(だと思う)を置いて
それを頼りに3Dモデルなんかを表示するんだと思います
(全然調べてないんで憶測です笑)

しかし、このアプリはARマーカーを使いません
スマートフォン特有の豊富なセンサーを利用することで可能なのです

手順としては
1、身長を入力
2、モデルを表示させたい地面を選択
3、端末を動かして遊ぶ
だけです

まず1について
身長を入力してもらうことで、端末の高さを得ます

2で
地面を選択する、というのは
ようはモデルの足元を選択することです
そうすると、この時の
端末が水平方向から何度傾いているか(ピッチ p)を得ることで
身長Xtan(p) で立っている場所から選択した地面までの水平距離を求めれます

求めた水平距離を
OpenGLでの奥行に適応してあげれば
視点、モデル間の距離を設定できます
また、端末がどの方位を向いているかを取得して、
モデル表示時からの変化量を得れば水平方向の視点の回転が可能です
この変化量をヘディング h と言います(たぶん笑)

モデルを固定して視点を p や h を使ってぐりぐり動かせば
マーカーがなくてもモデルを現実的な位置に固定できます
こんな感じ↓
あ、部屋が汚いのは気にしないでくださいw








3D、モデルはネットからお借りしてきた
初音ミクですw
いまいちmqoファイルの内容がわかってなかったり
OpenGLの設定がちんぷんかんぷんで
モデルの質感や色は読み込んでないですw
センサー関連も反応の面から改善の余地がありまくりですねw
ただ、この方法だと等身大のモデルになるのは非常に大きな魅力かと思います
今回はAndroidの勉強の一環で作ったのですが
なかなか面白い試みだったので改良を続けていこうと思います

後々ソースの説明もできたらな〜と思います
と、毎回書く決まり文句を笑

SkySwift

ものすごくお久しぶりです。

以前ブログに書いたように授業でゲーム制作をしていました。
4人グループでの制作なんですが、僕らの班は、
僕がプログラムを担当して、
他の3人がイラストや音楽作成、という感じでした。

そのゲーム作成が忙しくて全然ブログを更新できませんでした(^_^;)
しかし集中して開発を行って何とか優勝することができました。

今回はそのゲームの宣伝です←

ただ、めっちゃバグが多いと思うのでできればクレームはなしの方向で笑

今後はこのゲームのバグ調整と、期間の間ではやりきれなかったことを
実装していこうかと思っています。
ブログの方には少しずつプログラムを載せてみたりしようかなとw

以下はゲームの概要です。


ゲーム名    :SkySwift
プラットフォーム:Android
ジャンル     :アクション
プレイ人数   :2人
ホームページ:


ゲーム名は空が舞台なのと、速さ(Swift)をウリにしているのでこう決まりました。
プラットフォームとして以前から話を出していたAndroidを使用しました。
HPにはPC版の説明がありますが、PC版は授業のコンテストで使用していただけなので、
公開はしていないです。
上にも書きましたが、かなり急ぎ足で作成したのでいまだにバグが残っています。
なので、HPに書いてある注意事項をお読みの上プレイをお願いします。
最悪アンインストールして忘れてやってください笑

このSkySwiftでは通信方式としてTCP、UDPの両方を採用しています。
TCPは絶対に届かないといけないマッチング時に、
UDPはとにかく速度が重要なゲーム時に使用しています。

UDPの接続の仕方として以前記事にしたUDP hole punching をAndroidでも使用しています。
なのでSkySwiftを遊ぶときはAndroidは3G(LTE)回線でもWi-fiでは大丈夫です。
(ルータによっては不具合が起こる場合があるようなのでその時は3Gでお願いします。)

最後に、所詮学生が作ったゲームなのであまり期待はせずにお楽しみください笑

LWJGLでのFPSテスト

前々回2D描画はJava2Dを使うよりもOpenGLを使った方が速いと書いたので
今回はLWJGLを使ったFPSテストプログラムを作ってみました。

このプログラムには
背景として
background.png
幅1024ピクセル 高さ720ピクセルと

キャラクターとして
char1.png
正方形の画像

を使用するので適当な画像を用意して使用くださいw

ソースはここに載せると汚くなるのでリンクを張りますw
FPSTestソース
リンク先のFPSTest.zipからソースをダウンロードできます。
ダウンロードしたら前回のように作成したプロジェクトにコピーして、
画像を用意したら実行してみてください。

FPSTest.java
の最初の方にあるcharNumを変えて実行してみるとOpenGLの凄さがわかると思いますw

Texture.java と TextureLoader.javaは桃缶食べたい。様のHPでも紹介されているように
公開されているものを使用しました。

ソースについては次回解説をするかもしれません笑

LWJGLの準備

だいぶ久しぶりになります(^_^;)

前回の続きでLWJGLの導入から始めたいと思います。
まずはLWJGLをダウンロードしましょう。
LWJGLダウンロード
このページのLWJGL 2.8.4(バージョン番号)
のリンクへ飛びます。
その先でlwjgl-2.8.4.zipをダウンロードしましょう。

ダウンロードしたzipは任意の場所で展開します。
お勧めは場所がわかりやすいのでworkspaceと同じディレクトリです。
展開が終わったらeclipseでの操作になります。

まずは、LWJGLを使いたいプロジェクトで右クリック、プロパティを選択しましょう。
左のリストからJavaのビルド・パスを選択し、ライブラリータブを開きます。
そして、右のボタンの外部Jar追加をクリックします。


そうするとファイルの選択になるので先ほど展開したlwjglから
lwjgl-2.8.4/jar/lwjgl.jar
を選びます。

先ほどのライブラリーにlwjgl.jarが追加されていると思います。
そこから
ネイティブ・ライブラリーのロケーションをダブルクリックします。



出てきた
ネイティブ・ライブラリー・フォルダーの構成の外部フォルダーボタンをクリックして、
lwjgl-2.8.4/native/windows
を選択します。
OSによってはlinuxやmacosxなどを選びましょう。

選べたらOKを押してプロパティーを閉じましょう。
これでLWJGLを使う準備ができました。
ただし、LWJGLが使えるのはこのプロジェクトだけです。
他のプロジェクトで使う場合は同じように設定しましょう。

余談ですがゲームパッドを使う場合は
lwjgl-2.8.4/jar/jinput.jar
も同じように設定しましょう。

これでJavaでOpenGLを使うことができます。
次回は簡単なサンプルでも載せてみようと思います。

Javaで2Dアクションゲーム

皆さんこんばんは^^
予告通りJavaで2Dアクションゲームを作る際の描画処理について書いていきたいと思います。

Javaでゲームを作るというのは今の時代だいぶましになってきたみたいですね。
いろんな方のHPを拝見させてもらいましたが、昔はとても苦労されていたみたいです。

さて、一言でゲームと言ってもとても多くの種類があります。
シミュレーションRPGのように再描画の回数が比較的多くないものから
アクションゲームのようにFPS60は欲しいゲームまで。
ほとんどのゲームはJava2Dと言われるJavaに標準搭載されてる描画処理で事足ります。
そして、Java2Dでのゲームについては多くのサンプルがあり、
とてもわかりやすいJavaでゲーム作りますが何か?様のHPがかなりお勧めです。

ただ、自分もそうだったのですがエフェクトが多くて、キャラクターが高速移動する
アクションゲームではどうしても処理が重たくなってしまいます。
自分は
CPU i7-2600
メモリ 12GB
GPU CPU内臓
という環境でエフェクトなどない状態でもFPSが80しかでなくて、
さらに学校のPCでは目を疑うFPSが6という状態でした(^_^;)

これほど遅い原因はやはりJavaが仮想マシンで動作しているからでしょう。
C言語などではハードの力を使えるので、画像の加工も速いです。
でもJavaではハードの力を存分に使用することはできません。

また、いろいろ調べてみると
JavaではGraphicsによって画像を合成することで背景とキャラクターを描画しますが、
このGraphicsでの処理がなかなか重たいらしい。

それってどうしようもないじゃないか、と思っていたところ
興味深い記事を見かけました。
それはスプライトという技法です。(技法って言っていいのかな?)
知ってる人からすれば「何をそんな常識を今更・・・」って思われるかもしれません。
でもゲームを作り始めたばかりではそんなことも知らないのです。
ゲームでキャラクターの位置を変える場合
Java2Dでは背景で塗りつぶして移動させた位置にキャラクターを描画するものでした。
これでは何も変わっていないところが無駄でしかありません。
これに対して、スプライトの考えでは
画像を合成するのではなく、背景とキャラクターを別々のパーツとして、
背景の上にキャラクターを乗せることで描画します。
位置の移動もキャラクターを移動させるだけで背景で塗り直しはしないで済みます。

さて、ようやく本題ですが、Java2Dではスプライト的描画はありません。
(もしかしたら可能なのかもしれませんが、調べても見つかりませんでした。)
では、どうやってスプライトをするのか?
それは簡単です。OpenGLを用いてポリゴンによるスプライトをするのです。

OpenGLとポリゴンと聞くとJava2Dよりも重たくなりそうな気がしますよね?
でもこれが違います。何故ならOpenGLを使うということは、
Java2Dではできなかったハードの力を使うことができるのです!
また、ポリゴンも直方体ではなく、平べったい板状のものを使用すれば重たくもないです。
つまり、なんちゃって2Dです笑
3D空間を使用するけど描画は完全に2Dってことです。

JavaでOpenGLを使うことで高速に処理ができるとは言いましたが
どうやってOpenGLを使うのかが次の問題になりますね。
JavaでのOpenGLではJOGLとLWJGLという2つが有名みたいです。
自分はLWJGLを使用することにしました。
それは、桃缶食べたい。様のブログがとてもわかりやすかったのが大きいです^^
ただ、やはり3D中心の内容なので、単純に2Dの高速描画を求めるにはちと処理が複雑で
難しかったです。それでも解説は詳しく説明されてるので一度は読んでみることをお勧めします。

そういうわけなのでこれからLWJGLを用いた2D描画についての記事を書いていきたいと思います。
自分もOpenGLについては完全に素人なので備忘録な感じで行くかもしれませんw

ちなみに、Java2DでFPS80だったゲームはLWJGLでまったく同じ処理を書いたところ
FPSが400出てましたww 5倍ですw
これでOpenGLの方が速いこともわかりましたw

次回は導入方法でも書こうと思います。

ネットワーク対戦型ゲームその4-2

次にクライアント側の
ClientThreadです



import java.net.*;
import java.io.*;

//サーバと通信するクラス
public class ClientThread extends Thread{

//サーバのIPアドレスまたは同一LAN内ならばホスト名
private final static String IP = "localhost";

//サーバのポート番号
private final static int PORT = 50000;

//MainPanelのオブジェクト
public MainPanel panel;

//サーバのIPとポート番号を指定するオブジェクト
InetSocketAddress address;

//マルチキャスト受信用アドレス
private final static String castIP = "224.1.1.1";

//マルチキャスト用ソケット
private static MulticastSocket socket;
private static InetAddress inetAddress;

public ClientThread(MainPanel panel){
this.panel = panel;

try{
//受信用にマルチキャストのポート番号を引数としてソケットを作成する
socket = new MulticastSocket(PORT);

//マルチキャストのアドレスからInetAddressオブジェクトを生成する
//これはInetSocketAddressと違い、アドレス情報のみしか表わさない

inetAddress = InetAddress.getByName(castIP);

//先ほど作成したソケットをマルチキャストのグループに追加する
//これによりマルチキャストを受信できるようになる

socket.joinGroup(inetAddress);

//サーバと1対1で通信するために
//サーバのIPとポートからInetSocketAddressオブジェクトを生成する
//サーバはマルチキャストと同じポート番号で
//普通の受信も行っているので上記のソケットと同じ値を引数にしていする
//もちろんプログラムを変更して、マルチキャストと別のポートをしようすることも可能であるが
//ポート番号は有限なので無駄遣いは避けたい

address = new InetSocketAddress(IP, PORT);

}catch (IOException e){
e.printStackTrace();
}
}

//スレッド処理
public void run(){

int size;
String str;
byte[] buf = new byte[1024];

try {

//受信ループ
while (true) {

//データの受信
//受信用のパケットを作成

DatagramPacket recvPacket = new DatagramPacket(buf, 1024);

//受信待ち、ここで停止
socket.receive(recvPacket);

//受信したバイトデータを文字列に変換
str = new String(recvPacket.getData(), 0, recvPacket.getLength());

//Integer.parseInt(文字列)で文字列をint型へ変換
int clientNumber = Integer.parseInt(str.substring(0, str.indexOf(':')));

//クライアントと接続できた時に もっとも大きなクライアントナンバー+1が今接続している数なので
//MainPanelのclientNumへ反映する

if(panel.clientNum < clientNumber+1){
panel.clientNum = clientNumber+1;
}

//サーバから送られてきた各クライアントの座標をMainPanelのx, y配列にセットする
panel.x[clientNumber] = Integer.parseInt(str.substring(str.indexOf(':')+1, str.indexOf(',')));
panel.y[clientNumber] = Integer.parseInt(str.substring(str.indexOf(',')+1, str.indexOf('E')));

//そして再描画する
panel.paintScreen();

}

} catch (Exception e) {
e.printStackTrace();
disconnect();
}
}

//送信
//詳しくはサーバを参照

public void send(String message){
byte[] b = message.getBytes();

try {
if(socket != null){
DatagramPacket sendPacket = new DatagramPacket(b, 0, b.length, address);
socket.send(sendPacket);
}

} catch (IOException e) {
e.printStackTrace();
}
}

//切断
public void disconnect() {
try {
socket.close();
socket=null;
} catch (Exception e) {
e.printStackTrace();
}
}
}


こうしてソースを見てみるとサーバのマルチスレッドがない分短いですね笑
この程度の動作ではTCPとUDPの速度差は感じることはないと思いますが、
ゲームを作るとなるとかなり違ってくるんじゃないでしょうか?

ちなみに現在制作中のゲームはUDPでの通信に変更しました(^^;)
やはりマルチキャストの存在は大きいですねw

ひとまずこれで通信関係は終わりにしようと思います。
気が向けばAndroidのUDP通信にも触れようかな〜ぐらいですw
次回からは個人的に苦労した
Javaでネットワーク対戦型2Dアクションゲーム
の、描画関係について書いていきたいと思います。
やっぱりJavaでゲームってのは探してもなかなか見つからないですし、
あってもアクションゲーム向きなのはほとんどないのが現状な気が・・・
(もし解説されてる方がおられましたらすいません!)
    >>次へ
×

この広告は30日以上新しい記事の更新がないブログに表示されております。