【中級者向け】ゲーム設計で学ぶobserverパターン!

こんにちは!
今日はプログラムの設計でよく見るobserverパターンについてだよ!

「こういう処理が走ったら、特定のオブジェクトにこういう処理をさせたい!」って時よくあるよね???ゲーム設計に限らずだと思うけど!

その時にif文case文地獄にならないように設計できるのがobserverパターン!

用意するのはざっくり2つ!

1、「こういう処理が走ったら」を感知するsubject

2、その感知に対してどういう処理を行うかのObserver

subjectがObserverを管理して登録したり削除したり感知するメソッドを用意!
Observerは感知された時に呼び出される処理を書く!

今回は花壇に水をやってそれを感知する花と花壇の水量を観察するクラスを作っていきましょう!
今回はC#で書くかphpで書くか迷ったけど最近phpばっかだからphp(言語は違っても考え方は同じだから!!!)

まずは花壇クラスを作成!上で言うsubjectの部分!
Flowerbed.php

<?php 
/**
 * Subjectクラス+ConcreteSubjectクラスに相当する
 */ 
class Flowerbed { 
  private $waterCnt; 
  private $listeners; 
  public function __construct() { 
    $this->listeners = array();
    $waterCnt = 0;
  }

  /**
  * 植物に水を与えたときに呼ぶメソッド
  */
  public function addWater()
  {
    $this->$waterCnt++;
    $this->notify();
  }

  /**
  * 水を与えた回数を取得
  */
  public function getWaterCnt()
  {
    return $this->$waterCnt;
  }

  /**
  * Observerを登録するメソッド
  */
  public function addListener(PlantListener $listener)
  {
    $this->listeners[get_class($listener)] = $listener;
  }

  /**
  * Observerを削除するメソッド
  */
  public function removeListener(PlantListener $listener)
  {
    unset($this->listeners[get_class($listener)]);
  }

  /**
  * Observerへ通知するメソッド
  */
  public function notify()
  {
    foreach ($this->listeners as $listener) {
      $listener->update($this);
    }
  }
}
?>

次はインターフェース部分!抽象メソッドを定義するよ!
PlantListener.php

<?php
interface PlantListener {
    public function update(Flowerbed $flowerbed);
}
?>

次は花壇の水量を観察するクラスを作っていこう!(上で言うObserverのとこ!)
AmountWater.class.php

<?php
  require_once 'PlantListener.php';
/** 
* Observerクラスに相当する 
*/
class AmountWater implements PlantListener { 
  public function __construct() { } 
  public function update(Flowerbed $flowerbed) {
   echo '現在の水量は'.$flowerbed->getWaterCnt().'です';
 }
}
?>

次は具体的な花のクラスを作るよ!今回はアサガオと向日葵!
Asagao.class.php

<?php
require_once 'PlantListener.php';

/**
 * Observerクラスに相当する
 */
class Asagao implements PlantListener
{
    public function __construct(){}
    public function update(Flowerbed $flowerbed)
    {
     echo 'アサガオが水をもらいました';
    }
}
?>

Himawari.class.php

<?php
require_once 'PlantListener.php';

/**
 * Observerクラスに相当する
 */
class Himawari implements PlantListener
{
    public function __construct(){}
    public function update(Flowerbed $flowerbed)
    {
      echo '向日葵が水をもらいました';
    }
}
?>

これで準備おK! あとは水をあげるボタンを用意してそれぞれのオブジェクトをよぼう!
observer_client.php

<?php
 require_once 'Flowerbed.php';
 require_once 'Himawari.class.php';
 require_once 'Asagao.class.php';
 require_once 'AmountWater.class.php'; 
//花壇と花を作成してSubjectに登録 
function createCart() { 
 $flowerbed = new Flowerbed(); 
 $flowerbed->addListener(new Himawari());
 $flowerbed->addListener(new Asagao());
 $flowerbed->addListener(new AmountWater());
 return $flowerbed;
}

session_start();
$flowerbed = isset($_SESSION['flowerbed']) ? $_SESSION['flowerbed'] : null;

if (is_null($flowerbed)) {
 $flowerbed = createCart();
 $_SESSION['flowerbed'] = $flowerbed;
}

$mode = (isset($_POST['mode']) ? $_POST['mode'] : '');

//水をあげた時にFlowerbedのaddWater関数を呼ぶ
if ($mode != '') {
 $flowerbed->addWater();
}

?>
<form method="post" action="">
 <input type="hidden" name="mode" value="add">
 <input type="submit" value="水をあげる">
</form>

