ヘキサ日記 Blog

 

        

次男(二歳)への意識調査の結果

納豆>(越えられない壁)>母

ということが判明しました。

納豆よりプライオリティが低い大阪デザイナー阿部です。

 

 

 

 

 

 

そういう意味で言ったんじゃない! とか

そんなつもりじゃなかった・・・ とか

そういう場面あるじゃないですか。

 

こういう状況になってしまった原因は

情報を発信した側受け取った側 どちらにあると思いますか?

 

から揚げを作りたいから鶏肉にひたひたになるぐらい醤油を入れておいてくれと母に言われた妹が

鶏肉を入れたボウルいっぱいに醤油をぶちまけた(1㍑)場合・・・・

 

お鍋を火にかけてるから見といてくれと母に言われた妹が

ゴボラゴボラと沸騰し続けるお湯を延々見つめていた場合・・・

 

 

等々・・・・いろんな状況がありますが

こういう意志疎通の間違いや摩擦の原因は概ね情報を発信した側にあります。

 

上は極端な例かつ物理的な話なのでちょっと違う感じになるのですが

あなたが感じてる「思い」があなたの内にある間はあなただけのものですが

 

あなたがその「思い」を発した時点で、外に出した時点でその発した「思い」は

 

あなたのものではなく受け取った側のものになります。

 

 

イジメやハラスメントはされた側がそう判断したら、

した側が何と言おうとそれがイジメやハラスメントになるのと同じです。

 

 

以前のブログに書いた「のに」の話とか通じるのですが

 

あなたが発した思いを他人がどう受け取るかは

あなたが操作できる領域ではありません。

 

あなたが好意で発した言葉を不愉快だと受け取られたら、

それはもうその人にとって不愉快なことでしかないのです。

 

 

だから

何で分かってくれないんだ!って受け取った側にイライラするのはお門違いだし無駄です。

意図通りに伝わっていないと分かった時にあなたができることは

 

うまく伝えるにはどうしたらいいか考えてそれを実行する

まぁいいかプー

 

と諦めるだけです。

 

他人に意図を正しく伝えたり、動いてもらうのは本当に難しいし困難です。

意思疎通がうまくできなくてもう無理だ・・・と失意のまま諦めてしまうことも多いかと思います。

 

でも考えてみてください・・・・

 

 

4年前に思い出の教会で告白されて、

パリに留学するけど付いて来てくれるんだろ? って言われたから、

パスポートを用意するとこまでは出来たけど

 

 

彼が一向にDSの中から出てきてくれない

 

 

そもそもパスポートを用意した旨を伝えるすべがない

 

 

 

という問題を解決するより

 

 

現実の人間に意図を正しく伝える方がよっっっっぽど難易度は低くないですか?

 

それと比べたらなんかもう

何でも出来るような気がしませんか?

 

 

うまくいかないこと多いけど

we can do it ですよ。

あきらめなければ試合は続くんですよ。

 

oh…YES…


        

こんにちは

寒さもさらに厳しくなり、朝に布団から出る勇気を振り絞っている よっしーです。

 

早速ですが今回は、【PDCAサイクル】について紹介します。

PDCAサイクルは、品質管理等をうまくまわすために提唱された手法となります。
ただ、このPDCAサイクルは、プロジェクト運営やシステム運用などいろいろなものに
応用ができる非常に優れた手法になります

 

そもそもPDCAとは?

 

ということになりますが、以下のようなものになります。

 

P : Plan(計画を立てる)

 

D : Do(実行する)

 

C : Check(評価する)

 

A : Action(改善する)

 

サイクルというようにこれらを繰り返し行うことで現在の状況を

常に把握しながら改善を行い、発生しうる障害やリスクの回避を

行っていくことになります。

 

もちろんインフラでもたくさんのリスクがあります。

 

■想定されるリスク例

ストレージの故障やオペレーションミスによるデータ喪失のリスク

稼動システムの障害による業務継続不能のリスク

その他も多々あります。。。

 

例えば「」の場合は、

 

【Plan】

システムで障害が発生した際の状況を想定してシステム構築計画を立てます。

ここがとても重要です。

どのようにするかの計画がしっかりとできていないとその後の「Check」で

大量の修正を行うことになり、結局負担が大きくなります。

 

■計画内容例

・システム上でサーバ等をどのように構成するのか。

・このシステムはどの程度停止するとリスクとなってしまうのか。

 そもそも止まってしまってはいけないのか。

・バックアップの取得はどのデータを取得すればよいのか。

 また、どの時点のデータがあれば業務に支障がないのか。

・取得したバックアップからのリカバリはどのようにするのか。

・ハードディスクなどの障害に備えて、RAIDはどのように組むのか。

 それともサーバ自体を冗長構成にして、1台が壊れても業務を継続できるようにするのか。

 

まずはこのような内容を検討し、稼動システムの構築計画を立てます。

 

【Do】

「Plan」で検討し、決定した内容を正しく理解し、実際にシステムの構築を行います。

 

【Check】

実際に構築したシステムが正常に稼動できているか確認します。
このチェックをしっかりやって、正しくシステムが動作していることを確認しないと
結局、大きなリスクを背負うことになります。

 

■チェック内容例

