【PHP】参照渡しと値渡しについて!!!٩( ᐛ )و【ポインタ】

こんにちは!
今日は社内の子に参照渡しと値渡しって何だよ!と聞かれたので、せっかくなのでブログでまとめて書こうと思います!

よく言われている通り、参照渡しは値を共有するイメージで、ポインタと似ています!(参照渡し理解できればポインタも理解できるでしょう!)
値渡しは単に値だけを渡して共有はしないってイメージです。

とりあえず実際にコード書いてどう動くか確認してみましょう!
参照渡しと値渡しはどんなプログラミング言語にもあると思うけど、いつも通りPHPで書きます!٩( ᐛ )و٩( ᐛ )و

まずは値渡しのコード

$atai_A = 'atai_Aの値を渡すよ';
$atai_B = null;

echo "値渡し前のatai_Aの値: $atai_A
";
echo "値渡し前のatai_Bの値: $atai_B
";

// $atai_Aの値渡し
$atai_B = $atai_A;

$atai_B = 'atai_Aの値を渡されたよ';

echo "値渡し後のatai_Aの値: $atai_A
";
echo "値渡し後のatai_Bの値: $atai_B
";

実行結果
値渡し前のatai_Aの値: atai_Aの値を渡すよ
値渡し前のatai_Bの値:
値渡し後のatai_Aの値: atai_Aの値を渡すよ
値渡し後のatai_Bの値: atai_Aの値を渡されたよ

ここはプログラムちょっとでもやった人なら納得だと思います!
atai_Aの中を「atai_Aの値を渡すよ」にして、その値を「atai_B」に入れた後に「atai_Aの値を渡されたよ」で上書きしています。

では本題の参照渡し!٩( ᐛ )و

$sansyo_A = 'sansyo_Aの参照を渡すよ';
$sansyo_B = null;

echo "参照渡し前のsansyo_Aの値: $sansyo_A<br/>";
echo "参照渡し前のsansyo_Bの値: $sansyo_B<br/>";

// $sansyo_Aの参照渡し
$sansyo_B =& $sansyo_A;

$sansyo_B = 'sansyo_Aの参照を渡されたよ';

echo "参照渡し後のsansyo_Aの値: $sansyo_A<br/>";
echo "参照渡し後のsansyo_Bの値: $sansyo_B<br/>";

実行結果
参照渡し前のsansyo_Aの値: sansyo_Aの参照を渡すよ
参照渡し前のsansyo_Bの値:
参照渡し後のsansyo_Aの値: sansyo_Aの参照を渡されたよ
参照渡し後のsansyo_Bの値: sansyo_Aの参照を渡されたよ

はい!さっきと違うのは参照渡し後のsansyo_Aの値ですね!
先ほどと同じように、sansyo_Aの中を「sansyo_Aの参照を渡すよ」にして、その値を「sansyo_B」に入れた後に「sansyo_Aの参照を渡されたよ」で上書きしています!

が!なんとsansyo_Aの値も変わっています!
冒頭で説明した通り、値が共有されていますね!
sansyo_Bはsansyo_Aの実態を持っているイメージです!

参照渡しと値渡しどうでしょうか!とりあえず初めのうちは、こう書いたらこう動くと割り切って進めていくのもありです!
次は関数を使った参照渡しを書こうと思います!

それでは٩( ᐛ )و

【中級者向け】ゲーム設計で学ぶ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^

【アドフリくん】バナーやインタースティシャルを表示させるソースコード!【Unity】【C#】

こんばんは!河条です!(^o^)

今回はアドフリくんのバナーやインタースティシャルを表示させるソースです!
なぜかJavaScriptでの方法ばかりだったので、C#でのソースを公開しようと思います!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AdfurikunPlay : MonoBehaviour {
	enum SCENE_STATE {
		MAIN,
		QUIT_WAIT,
		QUIT,
		END
	}
	private SCENE_STATE sceneState = SCENE_STATE.MAIN;
	private bool initialized = false;

	#if UNITY_IPHONE
	private string ADFURIKUN_APPID  = "********************"; 
	#elif UNITY_ANDROID
	private string ADFURIKUN_APPID  = "********************"; 
	#else
	private string ADFURIKUN_APPID = "********************";
	#endif

	// Use this for initialization
	void Start () {
		//インタースティシャル広告の表示
		ShowAdfurikunIntersAd(0);
		//バナーの表示
		ShowAdfurikunBannerAd (0,true);
	}
	
	// Update is called once per frame
	void Update () {
		if (!initialized) {
			initialized = true;
			GameObject obj = GameObject.Find("AdfurikunUtility");
			if (obj != null) {
				AdfurikunUtility au = obj.GetComponent<AdfurikunUtility>();
				if (au != null) {
					au.addCustomSizeAd(ADFURIKUN_APPID, 100, 400, AdfurikunUtility.AdSize.ICON, AdfurikunBannerAd.AndroidTransition.NOTHING, true);
				}
			}
		}

		switch (this.sceneState) {
		case SCENE_STATE.MAIN:
			break;
		case SCENE_STATE.QUIT_WAIT:
			this.sceneState = SCENE_STATE.QUIT;
			break;
		case SCENE_STATE.QUIT:
			this.sceneState = SCENE_STATE.END;
			Application.Quit();
			break;
		case SCENE_STATE.END:
			break;
		}
	}

	/// 