これでobserver_client.phpを開いて水をあげれば下記のようになるよ!

今回は文字を表示させているだけだけど、実際に走らせたい処理を書いてあげるといいよ!
花が増えたり、観測者を増やしたいなら別途そのオブジェクトを管理するファイルを作って登録させるだけ!
これで条件分岐地獄にはならずにオブジェクトごとに管理もしやすくてバグも起こりにくいよ!

ちょっと長かったけどぜひこの設計やって見てね!
以上!河条でした^o^

Live2D Creators Conference alive 2017

に、参加してきました、どうも!taeminでっす^o^
先日12月4日(月)に秋葉原UDXにて、Live2Dのイベントがありました〜

企業さんや個人の方のトークセッション、Live2Dを使った製品の展示、 Live2Dを使用したオリジナル短編アニメ「The Lamp Man」の上映などなど、内容盛りだくさんのイベントでしたー!(ついイベントに熱中してしまい写真を撮ることを忘れていた・・・)

お話ししてくださった方々、
スタッフの方々、
企業関係者の方々、

この場を借りてお礼申し上げます!
とても楽しい勉強になるイベントでした!
年に一回のこのイベント、次回開催はまた来年ですが、今からもう既に楽しみです^o^!
それまでにもっとLive2Dの勉強をするぞー!

 

 

さてさて、、一人突っ走ってしまいましたが、
Live2Dとはなんぞや??という方のためにご説明しますと、

Live2Dとは、
2Dのモーフィングによるシームレスアニメーションを可能にする映像表現および関連ソフトウェアの総称である。
3D制作するよりも原画の画風を保ったままキャラクターを動かせる特徴を持ち、低コストでの制作を可能にする。
byウィキペディア

 

はい、そうなんです、Live2Dとはアニメーションを作れるソフトウェアなんです!

 

我が社のスマホアプリ、Ghost Crashのライちゃんを例にしてアニメーションを作成しますと、

まず、キャラクターのイラストを一枚描きます。

はい、
動かすためのイラスト制作はこれで終わりです。

通常、アニメーションを作る時は動かすために何枚もイラストが必要なわけですが、、、
Live2DだとこれだけでOKです。(動きにこだわる際は何パターンか差し替え用のイラストを用意する場合もある)

 

そしてそれを元にパーツわけをして、、

 

Live2Dに読み込んで(色々省略して)動かすと・・・

動きます!!!
自分が描いたキャラクターが動いた時の感動たるや・・・!!!!!

 

まだまだLive2Dのお勉強を始めたばかりなので、先ほど省略した部分はまた次の機会にでも書けたら!
まだこれくらいしか動かせないけど、今後もっともっとキャラクターを生き生きと動かせるように頑張るぞー!

 

そして今回Live2Dのイベントに参加して思ったのは、
このLive2Dという技術は、現在とても需要のある技術なのだな、
という事でした。

ご興味ある方は是非一度Live2Dをやってみてはいかがでしょう?
絵描きさんであれば、自分の描いたキャラクターが動く感動を是非一度味わってみてくださいー^o^!

では!

ちょっと差をつけよう!?【HTML】オッシャレーな便利機能【CSS】

ちょっと差をつけよう!?【HTML】オッシャレーな便利機能【CSS】

こんにちは!bibiです。

今回は、テキスト選択時のハイライトのカラーを変更する小技をこっそりお教えします!

工程は超カンタン!

cssにこちらを記述します。今回はハイライトに鮮やかな赤色を指定。

これでOK!どうでしょう!この1ステップのみのお手軽さ!!!

ここに例えば、文字色自体をこのように変えたり

P要素のみに限定してハイライトをつけたり

意外と自由度高く行うことができます!

これであなたもハイライト・マスター!!!!

ご報告!!

お久しぶりのtaeminでっす!
なかなかブログ当番が回ってこないので、このまま幽霊部員的な扱いになってしまうのか??!・・・なんて思ったけれど、ちゃんとブログ当番は回ってきました( ̄ー ̄)ちっ

さて気を取り直して、、、
今回はご報告が・・・!!!

 

 

 

 

私ごとではありますが、、、
このたび、結婚をする運びとなりました!!!!

 

 

 

 

 

 

 

・・・・・・・・なんて冗談は置いておいて。。。

 

 

 

 

 

 

なんと!!
弊社がスマートフォンアプリ開発を始めて、丸1年が経ちましたよ!!(パンパカパーン!ドンドン!パフパフ!)

 

 

なので今回のブログは、今までリリースしてきた計8タイトルを改めてご紹介したいと思います〜〜〜

 

