|
|
|
2015/9/6(Sun) 23:50:08|NO.71423
hgimg3のフルスクリーンだと、ウィンドウオブジェクトが使えないので
直接描画で表示する命令を追加するモジュールです。
(ついでに色や透明度も簡単に設定出来るようにしてみた)
このモジュールは、ウィンドウオブジェクトを画面外に配置して
その情報を基に、画面内に直接描画を行います。(OSの仕様変更で使えなくなる可能性はある)
なので、ウィンドウオブジェクトを直接操作すると、ある程度反映されます。
hgButtonやhgChkboxのスタイル変更でラジオボタンにも出来ます。
このスレのアドレスをモジュールに書き込みたいので後でモジュールのURLをレスします。
////////主な命令///////
//<<<<<<<<<<<<<<<<<<< hgInput関係の命令 >>>>>>>>>>>>>>>//
hgInput 入力のための変数, Xサイズ, Yサイズ, 最大文字数, フレームテクスチャID, 枠の幅, 枠画像のタイプ, 枠のコピーモード , アルファ値 //hgimg3用のinputを設置(描画はhgallwinobjdrawを実行)「枠画像のタイプ値 0=64*64のテクスチャを作る、1=指定サイズの枠を使いテクスチャを作る」
テクスチャid = hgMakeInputFrame(framecol, fs, frame_id, p_ft, p_sx, p_sy) //hginput枠の色と幅を指定してテクスチャを作ってID取得「framecol=外枠左と上,内枠左と上,内枠右と下,外枠右と下 の様に入れる 色指定は16進数で$RRGGBBの並び」
hgSetInputPos hginputID, 左上X座標, 左上Y, Xサイズ, Yサイズ5, 動作スイッチ //hginputを移動サイズ変更(動作スイッチが0なら設定値がそのまま使われ1なら増減地として使われる)
hgSetInput hginputID, 設定項目, pa, pb, pc //hginput内表示設定
//------------hgSetInputで使用する設定項目---------------------//
HGINPUT_INIT = -1 //(-1)初期化「pa,pb,pcは無視される」
HGINPUT_RGB_GMODE //(0)INPUT文字列の色とコピーモードアルファ値を指定「pa=色($RRGGBB),pb=コピーモード(gmodeのp1と同じ),pc=アルファ値(gmodeのp4と同じ)」
HGINPUT_BG_RGB_GMODE //(1)INPUT背景 同上
HGINPUT_CARET_RGB_GMODE//(2)INPUTキャレット 同上
HGINPUT_SEL_RGB_GMODE //(3)INPUT選択範囲文字列 同上
HGINPUT_SELBG_RGB_GMODE//(4)INPUT選択範囲背景 同上
HGINPUT_MODE //(5)INPUTの設定スイッチ「pa=hginput背景等の表示非表示切替(*A:別途説明),pb=hginput背景等の表示設定(*B:別途説明),pc=hginput内マウスカーソル関係の設定(*C:別途説明)」
HGINPUT_ENUMEND
//////////////////////////////////////////////////////////////
hgSetIme 設定項目, pa, pb, pc //hginput使用時のIME入力窓内の色や変換候補リストの色と候補数サイズを設定
//------------hgSetImeで使用する設定項目---------------------//
IMESETTING_INIT //(-1)初期化「pa,pb,pcは無視される」
IMECOLOR_INPUT //(0)IME入力中文字列の色とコピーモードアルファ値を指定「pa=色($RRGGBB),pb=コピーモード(gmodeのp1と同じ),pc=アルファ値(gmodeのp4と同じ)」
IMECOLOR_INPUTBG //(1)IME背景 同上
IMECOLOR_CARET //(2)IMEキャレット 同上
IMECOLOR_ATTR_INPUT //(3)IME入力中下線 同上
IMECOLOR_ATTR_TARGET_CONVERTED //(4)IME変換選択中下線 同上
IMECOLOR_ATTR_CONVERTED //(5)IME変換済下線 同上
IMECOLOR_ATTR_TARGET_NOTCONVERTED //(6)IME選択中矩形 同上
IMECOLOR_ATTR_INPUT_ERROR //(7)IME無効な文字 同上
IMECOLOR_CANDIDATE //(8)IME変換候補リスト文字列 同上
IMECOLOR_CANDIDATEBG //(9)IME変換候補リスト背景 同上
IMECOLOR_SELECT //(10)IME変換候補リスト選択中 同上
IMECANDIDATE_SIZE //(11)IME変換候補リストの表示数、文字サイズ、リスト表示最大Xサイズ「pa=表示数,pb=文字サイズ,pc=最大Xサイズ」
IMESTRING_LINE_BREAKS //(12)IME文字列を改行するかどうか 「pa=0なら改行 1なら改行しない」
IMECOLOR_CANDIDATE_END
//////////////////////////////////////////////////////////////
hgSetImeStatus 設定項目, pa, pb, pc //hginput使用時のIME入力変換モード表示設定
//------------hgSetImeStatusで使用する設定項目---------------------//
IMESTATUS_INIT = -1 //(-1)初期化「pa,pb,pcは無視される」
IMESTATUS_POS //(0)ステータス表示位置「pa=-1〜7(0=ウィンドウ左上基点、1=input左基点、2=TOPをinputと合わせる、4=input右基点、8=BOTTOMをinputと合わせる) 、ab=X座標調整、pc=縦座標調整」
IMESTATUS_SIZEADJUST //(1)通常input縦サイズと同じになるスータスの大きさを調整「pa=通常サイズから調整する数値」
IMESTATUS_MAXSIZE //(2)通常は最大表示サイズ64なのを変更「pa=最大表示サイズ」
IMESTATUS_VISIBLE //(3)ステータス表示非表示「pa=0〜3 (0=両方非表示、1=入力モード表示、2=変換モード表示、3=両方表示)」
IMESTATUS_WINSWAP //(4)両方表示する場合の表示順序入れ替え「pa=0〜1(0=入れ替えしない、1=入れ替えする)」
IMESTATUS_POSXADJUST //(5)二つ表示される場合に間を空ける「pa=空ける幅」
IMESTATUS_RGBGMODE //(6)ステータス文字色「pa=色($RRGGBB)、pb=標準命令のgmodeのp1と同じ(2〜6)、pc=gmodeのp4と同じ」
IMESTATUS_BGRGBGMODE //(7)ステータス背景色「pa=色($RRGGBB)、pb=標準命令のgmodeのp1と同じ、pc=gmodeのp4と同じ」
IMESTATUS_END
//////////////////////////////////////////////////////////////
hgImeStatus 入力モード用インデックス, 変換モード用インデックス, パラメータを入力にするか出力にするか指定, IMEコンテキストハンドル //IMEの現在のモードを取得設定
hgOnkey_Gosub *label //コールバック用モジュールをインクルードしてない場合はonkeyが使われるので、メイン側でもonkeyを使いたい場合のマクロ
hgClrInput //hginputを全て削除(個別に削除したいときは標準命令のclrobjにIDを指定してください)
//<<<<<<<<<<<<<<<<<<< hgWinObj(hgbutton,hgchkbox,hglistbox,hgcombox)関係の命令 >>>>>>>>>>>>>>>//
hgButton ボタンの名前, ラベル名, 動作設定, 文字色($AARRGGBB), 背景色, フェードインフレーム数 //hgimg3用のbuttonを設置(描画はhgallwinobjdrawを実行)
hgChkbox 内容表示文字列, 状態を保持する変数, 動作設定, 文字色($AARRGGBB), 背景色, フェードインフレーム数 //hgimg3用のChkboxを設置(描画はhgallwinobjdrawを実行)
hgListbox 状態を保持する数値型変数, 拡張Yサイズ, 内容を示す文字列, 動作設定, 文字色($AARRGGBB), 背景色, フレーム色, フェードインフレーム数 //hgimg3用のListboxを設置(描画はhgallwinobjdrawを実行)
hgCombox 状態を保持する数値型変数, 拡張Yサイズ, 内容を示す文字列, 動作設定, 文字色($AARRGGBB), 背景色, フレーム色, フェードインフレーム数 //hgimg3用のComboxを設置(描画はhgallwinobjdrawを実行)
hgObjImage テクスチャID, 通常時左上X座標, 通常時左上Y座標, 押し下げ時X, 押し下げ時Y, マウスオーバー時X, マウスオーバー時Y, ボタン名表示マージン, ボタン名を横移動させるドット数, ボタン名を縦移動させるドット数 //カスタムボタンを配置するための設定(hgbutton,hgchkboxに反映)
hgWinObjArgb hgwinobjID, 設定項目, 透明度と色 //hgwinobjの透明度と色を$AARRGGBB形式で設定
透明度と色 = hgGetWinObjArgb( hgwinobjID, 取得項目) //hgwinobjの$AARRGGBB形式で色取得
hgSetWinObjOptTim hgwinobjID, 動作設定, フェードインフレーム数 //hgwinobjの動作設定とフェードインフレーム数設定
hgGetWinObjOptTim hgwinobjID, 動作設定, フェードインフレーム数 //hgwinobjの動作設定とフェードインフレーム数取得
hgWinObjValid hgwinobjID, 追加するスタイル, 削除するスタイル //hgwinobjを有効にし描画されるようにする
hgWinObjInvalid hgwinobjID, 削除スイッチ //hgwinobjを無効にし描画処理から除外する(削除スイッチが0以外なら削除)
hgSetWinObjPos hgwinobjID,左上X座標, 左上Y, Xサイズ, Yサイズ5, 動作スイッチ //hgSetInputPosと同じ IDにはhgbutton,hglistbox,hgcombox,hgchkboxのIDを指定
hgClrWinObj //hgwinobjを全て削除(個別に削除したいときは標準命令のclrobjにIDを指定してください)
//<<<<<<<<<<<<<<<<<<< hgAllWinObj(hginput,hgbutton,hgchkbox,hglistbox,hgcombox)関係の命令 >>>>>>>>>>>>>>>//
hgTexMakeMode 作成モード //メッセージテクスチャ(inputやime,button等の文字部分のテクスチャ)の作成モード設定
hgSetAllWinObjStyle hgallwinobjID, 追加するスタイル値, 削除するスタイル値 //hgallwinobjのスタイルを変更
hgGetAllWinObjPos hgallwinobjID, 左上X座標, Y座標, Xサイズ, Yサイズ //hgallwinobjdraw実行時の左上座標とサイズを取得
hgAllWinObjDraw //hginput&hgwinobj描画命令(直接描画なので通常hgdrawとhgsyncの間に配置)
hgSetParent 子hgallwinobjID, 親hgallwinobjID //指定された子の親を変更します
hgAllWinObj_reset //モジュール初期化「hgreset等のテクスチャがクリアされる命令を使用した時だけ実行してください」
//<<<<<<<<<<<<<<<<<<< その他の命令 >>>>>>>>>>>>>>>//
InvertColor 元の色($RRGGBB)、反転赤、反転緑、反転青 //色を反転して取得(中間より64以上差が無ければ0か255にする)
hgLineRect 左上X座標, 左上Y, Xサイズ, Yサイズ //ラインで四角を描く
hgDotLineRect 左上X座標, 左上Y, Xサイズ, Yサイズ, ドット数, 点の描画位置をずらす数値 //ラインか点線で四角を描く----
hgGetMouse マウスX,マウスY //現在のマウス座標を取得(hginput等の上でマウスドラッグするとmousex等は動かないので)
hgDotLineBox 左上X, 左上Y, 右下X,右下Y, ドット数, 点の描画位置をずらす数値 //四角形の左上隅、右下隅を指定してラインか点線で描画
hgLineBox 左上X, 左上Y, 右下X, 右下Y //四角形の左上隅、右下隅を指定してラインで描画
hgDotLine 開始X座標, 開始Y座標, 終了X座標, 終了Y座標, 点の長さ, 点の描画位置をずらす数値 //点線描画
//<<<<<<<<<<<<<<<<<<< hgAllWinObjDraw実行後に更新されるグローバル変数 >>>>>>>>>>>>>>>//
HGALLWINOBJ_ACT //フォーカスが合っている種類が代入される「-1=合ってる物がない、0=HG系以外の物に合ってる、1=hginput、2=hgwinobj」
HGMOUSEX, HGMOUSEY //hgallwinobjdraw実行時のマウス座標(ウィンドウオブジェクト内でドラッグすると標準のmousex,yが使えない)
HGMOUSE_POINT_ID //マウスカーソルの下にあるhginputかhgwinobjのIDが代入される「-2=ウィンドウ外、-1=ウィンドウ内だが何も無い、0以上=hginputかhgwinobjのID」
HGINPUT_MOUSE //hginput内で直接描画のマウスカーソルを使うためのフラグ「-2=ウィンドウ外、-1=hginput以外の標準オブジェクト、0=ウィンドウ内だがhginput外、1=hginput内」
HGMOUSE_POINT_COLOR //マウスカーソル下のhginputかhgbuttonの背景色「hginputなら$RRGGBB、hgwinobjなら$AARRGGBB」
HGMOUSE_LAST_POINT_DISABLED //最後にマウスカーソルの下にあったhginputかhgwinobjが有効だったかどうか「0=無効、1=有効」
HGMOUSE //標準マウスカーソルが表示中かどうか「0=表示中、-1=非表示中」(hgAllWinObjDraw内での表示切替を反映)
HGMOUSE_MOVEX, HGMOUSE_MOVEY //マウスの移動量
・標準ウィンドウオブジェクトとの違い
hginputのキャレットがドット単位での色反転してない(背景色に対しての反転だけ)
hginputにフォーカスが合ってる時に[ESC]を押してもビープ音が鳴らない(これは意図的に鳴らないようにしてる)
hginputがパスワードスタイルの時に[Ctrl+C]してもビープ音が鳴らない(これも意図的に鳴らないようにしてる)
hginput上で右クリックしてもメニューは出ない
IME入力文字がinput枠を超えた時に改行するのは一段だけ
IME入力ウィンドウはマウス判定してないのでクリックできない
変換候補ウィンドウはマウス判定してないのでクリックできない
変換候補を数字キーで選べない(ナンバーも付けていない)
hgbutton等がマウスオーバーする(白を加算コピーしてるだけだが)
hglistboxやhgcomboxの選択中項目文字が色反転しない(手抜き・・・)
hgcomboxのリストにスクロールバーは付かない(手抜き・・・)
hgcomboxはリストをクリックした時に決定する(標準のは離された時)
hgObjImageがhgchkboxにも反映される(hgchkboxの場合はマウスオーバーは無し)
簡単な使い方
#include "hgimg3.as"
#include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude
hgini
setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode)
texload dir_exe+"\\sample\\hgimg3\\fontchr.bmp" ; フォントテクスチャの登録
text="テスト"
font "MS 明朝",28,16+1 //必ずフォントの設定が必要
pos 50,200
hginput text,200,32 //直接描画用のinputを設置
font "MS ゴシック",20,16
objsize 150,24
pos 50,240
hgbutton gosub "listに追加",*title_put //直接描画用のhgbuttonを設置
objsize 100,24
hgchkbox "テスト",c //直接描画用のhgchkboxを設置
objsize 150,24
list="あいうえお\nかきくけこ\nさしすせそ\nたちつてと\n"
pos 300,150
hglistbox l,,list //直接描画用のhglistboxを設置
lbid=stat
font "MS ゴシック",16,0
cmlist="あいうえお\nかきくけこ\nさしすせそ\nたちつてと\n"
hgcombox cm,,cmlist //直接描画用のhgcomboxを設置
cmid=stat
clscolor $4444
hgact_mes="NotObj","WinObj","hgInput","hgWinObj"
repeat
stick stk
if stk=128 {end}
hgdraw
hgAllWinObjDraw //hgAllWinObjを描画
imebuf=refstr //ime入力中文字列
actid=stat //フォーカスが合ってるhgAllWinObjID
fprt "HGALLWINOBJ_ACT ["+HGALLWINOBJ_ACT+"] "+hgact_mes(HGALLWINOBJ_ACT+1),8,20
fprt "HGMOUSE_POINT_ID ["+HGMOUSE_POINT_ID+"] ",8,40
fprt "HGINPUT_MOUSE ["+HGINPUT_MOUSE+"] ",8,60
color RGBtoCOLOR(HGMOUSE_POINT_COLOR)
gmode 0
hgrect 250,88,0.0,20,20
fprt "HGMOUSE_POINT_COLOR ["+strf("$%08X",HGMOUSE_POINT_COLOR)+"] ",8,80
fprt "HGMOUSE ["+HGMOUSE+"] ",8,100
hgsync 16
title ""+text+" c="+c+" l="+l+" cm="+cm+" imebuf="+imebuf+" actid="+actid
loop
*title_put
list+text+"\n"
objprm lbid,list
objprm lbid,l
cmlist+text+"\n"
objprm cmid,cmlist
objprm cmid,cm
return
全て標準ウィンドウオブジェクト使用時と同じように使えます。
注意としては直接描画命令が奇数サイズの描画が出来ないので
フォントも含めてサイズ設定は全て偶数にした方が良い
(フォントは描画サイズが変わってしまう事があるが・・・)
途中まで奇数サイズに対応したが、馬鹿らしくなった・・・
(hgrectはまだ許せるけどhgrotateは文字の場合致命的)
| |
|
2015/9/7(Mon) 01:08:11|NO.71425
モジュールのURL
http://ux.getuploader.com/himajin130414/download/7/mod_hgAllWinObj.hsp
・標準ウィンドウオブジェクトとの違い(追加)
hglistbox,hgcomboxに変更があった場合は一度に全項目の描画は行わずに一行づつになる
hgbutton等の名前は \n で改行するスタイル変更では改行しない
文字用テクスチャは設置時に作成されるので、後からこれを超える文字列が入力されると描画されない
(対策としては大きめに作ってからhgSetInputPos,hgSetWinObjPosで必要サイズに小さくする)
少し設定を変更してみる
#include "hgimg3.as"
#include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude
hgini
texload dir_exe+"\\sample\\hspcv\\bgsamp.jpg"
clstex stat
hgSetImeStatus IMESTATUS_VISIBLE,1 //入力モード表示
text="テスト"
font "MS 明朝",28,16+1 //必ずフォントの設定が必要
pos 50,200
hginput text,200,32 //直接描画用のinputを設置
ipid=stat
hgSetInput ipid,HGINPUT_BG_RGB_GMODE,$00ffff,3,100 //hginputの背景を青水色にして半透明 文字は水色の反転色になる
font "MS ゴシック",20,16
objsize 150,24
pos 50,240
//押し下げ時にジャンプの場合必ずgosubにする必要がある
hgbutton gosub "点線表示",*dotline,1+2+4+16+32,$ff00ff00,$88888888,100 //押し下げ時にジャンプ+点線枠非表示+スペースでボタンを押せなくする+押してる間常にジャンプ+押してる間以外フォーカスを合わせない //100フレーム使ってフェードイン
repeat
stick stk
if stk=128 {end}
hgdraw
hgAllWinObjDraw //hgAllWinObjを描画
imebuf=refstr //ime入力中文字列
actid=stat //フォーカスが合ってるhgAllWinObjID
hgsync 16
title ""+text+" c="+c+" l="+l+" cm="+cm+" imebuf="+imebuf+" actid="+actid
loop
*dotline
gmode 0
color 255,0,0
hgDotLine 0,0,640,480,5,gettime(7)/20 //5ドット点線描画
return
| |
|
2015/9/8(Tue) 21:57:03|NO.71506
hgObjImage にもバグがあった、押し下げ時に設定通りの座標が使われない
修正ついでにスタイルが変更されたら文字色を反映するように変更 mod_hgAllWinObj.hsp v1.11
http://ux.getuploader.com/himajin130414/download/10/mod_hgAllWinObj.hsp
・標準ウィンドウオブジェクトとの違い(追加)
描画順が作られた順(重なってボタンを押した場合後から作られたものが優先される)
hginputはフォーカスが合ってる物が最後に描画される
作成順に関係なくhgwinobjよりhginputが後で描画される(処理が完全に分かれてるので)
BS_MULTILINE、ES_MULTILINEの複数行を可能にするスタイルは反映されません。
BS_MULTILINEの場合設定しなくても文字列に改行を入れれば複数行になります。
後、仕様として
hgWinObjArgb id,0,色 //透明度は直ぐに反映される
hgSetInput id,HGINPUT_RGB_GMODE,色
の設定は文字列かスタイルの変更がなければ反映されません(無駄にtexmesしてしまう可能性があるので)
文字列を変更せずに色を反映させたい場合はhgWinObjならBS_MULTILINE
hginputならES_MULTILINEのスタイルを変更することで文字色の変化だけに出来ます。
パスワードキャラ設定のhginput
hgMakeInputFrame()を使ったhginput
hgObjImageを使ったhgchkboxとhgbutton
hgchkboxを文字表示だけに使うサンプル
hgSetWinObjPosもちょっと使用
#include "hgimg3.as"
#include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude
hgini
setcolor 255,255,255
addbox mdid,12,12 ; BOXモデルを作成
regobj mychr,mdid ; BOXモデルをオブジェクトとして登録
setpos HGOBJ_CAMERA, 0, 0, 20 ; カメラ位置設定
texload dir_exe+"\\sample\\hgimg3\\q.bmp"
mest = stat
texmake 256,32
ntexid=stat
texcls ntexid,0
font "MS ゴシック",22,16+2
color 128,128,128
texmes "Name",ntexid,8,8
texmake 256,32
ptexid=stat
texcls ptexid,0
font "MS ゴシック",22,16+2
color 128,128,128
texmes "Password ",ptexid,8,8
texmake 256,32
name_texid=stat
texcls name_texid,$88888888
font "MS ゴシック",28,16
color 0,255,255
texmes "name:",name_texid,2,2
hgSetImeStatus IMESTATUS_VISIBLE,1 //IME入力モード表示
font "MS 明朝",30,16
pos 50,200
framecol=$4444ff,$222288,$222288,$4444ff //外枠左と上,内枠左と上,内枠右と下,外枠右と下
fid = hgMakeInputFrame(framecol,4) //4ドットのフレームをノーマルタイプで作成
name_str=""
hginput name_str,250,40,,fid,,,3,200 //hgMakeInputFrameで作ったフレームテクスチャを指定 フレームを半透明設定
iid=stat
objenable iid,0 //フォーカスを外すために一旦無効化して
objenable iid,1 //有効に戻す
hgSetInput iid,HGINPUT_RGB_GMODE,$ffffff //hginputの文字色を変更
hgSetInput iid,HGINPUT_BG_RGB_GMODE,$885500,3,255 //hginputの背景色を変更し半透明指定
hgSetInput iid,HGINPUT_MODE,,,3+4 //通常カーソル非表示にして直接描画カーソル表示+hginput外をクリックするとフォーカスが外れる
pas_str=""
hginput pas_str,250,40,,fid,,,3,128 //hgMakeInputFrameで作ったフレームテクスチャを指定 フレームを半透明設定
pid=stat
sendmsg objinfo(pid, 2), $CC, '*' //パスワードキャラ設定
hgSetInput pid,HGINPUT_RGB_GMODE,$ffffff //hginputの文字色を変更
hgSetInput pid,HGINPUT_BG_RGB_GMODE,$885500,3,255 //hginputの背景色を変更し半透明指定
hgSetInput pid,HGINPUT_MODE,,,3+4 //通常カーソル非表示にして直接描画カーソル表示+hginput外をクリックするとフォーカスが外れる
name_f=1
buffer 3,128,128
picload dir_exe+"\\sample\\new\\btn_normal.bmp",1
settex 128,128
btid=stat
gsel 0 //必ずメインウィンドウを操作先に戻す必要がある
hgobjimage btid, 0,0, 0,64, 0,32,2,2,2 ; ボタンテクスチャの指定 マージン2、押し下げ時文字移動右2、下2
font "MS ゴシック",12,1
pos 300,8
objsize 128,32
hgchkbox "hgObjImage\nhgChkbox",tempch ,2 //hgobjimageのテクスチャを使ったチェックボックス 点線枠非表示
//↑と↓では文字表示位置や離した時の動作が違います。
hgchkbox "hgObjImage\nhgChkbox",tempch ,2 //hgobjimageのテクスチャを使ったチェックボックス 点線枠非表示
chkid=stat
hgSetAllWinObjStyle chkid,0x00001000 //プッシュボタンのような概観と機能を持つ、チェックボックス(BS_PUSHLIKE)
font "MS ゴシック",26,0
pos 50,300
//hgobjimageのテクスチャを使ったhgbutton
hgbutton gosub "[CANCEL]",*_cancel,2+32,$880000ff,,50 //点線枠非表示+押してる間以外フォーカスを合わせない //50フレーム使ってフェードイン
cbid=stat
pos 180,300
//hgobjimageのテクスチャを使ったhgbutton
hgbutton gosub "[OK]",*_ok,2+32,$880000ff,,50
obid=stat
buffer 3,512,128
gradf 0,-36,512,36*2,1,$0,$ffffff
gradf 0,36,512,36,1,$ffffff,$0
gradf 4,4,512-8,36*2-8,1,$888888,$888888
settex 512,128
mftid=stat
gsel 0 //必ずメインウィンドウを操作先に戻す必要がある
hgObjImage mftid,0,0
font "MS P明朝",28,16+2+1
objsize 512,36*2
pos 50,350
//文字列表示用のウィンドウとしてhgchkboxを作成
hgchkbox "名前とパスワードを入力してください",temp_chk,2+4+8+32,$ff00ffff,$aa000000 //点線枠非表示+スペースでボタンを押せなくする+クリック出来なくする+押してる間以外フォーカスを合わせない
mid=stat
hgSetAllWinObjStyle mid,0x00001300 //プッシュボタンのような概観(BS_PUSHLIKE) 中央表示(BS_CENTER)
objskip mid,3 //タブキーでフォーカスを合わせない
hgObjImage -1 //カスタムボタンキャンセル
rot = 0.0
clscolor $4444
*main
hgdraw
rot+0.05
hgAllWinObjDraw //hgAllWinObjを描画
imebuf=refstr //ime入力中文字列
actid=stat //フォーカスが合ってるhgAllWinObjID
if name_f {
if actid ! iid { //hginputにフォーカスが合ってないなら"名前を入力して下さい"のテクスチャを表示
if name_str="" {
pos 50+256/2,200+40/2
gmode 3,256,32,255
hgrotate ntexid
}
if nbga ! 100 { //hginput背景の透明度が100じゃないなら
nbga=100 //透明度を100に指定
hgSetInput iid,HGINPUT_BG_RGB_GMODE,,,nbga //hginputの背景色を半透明指定
}
}else{
if nbga ! 255 {
nbga=255
hgSetInput iid,HGINPUT_BG_RGB_GMODE,,,nbga //hginputの背景色を変更し半透明指定
}
}
if actid ! pid { //hgbuttonにフォーカスが合ってないなら"名前を入力して下さい"のテクスチャを表示
if pas_str="" {
pos 50+256/2,200+40/2+40
gmode 3,256,32,255
hgrotate ptexid
}
if pbga ! 100 {
pbga=100
hgSetInput pid,HGINPUT_BG_RGB_GMODE,,,pbga //hginputの背景色を変更し半透明指定
}
}else{
if pbga ! 255 {
pbga=255
hgSetInput pid,HGINPUT_BG_RGB_GMODE,,,pbga //hginputの背景色を変更し半透明指定
}
}
//カスタムボタンのサイズ変更テスト(hginputとは違い拡大縮小表示される)
if k&$f {hgSetWinObjPos chkid,,, ((k=4)-(k=1))*2,((k=8)-(k=2))*2, 1}//加減算設定でサイズ変更
}
pos 10+256/2,10+32/2
gmode 2,256,32,255
hgrotate name_texid
hgsync 16
stick k,127
if k&128 : goto *owari ; [ESC]で終了
setang mychr, 0.0, rot,0.0 ; 箱の角度設定
goto *main
*_cancel
name_str=""
objprm iid,""
pas_str=""
objprm iid,""
return
*_ok
if name_str ! "テスト" {objprm mid,"名前が違います(テスト)":return}
if pas_str ! "test" {objprm mid,"パスワードが違います(test)":return}
font "MS ゴシック",28,16
color 0,255,255
texmes "name:"+name_str,name_texid,2,2
name_f=0
clrobj iid,mid-1 //文字列表示用のhgchkboxだけ残す
objprm mid,"ログイン成功"
return
*owari
end
| |
|
2015/9/13(Sun) 01:06:58|NO.71630
|
|
2015/9/13(Sun) 22:43:38|NO.71656
マウスクリックとキーボード両方で操作出来る設定画面テスト
見た目こんな感じ
http://ux.getuploader.com/himajin130414/download/13/設定画面テスト.PNG
決定、中止は方向キーでフォーカスを合わせてからエンターかスペースで操作
#include "hgimg3.as"
#include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude
//ウィンドウオブジェクトをグループ化するモジュール
#module
////----ウィンドウオブジェクトをグループ化する最初のオブジェクトを設定-----
// newRadioGroup p_id, p_sty, p_f
// p_id :グループの最初に指定するウィンドウオブジェクトのID
// p_sty :追加スタイル
// p_f :自動ラジオボタンにするか「0なら自動ラジオボタン」
//戻り値:statにグループIDが返る
#deffunc newRadioGroup int p_id,int p_sty,int p_f
rg(rgid)=str(p_id)
butf_list(p_id)=0
if p_f=0{
hgSetAllWinObjStyle p_id, p_sty | 0x00020009,$f //WS_GROUP 0x00020000
}else{
hgSetAllWinObjStyle p_id, p_sty
}
rgid++
return rgid-1
////----newRadioGroup以降のウィンドウオブジェクトをグループ化-----
// newRadioGroup p_id, p_sty, p_f
// p_id :グループに追加するウィンドウオブジェクトのID
// p_sty :追加スタイル
// p_f :自動ラジオボタンにするか「0なら自動ラジオボタン」
//戻り値:statにグループ内のオブジェクト数が返る
#deffunc nextRadioGroup int p_id,int p_sty,int p_f
butf_list(p_id)=0
rg(rgid-1)+","+str(p_id)
if p_f=0{
hgSetAllWinObjStyle p_id, p_sty | 9,$f
}else{
hgSetAllWinObjStyle p_id, p_sty
}
split rg(rgid-1),",",rgid_str
return stat
////----グループ内のオブジェクトのチェック状態を設定取得-----
// setRadioGroupCheck p_rgid, p_i, p_opt, p_clk
// p_id :グループID
// p_i :チェックONにするインデックス「p_optによりインデックスとして使われるか増減値として使われるか決まる」
// p_opt :p_iの扱いを指定「0=インデックス、1=増減値、2=通常ループするのを0〜上限までになる、8=現在のチェック状態を取得 マイナス値の時はチェックされずにフォーカスを移動させる」
// p_clk :フォーカスが合っていたら押す「p_optがマイナス値かグループ内にチェックONが無い場合」
//戻り値:statにチェックON状態かフォーカスが合っているインデックスが返る
#deffunc setRadioGroupCheck int p_rgid,int p_i,int p_opt,int p_clk
if p_rgid<0 {return -1}
split rg(p_rgid),",",rgid_str
if rgid_str=""{return -1}
max=stat
grp_index=-1
abs_opt=abs(p_opt)
repeat max
sendmsg objinfo_hwnd(0+rgid_str(cnt)), $F0, 0,0 //BM_GETCHECK
if stat{
if abs_opt&8 {grp_index=cnt:break}
if abs_opt&2 {
if cnt=0 {if p_i<0 {grp_index=cnt:break}}
if cnt=(max-1) {if p_i>=((abs_opt&1)=0)*(max-1) {grp_index=cnt:break}}
}
grp_index=(cnt*((abs_opt&1))+p_i+max)\max
if p_opt<0 {break}
h=objinfo_hwnd(0+rgid_str(grp_index))
sendmsg h, $f5, 0,0 //BM_CLICK
break
}
loop
if (abs_opt&8) ! 8 {
if grp_index<0 or p_opt<0{
if p_i {
objsel -1
id=stat
repeat max
if id=(0+rgid_str(cnt)) {
if abs_opt&2 {
if cnt=0 {if p_i<0 {grp_index=cnt:break}}
if cnt=(max-1) {if p_i>=((abs_opt&1)=0)*(max-1) {grp_index=cnt:break}}
}
grp_index=(cnt+p_i+max)\max
break
}
loop
if grp_index<0 {
if p_i<=0{grp_index=0}
if p_i>0{grp_index=1}
}else{
}
objsel (0+rgid_str(grp_index))
}else{
objsel -1
id=stat
repeat max
if id=(0+rgid_str(cnt)) {
if p_clk {
sendmsg objinfo_hwnd(id), $f3, 1,0 //BM_SETSTATE
butf_list(id)=1
}else{
if butf_list(id)=1 {
butf_list(id)=0
sendmsg objinfo_hwnd(id), $f5, 0,0 //BM_CLICK
}
}
break
}
loop
}
}
}
return grp_index
////----グループの表示非表示を変更する-----(hgWinObjInvalidを使った非表示の場合は完全に描画処理(hgAllWinObjDraw)から除外される)
// RadioGroupON p_rgid, p_f
// p_rgid :表示状態を変更するグループID
// p_f :表示状態スイッチ「0=表示、1=非表示」
//戻り値:statが0以外の場合グループ内にオブジェクトが無かった
#deffunc RadioGroupON int p_rgid,int p_f
split rg(p_rgid),",",rgid_str
if rgid_str=""{return 1}
if p_f {//非表示
repeat stat
hgWinObjInvalid 0+rgid_str(cnt)
loop
}else{//表示
repeat stat
hgWinObjValid 0+rgid_str(cnt)
loop
}
return 0
////----グループ内のオブジェクトID取得-----
// 変数 = getRadioGroupObjSel( p_rgid, p_index)
// p_rgid :オブジェクトIDを取得したいグループID「0〜」
// p_index :グループ内インデックス「0〜」
//戻り値:0以上ならオブジェクトID、マイナス値の場合グループ内に指定オブジェクトが無かった
#defcfunc getRadioGroupObjSel int p_rgid,int p_index
if p_rgid<0 or p_index<0{return -1}
split rg(p_rgid),",",rgid_str
if p_index>=stat or rgid_str="" {return -1}
return 0+rgid_str(p_index)
////----グループ内のオブジェクトを削除してグループ情報もクリア-----
// clrRadioGroup p_rgid
// p_rgid :削除するオブジェクトID「0〜」
//戻り値:statが0以外の場合グループ内にオブジェクトが無かった
#deffunc clrRadioGroup int p_rgid
if p_rgid<0 {return 1}
split rg(p_rgid),",",rgid_str
if rgid_str=""{return 1}
repeat stat
clrobj int(rgid_str(cnt)),int(rgid_str(cnt))
loop
rg(p_rgid)=""
return 0
#global
hgini
setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode)
texload dir_exe+"\\sample\\hgimg3\\fontchr.bmp" ; フォントテクスチャの登録
#enum テストA = 0
#enum テストB
#enum テストC
#enum テストD
#enum テストE
#enum 設定更新
confname="テストA","テストB","テストC","テストD","テストE","設定更新"//メイングループ名
font "MS ゴシック",32,16
objsize 400,40
pos 50,200
c(設定更新)=1 //設定更新のラジオボタンON
repeat length(confname)
hgchkbox confname(cnt),c(cnt),2+4+32+256,$ff00ffff,$884444ff,10 //フォーカス点線枠非表示+スペースで決定出来なくする+押してる間以外フォーカスを合わせない+非表示無効状態
if cnt=0 {//一つ目はnewRadioGroup
newRadioGroup stat,$1100 //BS_PUSHLIKE(0x00001000) + BS_LEFT(0x00000100)
mgrpid=stat //メインループID保持
}else{//二つ目からはnextRadioGroup
nextRadioGroup stat, $1100
}
loop
confbcnt=2,2,2,3,5,2 //サブグループのボタンの数
confbn="0","1", "0","1", "0","1", "0","1","2", "0","1","2","3","4", "決定","中止" //サブグループのボタン名
//295=押し下げ時に決定+フォーカス点線枠非表示+スペースで決定出来なくする+押してる間以外フォーカスを合わせない+非表示無効状態
confopt=295,295, 295,295, 295,295, 295,295,295, 295,295,295,295,295, 256+2,256+2 //ボタンオプション
conf_list=0, 0, 1, 2, 3,-1 //サブグループの何番目のラジオボタンをONにするか(-1は通常ボタンを作る)
font "MS ゴシック",20,16
ch_cnt=0 //コンフィング用オブジェクトの数カウント用
repeat length(confname)
if conf_list(cnt)>=0 {
chf_list(ch_cnt+conf_list(cnt))=1 //指定されてる場所をON
chkaut_f=0 //チェックボックスからラジオボタンフラグ
}else{
chkaut_f=1 //通常ボタン用フラグ
}
sizex=250/confbcnt(cnt)
objsize sizex-4,28
grp_index=cnt //サブグループとして使う配列grp_id用のグループインデックス
repeat confbcnt(cnt)
pos 200+sizex*cnt,200+grp_index*40+6
if chkaut_f {//通常ボタン
hgbutton gosub confbn(ch_cnt),*fonf,confopt(ch_cnt),$ff55ff55,$88885544,10
}else{//チェックボックス
hgchkbox confbn(ch_cnt),chf_list(ch_cnt),confopt(ch_cnt),$ffffffff,$885566aa,10
}
if cnt=0 {//一つ目はnewRadioGroup
newRadioGroup stat,$1000,chkaut_f//BS_PUSHLIKE(0x00001000)
grp_id(grp_index)=stat ///サブとして使うグループID保持
}else{//二つ目からはnextRadioGroup
nextRadioGroup stat, $1000,chkaut_f
}
ch_cnt++
loop
loop
ok_id=getRadioGroupObjSel(grp_id(設定更新),0) //決定ボタンID
can_id=getRadioGroupObjSel(grp_id(設定更新),1) //中止ボタンID
font "MS ゴシック",18,16
pos 0,0
objsize 100,28
hgbutton gosub "設定開始",*fonf
fonf_id=stat
clscolor $4444
repeat
stk_b=stk
stick stk,$ff
if stk=128 {end}
hgdraw
if conf_f {//設定画面表示中
setRadioGroupCheck mgrpid,,8 //操作中のグループインデックスを取得
grp_index=stat
if (stk&32)>0 {
setRadioGroupCheck grp_id(grp_index),0,-1,1 //押されてる
}else{
if stk_b&32 {setRadioGroupCheck grp_id(grp_index),0,-1,0}//離された
}
if stk=2 and stk_b=0{
setRadioGroupCheck mgrpid,-1,1
grp_index=stat
}
if stk=8 and stk_b=0{
setRadioGroupCheck mgrpid,1,1
grp_index=stat
}
if stk=1 and stk_b=0 { setRadioGroupCheck grp_id(grp_index),-1,3}
if stk=4 and stk_b=0 { setRadioGroupCheck grp_id(grp_index),1,3}
hgAllWinObjDraw //hgAllWinObjを描画
actid=stat //フォーカスが合ってるhgAllWinObjID
if 設定更新=grp_index{
if actid=ok_id or actid=can_id{// "決定","中止"選択中枠表示()
hgGetAllWinObjPos actid, p_px, p_py, p_sx, p_sy
color 255,255
gmode 0
hgDotLineRect p_px, p_py, p_sx, p_sy,4,f
f++
}
}
}else{
hgAllWinObjDraw //hgAllWinObjを描画
actid=stat //フォーカスが合ってるhgAllWinObjID
}
repeat 6
setRadioGroupCheck grp_id(cnt),0,8
fprt ""+stat,450,200+cnt*40
loop
hgsync 16
loop
stop
*fonf
if stat=fonf_id {hgWinObjInvalid fonf_id}
if stat=ok_id {
hgWinObjValid fonf_id
repeat 6
setRadioGroupCheck grp_id(cnt),0,8
conf_list(cnt)=stat //設定更新
loop
}
if stat=can_id {
hgWinObjValid fonf_id
repeat 6
setRadioGroupCheck grp_id(cnt),conf_list(cnt),0 //変更前に戻す
loop
}
RadioGroupON mgrpid,conf_f //conf_fが0なら表示 1なら非表示
repeat length(grp_id)
RadioGroupON grp_id(cnt),conf_f
loop
conf_f^1
return
設定画面を出すのはボタンクリックで・・・
| |
|
2015/9/13(Sun) 23:05:39|NO.71657
これは凄い。hgimg3を使ったゲームを作るときに使用させて頂きます。
|
|
2015/9/14(Mon) 21:25:38|NO.71679
ありがとうございます。
お役に立てれば幸いです。
>NO.71656
のボタンのジャンプ先の処理がバグってもおかしくないので修正
*fonf
id=stat
if id=fonf_id {hgWinObjInvalid fonf_id}
if id=ok_id {
hgWinObjValid fonf_id
repeat 6
setRadioGroupCheck grp_id(cnt),0,8
conf_list(cnt)=stat //設定更新
loop
}
if id=can_id {
hgWinObjValid fonf_id
repeat 6
setRadioGroupCheck grp_id(cnt),conf_list(cnt),0 //変更前に戻す
loop
}
RadioGroupON mgrpid,conf_f //conf_fが0なら表示 1なら非表示
repeat length(grp_id)
RadioGroupON grp_id(cnt),conf_f
loop
conf_f^1
return
|
|
2015/9/14(Mon) 22:28:31|NO.71685
バグ等修正
・hgInputを一度でも作ってからじゃないとhgListbox、hgComboxにマウスカーソルをあわせるとエラーになるのを修正
・hgButtonより後にhgListbox、hgComboxが配置されるとhgButtonをクリックできなくなるのを修正
・SetWindowLongを使った無効化ではスペースで反応してしまうのでフォーカスを外すように修正
・プッシュ概観チェックボックスをクリック時に確定してなくても網目が描画されるのを修正
・hgObjImageを使ったチェックボックスを押した時にhgrectで減算コピーして少し暗くしてたのをチェックボックスのテクスチャをコピーするように変更(四角以外でも良いように)
・hgButton、hgChkboxのp_optに 64=マウスオーバー無し を追加(hgObjImageを使用してる場合は無効)
ヘルプファイル v1.12
http://ux.getuploader.com/himajin130414/download/18/mod_hgallwinobj.hs
mod_hgAllWinObj.hsp v1.12
http://ux.getuploader.com/himajin130414/download/19/mod_hgAllWinObj.hsp
楕円形のリージョンテストの見た目(見た目だけじゃ意味無いが・・・)
http://ux.getuploader.com/himajin130414/download/14/EllipticRgnTes.PNG
裏でウィンドウオブジェクトが動いてるので
リージョンを差し替えれば、そのまま判定に反映されると言うテスト
#include "hgimg3.as"
#include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude
if HGALLWINOBJ_VER < 1.12 {dialog "バージョン1.12以上を使用して下さい":end}
#uselib "gdi32"
#cfunc CreateEllipticRgn "CreateEllipticRgn" int, int, int, int
#uselib "user32"
#func SetWindowRgn "SetWindowRgn" int, int, int
hgini
setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode)
texload dir_exe+"\\sample\\hgimg3\\fontchr.bmp" ; フォントテクスチャの登録
osx=250
osy=40
p_x1=0
p_y1=0
p_x2=0
p_y2=osy
p_x3=0
p_y3=osy*2
buffer 3,256,128
boxf
color 1,1,1
circle p_x1, p_y1, p_x1+osx, p_y1+osy
color 100,150,250
circle p_x1, p_y1, p_x1+osx-4, p_y1+osy-4
color 150,150,250
circle p_x2+4, p_y2+4, p_x2+osx, p_y2+osy
color 1,1,1
circle p_x3, p_y3, p_x3+osx,p_y3+osy
color 150,150,255
circle p_x3, p_y3, p_x3+osx-4, p_y3+osy-4
settex 256,128
p_tid=stat
color
boxf
color 200,150,50
circle p_x1, p_y1, p_x1+osx, p_y1+osy
color 255,255,255
boxf 3,osy/2-4,3+8,osy/2+4
pos p_x2, p_y2
gcopy 3,p_x1, p_y1, p_x1+osx, p_y1+osy
color 1,1,1
line p_x2+2,p_y2+osy/2-5,p_x2+3+8,p_y2+osy/2+4
line p_x2+2,p_y2+osy/2+5,p_x2+3+8,p_y2+osy/2-4
gmode 3,,,128
pos p_x3, p_y3
gcopy 3,p_x2, p_y2, p_x2+osx, p_y2+osy
settex 256,128
p_tid2=stat
gsel 0 //必ずメインウィンドウに戻す
hgObjImage p_tid, p_x1, p_y1, p_x2, p_y2, p_x3, p_y3, 2, 4, 4//マージン2ドット、文字移動縦横4ドット
font msmincho,18,1+16
objsize osx,osy
pos 100,100
hgbutton gosub "楕円リージョンテスト",*tes,,$ddffffff,AlpCOLORtoARGB(255,100,150,250) //背景はhgObjImageのテクスチャが使われますが、描画時の透明度と背景色取得にはこの設定が使われます
bid=stat
hRegion = CreateEllipticRgn(p_x1-2, p_y1-2, p_x1+osx+2, p_y1+osy+2) //楕円形のリージョンを作成
SetWindowRgn objinfo_hwnd(bid), hRegion, 1 //楕円形のリージョンをオブジェクトに設定
hgchkbox "楕円リージョンテスト",c_tes,,$ddffffff,AlpCOLORtoARGB(255,255,0,0) //フォーカス枠が背景色の反転色になる
cid=stat
hgSetAllWinObjStyle cid, 0x00001000 //チェックボックスをプッシュボタン概観にすると押し下げてクリックを離すと文字位置が元に戻る(これは標準chkboxと同じ動作)
hRegion = CreateEllipticRgn(p_x1-2, p_y1-2, p_x1+osx+2, p_y1+osy+2)
SetWindowRgn objinfo_hwnd(cid), hRegion, 1
hgObjImage p_tid2, p_x1, p_y1, p_x2, p_y2, p_x3, p_y3, 0, 0, 0//マージン0ドット、文字移動縦横0ドット
hgchkbox "楕円リージョンテスト",c_tes2,,$ffffffff,AlpCOLORtoARGB(255,0,0,0) //フォーカス枠が背景色の反転色になる
cid2=stat
hgSetAllWinObjStyle cid2, 6,3 // (6)BS_AUTO3STATE つの状態を持つチェックボックス,(3)BS_AUTOCHECKBOX
hRegion = CreateEllipticRgn(p_x1, p_y1, p_x1+osx, p_y1+osy)
SetWindowRgn objinfo_hwnd(cid2), hRegion, 1
hgObjImage -1
clscolor $4444
repeat
stk_b=stk
stick stk,$ff
if stk=128 {end}
hgdraw
hgAllWinObjDraw //hgAllWinObjを描画
actid=stat //フォーカスが合ってるhgAllWinObjID
fprt "actid="+actid,0,0
fprt "c_tes="+c_tes,350,100+40
fprt "c_tes2="+c_tes2,350,100+40*2
hgsync 16
loop
*tes
b++
title ""+b
return
| |
|
2015/9/14(Mon) 22:37:16|NO.71686
|
|
2015/9/21(Mon) 03:52:24|NO.71808
アイテムウィンドウテストの画像
http://ux.getuploader.com/himajin130414/download/21/itemwin.PNG
マウスクリックで操作するアイテムウィンドウを作って見るテスト
#include "hgimg3.as"
#include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude
#uselib "gdi32"
#cfunc CreateEllipticRgn "CreateEllipticRgn" int, int, int, int
#cfunc CreateRectRgn "CreateRectRgn" int, int, int, int
#uselib "user32"
#func SetWindowRgn "SetWindowRgn" int, int, int
#cfunc GetWindow "GetWindow" int, int
#func GetCaretPos "GetCaretPos" var
#cfunc GetCaretBlinkTime "GetCaretBlinkTime"
#func SetCaretPos "SetCaretPos" int,int
#cfunc GetDC "GetDC" int
#func ReleaseDC "ReleaseDC" int
#func DestroyWindow "DestroyWindow" int
#cfunc WindowFromPoint "WindowFromPoint" int,int
#cfunc ChildWindowFromPoint "ChildWindowFromPoint" int,int,int
//hgobjimageで設定されてるテクスチャID取得
//「変数 = hggetobjimagetex(hgwinobjID)」
#define ctype global hggetobjimagetex(%1) hgbt_tex_id_list@mod_hgallwinobj((%1)*9)
//hgobjimageで設定されてるテクスチャ参照座標を取得
//「hggetobjimageindex hgwinobjID,参照座標の種類,X座標,Y座標」
//参照座標の種類:0=常時 1=押し下げ時 2=マウスオーバー時
#define global hggetobjimageindex(%1,%2,%3,%4) %3=hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9+(%2)*2):%3=hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9+(%2)*2+1)
//hgobjimageで設定されてるテクスチャIDを変更
//「hgsetobjimagetex hgwinobjID,テクスチャID」
#define global hgsetobjimagetex(%1,%2) hgbt_tex_id_list@mod_hgallwinobj(%1)=%2
//hgobjimageで設定されてるテクスチャ参照座標を変更
//hgsetobjimageindex hgwinobjID,カスタムボタンの参照座標1〜3が入ってる配列(2*3要素必要)」
#define global hgsetobjimageindex3(%1,%2) memcpy hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9),%2,24
//hgobjimageで設定されてるテクスチャ参照座標を変更
//hgsetobjimageindex hgwinobjID,参照座標の種類,X座標,Y座標」
//参照座標の種類:0=常時 1=押し下げ時 2=マウスオーバー時
#define global hgsetobjimageindex(%1,%2,%3,%4) hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9+(%2)*2)=%3,%4
screen 0,800,600,0,100,100
hgini
setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode)
texload dir_exe+"\\sample\\hgimg3\\fontchr.bmp" ; フォントテクスチャの登録
// 0 1 , 2 ,3 , 4 , 5 , 6, 7 , 8
itemtype_name="未定","回復", "攻撃", "無", "装備", "無", "無", "無", "特殊"
//アイテムIDに各種データセット
repeat 64
igpx=(cnt\8)*64
igpy=(cnt/8)*64
item_tixy(cnt*6)= igpx, igpy, igpx-2, igpy-2,igpx, igpy //アイテム画像座標(objimageの x1,y1,x2,y2,x3,y3 と同じ)
item_type(cnt)=1<<(cnt/16) //今回はID16個毎にタイプを1,2,4,8に設定("回復","攻撃","装備","特殊")
item_name(cnt)="アイテムID:"+strf("%03d",cnt)
item_effect(cnt)="ID"+cnt+"の説明"
loop
ITEM_SIZE=64
ITEM_HMAX=4 //アイテム欄横数
ITEM_VMAX=4 //アイテム欄縦数
ITEM_TOTAL=ITEM_HMAX*ITEM_VMAX
TITLE_SIZEY=20
TAB_SIZEY=20
//-----アイテムウィンドウ背景(64*64がループされて使用される)
buffer 3,ITEM_SIZE,ITEM_SIZE //2の累乗意外だとうまくいかない
gbcolor=$885522,$558822,$552288,$885588
gbcolor2=$664422,$446622,$442266,$664466
repeat 4
gradf 0,0,ITEM_SIZE,ITEM_SIZE,1,gbcolor(cnt),gbcolor(cnt)
gradf 2,2,ITEM_SIZE-4,ITEM_SIZE-4,1,gbcolor2(cnt),0
settex ginfo_sx,ginfo_sy
itemwin_bgtex_id(cnt)=stat
loop
//-----メニュー表示時のマスクテクスチャ
buffer 3,ITEM_SIZE*ITEM_HMAX,ITEM_SIZE*ITEM_VMAX //2の累乗意外だとうまくいかない
color 10,10,10
boxf
gradf 0,0,ITEM_SIZE,ITEM_SIZE,0,0,0 //左上に穴を開ける
settex ginfo_sx,ginfo_sy
itewin_mskid=stat
gsel 0 //必ずメインウィンドウに戻す
texload2 dir_exe+"\\sample\\hgimg4\\res\\ball64.png"
gbtexid=stat
texload dir_exe+"\\hsptv\\bg03.jpg"
bgid=stat
dim itemwin_bttype,256 //ボタンやチェックボックスの使用タイプ保存参照用配列
//-----アイテムウィンドウ用タイトルバー作成
pos 100,100
objsize ITEM_SIZE*ITEM_HMAX,TITLE_SIZEY
font "MS ゴシック",TITLE_SIZEY-2,1
hgbutton gosub "",*_itemwin_move,2+4+16+32,$ffffffff,AlpCOLORtoARGB(80,50,70,60)
itemwin_titlebar_id=stat
//-----アイテムウィンドウタイトル名用チェックボックス作成(タイトルバーのサイズを変更するので)
pos 0,0 //タイトルバーの子ウィンドウとして使うので左上なら0,0
objsize 64,TITLE_SIZEY
hgchkbox "ITEM",itemwin_open,2+4+8+32+64,$ffffffff,0
itemwin_titlename_id=stat
hgSetAllWinObjStyle itemwin_titlename_id, $1000,0
hgSetParent itemwin_titlename_id,itemwin_titlebar_id
SetWindowRgn objinfo_hwnd(itemwin_titlename_id),CreateRectRgn(0,0,0,0),0
hgObjImage -1
//-----種類タブ作成
bitmsk_list=%1111,%11,%100,%1000
itemwin_tabname="全品","消耗品","装備品","特殊品"
tab_sty=$21009,$1009,$1009,$1009 //WS_GROUP(0x00020000) BS_PUSHLIKE(0x00001000) BS_AUTORADIOBUTTON(0x00000009)
font "MS 明朝",TITLE_SIZEY-2,16+1 //文字表示は使ってないけどhgbuttonの仕様上設定は必要
typetab_cf=1,0,0,0
tabsize=(ITEM_SIZE*ITEM_HMAX/4)
objsize tabsize,TAB_SIZEY
repeat length(itemwin_tabname)
pos tabsize*cnt,20 //タイトルバーの下にしたいのでタイトルバーの高さ分下に配置
InvertColor gbcolor(cnt),tab_ir,tab_ig,tab_ib
hgchkbox itemwin_tabname(cnt),typetab_cf(cnt),1+2,AlpCOLORtoARGB(255,tab_ir,tab_ig,tab_ib),$ff000000+gbcolor(cnt),5 //背景はhgObjImageのテクスチャが使われますが、描画時の透明度と背景色取得にはこの設定が使われます
typetab_id(cnt)=stat
objid_index_list(stat)=cnt
itemwin_bttype(stat)=-2 //このIDがアイテムタブ用ボタンに使用してるフラグ
hgSetAllWinObjStyle typetab_id(cnt), tab_sty(cnt),$f
hgSetParent typetab_id(cnt),itemwin_titlebar_id //タイトルバーの子にする
loop
InvertColor gbcolor,tab_ir,tab_ig,tab_ib
//-----アイテムウィンドウ背景
hgObjImage itemwin_bgtex_id, 0, 0, 0, 0, 0, 0, 0, 0, 0//マージン2ドット、文字移動縦横4ドット
objsize ITEM_SIZE*ITEM_HMAX,ITEM_SIZE*ITEM_VMAX
pos 0,TITLE_SIZEY+TAB_SIZEY
hgbutton gosub "",*_temp,2+4+8+32,$dd5,AlpCOLORtoARGB(255,100,150,250) //背景はhgObjImageのテクスチャが使われますが、描画時の透明度と背景色取得にはこの設定が使われます
itemwin_bg_id=stat
hgSetParent itemwin_bg_id,itemwin_titlebar_id //タイトルバーの子にする
//-----ページタブ作成
hgObjImage -1
pagetab_cf=1,0,0,0
tabsize=ITEM_SIZE*ITEM_HMAX/4
objsize tabsize,TAB_SIZEY
repeat 4
pos tabsize*cnt,ITEM_SIZE*ITEM_VMAX //タイトルバーの下にしたいのでタイトルバーの高さ分下に配置
hgchkbox str(1+cnt),pagetab_cf(cnt),1+2+32,$88010101,$ff000000+gbcolor,5 //背景はhgObjImageのテクスチャが使われますが、描画時の透明度と背景色取得にはこの設定が使われます+cnt
pagetab_id(cnt)=stat
objid_index_list(stat)=cnt
itemwin_bttype(stat)=-3 //このIDがページタブ用ボタンに使用してるフラグ
hgSetAllWinObjStyle pagetab_id(cnt), tab_sty(cnt),$f
hgSetParent pagetab_id(cnt),itemwin_bg_id //タイトルバーの子にする
loop
//-----アイテム画像をカスタムボタンテクスチャに設定
hgObjImage gbtexid, 0, 0, 0, 0, 0, 0, 0, 2, 2//マージン2ドット、文字移動縦横4ドット
font "MS 明朝",20,16+1+2
//-----アイテムボタン作成
objsize ITEM_SIZE,ITEM_SIZE
repeat ITEM_TOTAL
pos (cnt\ITEM_HMAX)*ITEM_SIZE,(cnt/ITEM_HMAX)*ITEM_SIZE
hgbutton gosub " ",*_temp,4+16,$ff00ffff,$885522,5
ibid_list(cnt)=stat //インベントリ用ボタンIDを表示インデックス順に代入「表示順はibid_list(0)が左上で右隣がibid_list(1)」
objid_index_list(stat)=cnt //ID指定逆引き用リスト(IDを要素にすれば表示インデックスが分かる)
itemwin_bttype(stat)=-1 //このIDがアイテム用ボタンに使用してるフラグ(-1はアイテム設定前)
hgSetAllWinObjStyle ibid_list(cnt),0x0000A00
hgSetParent ibid_list(cnt), itemwin_bg_id
loop
//-----アイムメニュー表示時に使用するアイテム以外を半透明マスクするボタン作成
hgObjImage itewin_mskid, 0, 0, 0, 0, 0, 0, 0, 0, 0
objsize ITEM_SIZE*ITEM_HMAX,ITEM_SIZE*ITEM_VMAX
pos 0,0
hgbutton gosub "",*_temp,2+4+32+256,0,$88000000
itemwin_msk_id=stat
hgSetParent itemwin_msk_id, itemwin_bg_id
SetWindowRgn objinfo_hwnd(itemwin_msk_id),CreateRectRgn(0,0,0,0),0
hgObjImage -1
//-----アイテム所持リスト
dim itemid_list,100
dim itemstock_list,100
item_max=50 //アイテム所持数
repeat item_max
itemid=rnd(64) //アイテムIDとして0〜64をランダムで代入
itemid_list(cnt)=itemid //アイテムIDを所持リストに登録
itemstock_list(cnt)=rnd(99)+1 //アイテム別所持数
loop
dim itemwin_index_list,ITEM_TOTAL
//-----所持アイテムをアイテムボタンに割り当て
repeat ITEM_TOTAL
ibid=ibid_list(cnt) //アイテムボタン用ID
if itemstock_list(cnt) {//一つ以上もってる
itemid=itemid_list(cnt)
itemwin_index_list(ibid)=cnt
itemwin_bttype(ibid)=1 //アイテムボタンにアイテムIDが割り当てられたフラグ
hgWinObjArgb ibid, 1,$ff885522
if item_type(itemid)&%11 {objprm ibid,itemstock_list(cnt)}else{objprm ibid,""} //消耗品以外は個数表示無し
//カスタムボタン参照座標をアイテムテクスチャ座標に変更
hgsetobjimageindex3 ibid,item_tixy(itemid*6)
}else{//もってない
itemwin_bttype(ibid)=-1 //アイテムボタンにアイテムIDが割り当てられたフラグ
hgWinObjArgb ibid, 1,$885522
}
loop
//-----アイテムコメントウィンドウ作成
font "MS 明朝",18,16+1
objsize 200,100
hgchkbox "名前:\n効果:\n種類:",temp_chk,256+2+4+8+32+64,$ffffffff,AlpCOLORtoARGB(170,100,150,250),10 //背景はhgObjImageのテクスチャが使われますが、描画時の透明度と背景色取得にはこの設定が使われます
itemcom_id=stat
hgSetAllWinObjStyle itemcom_id,0x00009500 // BS_FLAT(0x00008000) | BS_PUSHLIKE(0x00001000) | BS_TOP(0x00000400) | BS_LEFT(0x00000100)
//----アイテムウィンドウ用メニュー作成
font "MS 明朝",18,16+1
item_men="使う\n詳細\n捨てる\nキャンセル"
objsize 100,18
pos 0,0
im_i=-1
hglistbox im_i,18*4,item_men,16+256,$ffff44ff,$88005555 //リストボックスをメニューとして使う
itemwin_menu_id=stat
hgWinObjArgb itemwin_menu_id, 3,$88000000
objsize 100,18*4
pos 0,0
hgbutton gosub "",*_itemwin_menu,2+4+16+64+256,0,$11881111 //メニューの上にボタンを被せてメニュー操作を補助
itemwin_menu_button_id=stat
clstex bgid
repeat
stk_b=stk
stick stk,$fff
if stk=128 {end}
hgdraw
if (stk&256)>0 {
if itemwin_move_f {//アイテムウィンドウ移動(ボタンでジャンプしたルーチン内だとうまく行かなかったので)
hggetmouse mx,my
hgSetWinObjPos itemwin_titlebar_id,mx+inv_difx,my+inv_dify
}else{
if HGMOUSE_POINT_ID>=0 {
if itemwin_bttype(HGMOUSE_POINT_ID)>0 {
if (frame_cnt-L_click_time)<15 and sel_ibid=HGMOUSE_POINT_ID and mlc_f=0 { //左ダブルクリック
mlc_f=2 //左ダブルクリックフラグ
itemindex=itemwin_index_list(sel_ibid) //アイテムボタンIDを要素にインデックスリストからインデックスを取得
itemid=itemid_list(itemindex) //インデックスを要素にアイテムIDリストからアイテムIDを取得
if item_type(itemid) & %11 {
title "使用 名前:"+item_name(itemid)+" 効果:"+item_effect(itemid)
itemstock_list(itemindex)--
if itemstock_list(itemindex) {
objprm sel_ibid,itemstock_list(itemindex)
}else{
hgWinObjArgb sel_ibid, 0,$0000ffff
hgWinObjArgb sel_ibid, 1,$0885522
itemwin_bttype(sel_ibid)=-1 //アイテムボタンからアイテムIDが解除されたフラグ
}
}else{
if item_type(itemid) & %100 {
title "装備 名前:"+item_name(itemid)+" 効果:"+item_effect(itemid)
if itemstock_list(itemindex)=1 {objprm sel_ibid,"":itemstock_list(itemindex)=2}else{objprm sel_ibid,"装備中":itemstock_list(itemindex)=1}
}else{
title "特殊 名前:"+item_name(itemid)+" 効果:"+item_effect(itemid)
}
}
}else{//左クリック
sel_ibid=HGMOUSE_POINT_ID //選択中アイテムボタンID
mlc_f=1 //左クリックフラグ
}
L_click_time=frame_cnt
}
}
}
}else{
mlc_f=0 //左クリックフラグクリア
}
if itemwin_off=0 {//アイテムウィンドウ表示中
if menu_on {//メニュー表示中
if ((menu_tag_id ! HGMOUSE_POINT_ID) and (HGMOUSE_POINT_ID ! itemwin_menu_button_id)) {//マウスがメニュー外か違うアイテムに移動した
menu_on=2 //クリック関係なくメニューを消すフラグ
gosub *_itemwin_menu
}
}else{
if HGMOUSE_POINT_ID>=0{
if (stk&512)>0 {//右クリック
if itemwin_bttype(HGMOUSE_POINT_ID)>0{//マウスがアイテムボタンを指してる
menu_tag_id=HGMOUSE_POINT_ID //メーニューを開くアイテムボタンID
objsel menu_tag_id
gosub *_itemwin_menu //menu_on=0なのでメーニューを開く
}
}
}
}
hgAllWinObjDraw //hgAllWinObjを描画
actid=stat //フォーカスが合ってるhgAllWinObjID
if itemwin_move_f=0 {
gosub *_itemwin_open//アイテムウィンドウ内に変更があった時の処理
}
}else{
hgAllWinObjDraw //hgAllWinObjを描画
actid=stat //フォーカスが合ってるhgAllWinObjID
}
hgsync 16
frame_cnt++
loop
*_temp //ボタンとして使用しないhgbuttonのラベル
return
//アイテムウィンドウ内に変更があった時の処理
*_itemwin_open
if HGMOUSE_POINT_ID>=0 {
if itemwin_bttype(HGMOUSE_POINT_ID)>0 {//マウスがアイテムボタンを指してる
if itemcom_f=0 or HGMOUSE_POINT_ID_bak!HGMOUSE_POINT_ID {//コメントウィンドウが非表示か違うアイテムが指された
itemcom_f=1//アイテムコメントウィンドウ表示中フラグ
HGMOUSE_POINT_ID_bak=HGMOUSE_POINT_ID //現在のアイテムボタンID保持
hgGetAllWinObjPos HGMOUSE_POINT_ID, mc_px, mc_py, sx, sy //現在のアイテムボタン座標取得
hgWinObjValid itemcom_id //アイテムコメントウィンドウ表示
ispx=mc_px+1.2*ITEM_SIZE //アイテムボタン座標より右上にずらす
ispy=mc_py-1.2*ITEM_SIZE
hgSetWinObjPos itemcom_id, ispx,ispy //アイテムボタン座標設定
itemindex=itemwin_index_list(HGMOUSE_POINT_ID) //アイテムボタンIDを要素にインデックスリストからインデックスを取得
itemid=itemid_list(itemindex) //インデックスを要素にアイテムIDリストからアイテムIDを取得
//解説をボタンに設定
objprm itemcom_id,"名前:"+item_name(itemid)+"\n種類:"+itemtype_name(item_type(itemid))+"\n効果:"+item_effect(itemid)
}
color tab_ir,tab_ig,tab_ib
gmode 0
f++
hgDotLineRect mc_px, mc_py, ITEM_SIZE-1, ITEM_SIZE-1,4,f/4
hgline HGMOUSEX, HGMOUSEY,ispx, ispy
}else{
if itemcom_f=1 {//アイテムコメントウィンドウ非表示処理
itemcom_f=0
hgWinObjInvalid itemcom_id
}
}
}else{
if itemcom_f=1 {//アイテムコメントウィンドウ非表示処理
itemcom_f=0
hgWinObjInvalid itemcom_id
}
}
if actid>=0 {
if actid_bak!actid {
actid_bak=actid
if itemwin_bttype(actid)<=-2 {//タブがアクティブ
sendmsg objinfo_hwnd(actid), 0x00F0 , 0,0 //BM_GETCHECK 0x00F0 //タブに使用してるグループラジオボタンのチェック状況を取得
if itemwin_bttype(actid)=-2 {//タイプタブがアクティブ
tab_index=objid_index_list(actid) //タブのインデックス
chk_on=stat and (tab_index_bak!tab_index) //チェックONで更にタブの変更があれば1
if chk_on {//ページタブを最初に戻す
objprm pagetab_id(pagetab_index),0
objprm pagetab_id,1
pagetab_index=0
}
tab_index_bak=tab_index
}else{
if stat and itemwin_bttype(actid)=-3 {//ページタブがアクティブ
chk_on=1
pagetab_index=objid_index_list(actid) //ページタブインデックス
}
}
if chk_on {
chk_on=0
tab_argb=hgGetWinObjArgb(actid,1)
InvertColor tab_argb,tab_ir,tab_ig,tab_ib
bitmsk=bitmsk_list(tab_index)
pagetab_nextindex=pagetab_index*ITEM_TOTAL //ページタブインデックスを次ページまでのアイテム数にする
itemid_cnt=0
ibid_cnt=0
repeat -1
if ibid_cnt=ITEM_TOTAL {break}//アイテムボタンを使い切った
if cnt<item_max {
itemid=itemid_list(cnt)
if (item_type(itemid) & bitmsk)>0 and itemstock_list(cnt)>0{//タイプタブに一致していて1個以上もってる
if itemid_cnt<pagetab_nextindex {itemid_cnt++:continue} //現在のページになるまでitemid_cntを加算
ibid=ibid_list(ibid_cnt) //アイテムボタンID
itemwin_bttype(ibid)=1 //アイテムボタンにアイテムIDが割り当てられたフラグ
hgWinObjArgb ibid, 0,$ff00ffff
hgWinObjArgb ibid, 1,tab_argb
if item_type(itemid)&%11 {objprm ibid,itemstock_list(cnt)}else{objprm ibid,""} //消耗品以外は個数表示無し
//カスタムボタン参照座標をアイテムテクスチャ座標に変更
hgsetobjimageindex3 ibid,item_tixy(itemid*6)
itemwin_index_list(ibid)=cnt//ボタンIDを要素にアイテムIDリストのインデックスを代入
}else{
continue
}
}else{//所持アイテム数を超えた
//使用したいアイテムボタンを透明に
ibid=ibid_list(ibid_cnt)
hgWinObjArgb ibid, 0,$0000ffff
hgWinObjArgb ibid, 1,$0885522
itemwin_bttype(ibid)=-1 //アイテムボタンからアイテムIDが解除されたフラグ
}
ibid_cnt++
loop
//カスタムボタン用テクスチャIDを変更
hgsetobjimagetex itemwin_bg_id,itemwin_bgtex_id(tab_index)
repeat 4
hgWinObjArgb pagetab_id(cnt), 1,tab_argb
loop
}
}
}
}
return
//アイテムメニュー処理
*_itemwin_menu
if menu_on {//メニュー表示中
getkey bt_clk,1
if bt_clk=0 or menu_on=2 {//メニューを非表示にする処理
menu_on=0
hgWinObjInvalid itemwin_msk_id
hgWinObjInvalid itemwin_menu_button_id
hgWinObjInvalid itemwin_menu_id
objsel -1
if im_i<0 or (HGMOUSE_POINT_ID ! itemwin_menu_button_id) {//マウスが別のアイテム等に移動したかキャンセルされた
title "[機能は作って無いので表示だけ]"
}else{//メニューが選択決定された
//機能は作って無いので表示だけ
notesel item_men
noteget itemmen,im_i
noteunsel
title itemmen+" 名前:"+item_name(menu_tag_id)+" 種類:"+itemtype_name(item_type(menu_tag_id))+" [機能は作って無いので表示だけ]"
}
objsel menu_tag_id
}
}else{
//メニュー表示開始
hgGetAllWinObjPos itemwin_bg_id, mskpx, mskpy, sx,sy //アイテムメニューの背景座標を取得
hgGetAllWinObjPos menu_tag_id, px, py, sx,sy //メニュー元のアイテムボタン座標を取得
hgsetobjimageindex itemwin_msk_id,0,mskpx-px,mskpy-py //背景座標からボタン座標を引いてマスクテクスチャ参照座標にする
hgWinObjValid itemwin_msk_id //メニュー表示中のマスクボタン表示
objprm itemwin_menu_id,-1 //メニューを非選択に
hgWinObjValid itemwin_menu_id //メニュー用リストボックスを表示
hgWinObjValid itemwin_menu_button_id //メニュー補助ボタン表示
hgSetWinObjPos itemwin_menu_id,HGMOUSEX-1,HGMOUSEY-8,,20 //メニュー座標設定
hgSetWinObjPos itemwin_menu_button_id,HGMOUSEX-1,HGMOUSEY-8,,20
menu_on=1//メニュー表示中フラグ
}
return 0
//アイテムウィンドウタイトルバークリック
*_itemwin_move
if menu_on {//メニューが表示中なら閉じる
menu_on=0
hgWinObjInvalid itemwin_msk_id
hgWinObjInvalid itemwin_menu_button_id
hgWinObjInvalid itemwin_menu_id
}
if HGMOUSE_MOVEX!0 or HGMOUSE_MOVEY!0 or itemwin_move_f{//ドラッグ開始
if itemwin_move_f=0 {//移動前だった
itemwin_move_f=1 //有働開始フラグ
hgGetAllWinObjPos itemwin_titlebar_id, px, py, sx,sy //現在のウィンドウ座標
inv_difx=px-HGMOUSEX //マウス座標との差分
inv_dify=py-HGMOUSEY
}else{
getkey itemwin_move_f,1 //クリックが離されたらitemwin_move_fがクリアされる
}
}else{
if itemwin_move_f=0{//移動前だった
getkey bt_clk,1
if bt_clk=0 {//ボタンが離された
itemwin_off^1 //ウィンドウ表示非表示切替(0なら非表示)
if itemwin_off {//ウィンドウ非表示
hgSetWinObjPos itemwin_titlebar_id,,,64,20 //タイトルバーを小さくする
hgWinObjInvalid itemwin_bg_id //アイテムウィンドウ背景表示
repeat 4
hgWinObjInvalid typetab_id(cnt)//タイプタブ表示
hgWinObjInvalid pagetab_id(cnt) //ページタブ表示
loop
repeat ITEM_TOTAL //アイテムボタン表示
hgWinObjInvalid ibid_list(cnt)
loop
}else{//ウィンドウ表示
hgSetWinObjPos itemwin_titlebar_id,,,ITEM_SIZE*ITEM_HMAX,20 //タイトルバーを元に戻す
hgWinObjValid itemwin_bg_id //アイテムウィンドウ背景非表示
repeat 4 //タブ非表示
hgWinObjValid typetab_id(cnt)
hgWinObjValid pagetab_id(cnt)
loop
repeat ITEM_TOTAL //アイテムボタン非表示
hgWinObjValid ibid_list(cnt)
loop
}
}
}
}
return
ウィンドウオブジェクトの子ウィンドウにして使用してるのでクリック時のジャンプや
チェックボックスに設定した変数が無反応になるので色々面倒かな・・・
| |
|
2015/9/22(Tue) 22:23:14|NO.71857
リストボックスの項目毎に画像を付けてアイテム一覧にした画像
http://ux.getuploader.com/himajin130414/download/22/aitemlistbox.PNG
リストボックスを画像付きアイテム一覧にしてみるテスト
テンキーの + で所持アイテム追加
エンターで決定(タイトルにアイテムデータ表示するだけ)
#include "hgimg3.as"
#include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude
//hgobjimageで設定されてるテクスチャID取得
//「変数 = hggetobjimagetex(hgwinobjID)」
#define ctype global hggetobjimagetex(%1) hgbt_tex_id_list@mod_hgallwinobj((%1)*9)
//hgobjimageで設定されてるテクスチャ参照座標を取得
//「hggetobjimageindex hgwinobjID,参照座標の種類,X座標,Y座標」
//参照座標の種類:0=常時 1=押し下げ時 2=マウスオーバー時
#define global hggetobjimageindex(%1,%2,%3,%4) %3=hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9+(%2)*2):%3=hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9+(%2)*2+1)
//hgobjimageで設定されてるテクスチャIDを変更
//「hgsetobjimagetex hgwinobjID,テクスチャID」
#define global hgsetobjimagetex(%1,%2) hgbt_tex_id_list@mod_hgallwinobj(%1)=%2
//hgobjimageで設定されてるテクスチャ参照座標を変更
//hgsetobjimageindex hgwinobjID,カスタムボタンの参照座標1〜3が入ってる配列(2*3要素必要)」
#define global hgsetobjimageindex3(%1,%2) memcpy hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9),%2,24
//hgobjimageで設定されてるテクスチャ参照座標を変更
//hgsetobjimageindex hgwinobjID,参照座標の種類,X座標,Y座標」
//参照座標の種類:0=常時 1=押し下げ時 2=マウスオーバー時
#define global hgsetobjimageindex(%1,%2,%3,%4) hgbt_tex_index_xy_list@mod_hgallwinobj((%1)*9+(%2)*2)=%3,%4
#uselib "gdi32"
#cfunc CreateRectRgn "CreateRectRgn" int, int, int, int
#uselib "user32.dll"
#func SetWindowRgn "SetWindowRgn" int, int, int
screen 0,800,600
hgini
buffer 3,16,16
color
boxf
settex ginfo_sx,ginfo_sy
namebg_texid=stat
gsel 0
setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode)
texload dir_exe+"\\sample\\hgimg3\\fontchr.bmp" ; フォントテクスチャの登録
texload2 dir_exe+"\\hsptv\\hsptv_img.png"
etctexid=stat
texload2 dir_exe+"\\sample\\hgimg4\\res\\ball64.png"
itemtexid=stat
//アイテムデータ設定
repeat 64
igpx=(cnt\8)*64
igpy=(cnt/8)*64
item_tixy(cnt*6)= igpx, igpy, igpx-2, igpy-2,igpx, igpy //アイテム画像座標(objimageの x1,y1,x2,y2,x3,y3 と同じ)
item_name(cnt)="アイテムID:"+strf("%03d",cnt)
item_effect(cnt)="ID"+cnt+"の説明"
loop
//所持アイテム設定
dim item_list,100
dim itemstock_list,100
item_max=5
repeat item_max
itemid=rnd(64)
itemid_list(cnt)=itemid
itemstock_list(cnt)=rnd(100)+1
loop
ITEM_SIZE=64
ITEM_VMAX=8 //アイテム欄縦数
//アイテム選択用リストボックス作成(文字表示無しで機能だけを利用)
font "MS ゴシック",ITEM_SIZE,16 //listboxの縦サイズはホントサイズが基準になるので設定しとく(今回はリストボックスには文字表示はしないけど)
objsize 2,2 //適当なサイズ(後で必要なサイズに変更)
list_txt="" //hgkistbox,hgcomboxのメッセージテクスチャは文字列指定が無くてもフォントサイズとobjsizeの横幅を基準に作られる
pos 150,50
hglistbox list_index,,list_txt,2+4+256,0,$ff225599,$ff995599
listbox_id=stat
hgSetWinObjPos listbox_id,,,400,ITEM_SIZE*ITEM_VMAX+ITEM_SIZE //必要サイズにする(フォントサイズと実際のサイズは違うことがあるので一つ分大きめに指定)
//アイテム画像用ボタン作成
hgObjImage itemtexid, 0, 0, 0, 0, 0, 0, 0, 0, 0
pos 0,0
objsize 64,64,64
font "MS ゴシック",24,16
repeat ITEM_VMAX
hgbutton gosub "",*_temp,2+4+8+64+256,,$ff000000
picibid_list(cnt)=stat
hgSetParent picibid_list(cnt), listbox_id //リストボックスの子に設定
SetWindowRgn objinfo_hwnd(picibid_list(cnt)),CreateRectRgn(0,0,0,0),0 //マウス判定無し
loop
//アイテム名用ボタン作成
objsize 180,32,64
hgObjImage namebg_texid, 0, 0, 0, 0, 0, 0, 0, 0, 0 //カスタムボタンの方がモジュール内の処理が少ないので背景透明で利用
font "MS ゴシック",24,16+1
repeat ITEM_VMAX
pos 64,0
hgbutton gosub " ",*_temp,2+4+8+64+256,$ffffffff,0
nameibid_list(cnt)=stat
hgSetParent nameibid_list(cnt), picibid_list(cnt) //アイテム画像用ボタンの子に設定
SetWindowRgn objinfo_hwnd(nameibid_list(cnt)),CreateRectRgn(0,0,0,0),0
loop
//アイテム説明用ボタン作成
pos 64,32
font "MS ゴシック",20,16
repeat ITEM_VMAX
pos 64,32
hgbutton gosub " ",*_temp,2+4+8+64+256,$ffffffff,0
effibid_list(cnt)=stat
hgSetAllWinObjStyle effibid_list(cnt),0x0000100
hgSetParent effibid_list(cnt), picibid_list(cnt) //アイテム画像用ボタンの子に設定
SetWindowRgn objinfo_hwnd(effibid_list(cnt)),CreateRectRgn(0,0,0,0),0
loop
//アイテム個数用ボタン作成
objsize 64,64
font "MS ゴシック",20,16+1
repeat ITEM_VMAX
pos 64+200+32,0
hgbutton gosub " ",*_temp,2+4+8+64+256,$ffffffff,0
stcibid_list(cnt)=stat
hgSetParent stcibid_list(cnt), picibid_list(cnt) //アイテム画像用ボタンの子に設定
SetWindowRgn objinfo_hwnd(stcibid_list(cnt)),CreateRectRgn(0,0,0,0),0
loop
//アウテム一覧を開くボタン作成
objsize 80,24
font "MS ゴシック",14,16+1
hgObjImage -1
pos 32,32
hgbutton gosub "アイテム",*_itemlist_open,2+64,$ff0000ff
itemlistopen_id=stat
objsel itemlistopen_id
//開くボタン用カーソル作成
pos -20,0
objsize 32,32
hgObjImage etctexid, 32*15, 64, 32*15, 64, 32*15, 64, 0, 0, 0
hgbutton gosub "",*_temp,2+4+8+64
cursor_id=stat
hgSetParent cursor_id, itemlistopen_id//開くボタンの子に設定
//リストボック用カーソル作成
hgbutton gosub "",*_temp,2+4+8+64+256
cursor_id2=stat
hgSetParent cursor_id2, listbox_id //リストボックスの子に設定
clscolor $4444
repeat
stk_b=stk
stick stk,$ff
if stk=128 and stk_b=0{
if itemlist_on {gosub *_itemlist_open}else{end}
}
hgdraw
p_bak=p
getkey p,107
if p=1 and p_bak=0 {//テンキーの + で所持アイテム追加
list_topindex_bak=list_topindex+ITEM_VMAX
list_txt+"\n" //リストボックスに殻の改行を追加
objprm listbox_id,list_txt //リストボックsに反映
objprm listbox_id,list_index //リストックすの背選択中を反映
itemid=rnd(64) //適当なアイテムID
itemid_list(item_max)=itemid //リストに追加
itemstock_list(item_max)=rnd(100)+1 //個数をリストに追加
item_max++ //所持数追加
if itemlist_on {itemlist_on=2:hgWinObjInvalid cursor_id2} //アイテム一覧が表示中なら追加したフラグセット
}
if itemlist_on {gosub *_itemlist}
objsel -1
if stat>=0 {
id=stat
if id=listbox_id {//リストボックスにフォーカスが合ってる
if stk&32 {//エンターが押された
SetWinObjPos cursor_id2,-16+2,(list_index-list_topindex)*64+16+2
itemid=itemid_list(list_index)
title ""+strf("名前:%s 効果:%s",item_name(itemid),item_effect(itemid))
}else{
SetWinObjPos cursor_id2,-16+(cnt/10)\2,(list_index-list_topindex)*64+16+(cnt/10)\2
}
}
if id=itemlistopen_id {//アイテム一覧を開くボタンにフォーカスが合ってる
if itemlist_on=0 {//一覧が閉じてる
if stk&32 {//エンターが押された
SetWinObjPos cursor_id,-20+2,-16+2 //離されたときにジャンプするのでカーソルだけ処理
}else{
if stk_b&32 {//エンターが離された
hgWinObjArgb cursor_id, 1,$88000000 //カーソル半透明
gosub *_itemlist_open //一覧オープン処理にジャンプ
}else{
SetWinObjPos cursor_id,-20+(cnt/10)\2,-16+(cnt/10)\2 //カーソルアニメーション(位置をずらしてるだけ)
}
}
}
}
}else{
if ginfo_act>=0 {
if itemlist_on=0 {
objsel itemlistopen_id
}else{
objsel listbox_id
}
}
}
hgAllWinObjDraw //hgAllWinObjを描画
actid=stat //フォーカスが合ってるhgAllWinObjID
hgsync 16
loop
stop
*_itemlist
sendmsg objinfo_hwnd(listbox_id), $018E,0,0 // LB_GETTOPINDEX($018E)
list_topindex=stat
if list_topindex_bak ! list_topindex {
if list_index<list_topindex or list_index>=(list_topindex+ITEM_VMAX) {
if cursor2_off=0 {
cursor2_off=1
hgWinObjInvalid cursor_id2
}
}else{
if cursor2_off=1 {
cursor2_off=0
hgWinObjValid cursor_id2
}
}
if list_topindex>list_topindex_bak {
loop_max=limit(list_topindex-list_topindex_bak,0,ITEM_VMAX)//表示トップインデックスの変化分をループ回数にする(但し表示最大数以内)
topindex=list_topindex+ITEM_VMAX-loop_max //現在のトップインデックスに表示最大数を足してループ回数を引いて更新するアイテムリストインデックにする
index=ITEM_VMAX-loop_max //表示最大数からループ回数絵を引いて表示インデックスにする
repeat loop_max,topindex
_cnt=cnt\ITEM_VMAX
SetWinObjPos picibid_list(_cnt), 0,index*64 //アイテムボタン座標設定
itemid=itemid_list(cnt)
hgsetobjimageindex3 picibid_list(_cnt),item_tixy(itemid*6)
objprm nameibid_list(_cnt), item_name(itemid)
objprm effibid_list(_cnt), item_effect(itemid)
objprm stcibid_list(_cnt), itemstock_list(cnt)
index++
loop
}else{
index=0
loop_max=limit(list_topindex_bak-list_topindex,0,ITEM_VMAX)
loop_max=limit(loop_max,0,item_max-list_topindex)
repeat loop_max,list_topindex
_cnt=cnt\ITEM_VMAX
SetWinObjPos picibid_list(_cnt), 0,index*64 //アイテムボタン座標設定
itemid=itemid_list(cnt)
hgsetobjimageindex3 picibid_list(_cnt),item_tixy(itemid*6)
objprm nameibid_list(_cnt), item_name(itemid)
objprm effibid_list(_cnt), item_effect(itemid)
objprm stcibid_list(_cnt), itemstock_list(cnt)
index++
loop
if itemlist_on ! 1 {//1以外ならアイテム表示中更新
itemlist_on=1 //アイテム表示中更新したフラグ
repeat loop_max,list_topindex
_cnt=cnt\ITEM_VMAX
hgWinObjValid picibid_list(_cnt)
hgWinObjValid nameibid_list(_cnt)
hgWinObjValid effibid_list(_cnt)
hgWinObjValid stcibid_list(_cnt)
loop
hgWinObjValid cursor_id2
}
}
list_topindex_bak=list_topindex
}
return
*_itemlist_open
if itemlist_on=0 {//アイテム一覧が閉じられてる
list_topindex_bak=list_topindex+ITEM_VMAX
hgWinObjValid listbox_id
notesel list_txt
if item_max ! notemax {
if item_max > notemax {
repeat item_max - notemax
list_txt+"\n"
loop
}else{
list_txt=strmid(list_txt,0,item_max*2)
}
objprm listbox_id,list_txt
}
noteunsel
gosub *_itemlist
objsel listbox_id
if list_index<0 {objprm listbox_id,0}else{objprm listbox_id,list_index}
}else{//アイテム一覧が開いている
itemlist_on=0
hgWinObjInvalid cursor_id2
hgWinObjInvalid listbox_id
repeat ITEM_VMAX
hgWinObjInvalid picibid_list(cnt)
hgWinObjInvalid nameibid_list(cnt)
hgWinObjInvalid effibid_list(cnt)
hgWinObjInvalid stcibid_list(cnt)
loop
objsel itemlistopen_id
hgWinObjArgb cursor_id, 1,$ff000000
}
return
*_temp
return
| |
|
2015/9/23(Wed) 12:28:34|NO.71867
編集可能なコンボボックスの画像
http://ux.getuploader.com/himajin130414/download/23/combinput.PNG
hgcomboxの子にhginputを設定して
編集追加可能なコンボボックスにしてみるテスト
インプット内クリックで編集開始
エンターで編集内容をリストに反映
コントロール+エンターでインプット内容をリストに追加
#include "hgimg3.as"
#include "mod_hgallwinobj.hsp" //必ずhgimg3.asの後にinclude
#uselib "user32"
#func GetWindowText "GetWindowTextA" int, var, int
hgini
font "MS ゴシック",24,16
objsize 256,24 //表示Yサイズはフォントサイズが基準になる
pos 100,100
comblist="HSP\nHGIMG3\nあいうえお\nアイウエオ"
hgcombox combindex,500,comblist,,$ffffffff,$ffbb88bb,$ffdd88dd //想定される項目追加に応じて拡張Yサイズを設定(objsizeのYサイズでも可)
cbid=stat
hgGetAllWinObjPos cbid, p_px, p_py, p_sx, p_sy //hgcomboxの表示サイズを取得
sdim input_buf,1024
notesel comblist
noteget input_buf,combindex
noteunsel
pos 2,2 //hgcomboxのの子にするので相対座標を設定
hginput input_buf,p_sx-18, p_sy-4 //hgcomboxサイズから枠とドロップダウンボタンのサイズを引いて指定 枠を半透明設定の透明度0
ipid=stat
hgsetinput ipid,HGINPUT_MODE,4 //枠非表示
hgSetParent ipid, cbid ///hginputをhgcomboxの子に設定
//hginputの色変更
hgsetinput ipid,HGINPUT_RGB_GMODE,$dd88dd //インプットの文字色
hgsetinput ipid,HGINPUT_SEL_RGB_GMODE ,$ff8888 //インプット内選択中文字色
hgsetinput ipid,HGINPUT_SELBG_RGB_GMODE,$8888 //インプット内選択中背景色
title ""+combindex+" "+input_buf
clscolor $3333
repeat
stick stk,$fff-32-128 //EnterとEscは押した時だけ
if stk&128 :end // [ESC]で終了
hgdraw
//選択中項目をインプットに反映
if combindex ! combindex_bak {//コンボボックスの選択項目が変わった
combindex_bak=combindex
notesel comblist
noteget comstr,combindex
noteunsel
objprm ipid,comstr
objsel ipid
title ""+combindex+" "+comstr
}
//インプット内容を選択中項目に反映
if (stk&32)>0 and ime="" {//エンターが押されてIME内に文字列が無いなら
notesel comblist
GetWindowText objinfo(ipid,2),input_buf,63
noteadd input_buf,combindex,(stk&64)=0
noteunsel
objprm cbid,comblist
objprm cbid,combindex
title ""+combindex+" "+input_buf
}
hgAllWinObjDraw //hgAllWinObjを描画
actid=stat //フォーカスが合ってるhgAllWinObjID
ime=refstr //IME内に文字列
hgsync 16
loop
| |
|
2015/9/27(Sun) 13:05:03|NO.71987
NO.71808とNO.71857に書いたマクロに間違いがありました
>#define ctype global hggetobjimagetex(%1) hgbt_tex_id_list@mod_hgallwinobj((%1)*9)
は
#define global ctype hgGetObjImageTex(%1) hgbt_tex_id_list@mod_hgallwinobj(%1)
にして下さい
|
|