<summary>
	/// バナーの表示と非表示
	/// </summary>


	/// <param name="index">Index.</param>
	/// <param name="show">trueで表示、falseで非表示</param>
	public void ShowAdfurikunBannerAd (int index, bool show) {
		GameObject obj = GameObject.Find("AdfurikunUtility");
		if (obj != null) {
		AdfurikunUtility au = obj.GetComponent<AdfurikunUtility>();
			if (au != null) {
				if (show) {
				au.showBannerAd(index);
				} else {
				au.hideBannerAd(index);
				}
			}
		}
	}

	/// 

<summary>
	/// インタースティシャルの表示
	/// </summary>


	/// <param name="index">Index.</param>
	public void ShowAdfurikunIntersAd (int index) {
	GameObject obj = GameObject.Find("AdfurikunUtility");
		if (obj != null) {
			AdfurikunUtility au = obj.GetComponent<AdfurikunUtility>();
			if (au != null) {
				au.showIntersAd(this.gameObject, index);
			}
		}
	}

	/// 

<summary>
	/// インタースティシャル閉じる
	/// </summary>


	/// <returns><c>true</c> if this instance cancel adfurikun inters ad; otherwise, <c>false</c>.</returns>
	public void CancelAdfurikunIntersAd () {
	GameObject obj = GameObject.Find("AdfurikunUtility");
		if (obj != null) {
			AdfurikunUtility au = obj.GetComponent<AdfurikunUtility>();
			if (au != null) {
				au.cancelIntersAd();
			}
		}
	}
}

コメントにある通りですが、Start関数の中に、ShowAdfurikunIntersAdとShowAdfurikunBannerAdを呼んで、広告を表示させています!

Update関数の中では”AdfurikunUtility“ゲームオブジェクトをFindしているので、シーン上にちゃんとあることを確認してください!
また、sceneStateでシーンの状態をUpdate関数の中で確認することも忘れずに!!

基本的に公式にあるJavaScriptのソースをそのままC#に変換しただけです!
C#でどうしても組み込みたいという方は参考にしてみてくださいー^o^

以上!河条でした!

「ユーザ目線」のゲーム開発

yukiです。
現在、弊社新作ゲームアプリとして脱出ゲームを開発しております。

今回のゲームは少人数のチーム体制で、企画から練ったものになりますが、
ゲームの仕様決めに関して、えらく苦戦したのでそのお話をしたいと思います。

ゲームというのは、業務などで使うプログラムと違って、
実用性を追求したものではありません。
業務システムのように、何かを実現するために作るというのではなく、
ただ楽しむもの、面白がるためのものが、ゲームです。

ゲーム開発をするとき、ゲームの「面白さ」を考えていくわけですが、
いくら考えても、チーム内で練っていってもしっくり来なくて、悩んでました。

今思えば、考え方が間違ってたんです。
その頃の自分含むチームメンバーは「自分にとって面白いゲーム」をアイデアとして出そうとしていました。

「面白さ」というのは、主観的なものですので、意見や認識が合わないのは当然のことです。

要するに、「ユーザ目線」というのが圧倒的に欠如していたんですね。
だから、考えれば考えるほどゲームのコンセプトがブレていく。

ゲームは、自分のために作るものじゃなくて、ユーザのために作るものです。
そのゲームはどう面白いのか、誰を面白がらせるものなのか。
ターゲットを見据えなければ、ゲームは開発者の独りよがりなものでしか無くなります。

こういう感覚を得られたのは、いい経験になりました。
とても大切なことを学べたと思います。

htmlをそれぞれ分けて管理する

どうもsu-sanです。

webページを作成している際、グロナビ周りやfooterに追加の変更があった場合いちいちコピペして回るのは面倒くさいですよね?

今回はCodeIgniter、CakePHPを始めとしたCMSを使用せずにheaderやfooterをパーツ化して管理する方法を書いていきたいと思います!

まずは共通化したい部分が記述されたhtmlを作成します!ファイルネームはheader.htmlで・・・

次に読み込ませたいhtmlのheadでjqueryを読み込みます。

その直下に下記を記述します。header.htmlのglobalnavというidのdiv要素を取得して、div#navに展開する。という感じです。

読み込ませたいhtmlに

こう記述すれば完了!

これだけで簡単に共通化することができます。

皆さんも試して見てはいかがでしょうか?