独学ツクールブログ

ツクールでのオリジナル作品の話を中心に創作関係の徒然な語り。

<< Win32APIで遊ぼう1 | main | Mateauria感想いただきました >>

[ - ] スポンサーサイト

一定期間更新がないため広告を表示しています

| 2018.02.20 Tuesday | - | - |

[ RGSS奮闘記 ] Win32APIで遊ぼう2

いや遊んでるわけじゃないんだってば(挨拶)。
ということで、今更ながら「マウスカーソル位置の取得」のために4つの関数を呼ぶというお話の続き。


順番に見ていこう。
まずは初めにGetPrivateProfileString 関数でタイトルを取得する。
これは、すでに述べたように、.iniファイルから情報を取得する関数である。
リファレンスを見てもらえばわかるが、基本的にRubyで使うための情報は無い。Win32APIクラスの仕様と合わせ、適宜自分で変換していかないといけない。
さて引数は「セクション名」「キー名」「既定の文字列」「情報が格納されるバッファ」「情報バッファのサイズ」「.ini ファイルの名前」である。
RGSS3(RPGツクールVXAce)の場合、「セクション名」は「Game」、「キー名」は「Title」、「.iniファイルの名前」である。
Rubyから呼び出す場合、どうやらStringオブジェクトは「p」とするようだ。しかしこの辺りは依然詳細不明。関数名で検索してサンプルを見ながらいろいろ変えていくしかない。

def get_title
get = Win32API.new('kernel32', 'GetPrivateProfileString', %w(p p p p l p), 'l')
title = "¥0" * 256
get.call('Game', 'Title', 'title', title, 255, "¥¥Game.ini")
title.encode!('UTF-8', 'Shift_JIS').delete!("¥0")
end

まあ正直自分でもよく分かっていない(笑)
まあ、こうするとGame.iniに記載されたタイトルが文字列として取得できるのである。
変数titleに「¥0」という謎の文字列を入れているが、これはWin32APIで文字列を操作する際はRubyで直接やるときのように気を利かせてはくれないのでC言語で扱う時のようにメモリを確保するということだ。

さて、タイトルが取得出来たら、これを使ってウィンドウハンドルをゲット。
これもまあ、記述は簡単だがやってることは正直何が何やら感。
def hwnd
f = Win32API.new('user32', 'FindWindow', %w(p p), 'l')
h = f.call('RGSS Player', get_title)
if h == 0
h = f.call('RGSS Player', nil)
end
end

FindWindow関数を呼ぶ際の引数にウィンドウのタイトルが必要なので、上記のget_titleメソッドで取得。
ちなみに、取得できないと0を返すらしいので、その場合はタイトルじゃなくnilを渡すと取得できるみたいだ。うーむ分からん(笑)

def screen_to_client(pos)
s2c = Win32API.new('user32', 'ScreenToClient', %w(l p), 'l')
s2c.call(hwnd, pos)
pos.unpack("l2")
end

ScreenToClient関数を呼ぶには、ウィンドウハンドルと座標が必要。
これは単に引数を渡すだけなので難しくはないのだが、問題は最後のunpackメソッド。
これにはもちろん訳があるのだが詳しくは次項。

def get_cursor_pos
get = Win32API.new('user32', 'GetCursorPos', 'p', 'l')
pos = [0, 0].pack("l2")
get.call(pos)
screen_to_client(pos)
end

GetCursorPosを呼び、上記のscreen_to_clientでクライアント座標に変換する。
さて、先ほどunpackがありここではpackがある。詳しくはリファレンスに譲るが、この変換はある仕様のためである。
ここでWin32関数に渡している「座標」は、実は配列などではなく「POINT 構造体」である。しかしRubyにそんなものは無いので、packでPOINT構造体と同じ状態にして渡す必要がある。リンク先にある通り、X座標とY座標をそれぞれLONGで持つことになっているので、long二つを意味する「l2」で変換しているのである。


さて、まあなんとなく頑張ってみたが、結局は分かる人にも分からない人にも意味のない話だなあこれ(笑)
次回は、本題であるすいか割りゲームの話をする予定。


タグ:[RGSS] [Win32API] [フリゲ展夏] [GetCursorPos] [ScreenToClient] [FindWindow] [GetPrivateProfileString]



| 2016.06.28 Tuesday 00:08 | comments(0) | trackbacks(0) |

[ - ] スポンサーサイト

| 2018.02.20 Tuesday 00:08 | - | - |

コメント

コメントする






この記事のトラックバックURL

トラックバック

このページの先頭へ▲

Twitter

WebClap

Blogram

ブログランキングならblogram

calendar

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
2930     
<< April 2018 >>

categories

archives

Amazon

selected entries

recent comment

recent trackback

recent ranking

links

search this site.

sponsored links

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM