画素値へのアクセスについて:
ちょっと画像の画素値をいじくってたんだけど、どうも変な感じ・・・
改めて確認すると、なぜか画素値にマイナスの値が格納されている。
え、画素って0〜255じゃないの?と思ってよくよく見ると、IplImage使って呼び出したときの画素値はchar型らしい。
というわけで、
IplImage* img; int x, y; int data = (unsigned char)img->imageData[y*img->widthStep + x]
こんな感じでいいですかね。
ボールたちが動いていって反射するプログラム
ボールが動いていくプログラム の続きみたいなもの。
とりあえず反射させてみる+ボールのクラスを作ることでボールを増やすことが可能になりました!これぞオブジェクト指向ってやつだね
主な変更点は
・WinodowListenerの追加(閉じるボタンで閉じるようになった)
・反射させた(簡単なif分の追加)
・クラスを三つに分けた(メイン、キャンバス、ボール)
ってところ。
続きを読むボールが動いていくプログラム
いつかゲームが作れたらいいねなんて思ってる人はきっと多いと思う。
かくいう自分もその一人で、ようやく思ってるだけから実行に移そうかなとか考え中。
ちょうどJavaをやる機会があったのでとりあえずボール動かしてみたよ。次の目標は壁での跳ね返りだね。
まともに参考にするならこちらのサイトが良いと思います。
多くのサンプルコードもあってとてもありがたい。
参考:ボールを動かす - 人工知能に関する断想録
ソースは続きを読むから:
続きを読むjarファイルをexeファイルに変換するソフト:exewrap
授業の課題でJavaのプログラムを書いてソース+exeファイルを提出、というのがあったので。
exewrap:http://www.ne.jp/asahi/web/ryo/exewrap/
を使ってexeを作成した。
File->Export->Jarファイルでjarファイルを作成し、D&Dでexeファイルが出来る。
似たようなソフトは結構あるみたいだけど、ひとまずjarから変更出来ればよかったので比較はしてないです
Delegateを使ってマルチスレッドをおこなうサンプルコード
forループしながら数字を出力し続ける関数を二つ作り、それぞれ別スレッドを立てて実行。
しかし無駄なステップが多いんじゃないかなこの作業・・・
1.ThreadStartに関数を登録(デリゲート化)
2.ThreadにThreadStart型の関数を登録
3.Thread型の関数->Startでスレッド開始
#引数と戻り値これどうやって使うんだろ
#ThreadStartはvoid Function(void)だから、もしかして使えない?
ソースは続きを読むからどうぞ:
続きを読む^System::Stringを*charにして使いたい
VisualStudioを使ってC++/CLIを書き始めた。
それにOpenCVやOpenGLを絡めて画像を扱うとする。
C++/CLIでファイル名なんかのデータは基本的にSystem:Stringで与えられるが、
他のプログラムに渡そうと思ったら*char型への変換が必要。
#OpenCVのcvLoadImageとか
そこでその変換方法。
System::Runtime::InteropServices::Marshal::StringToGlobalAnsi
を使ってchar*型のポインタに変換、代入し、使い終わったchar*を
System::Runtime::InteropServices::Marshal::FreeHGlobal
で開放してやると良い、らしい。どっちも長い。
画像処理ソリューション:【C++/CLI】System::String^からchar*へ変換
http://imagingsolution.blog107.fc2.com/blog-entry-89.html
よりほぼ抜粋。感謝!
OpenFileDialog^ dlg = gcnew OpenFileDialog;
dlg->Filter = "ビットマップ(*.bmp)|*.bmp";
dlg->ShowDialog();//System::String^からchar*へ変換
char* pStr = (char*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(dlg->FileName).ToPointer();
IplImage *src_img = cvLoadImage(pStr, CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
System::Runtime::InteropServices::Marshal::FreeHGlobal(IntPtr(pStr));