・バックアップするデータに誤りはないか。

 障害発生時にシステムを戻すためのバックアップが正しく取れていなければ、

 リカバリそのものの意味がなくなります。

・システムの冗長構成は正しく動作しているか。

 お互いの死活監視が行えており、システムダウン時に別のサーバで

 業務を引き継ぐことができる状態かを確認します。

 

【Action】

「Check」で確認した内容で不具合があった場合は、その修正を行い、正しくシステムが

動作できるようにする必要があります。

この改善の繰り返しでリスクを低減し、プロジェクトやシステム運用を成功に導きます。

 

■改善例

・取得すべきシステムのバックアップデータで一部データの指定が抜けていた場合。

 障害時に正しくシステムが戻らない状態になので早急にバックアップ対象に設定して、

 正常にバックアップが取得されていることを確認する必要があります。

 

上述のように何事もやったらやりっぱなしでなく、過去と現在を正しく把握して、

定期的に見直すことでリスクの低減が可能です

 

また、作業工数の削減や無駄の排除によってさらにクオリティ高い業務を行っていくことも可能です

 

ヘキサドライブでもPDCAサイクルをまわし、同じ失敗を2度繰り返さないように失敗から学び、

さらに良い環境作りを行っていければと思います。

 

では


2015年1月28日

今夜も眠れない!

        

いつもお世話になっております。
かつてはイケメン、今はイクメン、好物はツケメン、
ヘキサドライブのタカシマヤでございます。

 

私事で恐縮ですが、生後7ヶ月になります我が長男がですね、
1歳児なみの体重10kgに達するなど驚異的な発育を遂げており、
抱っこしていると腰が折れそうになる今日此頃なんですけども、
皆様いかがお過ごしでしょうか?

 

基本的には仕事している私が育児に関われるのは、
夜中のオムツ替えぐらいなもんなんですが、これが結構大変。
真夜中1時とか午前3時とか午前5時にオムツを替える為に起きますとですね、
その後眠れなくなるんですよね。明日も仕事なんだけどなあ…。

 

で、目が冴えているので、ついついゲームを始めてしまうんですな。
朝5時とかにですよ。30代のオッサンが朝5時からゲームですよ。世も末ですよ。

 

お陰様でこれまでプレイ出来てなかったゲームがいろいろ遊べちゃってます。
今回は、そんなイクメン・タカシマヤが朝方に見つけたイチオシゲームを、
ご紹介したいなと思いますよ!

 

基本的に洋ゲー(海外のゲーム)ばっかりですけどね。

 

——————————————————————————-

DRAGON AGE INQUISITION(ドラゴンエイジ:インクイジション)

 

59552

 

言わずと知れたEAさんのドラゴンエイジシリーズの最新作です。
ジャンルでいうとアクションRPGなんですが、リアルタイムでバシバシ殴り合うだけじゃなく、
時間を停止させて戦略を練り、一緒に旅をしている仲間の行動を指示しながら戦うという、
結構頭を使う中級者向けのゲームで、MMORPGのパーティープレイを1人でやってる様な感覚です。

 

2624065-dragonageinquisition_gamescom_wm_11 1408018300-2

 

シリーズを通して脈々と受け継がれる重厚かつ王道ストーリーも魅力です。
世界の危機を救う為に、特別な力を得た主人公と個性的な仲間達が奔走する胸熱展開!
プレイするなら過去作もチェックしておく事をオススメします。

 

個人的にはアドバイザーのレリアナという仲間のキャラが熱いですね。
ただし彼女は本作ではラブロマンスな展開は設定されていないのが残念…。
ぜひダウンロードコンテンツで対応してほしい!

 

dragon_age_inquisition_leliana_5

 

 

 

 

 

Transistor(トランジスター)

Transistor_art

 

Transistorという名のおしゃべりな剣を手に入れた主人公Red(女性)が、
未来都市でロボット達と戦うSFな世界観のアクションRPGです。

 

001

 

Bastionというゲームで高い評価を得たSupergiant Gamesが開発した本作は、
独特の世界観と、このアーティスティックなグラフィックが魅力ですねえ。

 

こちらもアクションRPGで、バシバシとアクションをキメていけるのですが、
Turn()というモードを使って時間を止め、次に行動する移動や攻撃などを、
あらかじめ予約しておき、敵の背後に周りこんで連続技をきめたり、
効率よく敵をまとめて倒したり、ステージギミックを解除したりと、
ストラテジーゲームに近いような遊び方が楽しめます。

 

002 004

 

英語が苦手な人には少し敷居が高いかもしれませんが、
ひと味違った世界観とゲームを楽しみたい方にオススメです!

 

 

その他にも、あまり知られてないけど、やってみるとなかなか奥が深い、
よく作りこまれているなというゲームが結構ありますよ!

 

Don’t Starve(ドント スターブ)
無人島でレッツサバイバル!
夜になる前に食い物を集めろ!!

 

ds_darkness_1920x1200 Dont-Starve-6

 

 

WARFRAME(ウォーフレイム)
基本無料で遊べるオンラインサードパーソン・シューティングです。
射撃系武器だけでなく、刀などの近接武器、クラス毎の特殊なスキルを駆使したアクションは、
とても無料とは思えない出来栄え!ついつい課金アイテムも欲しくなる作りになってますね。

 

