むずかしいことはわかりません

いろいろ書いてるみたいな

DXRubyがRuby3.2.4(win64)環境で動かなかった件

DXRuby1.4.7で64bit対応されているということで使おうと思ったけど、

Windowが作れないエラーが出てしまうのでしばらく諦めてた

 

休みになんかしないと落ち着かないので動かないのを再調査したところ

64環境ではウィンドウが作れないことがエラーに起因しているみたいなので

その辺を調べてみた

「CreateWindow 64」みたいな適当な検索してみたら、StackOverflowで

以下のような記事があった。

stackoverflow.com

 

なにやら

>WPARAM と LPARAM は UINT_PTR と LONG_PTR で定義されている

>ポインターサイズとして定義されているので32bitと64bitじゃ

>サイズが違う
>UINTとLONGは、32bitと64bitどちらも同じサイズになる
ということらしくて、返ってくるポインタのサイズを考えれば大丈夫らしい

 

messagethread.cにウィンドウプロシージャMessageThreadWndProcがあって

こちらの定義が文字通り、UINTとLONGだった。

LRESULT CALLBACK MessageThreadWndProc( HWND hWnd,UINT msg,UINT wParam,LONG lParam )

↓ WPARAM/LPARAMに変更する

LRESULT CALLBACK MessageThreadWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )

 

あとはビルド方法に従ってビルドをすれば、dxruby.soができあがるのでテスト用に別フォルダにコピーして、requireの行をローカルから読むように修正した。

おかげさまでサンプルは起動したので当初の目標は達成。

しかし、なぜ前回起動しないなーってときにこの部分に気づかなかったのか。

が、またdxruby起動するようになってよかったよかった。

 

 

GitHubのdxRubyリポジトリはこちら

github.com

 

 

今年は一度も書いてなかった。

去年、DxRubyのアドベントカレンダーに参加したので今年もやるぞ!って思っていたんですが、すでに12月27日とかなってました。

 

今年は、いろいろとやろうと思っていたのに結局仕事が忙しい*1という理由でここまできちゃいました。

 

今年もありがとうございました。

来年もよろしくお願いします。

 

本年中は28日まで営業

新年は5日か6日から営業

 

というわけで、また来年書きます。

*1:この業界にいて、仕事が忙しいことは感謝すべきことなのはわかってんだけど納得いかない

DXRubyで昔遊んだパズルゲームを思い出して作ってみた

この記事はDXRubyAdventCalendar2015、12日目の記事です。

www.adventar.org

Advent Calendar初参加ということで、よろしくお願いします。

普段、ちょっとしたテキスト処理やDBからデータファイルを作るなどの作業でRubyを使っています。で、先日何かの記事でDXRubyを知ったので、早速いろいろ見てみました。

dxruby.osdn.jp

DXRubyは、RubyからDirectXを使ったゲーム製作に必要な機能を提供してくれるライブラリで、実際使ってみても簡単にRubyで画像表示などいろいろできました。

ゲームの内容

f:id:sato_c:20151209115757p:plain

 

昔遊んだパズルゲームなので、盤面のサイズや駒の種類など細かいルールを忘れてしまっている都合上、若干アレンジしたものになっています。

点数周りも実装していません。特殊な条件として四方が囲まれた位置に駒を置いた場合にボーナスやエフェクトがあったのですが、そういったものも判定のコメントには書いてたりしますが、実際のゲームには反映してません。

 

ソースについては、githubにありますのでご自由にどうぞ。

github.com

 

操作は、マウスで盤面を左クリックすると駒を置き、右クリックするとundoです。

undoは、最後まで駒を置ききらない限り最初まで戻れます。

 

模様と色があって、どちらか一方、もしくは両方が合致する場所にしか駒を置けません。画面中央の緑◎と赤■の交差する場所には緑■もしくは赤◎しか置けないルールです。

右上が次に置くべき駒で、その下は残り何個持っているかです。

 

