最近、BMPを手動で表示するとかいう謎のプログラムを延々と拡張、修正を繰り返してまして(勉強しろ)
折角ピクセル単位での色の管理ができるんだから明るさとか、白黒の境目を変更してみよう、とか思って
やってみました。
[BBvideo 640,480]
http://i.gyazo.com/193a5e51b5bd61273da309f1d2a87e13.mp4[/BBvideo]
うん、いいね、
と思って、フルカラーでの明るさの変更してみようかなーと思って適当に値足してたら案の定、規格外の値を渡してしまいまして。
(GetColor(int r,int g,int b) 0-255の値を渡すとDxLibで使える色の値が帰ってくる)
まぁ、そのまま動かしちゃえってことで、動かしちゃいました。
[BBvideo 640,480]
http://i.gyazo.com/2d12d48a1564df2e780321e08d70dcdb.mp4[/BBvideo]
なにこれキモい。
謎の動きをするようになってしまいました。でもこういうのは見てて楽しいですよね、それに原因が何なのかなーとか考察するのもまた面白い。(まだわかってないけど)
昔初代ファミコンで、スーパーマリオブラザーズにて、テニスというソフトをしながら適当に歩いてソフトを抜いてマリオのカセットを入れると、
256面と呼ばれる様々なステージで遊べるというモノが話題になりました。
ソレはたまたまマリオのワールドを格納するアドレスとテニスの歩数を格納するアドレスが一致していたために起きたようです。
つまり「バグ」の一種なんだろうと思います。もちろん8面以降のデータはありませんから、完全に規格外の動作をしていたわけです。
なのにステージとして確立している面もありましたし、見てるだけで昔の私はワクワクしていたのを覚えています。
まぁ私のプログラミングという存在を知り、始めるきっかけになったのは殆どコレが原因だったりするんですけどね。
やはり規格外という動作には未知の可能性を感じます。あまりにも無理やりな動作をさせるといろいろなところにダメージが及ぶ可能性もありますが、
またそれもドキドキ感があって素晴らしい。
仕様書通りの動作を求める職業においてのプログラマにとってはバグは永遠の敵ですが、趣味でするなら逆に楽しいものでもあるんだなー
と、なんとなく感じたHiragi(GKUTH)なのでした。
#この日記は動画貼り付けのテストでもある。なんかレイアウトが...
► スポイラーを表示
BMP.cpp
CODE:
#include "DxLib.h"
#include "BMP.h"
#include
//あらかじめ白と黒は宣言しておく
int black = GetColor(0, 0, 0);
int white = GetColor(255, 255, 255);
void BMP_Init(img_t *img)
{
img->bw = BMP_BLACKORWHITE;
}
//画像のロード
bool BMP_Load(unsigned char data[TOTAL])
{
char name[256] = "111.bmp"; //画像の名前
FILE *fp; //ファイルの構造体
fp = fopen(name, "rb"); //読み込み
if (fp == NULL) //失敗すれば
{
printfDx("%sが見つかりませんでした", name);
fclose(fp); //閉じて
return false; //falseを返す
}
fread(data, TOTAL, 1, fp); //そうでなければロードさせる
fclose(fp); //閉じて
return true; //終了
}
//データを扱いやすく変換
void BMP_Convert(img_t *img,unsigned char data[TOTAL])
{
int x, y, c, t;
t = BMP_HEADER;
//y方向へのロード
for (y = BMP_HEIGHT - 1; y >= 0;y--)
{
//x方向へのロード
for (x = 0; x pixel[y][x].color[c] = data[t]; //ヘッダ以降のデータを実際に代入
t++; //次のデータにイクリメント(unsigned char分足す)
}
}
}
}
//描画
void BMP_Draw(img_t *img,int MODE)
{
int x, y;
int s_time = GetNowCount();
int e_time = 0;
DrawBox(0, 0, BMP_WIDTH, BMP_HEIGHT, white, true);
//y方向へ描画
for (y = 0; y pixel[y][x].color[2] + img->bw, img->pixel[y][x].color[1] + img->bw, img->pixel[y][x].color[0] + img->bw));
break;
case GLAY:
DrawPixel(x, y, GetColor(img->pixel[y][x].color[0] + img->bw, img->pixel[y][x].color[0] + img->bw, img->pixel[y][x].color[0] + img->bw));
break;
case MONO:
//白か?黒か?
if (!((img->pixel[y][x].color[0] + img->pixel[y][x].color[1] + img->pixel[y][x].color[2]) / 3 >= img->bw))
DrawPixel(x, y, black); //白く描画
break;
}
}
}
if (CheckHitKey(KEY_INPUT_Z) != 0) img->bw--;
if (CheckHitKey(KEY_INPUT_X) != 0) img->bw++;
DrawFormatString(120, 0, GetColor(255, 0, 0), "Brightness %d", img->bw);
e_time = GetNowCount();
DrawFormatString(0, 16, GetColor(255, 0, 255), "BMP_Draw %d[ms]", e_time - s_time);
}
//未実装でーす
void BMP_Encode(img_t *img)
{
int x, y;
for (y = BMP_HEIGHT - 1; y >= 0; y--)
{
for (x = 0; x < BMP_WIDTH; x++)
{
//ココに圧縮する処理を書く?(たぶんzipと同じ方式にするか? 0 or 1)
}
}
}
//未実装でーす
void BMP_Decode()
{
//デコードの処理
}