warframe Warframe-First-Look-Trailer_3

 

—————————————————–

 

いやはや、こんなに面白いゲームがたくさんあると、
今日はどれをプレイしようかなと迷ってしまいますよね。
当分の間、眠れない夜が続きそうです!

 

ぜひ皆さんも遊んでみてください!


2015年1月27日

脳内ホニャララ

        

こんにちは
マイキーです

 

連日冷え込む日が続いておりますが、体調等崩されていないでしょうか?
かくいう私は持病の腰痛が炸裂してしまいまして、1日身動きが取れずにおりました。
寒さによる冷え込みか……

はたまた運動不足の賜物か……

原因は色々と考えられますが、何とかして取り除きたい、この痛み……。
整骨院デビューは近そうです。

-*-*-*-*-

さて、私がバイク乗りなのは以前ブログにも書いたのですけれども。

 

周りからは「夏は暑い、冬は寒い、何が楽しいの?」と聞かれる事も多いのですが、

夏は暑いし、

冬は寒いし、

危ないし、

立ちゴケしたらとても悲しい気持ちになるけれど、

それを踏まえて考えた結果、楽しい

という結論に至った訳で。苛烈な環境にコーフンするとか、そういう趣味があるとかそういう事じゃないですよ?
実際の所、何をもって楽しいとするか?については人によって感じ方はそれぞれな訳で。一まとめに説明するのは難しいのです
唯一、より多くの人が共感し得る「楽しい」と感じるポイントは、「恐怖(スリル)ではないかなと思います

 

バンジージャンプやジェットコースター等と同じく、バイクもスピードを感じる事の出来るモノ
これらは非常にスリリングで気分を高揚させてくれますが、それは速度から来る「恐怖」というストレスから脳を保護する為に分泌される、脳内麻薬と呼ばれるホルモンに起因してまいす。
代表的なものが「βエンドルフィン」で、モルヒネと同等の作用があるとのこと。ほへー
また、βエンドルフィンは自身の成長達成感を感じた際にも分泌されます。ご褒美的な意味合いもある訳ですね。
その他にもドーパミンとかノルアドレナリンとか、調べてみると面白いです。何で恐怖とかストレスを感じると、気分が高揚するホルモンが分泌されるのと気になった方は、是非ぜひ調べてみて下さい

 

楽しい!気持ちいい!と感じさせてくれる脳内麻薬。
もちろん、ゲームでも分泌されるポイントが存在しています

 

  • レースゲームで、後ろにぴったり貼り付かれている状態で最終コーナーをクリアし、ゴール!
  • オンラインRPGなどで、一度死んでしまうと経験値大量ロストのリスクがある中、強力な敵を倒してレベルアップ!
  • 対戦ゲームで、あと一撃攻撃を食らえば負けという状況で、読みが当たって対戦に勝利!

 

などなど。
ストレスのかかった状態から一気に解放され、達成感を得た正にその瞬間…
気分の高揚は絶頂を迎える、という訳です。

 

こういった生理的な事を知らなくとも、感覚的に「これは面白い」「これは違う」という判断を行う事は出来ますが、知っていれば、また新しい基準を自分の中に設ける事が出来ます。
他にも、人の感覚や感情を制御するホルモンは多くあります。
それらに関する知識を取り入れて「生理的に面白く感じる」仕組みを考えてみるのも面白そうです

 

それでは


        

お久しぶりです、コウスケです。

先日のアジアカップ日本代表戦のあまりに早い敗退、本当に残念でした・・

とはいえ仕方のないこと、次に向けて切り替えていきたいと思います

 


 

さて、前回は、関数型プログラミングの基本機能としてmap/fiter/reduceを紹介しました。

それらは関自体数を関数の引数として渡せることを利用した機能でしたが、

今回は関数自体を戻り値として返すことの出来る機能を紹介します。

関数型言語では関数を「戻り値」として返すことができます。

その際に必要となってくる機能/概念が「クロージャ」です。

いきなり関数型プログラミング特有の、専門用語っぽい難しい

言葉が出てきてとまどうかもしれません。

 

クロージャは噛み砕いて言うと、「関数を返す関数」と、

その関数実行時の、変数などの「環境」が保持される機能を持つものです。

(日本語では「関数閉包」と呼ばれます。)

 

オブジェクト指向言語に慣れ親しんでいる人なら、感覚的には関数だけで、

クラスによるメンバ変数のカプセル化」が実現できるもの

と受け止めたら良いと思います。

関数 ⇔ クラス
関数内ローカル変数 ⇔ クラス内メンバ変数

 

こういうものはサンプルコードを見るのが一番なので、見てみましょう。

 

 
---------------- [サンプルコード] ----------------

#------------------------------
# 呼ばれた回数を返すカウンタ関数。
# クロージャを生成する。
# init_valは初期値
#------------------------------
def make_counter(init_val):
    # カウンタ変数
    # 本来はc=init_valとしたいですが、リストになっているのは
    # pythonの言語仕様によるものです。
    c = [init_val] # 初期化
    #---------------
    # 関数内関数の定義
    #---------------
    def _counter():
        c[0] += 1 # 変数cはmake_counter関数のローカル変数を参照する
        return c[0]
    # 関数内関数を返す
    return _counter

