|
|
2015/5/10(Sun) 01:31:10|NO.69121
先日質問したばかりですが、また新しいことで分からなくなってしまい
試行錯誤したのですが答えが見つからなかったので書き込みさせて頂きました
windowsの拡大鏡ツールのような物を現在作成しておりまして
screen 0の一部を拾ってscreen 1に反映させているのですが
screen 0に四角のような囲まれた範囲をコピーしてます。。的な表示をしたいのですが
どうもうまくいきません。。
誰かいいアイデア、知恵を分けてください。
よろしくお願いします
#module
#deffunc boxfa int ax, int ay, int bx, int by
pdx = ax, bx, bx, ax
pdy = ay, ay, by, by
gsquare -1,pdx, pdy
return
#global
screen 0,680,480
randomize
repeat 300
pos rnd(640),rnd(480)
color rnd(255),rnd(255),rnd(255)
mes "●"
loop
screen 1,200,200,,1000,0
repeat
x=mousex
y=mousey
;color 50,50,50
;gmode 3,,,20
;boxfa mousex,mousey,mousex+150,mousey+150
gsel 1,0
gzoom 200,200,0,x-75,y-75,150,150
gsel 0,1
wait 10
loop
|
|
2015/5/10(Sun) 02:18:16|NO.69123
こういう事でしょうか??
Screen 2,680,480//別画面に元の画像を置いといて毎フレーム毎にメイン画面にコピーする。
//このソースコードではわかりやすいようにScreenで作成しています。
randomize
repeat 300
pos rnd(640),rnd(480)
color rnd(255),rnd(255),rnd(255)
mes "●"
loop
screen 0,680,480
screen 1,200,200,,1000,0
repeat
gsel 0,1
x=mousex
y=mousey
redraw 0//redrawは更新範囲が狭ければ狭いほど高速なので、できれば範囲を指定した方がいい。
pos 0,0:gcopy 2,0,0,680,480
color 50,50,50:boxf x,y,x+150,y+150
pos x+1,y+1:gcopy 2,x+1,y+1,149,149
redraw 1
gsel 1
gzoom 200,200,2,x-75,y-75,150,150//Screen0をコピーすると四角い枠も一緒にコピーされてしまうため2を指定。
await 17//waitは精度が低いのでawaitを使うことをお勧めします。awaitは1000で1秒です。
loop
|
|
2015/5/10(Sun) 02:21:25|NO.69124
gzoomのコピー元の座標を見落としてました。
正しくはこっちですね。
Screen 2,680,480//別画面に元の画像を置いといて毎フレーム毎にメイン画面にコピーする。
//このソースコードではわかりやすいようにScreenで作成しています。
randomize
repeat 300
pos rnd(640),rnd(480)
color rnd(255),rnd(255),rnd(255)
mes "●"
loop
screen 0,680,480
screen 1,200,200,,1000,0
repeat
gsel 0,1
x=mousex
y=mousey
redraw 0//redrawは更新範囲が狭ければ狭いほど高速なので、できれば範囲を指定した方がいい。
pos 0,0:gcopy 2,0,0,680,480
color 50,50,50:boxf x-75,y-75,x+75,y+75
pos x-74,y-74:gcopy 2,x-74,y-74,149,149
redraw 1
gsel 1
gzoom 200,200,2,x-75,y-75,150,150//Screen0をコピーすると四角い枠も一緒にコピーされてしまうため2を指定。
await 17//waitは精度が低いのでawaitを使うことをお勧めします。awaitは1000で1秒です。
loop
|
|
2015/5/10(Sun) 03:45:25|NO.69125
>NO.69124
はわわ、このコードだと、四角の選択枠が画面から一部出た際に
コピー先の絵が多少おかしくなる(領域外が反映されない)のです……
それと、マウス画面外に出た時全く動かないのは個人的にちょっと操作しにくいのです
ということで適当に修正してみました
// 各種定数
;画面ID
#enum kMainID = 0 ;メイン画面
#enum kSubID ;サブ画面(ルーペ)
#enum kBufID ;メイン画面用のバッファ
;オブジェクトのサイズ
#const kWinX 640
#const kWinY 480
#const kLoupeSize 200
#const kLoupeSize2 kLoupeSize / 2
// メインルーチン
randomize
;表示用画像を作成
buffer kBufID, kWinX, kWinY
repeat 300
pos rnd(kWinX), rnd(kWinY)
color rnd(255), rnd(255), rnd(255)
mes "●"
loop
;メイン画面およびサブ画面を表示
screen kMainID, kWinX, kWinY
screen kSubID, kLoupeSize, kLoupeSize, 4
title "サブ画面"
;メインループ
color 50, 50, 50 ;ルーペ枠の色
repeat
;表示座標をマウス位置から決定
;(mousex, mouseyはマウスが画面外に出ると機能しなくなるので……)
gsel kMainID
mx = limit(ginfo_mx - ginfo_wx1, kLoupeSize2, kWinX - kLoupeSize2)
my = limit(ginfo_my - ginfo_wy1, kLoupeSize2, kWinY - kLoupeSize2)
title "メイン画面(マウス:" + mx + ", " + my + ")"
;表示座標に従い、各種オブジェクトを再描画する
gsel kMainID
redraw 0
;背景
pos 0, 0
gcopy kBufID, 0, 0, kWinX, kWinY
;ルーペ枠
line mx - kLoupeSize2, my - kLoupeSize2, mx + kLoupeSize2, my - kLoupeSize2
line mx + kLoupeSize2, my - kLoupeSize2, mx + kLoupeSize2, my + kLoupeSize2
line mx + kLoupeSize2, my + kLoupeSize2, mx - kLoupeSize2, my + kLoupeSize2
line mx - kLoupeSize2, my + kLoupeSize2, mx - kLoupeSize2, my - kLoupeSize2
redraw 1
gsel kSubID
redraw 0
pos 0, 0
gcopy kBufID, mx - kLoupeSize2, my - kLoupeSize2, kLoupeSize, kLoupeSize
redraw 1
await 1000 / 30 ;とりあえず、約30fpsとした
loop
| |
|
2015/5/10(Sun) 03:58:45|NO.69126
ついでに拡大機能も付けてみたのです(左クリックで拡大、右クリックで縮小)
// 各種定数
;画面ID
#enum kMainID = 0 ;メイン画面
#enum kSubID ;サブ画面(ルーペ)
#enum kBufID ;メイン画面用のバッファ
;オブジェクトのサイズ
#const kWinX 640
#const kWinY 480
#const kLoupeSize 200
#const kLoupeSize2 kLoupeSize / 2
;その他
#const kZoomPerStep 10 ;この%だけズーム率が変化する
// メインルーチン
randomize
;表示用画像を作成
buffer kBufID, kWinX, kWinY
repeat 300
pos rnd(kWinX), rnd(kWinY)
color rnd(255), rnd(255), rnd(255)
mes "●"
loop
;メイン画面およびサブ画面を表示
screen kMainID, kWinX, kWinY
screen kSubID, kLoupeSize, kLoupeSize, 4
title "サブ画面"
;メインループ
color 50, 50, 50 ;ルーペ枠の色
zoom_per = 100 ;ズーム率(500%まで対応)
repeat
;表示座標をマウス位置から決定
;(mousex, mouseyはマウスが画面外に出ると機能しなくなるので……)
gsel kMainID
mx = limit(ginfo_mx - ginfo_wx1, kLoupeSize2, kWinX - kLoupeSize2)
my = limit(ginfo_my - ginfo_wy1, kLoupeSize2, kWinY - kLoupeSize2)
title "メイン画面(マウス:" + mx + ", " + my + " ズーム率:" + zoom_per + "%)"
;ズーム率をマウスクリックで変化させる
stick ky, 256 + 512
if(ky & 256) :zoom_per = limit(zoom_per + kZoomPerStep, 100, 500)
if(ky & 512) :zoom_per = limit(zoom_per - kZoomPerStep, 100, 500)
;表示座標に従い、各種オブジェクトを再描画する
gsel kMainID
redraw 0
;背景
pos 0, 0
gcopy kBufID, 0, 0, kWinX, kWinY
;ルーペ枠
line mx - kLoupeSize2, my - kLoupeSize2, mx + kLoupeSize2, my - kLoupeSize2
line mx + kLoupeSize2, my - kLoupeSize2, mx + kLoupeSize2, my + kLoupeSize2
line mx + kLoupeSize2, my + kLoupeSize2, mx - kLoupeSize2, my + kLoupeSize2
line mx - kLoupeSize2, my + kLoupeSize2, mx - kLoupeSize2, my - kLoupeSize2
redraw 1
gsel kSubID
redraw 0
pos 0, 0
kLoupeSize3 = 100.0 * kLoupeSize2 / zoom_per
gzoom kLoupeSize, kLoupeSize, kBufID, mx - kLoupeSize3, my - kLoupeSize3, kLoupeSize3 * 2, kLoupeSize3 * 2, 1
redraw 1
await 1000 / 30 ;とりあえず、約30fpsとした
loop
| |
|
2015/5/10(Sun) 22:11:26|NO.69138
スペース(HSP歴3年) 様
名無し様
ありがとうございます。
画面描画処理だったりscreen処理だったりと、自分の苦手分野なので
先輩方のコードを見て勉強します。
ありがとうございました(^^)ノ
また何かあると思うのでよろしくお願いしますm(_ _)m
|
|
2015/5/11(Mon) 00:21:00|NO.69140
解決した後にすみません。
gcopyで画面をコピーすると
マウスのカーソルは反映されません。
これをどうにか導入したいのですが
何か方法はないでしょうか?
|
|
2015/5/11(Mon) 00:44:29|NO.69142
>NO.69140
カーソルのアイコン画像をDLLから抽出して……は可能だけど、
そんなことするぐらいなら自前でカーソル画像をでっち上げて
マウスがある座標に表示させる処理組んだ方が手っ取り早いかと
|
|
2015/5/11(Mon) 19:52:16|NO.69144
マウスカーソル表示はこんな感じです。
#include "user32.as" //マウスカーソルの表示に使います。
Screen 2,680,480//別画面に元の画像を置いといて毎フレーム毎にメイン画面にコピーする。
//このソースコードではわかりやすいようにScreenで作成しています。
randomize
repeat 300
pos rnd(640),rnd(480)
color rnd(255),rnd(255),rnd(255)
mes "●"
loop
screen 0,680,480
screen 1,200,200,,0,0
repeat
gsel 0,1
x=mousex
y=mousey
redraw 0//redrawは更新範囲が狭ければ狭いほど高速なので、できれば範囲を指定した方がいい。
pos 0,0:gcopy 2,0,0,680,480
color 50,50,50:boxf x-75,y-75,x+75,y+75
pos x-74,y-74:gcopy 2,x-74,y-74,149,149
redraw 1
gsel 1
redraw 0
gzoom 200,200,2,x-75,y-75,150,150//Screen0をコピーすると四角い枠も一緒にコピーされてしまうため2を指定。
gosub *mouse_draw ;マウスカーソル表示
redraw 1
await 17//waitは精度が低いのでawaitを使うことをお勧めします。awaitは1000で1秒です。
loop
*mouse_draw
// マウスアイコンハンドルを取得
dim CURSORINFO,5
CURSORINFO.0=20
GetCursorInfo varptr(CURSORINFO)
// ホットスポットを取得
dim ICONINFO,5
GetIconInfo CURSORINFO.2,varptr(ICONINFO)
// アイコンを描画
DrawIconEx hdc,(ginfo_sx/2)-ICONINFO.1,(ginfo_sy/2)-ICONINFO.2,CURSORINFO.2,0,0,0,0,0x0003 ;とりあえず画面中央に描画してみる
return
|
|
2015/5/12(Tue) 02:27:08|NO.69154
Moz 様
座標あれこれで難しいですがなんとかやってみます
ありがとうございます
|
|