さあ張り切っていきましょーー!!!

 

 

 

まず記念すべき1タイトル目は・・・

にゃんきー学園!

シンプルに見えてこれがなかなかに難しい・・・!
果たして全ての敵を倒し攻略することができるのか・・・??!

にゃんきー学園のダウンロードはこちらから!!!
App Storeからダウンロード googleplayからダウンロード

 

 

2タイトル目は・・・

バク反!

これもなかなかに難しい・・・・・!!
途中まではクリアできるものの、カオスモードがとにかくカオス。。。
これは本当に反射神経が求められる・・・!

バク反のダウンロードはこちらから!!!
App Storeからダウンロード googleplayからダウンロード

 

 

そして3タイトル目は・・・

METEO!

隕石やUFOが飛び交う宇宙の中にただ一人取り残された主人公・・・
果たして無事に生還することができるのか・・・??!
それはプレイヤー次第!!

METEOのダウンロードはこちらから!!!
App Storeからダウンロード googleplayからダウンロード

 

 

続いて4タイトル目は・・・

後の「こめでぃ」、「お米LINEスタンプ」の元になった
おこめ時代!

気持ちの悪い顔をしたお米をコツコツ育成し収穫するゲームだぞ!
これがなかなかに面白く、当時ハマってしまうtaeminであった。。。
プレイしたことのない方は是非一度ご賞味あれ!

おこめ時代のダウンロードはこちらから!!!
App Storeからダウンロード googleplayからダウンロード

 

 

そして5タイトル目は・・・

おこめ時代のシリーズとして登場の
こめでぃ!

お米をなぞって繋げて消す爽快パズルゲーム!!
今年の3月に「こめでぃのお米プレゼントキャンペーン」も開催していましたよ♪

こめでぃのダウンロードはこちらから!!!
App Storeからダウンロード googleplayからダウンロード

 

 

そしてそしてここからが わたくしtaeminが携わったアプリの第6タイトル目!
サプライド初めての受託アプリの

とりまるバブル!

クライアント様のご要望をお聞きして、一つ一つ丁寧に決めて作成しました!
ランキング機能も搭載していて、スコア100万オーバーの化け物級のユーザーがゴロゴロと・・・!!!
taeminや弊社のプログラマがいくら頑張っても20万スコア・・・
世の中にはスゴイ方がたくさんいらっしゃるんだなぁ・・・
世界って広い・・・!!

とりまるバブルのダウンロードはこちらから!!!
App Storeからダウンロード googleplayからダウンロード

 

 

続いて第7タイトル目!

Night Cloud!

これもなかなかに難しいーー!!!
けれどついついハマってしまう中毒性を持ったこのゲーム。。。
コツさえ掴めば100スコア台はいくものの、500スコア以上を叩き出す化け物ユーザーがここNightCloudにも存在した。。。
開発陣はもう敵いません((((;゚Д゚)))))))
世界って本当に広い・・・

Night Cloudのダウンロードはこちらから!!!
App Storeからダウンロード googleplayからダウンロード

 

 

さてさて最後は第8タイトル目の

Ghost Crash!

主人公「ライちゃん」の可愛いボイスが聴けるGhost Crash♡
個人的に可愛い女の子のキャラクターが描けてtaeminは嬉しゅうございました╰(*´︶`*)╯♡
ご要望があれば次はサプライドから恋愛シミュレーションアプリが出るかも??!
マッチ3パズルゲームがお好きな方は是非プレイしてみてね!

Ghost Crashのダウンロードはこちらから!!!
App Storeからダウンロード googleplayからダウンロード

 

 

こうして振り返ってみると、この1年で多くのアプリをリリースしてきました。
またこれからも続々と弊社からスマホアプリをリリースしていきたいと思うので、お付き合いのほどよろしくお願いいたします!!!

以上taeminでした^o^!

 

ps.
近々また新アプリ出るよ!!!
乞うご期待!!!!!

アドフリくん

こんにちは、kazです。

現在開発中のゲームで、ヒントを見たときに動画リワードを出そうということで、アドフリくんSDKを入れたけどこれがまた全然うまくいかない。

これが最初のエラー

長いっ!
とりあえずエラー内容を見ていく…

stderr[
Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat;

already addedということは同じものが複数ありますよ。ということっぽいので
とりあえずandroid-support-v4を削除してビルドしてみる

stderr[
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/ads/identifier/AdvertisingIdClient;

またか!
今度は別の場所で同じエラーが出たので…
google-play-servicesを削除

これで無事にビルドできました。
文字にするとあっという間だけど解決するの大変だった…