def main():
    # クロージャを生成するカウンタ関数を2つ作成
    counter_a = make_counter(0)
    counter_b = make_counter(10)
    
    # それぞれを呼ぶ
    print "counter_a: ", counter_a()
    print "counter_a: ", counter_a()
    print "counter_a: ", counter_a()
    
    print "counter_b: ", counter_b()
    
    print "counter_a: ", counter_a()

    print "counter_b: ", counter_b()

#------------------------------
# メイン関数
#------------------------------    
if __name__ == '__main__':
    main()


 ---------------- [実行結果] ----------------
counter_a:  1
counter_a:  2
counter_a:  3
counter_b:  11
counter_a:  4
counter_b:  12

ここで注目して欲しいのは、_counter関数内で
make_counter関数内のローカル変数cを参照することができ、
しかも_counter関数の呼び出し完了後も保持されることにより
カウンタ変数cが書き換わっていることです。

 

ここでのmake_counter関数のように、

クロージャを作った関数をエンクロージャと呼びます。

・クロージャは定義されたときの環境を保持する
エンクロージャが実行された時環境が生成される
クロージャ内部の変数はそのエンクロージャの環境で解決される。

ことが特徴になります。

 

この機能により、

1, 変数の影響範囲(スコープ)を関数内に限定し、例えばグローバル変数のようなものを使わなくて済む。
2, クロージャ生成による関数実行時の環境が保持されることで、様々な機能を持つ関数を作成することができる。

といったメリットがあります。2番めについてはピンと来ないと思うので、

次回改めてクロージャを用いた機能や概念を紹介したいと思います

 

【今回のまとめ】

・関数型言語では関数を返す関数を定義でき、クロージャと呼ばれる機能を持つ。
・クロージャにより、関数内での環境を共有できる関数を生成することができ、
変数のスコープを限定させることができつつ様々な機能を持つ関数を作成できる。

 


        

遅くなりましたが明けましておめでとうございます

まだまだ夜は冷え込みますが日中はあったかくなってきましたね。

ご無沙汰しています、藤原です。

 

 

弊社リリースタイトル 産地直送ダイコンバトル

ダイコン王の野望ッッッン!! 

20150123_01

 

みなさんもうプレイされたでしょうか

 

まだまだ知名度は低いですが、が
お陰様で各所で紹介して頂いておりうれしい限りです

 

Ketchapp! 様

iPhone女史 様

NAVER まとめ 様

 

有難うございます

 

 

さぁ今こそ農家のおじいちゃんおばあちゃんや、

野菜ソムリエだけどそんなアプリなんて知らなかったという方

既にプレイ中の方々も是非是非ダイコン王国の畑(領土)を

みなさんの手腕でどんどん広げて最強の野菜達を育ててあげて下さいネ

ユニットの詳細画面より野菜達のバックストーリーなども確認できて必読です

 

寒い夜はコタツにこもってダイコン王で決まりッッ

今後とも開発チームともどもより良くしていくために様々なアップデートを予定しています。

 

それではまた


        

まだまだ寒いですね
歳のせいで新陳代謝が悪くなったのか、血行悪くてヒートテック的な保温効果の高い下着が手放せません。コンドウです。ご無沙汰です

今回も前回に引き続きiOSのGame Centerについてのお話です。

 

Game Centerを使ってみよう! Act.1

Game Centerを使ってみよう! Act.2

 

前回はGame Centerを利用する為の認証周りについて触れましたが、今回は実際の通信処理についてコード的な話をしたいと思います。

Game Centerの一番のウリじゃないかと個人的に考えているマッチング通信です

もしSock系の通信処理を経験した人なら「TCP/UDPどうなるのかな?」とか「使えるポート番号はいくらだろう?
とか「1パケットの最大長はどのくらいかな?」とか想像しますよねえ?しない?いやいや、ネットワーク通信やるなら多少なりとも気になりますよ

ここではっきりと言いますが、通信はものすごく簡単な物しか無いという事です。
具体的に言うとTCPやUDP、IPアドレス、ポート番号 そんなもの一切ありません

あるのは送信関数、受信関数(正確にはコールバックメソッド)、あとはマッチング関連の関数群ぐらいです。
通信用の関数は驚くほど無いです。無いので逆にSock系を実現しようとすると面倒だったりします
その辺りの解説は後にして、まずはマッチング処理ですねこれが無いとそもそも相互通信できませんので。

マッチング処理はちょっとだけ面倒ですので、少しずつ進めていきましょう。
マッチング処理とは通信相手となる端末との検索と通信の確立です。Game Centerでは「マッチメーク」という
表現でドキュメント等に記載されています。(※1)

まずは処理の流れです。大きく分けて

 

 APIで用意されているGUIでマッチング処理
 UIも含めて全て自前で準備する

 

の2つのパターンがあります。

まずはのマッチング方法ですがこれはGame Center関連の書籍やネットでの情報、プログラミングドキュメントでもよく見かけますね。
まずはコーディング。前回分で作ったGameCenter.hとGameCenter.mmに追記していきます。
今回はについて解説します。

