HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0708
ぺんたマウスクリックのエフェクト3解決


ぺんた

リンク

2020/7/8(Wed) 18:09:45|NO.90941

HSPで、マウスをクリックしたときにエフェクトを表示させるソフトを
作りたいと思っているのですが、どのように作ればよいでしょうか?



この記事に返信する


ソラ

リンク

2020/7/8(Wed) 20:27:16|NO.90944

マウスの貫通とリージョンウィンドウ使えばできそう



こいる

リンク

2020/7/12(Sun) 09:23:48|NO.90975

リージョンウィンドウを使い、左クリックすると、マウスの位置に画像を表示するものを作ってみました。
ついでに、ウィンドウを半透明にしています。

後は、アニメーションエフェクトと、
連打への対応をすれば、いい感じになると思います。

// 不定形リージョンウィンドウ作成 モジュール ; HSP開発wiki様からお借りしました https://wiki.hsp.moe/%E4%B8%8D%E5%AE%9A%E5%BD%A2%E3%83%AA%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3.html#g426bdbb // 必要なものをインクルード #include "user32.as" #include "gdi32.as" #include "winmm.as" // これはリージョン作成に直接関係無し // ウィンドウ移動制御用の定数 #define global WM_NCLBUTTONDOWN $000000A1 #define global HTCAPTION 2 // リージョン作成用の定数 #define global WINDING 2 // モジュール記述 #module // CreateWindowRgn p1(targetWin), p2(baseWin) // targetWin : 不定形リージョンを適用するウィンドウID // baseWin : 不定形リージョンを作成する絵があるウィンドウID #deffunc CreateWindowRgn int targetWin, int baseWin gsel baseWin mref vram, 66 // 画像データを取得 dim pt, 100000 // 点データ用配列 dim ct, 100000 // 多角形点数記憶用配列 wx = ginfo_winx : wy = ginfo_winy // 画像サイズ取得 pget 0, 0 // 透明色の取得(点(0,0)の色を透明色にする) tr = ginfo_r : tg = ginfo_g : tb = ginfo_b // 変数初期化 // 注:yはデータ構造上、下から x = 0 : y = wy : flg = 0 : count = 0 : pt_cnt = 0 : poly_cnt = 0 repeat wy repeat wx // 画像データの構造にそってRGB値を取得 b = peek(vram,count) count++ g = peek(vram,count) count++ r = peek(vram,count) count++ // 透明色と比較 // 内部は説明面倒なので省略。やってることはIIと変わらない。 if (wx == x + 1) | ((r == tr) && (g == tg) && (b == tb)) { if flg == 1 { pt(pt_cnt) = x, y-1, x, y pt_cnt += 4 ct(poly_cnt) = 4 poly_cnt++ : flg = 0 } } else { if flg == 0 { pt(pt_cnt) = x, y, x, y-1 pt_cnt += 4 flg = 1 } } x++ loop x = 0 y-- loop // 取得した情報からリージョン作成(詳細はMSDNやその他サイト参照) CreatePolyPolygonRgn varptr(pt), varptr(ct), poly_cnt, WINDING tmpRgn = stat gsel targetWin // ターゲットウィンドウをアクティブに SetWindowRgn hwnd, tmpRgn, 1 // リージョン設定 DeleteObject tmpRgn // 後片付け return #global #define GWL_EXSTYLE $FFFFFFEC #define WS_EX_TRANSPARENT $00000020 #define WS_EX_TOOLWINDOW $00000080 #define WS_EX_LAYERED $00080000 #define LWA_COLORKEY $00000001 #define LWA_ALPHA $00000002 #define SW_HIDE $0 #define SW_SHOWNA $8 #define SWP_NOSIZE $1 #define SWP_NOZORDER $4 // 画像をバッファに読み込み(HSPのサンプルにある画像を流用) buffer 1 picload dir_exe+"\\hsptv\\king_knight.bmp" ;picload dir_exe+"\\sample\\pronama2d\\tamane_wizard2_5.png" // 大きい画像(大きいと、それだけリージョン作成に時間がかかる) winx = ginfo_winx winy = ginfo_winy // サイズを画像に合わた、枠なしウィンドウを作成 bgscr 0, winx, winy // ウィンドウの拡張スタイルを設定(マウス貫通 | タスクバーに表示させない | 不透明度を指定できるように) SetWindowLong hwnd, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW | WS_EX_LAYERED // ウィンドウを半透明に(これで下が透けて見える) SetLayeredWindowAttributes hwnd, 0, 155 , LWA_ALPHA // ウィンドウにリージョンを適用して、画像を描画(一番重要なところ) CreateWindowRgn 0, 1 // リージョンを使い、ウィンドウを画像の形と同じ形状に gcopy 1, 0, 0, winx, winy // バッファの画像をウィンドウにコピー // ウィンドウを最前面化して、非表示に gsel 0, 2 ShowWindow hwnd, SW_HIDE repeat // 左クリックで画像表示(長押しには反応しない) getkey isLClick, 1 if isLClick { if isFirstClick == 0 { isFirstClick = 1 // マウスの位置がウィンドウの中心にくるように、ウィンドウを移動 ;(標準命令のwidthだと、指定先が画面外だった場合に挙動が変になるので、MoveWindow関数を使用) ;width ,, ginfo_mx-(winx/2), ginfo_my-(winy/2) MoveWindow hwnd, ginfo_mx-(winx/2), ginfo_my-(winy/2), ginfo_winx, ginfo_winy, 0 // 一定時間ウィンドウを表示する ShowWindow hwnd, SW_SHOWNA wait 30 ShowWindow hwnd, SW_HIDE } }else{ isFirstClick = 0 } // Escで終了 getkey isEsc, 27 if isEsc == 1 { gsel 0,2 dialog "終了" end } wait 1 loop



ぺんた

リンク

2020/7/21(Tue) 17:05:31|NO.91056

まさに自分のやりたかったことです。
お二方ともありがとうございました!



ONION software Copyright 1997-2023(c) All rights reserved.