中身について

dxruby_1.rb : 本体

game_board.rb : 盤面の管理をするクラス

piece.rb : 駒の管理をするクラス

 

本体は、ゲームループとゲームに関する描画を行います。

盤面の管理は、仮想ボードの管理と指定位置に駒が置けるかの判定を行います。

駒の管理は、駒の描画イメージを生成したり、駒自体の情報を管理します。

 

今回はプロトタイプみたいなものと割り切って、画面の描画部分は、すべてImageクラスの描画で済ませています。

駒の模様はすべてbox_fillなどの描画、色についてはImageの初期化で使う色指定で設定しています。(★模様もなんとなく★っぽくなりました)

盤面もlineやbox_fillくらいで済ませていますが、背景画像を読み込んでRenderTextureにコピーしてやれば、現状のままでも背景を付けることは可能だと思います。

今回はこの辺のことは一切やらずにゲームが動く方を優先しました。 

さいごに

今までもスクリプト言語でゲームを作る的な環境はいくつもあったのですが、どれもちょっと見て「なるほどなー」とあまり手を動かしてなかったのです。

今回は、Rubyで書けるのが気になったので、まずは一通り動くものを作ってみようという計画を立ててデータ待ちしてる暇な時間を使ってみました。

普段はテキスト処理やDBから拾ってきたデータ処理にしか使ってなかったRubyでゲームが作れるというのは、思いのほか楽しかったので、次はもうちょっと動きがあるものや画面遷移があるものが作れればと考えています。

 

SH-01Gを標準ADBドライバで認識させるとかなんとかいう話

Nexus5じゃなくて4.4.4の端末でも動かして見たかったけど、

手持ちのSH-01Gは標準ドライバだと認識してくれないのと

SHARPドライバは、別途ダウンロードしてインストーラでいれないとダメで

いろいろと兼ね合いも面倒なので、どうしたもんかと思ってましたが

 

.infに追加してためした↓

; SH-01G
%SingleAdbInterface% = USB_Install, USB\VID_04DD&PID_9848
%CompositeAdbInterface% = USB_Install, USB\VID_04DD&PID_9848&REV_0232&MI_01

 

AndroidStudioからも認識できたみたいで、ちゃんとデバッガで動かせたので

この件は決着したと思いたい。

 

あと、これ。Nexus5でなんでか、ドライバも入ってるし認識されてるのにadbにでてこないのの原因がこれとか、もうね。↓

OnFragmentInteractionListener その後

先日はまったActivity側にFragmentInteractionListenerがなくてはまった件ですが

落ち着いていろいろと調べて行ったところ、Activityを介してFragment間でデータの

やりとりや画面遷移を行うのに使えるものだということがわかりました。

 

そのため、必ずしも必要というわけではなくて、使わないならonAttach内にある処理を

書き換えて、何もしないとかってことも可能なように思いました。

 

というわけで、もうちょっとドキュメント読んだりしようなっていうオチ。

そして、なんでAndroid Studioは、「動作を停止しました」ダイアログでOKクリック

すると、ログを消去してしまうんだろうなっていうのが非常に印象に残りました。

 

でも、くじけない。

…とおもう。

 

must be OnFragmentInteractionListener

ActivityとFragmentのデータ交換の仕組みとして、Activity内に

public void onFragmentInteraction(Uri uri)

というのを実装しないと初期化時にエラーが出て、起動しないということに何時間か無駄にした。

#新横Unityもくもく会 第1回お疲れ様でした。

参加していただいたみなさま、お疲れ様でした。

 

やり方自体もわかってませんので、至らないところも多かったかと思いますが、2回3回と続けていきたいと思ってますので、何かありましたら教えてください。

 

 昨日話題に出てた書籍メモ

  

Android Studioではじめる 簡単Androidアプリ開発

Android Studioではじめる 簡単Androidアプリ開発

 

 

そして、今回のスライドです。