typedef signed char          s8;    // 8bit 符号あり整数
typedef unsigned char        u8;    // 8bit 符号なし整数
typedef signed short        s16;    // 16bit 符号あり整数
typedef unsigned short      u16;    // 16bit 符号なし整数
typedef signed int          s32;    // 32bit 符号あり整数
typedef unsigned int        u32;    // 32bit 符号なし整数
typedef signed long long    s64;    // 64bit 符号あり整数
typedef unsigned long long  u64;    // 64bit 符号なし整数

@interface GameCenter :NSObject <GKMatchmakerViewControllerDelegate, GKMatchDelegate>
//--------------------------------------------------------
// クラスメソッド
//--------------------------------------------------------
+ (GameCenter*)instance;
//--------------------------------------------------------
// 公開メソッド
//--------------------------------------------------------
-(id)init;
@end

#define PLAYERS_MAX_PERSONS        4        // 最大同時プレイ人数(自身も含む)

struct PersonsInfo{
    NSString        _playerID;        // プレイヤ識別子
};

// マッチング情報
struct MatchingInfo{
    PersonsInfo    _person[ PLAYERS_MAX_PERSONS ];
    u32            _currentPersons;    // 接続人数(自身も含む) 1~4
};

GKMatchmakerViewControllerDelegateを基底に付けておきます。の場合は要らないところです。
GameCenter.hの記述を上記に変更します。

@interface GameCenter(){
    MatchingInfo    _playersInfo;
}
// @param[in,out]    MatchedFlag            matchイベントハンドラが呼ばれたかフラグ(NO:呼ばれていない YES:呼ばれた)
@property (nonatomic) BOOL MatchedFlag;

// @param[in,out]    MatchMakingFlag        マッチングフラグ(NO:非マッチ YES:マッチング中)
@property (nonatomic) BOOL MatchMakingFlag;

// @param[in,out]    OldMicroSecondClock    前回取得した起動からのマイクロ秒
@property (nonatomic) u64 OldMicroSecondClock;

// @param[in,out]    MatchRequest           マッチ用リクエスト
@property (retain) GKMatchRequest* MatchRequest;

// @param[in,out]    MyMatch                GKMatchオブジェクト
@property (strong) GKMatch *MyMatch;


@end

@implementation GameCenter


/*
 初期化関数(前回のinit関数と差し替える)
*/
-(id)init
{
    self=[super init];
    if(self){
        memset( &_playersInfo, 0, sizeof(_playersInfo) );
        [self InitializeMatchMaking];
        self.MatchRequest = [GKMatchRequest new];    // GKMatchRequestのインスタンスを予め取っとく
    }
    return self;
}

/*
 終了関数
*/
-(void)dealloc
{
    [self.MatchRequest release];
    [super dealloc];
}

/*
 プレイヤ情報を保持(前回の関数と差し替え)
 player        GKLocalPlayerデータ
*/
-(void)localPlayerDidChange:(GKLocalPlayer *)player
{
    self.localPlayer=player;
    if( player != nil ){
        self._playersInfo._person[0]._playerID = player.playerID;    // 自分自身のIDを配列の先頭に置く
    }
}


// マッチング処理の結果を取る通知関数です。上記の場合はキャンセルされたら処理が飛んでくるものです。
- (void)matchmakerViewControllerWasCancelled:(GKMatchmakerViewController *)viewController
{
    // キャンセルされた!
    viewController.delegate = nil;

    // controllerを閉じる
    [viewController dismissViewControllerAnimated:YES completion:^(void) {
        // アニメーション完了ハンドラ
        viewController.matchmakerDelegate = nil;
        [self InitializeMatchMaking];
        // ゲーム側にキャンセルされた事をここで通知しておく
    }];
}


// マッチング処理中に何らかのエラーが発生した場合に通知される関数です。
// エラー処理はここでゲーム側に通知しておきます。GameCenter.mmに追記します。
- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFailWithError:(NSError *)error
{
    // ゲーム側にマッチング中にエラーが発生した事をここで通知しておく
}


// マッチング処理完了時に呼び出される。うまくいった場合だね!
- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)match
{
    match.delegate = self;
    self.MyMatch = match;

    PersonsInfo* person = &_playersInfo._person[0];
    _playersInfo._currentPersons = 1;    // 少なくとも自身がいるので1からスタート
    // マッチングした自身を除く人たちの記録!
    for(NSString* playerID in match.playerIDs) {
        person++;    // [0]を飛ばすのは[0]に自身のプレイヤIDをセットしている為
        person->_playerID = playerID;    // プレイヤIDコピー
        _playersInfo._currentPersons++;
    }
    self.MatchMakingFlag = NO;
    [viewController dismissViewControllerAnimated:YES completion:^(void) {
        // アニメーション完了ハンドラ
        self.MatchedFlag = YES;
        [[GKMatchmaker sharedMatchmaker] finishMatchmakingForMatch:match];
    }];
}

/* 現在時間を取得
 戻り値:現在時間(単位:マイクロ秒)
*/
u64 GetCurrentMicroSecond()
{
    struct timeval tm;
    gettimeofday(&tm, NULL);

    u64 time = (unsigned)(tm.tv_sec) * (u64)1000000 + (unsigned)(tm.tv_usec);    // μsecを整数化
    return time;
}

