2018年01月08日

IchigoJamの疑似グラフィックでドット絵を描いてみる

こどもパソコンIchigoJamには標準ではグラフィック機能は無くて文字しか表示できないのですが、正方形の記号をちょうど田の字に4分割した16種類の文字の組み合わせで疑似的なグラフィックを描くことができますので、プロ生ちゃんドット絵を描くプログラムを作成してみました。
まず、元となるドット絵を描いてみます。
IchigoJamはプログラムで使えるメモリが1KByteくらいしかないので、余裕をみて今回は32x32ドットとしています。
プロ生ちゃんドット元絵
1から描いてもよかったのですが、工期短縮のためドット絵はT-Naさんの「8Bit ゲーム機風ドット絵プロ生ちゃん」素材を参考にさせていただきました。ありがとうございます。
(※4隅の■は目印用です)
このドット絵を16文字×16文字に変換するのですが、今回は一部で悪名高い方眼紙エクセルにてセルに埋め込む関数を駆使してBASICのデータを作成するようにしてみました。
ドット絵変換用方眼紙エクセル
ドット絵のデータは配列に定義してプログラムで展開して表示するようにします。
IchigoJamの配列変数は16進4桁まで扱えるので、メモリ節約のため4文字分を1要素に入れるようにしました。
プログラムは前半でドット絵データを配列に定義しています。
後半にてFOR文で回しながら1要素あたり4文字分を論理演算で展開して表示しています。
10 REM pronama-chan dot picture @machuoka
20 CLS
30 LET [0],#1800,#0000,#0000,#0090
40 LET [4],#0180,#0000,#9008,#0900
50 LET [8],#0050,#4200,#0050,#4209
60 LET [12],#081A,#A004,#00A4,#5042
70 LET [16],#0505,#A005,#6529,#A055
80 LET [20],#E8BD,#008C,#6F47,#20E8
90 LET [24],#A061,#0000,#9555,#09B9
100 LET [28],#B01D,#0809,#F3F5,#51A1
110 LET [32],#E554,#AAD8,#0992,#55A5
120 LET [36],#B551,#1B65,#5D20,#061D
130 LET [40],#AAA5,#00E2,#0000,#0039
140 LET [44],#950A,#4005,#0000,#0A05
150 LET [48],#4242,#0009,#6080,#4655
160 LET [52],#5000,#2490,#0612,#D9D7
170 LET [56],#AA00,#D60A,#80EC,#01A1
180 LET [60],#0100,#6509,#A951,#0050
190 I=0
200 FOR Y=0 TO 15
210 LOCATE 8,Y+4
220 FOR X=0 TO 15 STEP 4
230 D=[I]:I=I+1
240 FOR J=1 TO 4
250 C=D&#000F:D=D>>4
260 PRINT CHR$(C+#80);
270 NEXT:NEXT:NEXT
280 LOCATE 0,22
290 END
実行するとこんな感じでドット絵が出てきます。
実行イメージ
プロ生ちゃんに見えますよ…ね!?
IchigoJamの仕様的には64x48ドット表示できます。1KByteのメモリにもぎりぎり入るようです。
今回の上記のプログラムではもう800Byte近く使っているのでこの方法では無理そうです。
直接PRINT文でグラフィックキャラクターを表示するのであればあるいは…??
続きを読む
posted by まちゅ at 03:20| Comment(0) | プログラミング

2017年02月01日

FuelPHPで日またぎ時にログファイルの切り替えをする

FuelPHPのtasks(バッチ)などを常駐させたり、処理に時間がかかって日をまたいた時など、ログファイルを切り替えたい時があったのでちょっと調べてみました。
ていうか、FuelPHPは処理が終わるまでログファイル切り替えてくれないんで困っていたんです!

coreのLogクラス ( fuel/core/classes/log.php) のソース追っかけてくとこんな感じで書き出しているみたい(FuelPHP1.7の場合)。
		// log the message
		static::instance()->log($level, (empty($method) ? '' : $method.' - ').$msg);

		return true;
	}
さらに、instance()を追ってくと、
	/**
	 * Return the monolog instance
	 */
	public static function instance()
	{
		// make sure we have an instance
		static::$monolog or static::_init();

		// return the created instance
		return static::$monolog;
	}
こんな感じになってました。
うーん、シングルトンパターンかー。なるほど。
ログファイル名の設定はインスタンス作成時にしかやってないので、これだとログの日付は終了するまで変わらんですなー。
とはいえcoreにあまり手を入れたくないし動作確認などの影響もあるので、インスタンスを破棄すれば再度初期化処理が走るからいいんじゃないかなー、くらいで考えておりました。
んじゃどうやって破棄すりゃいいのかな、と調べてましたらこんなページを見つけました。

基底クラスのstaticメンバ変数を継承先のクラスで書き換えると、別クラスのインスタンスにも影響する

なるほど。継承先のクラスから基底クラスのメンバ変数を変更できるんですな。
つまり、coreのLogクラスを継承してインスタンスを破棄するメソッドを作成して、日をまたいだらこのメソッドを呼んであげればいいんですな。
<?php

class myLog extends Fuel\Core\Log {

	/*
	** 日付またぎ用メソッド
	** Logクラスのインスタンスを破棄して新たに作成させる
	*/
	public static function nextday() {

		self::$monolog = null;
	}
}
こんな感じで一応ちゃんとログが切り替わります。
このあたりの日またぎ時のログの情報がググってもぜんぜん出てこないのなんで…?
みんな困ってないの…?
タグ:PHP
posted by まちゅ at 14:30| Comment(0) | プログラミング