<span style="color: #339966;">/*
 GameCenterに対するコマンドのタイムアウト初期化
 GameCenterサーバー死んだ時用。
*/</span>
-(void)InitializeTimeOut
{
    self.OldMicroSecondClock = GetCurrentMicroSecond();
}

/*
 GameCenterに対するコマンドのタイムアウト検出
 cnt        タイムアウト時間(単位:マイクロ秒)
 戻り値:
 true        タイムアウト
 false        正常
 GameCenterサーバー死んだ時用。
*/
-(bool)IsTimeOut:(u32)cnt
{
    u64 current = GetCurrentMicroSecond();
    u32 sa = u32(current - self.OldMicroSecondClock);
    return (sa >= cnt );        // 指定時間超えたらtrue
}
@end

/*
 マッチング情報の初期化
*/
-(void)InitializeMatchMaking
{
    self.MatchMakingFlag=NO;
    self.MatchedFlag=NO;
    _playersInfo._currentPersons = 1;    // 少なくとも自身がいるので1からスタート
    self.MyMatch=nil;
}

マッチングを行った結果を返すデリゲートの設定やその他諸々設定です。

// マッチメーキング開始
- (void)matchMaking:(u32)playerGroup playerAttribute:(u32)playerAttr
{
    self.MyMatch=nil;
    self.MatchMakingFlag=YES;
    self.MatchedFlag=NO;
    [self InitializeTimeOut];            // 起動からのマイクロ秒記憶
    // マッチングの条件を設定! マッチングの条件はここでは割愛
    GKMatchRequest *req = self.MatchRequest;
    req.defaultNumberOfPlayers=2;        // デフォルト人数
    req.minPlayers=2;                    // 最少人数
    req.maxPlayers=PLAYERS_MAX_PERSONS;  // 最大人数
    req.playerGroup=playerGroup;         // プレイヤーグループ(特に指定がない場合は0をセットする)
    req.playerAttributes=playerAttr;     // プレイヤー属性(特に指定がない場合は0をセットする)
    GKMatchmakerViewController* gkmController = [[GKMatchmakerViewController alloc] initWithMatchRequest:req];
    gkmController.matchmakerDelegate = self;

    AppDelegate* delegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
    // GameCenterマッチングUIの開始アニメーションをメインスレッドで実行されるメインディスパッチキューにて登録して実行
    dispatch_async( dispatch_get_main_queue(), ^{
        [delegate.rootViewController presentViewController:gkmController animated:YES completion:^(void) {
        // アニメーション完了ハンドラ
        }];
    });
    [gkmController release];
    return 0;
}

そしてマッチング開始関数です。これを呼び出せばマッチングがスタートします。結果はデリゲートで設定した関数達で得られます。

Game Centerのマッチング条件(GKMatchRequestクラス)は非常にシンプルです。

 

  • ・最小/最大人数の設定(minPlayers/maxPlayers)
  • ・プレイヤーグループ(playerGroup:符号なし32bit整数値)
  • ・プレイヤー属性(playerAttributes:符号なし32bit整数値)

 

これだけ
コンシューマ機にありがちな、マッチング用の部屋建てたり、部屋検索したりとかありません
お互いの条件が一致する者達を繋げてくれるだけです
マッチング条件は貧弱ですが、工夫次第で何とかなります

例えばプレイヤーグループですが、これはお互いに一致したプレイヤーグループ同士を繋げてくれます。(但し0を指定した場合は例外で無条件にマッチングします)
これを例えば、下位5bitをマッチング種類として32個設定、次の3bitを職業等のステータスとして設定、残りのbitでその他の条件など、全てand条件になってしまいますが1つの変数で条件を複数分けたりやり方次第で何とかなります
またプレイヤー属性はちょっとややこしく、「自身と異なる相手を探す」場合に利用します。
オセロで考えた時に、自分は黒で相手は白の人を検索したい場合

 

黒(自分) 0x0000ffff
白(相手) 0xffff0000

 

と設定します。マッチングサーバーが両者の属性を論理和(OR)した結果が0xffffffffだったらマッチする条件となる訳です。黒同士もしくは白同士は0xffffffffにならないのでマッチングしないという事です。
これもうまく活用すれば更に条件のバリエーションを増やせます。
例えば、後で追加マッチング(※2)を行う場合に未マッチングの人とマッチング済みの人たちの組み合わせのみマッチングさせたい場合などに使えますね

 

今日はここまで(力尽きました)

次回ではの自前でマッチングを解説したいと思います。このカスタムマッチはネットでも余り触れているサイトが無く書籍でも情報が本当に薄いです。(そもそもGameCenter解説本が少ない)が、このカスタムマッチのほうが断然面白いマッチングができます
例えば、

 

  • ・プレイヤーの離脱、追加ができる(今回の方法でもできなくはないですが)
  • ・マッチングするまでプレイヤーをぼけーっと待たせない(ゲーム処理の裏でマッチングすればいいのだ)

 

サーバー建てなくてもよりアクティブなネットワーク対戦が構築できます
お楽しみに

 

 

※1 Game Centerプログライミングガイド
※2 一旦マッチングした後に4人に満たない場合や、対戦人数に満たない場合に追加でマッチング募集する場合に行う機能です。例えば最初1人でもマッチングすれば即ゲーム開始し、裏で追加の募集をかける的なオペレーションだとプレイヤーも待ちのストレスを最小限に抑えることができますね。


        

お久しぶりです。

ロードバイクデビューしたgood sunこと山口です。
日々風を感じております

 

前回の有刺鉄線を有効活用しようと考えたのですが、
気持ちを切り替えてSubstance Designerの学習を兼ねた紹介をしたいと思います。
思い起こせば一年前にSteamで購入して、
使用時間わずかに2時間という驚異の短時間使用で封印していました。
封印していた理由はシンプルで使い方が良くわからなかったからです。

 

いきなり難しいものを作るのも大変なので、
今回は簡単にハイトマップを元にして凹部分に凹凸を追加する事を目標に頑張ってみます。
(たぶんノードベースシェーダと同じように使えるはず…)

 

では開始です。
新規Substance…で新しいデータを作成します。
(物理ベースレンダリングのプリセットを使っていますが法線以外は使いません。)

 

20150121_blog_00

 

新規作成後はこんな画面になります。

20150121_blog_01

もうこの時点で突き放された気持ち全開ですね。
めげずに最初の一歩を踏み出します。

何もないと始まらないのでPhotoShop等でハイトマップを作成します。

20150121_blog_02

そしてグラフビューで右クリックして先ほど作成したpsdデータを読み込みます。
ついでにハイトマップを法線マップにするノードも作成しておきます。

20150121_blog_03

それぞれつないでみた感じがこれです。
きちんとノーマルマップになっていますね。

20150121_blog_04

これだけではシャープすぎるのでいったん画像を暈してみます。
ライブラリビューのブラーからBlur HQ Grayscaleをグラフビューにドロップして、
ハイトマップと法線の間に繋ぎます。

20150121_blog_05

すると、ぼんやりします。
次に凸凹をつけるためにノイズを加えてブレンドします。
選んだノードはノイズ->BnW Spots 3とブレンディング->Multiplyです。
ブラーノードの出力とノイズノードの出力をMutiplyの入力に繋いで、
Multiplyの出力を法線に繋ぎます。
(Multiplyを使用した理由は私がスカラーの合成は乗算が大好きだからです)

20150121_blog_06

繋がると全体的に凸凹します。
ですが望んでいるのは十字部分のハイトマップの凹み部分だけに効果を出したいので、あと一工夫します。

20150121_blog_07

ライブラリビューの調整からInvertを二つ作って、
Multiplyの前と後で画像をいい感じに反転させます。
(黒い部分がそのままではMultiplyの効果が低いので一度反転させて、再反転させてます)
なんとなく思い描いていたような感じに近づいてきました。

20150121_blog_08

ただこのままではどうも凹凸感が弱いので強調していきます。
ライブラリビューから
調整->Contrast…と法線マップ->Height Normal Blenderを取り出します。

20150121_blog_09

そしてMultiplyの出力に繋がったInvertの出力をContrastに繋いでコントラストを高めます。
さらにContrastの出力をハイトマップとしてHeight Normal Blenderに繋いでノーマルマップを強調します。
なんか思ったような感じになりました!
やれば何とかなるものですね。

20150121_blog_10

…ですがまだ終わりません!
Substance Designerの凄いところはここからです。
まずはハイトマップの画像を削除して、
残ったグレースケール変換ノードを右クリックして入力ノードを作成します。

20150121_blog_11

さらに作成しているsubstanceデータのパラメータビューの
Input Parametersのところにある⊕アイコン(新しい入力ツィークの追加)から
パラメータを追加してパラメータを整えたら、
ContrustノードのインスタンスパラメータのContrastの入力を先ほど作成したパラメータにします。

20150121_blog_12

と、このような加工を施すことでsubstanceデータは、
他のsubstanceデータで一つのノードとして使うことが出来ます!

20150121_blog_13

一つのノードになっているということは、
ハイトマップを違う画像に置き換えてもきちんと動作します。

20150121_blog_14

 

これで今回の練習兼紹介の内容は終了です。
感触としてはノードベースシェーダとほぼ同じ使い心地です。
今回のような編集作業であれば普通にPhotoShop使ったほうが早くて直観的なので、
使いどころはかなり限られてくるかなと思いますが、
画像を差し換えて複雑な手順を実行する場合は途中何度でも修正が出来るので、
PhotoShopのアクションより強力かもしれません。

ということで今回はこの辺で!


2015年1月20日

黒猫のウィズ

        

お久しぶりです、ナカムラです。
メジャーなスマホタイトルばかりを今更ながらに紹介して恐縮ですが、今回も本気でハマッているゲームを紹介させて頂きます

 

クイズRPG魔法使いと黒猫のウィズ

 

年末年始は某ゆるキャラとのコラボCMが流れまくっていたので、ゲームのタイトルをご存知の方は多いかと思いますが、どんなゲームなのかはよく知らない…という方もおられるのではないでしょうか?

改めて説明しますと、クイズに答えることで味方キャラクターに攻撃を促し、敵を倒すことで進んでいくRPG形式のスマートフォン対応オンライン型ゲームアプリです。

画面下部でクイズに答え、その結果が画面上部で行なわれるキャラクターの戦闘に反映される…というスタイルは昨今のスマホゲームに慣れた人にはすんなり理解できるものと思います

 

その他の基本的なルールとして…

 

  • 四択クイズに答える事で、味方キャラクターが攻撃を行います
    クイズの問題とキャラクターにはの属性があり、「」属性のクイズに答えれば、「」属性のキャラクターが攻撃を行います。
    」の三色が混在したクイズなら全属性のキャラクターが一斉攻撃してくれますが、その分難しい問題が用意されてる…というバランスで調整されていて、このバランスがなかなか絶妙です。
    (もちろん個人の知識レベルにもよると思いますが)単色のクイズなら、自分のよく知らないジャンル(後述)でも自信を持って回答できるレベルの問題が用意されていると思います
    2色混合のクイズなら、自分の不得意なジャンルは選ぶのを躊躇するレベルの問題が
    3色混合のクイズは、得意分野でも正答が困難なレベルの問題が用意されている…と言った印象です。

     

  • クイズの問題には「理系」「文系」「スポーツ」「芸能」「アニメ&ゲーム」「生活雑学」などのジャンルがあり、選択可能になっています。
    ただし、いつでも任意のジャンルを選べる訳ではないので、不得意なジャンルを選ばざるを得ないケースも多々あります
    (私自身は、ゲームはともかくアニメにはさほど詳しくないので、アニメとゲームは別ジャンルにして欲しい…と常々嘆いております)

     

  • ステージに連れて行くパーティはキャラクター5体で構成でき、それぞれが特殊なスキルを有しています。
    正解が一定数を超えることにより発動できるスキルや、
    出題後5秒以内に正答できれば発動されるスキルなど、クイズゲームに即したシステムになっていて、独特の緊張感を得る事が出来ます。

 

複数人で行うトーナメント戦や、一体のボスを協力して倒すレイドバトルなども存在するのですが、今回特にピックアップしたいのは、スタミナに関する次のシステムです。
地味ながら、思い切った英断がなされていると感じています

 


20131203_separater

 

プレイコストをスタミナ制にしているゲームは沢山ありますが、その中でも黒猫のウィズでは、ユーザーにとって大変嬉しい機能を実装してくれています。

こういうゲームでありがちな事として…

 

「初めてプレイするステージについての情報が分からず、どんな敵が出てくるのか分からない
 大きなスタミナを消費した上でゲームオーバーになってしまったら、勿体ない
 だから、攻略サイトでステージ情報を集めてからプレイしよう

 

なんて事はありませんか?

 

折角気軽にプレイ出来るはずのスマホゲームに対して、これはちょっとまだるっこしいですよね
黒猫のウィズでは、ある仕様によってそれを解決してます
それは、
「初めてプレイするステージに関しては、そこをクリアするまでスタミナ消費無し!」
というものです(ただし、期間限定で行われるイベントステージに限るようですが)。

どうですか
まるで、
「美味しくなかったらお代は要りません!」
と言ってるレストランのような…と言う比喩は的を射てないようにも思いますが、そんな度胸を感じさせる仕様ではないでしょうか

これによって、パーティ構成を気軽に変更して試行錯誤しながらプレイする事が出来るようになり、デッキ構築の楽しさを理解する一助になっていると思います

 


20131203_separater

 

 

今までご紹介したパズドラモンスト、ウィズに関しては、ホントに毎日プレイしているので、結構大変です

 日々プレイする数としてはあと1タイトルぐらいで限界…と思っているところで私のゲームプレイローテーションに組み込まれた、弊社リリースのダイコン王の野望ッッッン!!

手前味噌で恐縮ですが、こちらも是非プレイしてみて下さい

 

 


        

こんにちは~。
約1年ぶりに失礼します☆業務部しばやんです

少しお休みを頂いてオカン業に専念していましたが、

ヘキサ恋しさに舞い戻ってきました

 

さて、本日は先週末に東京・大阪にて開催しました会社説明会のご報告です。

今回は参加者がやや少なめでしたが、我々は例年通り

熱くパワフルにいろいろなお話をさせて頂きました

 

P1120208

 

質疑応答の時間には、学生のみなさんから様々な質問を頂きましたが、

説明会終了後さらに質問にきてくださる方も多く、熱心な姿がとても印象的でした

 

2月27日(金)の応募締切に向けて

今月25日、そして来月にもまた会社説明会を開催しますので、

プランナープログラマーグラフィックデザイナーを目指す学生のみなさんには

ぜひご参加頂きたいと思っています

 

ご予約はコチラから >>>  会社説明会のご案内

 

なお、ご応募(応募書類・作品のご郵送)にあたり、

会社説明会の参加は必須ではありませんので、遠方であったり

日程が合わない等で会社説明会にご参加頂けない場合でも、

ご心配なさらず応募書類・作品をお送りください。

お待ちしております

 

募集の詳細はコチラ >>> 募集要項応募方法

 

それではまた★


ヘキサブログ ピックアップ



過去の日記はこちら

2015年1月
« 12月   2月 »
 1234
567891011
12131415161718
19202122232425
262728293031