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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0515
ひろきジグソーパズルみたいにさぁ6未解決


ひろき

リンク

2006/5/15(Mon) 13:30:22|NO.734

ちょっとお聞きします。
ジグソーパズルゲーム風なの作っていますがうまく
いかないところがあるんです。

画像ピースをドラッグさせることはできたんですが
そのピースが正しい位置の近くにドロップさせると吸着してくれる
ようにしたいんですよ。

●をドラッグで移動させて背景の○に±5くらい近づいて
ドロップしたらピタッっと吸着して背景にぴったり重なるみたいなぁ
うまく説明できませんがご理解いただけるとうれしいなぁ

〜〜〜〜〜独り言〜〜〜〜〜
吸着したことが判るように変数に1とか代入できるともっといいけど・・・
〜〜〜〜独り言終了〜〜〜〜



この記事に返信する


Steep

リンク

2006/5/15(Mon) 14:42:00|NO.735

理解したが、何をして欲しいのか?



kz3

リンク

2006/5/15(Mon) 15:31:01|NO.736

吸ってみました。

ps = 50 adsorp = 20.0 font msgothic, ps repeat await stick key, 256 if( key == 256 ){ if( clkflg != 1 ){ x1 = mousex: y1 = mousey pos x1-ps/2, y1-ps/2: mes "■" clkflg = 1 } if( x1 != mousey )|( y1 != mousey ){ ax = 0.0 + x1 - mousex: ay = 0.0 + y1 - mousey if( sqrt( ax * ax + ay * ay ) >= adsorp ){ redraw 0 color 255,255,255: boxf color 0 pos x1-ps/2, y1-ps/2: mes "□" pos mousex-ps/2, mousey-ps/2: mes "■" redraw 1 }else{ redraw 0 color 255,255,255: boxf color 0 pos x1-ps/2, y1-ps/2: mes "■" redraw 1 } } } if( key == 0 ){ color 255,255,255: boxf color 0 clkflg = 0 } loop
画像処理に強い人ならもっとコンパクトに出来るハズ...、



K

リンク

2006/5/15(Mon) 22:05:44|NO.747

一番近い吸着ポイントの見つけ方だと推測
ピースの仕様を聞いてないから使えるかは謎


//GDSIZグリッド幅:GDグリッド数:GDS_POSグリッド開始座標:pc_posピース座標:ADSP吸着範囲 GDSIZ=35:GD=10:GDS_POSX=150:GDS_POSY=50:pc_posx=0:pc_posy=0:ADSP=5 //GDWS〜GDWEグリッドウィンドウ有効範囲 GDWS_X=GDS_POSX-ADSP:GDWS_Y=GDS_POSY-ADSP:GDWE_X=GDS_POSX+GDSIZ*GD-ADSP:GDWE_Y=GDS_POSY+GDSIZ*GD-ADSP buffer 1,,,0 repeat GD+GD+2 gd_setx=GDSIZ*cnt*(cnt<=GD)+GDS_POSX:gd_sety=GDSIZ*(cnt-GD-1)*(cnt>GD)+GDS_POSY gd_endx=GDSIZ*GD*(cnt>GD)+gd_setx:gd_endy=GDSIZ*GD*(cnt<=GD)+gd_sety line gd_setx,gd_sety,gd_endx,gd_endy loop gsel 0,1 repeat redraw 0 pos 0,0:gcopy 1,0,0,640,480 stick st,256 :drag=((st&256)>0)*drag if ((st&256)>0) and GDSIZ>abs(ms_x-pc_posx) and GDSIZ>abs(ms_y-pc_posy) or drag=1 { if drag {pc_posx=ms_x+mspcx:pc_posy=ms_y+mspcy} else {mspcx=pc_posx-ms_x:mspcy=pc_posy-ms_y:pc_posx=ms_x+mspcx:pc_posy=ms_y+mspcy:drag=1} gosub *adget ;表示用に }else{ if (GDWS_X<=pc_posx) and (GDWE_X>=pc_posx) and (GDWS_Y<=pc_posy) and (GDWE_Y>=pc_posy){ gosub *adget ;吸着ポイント収得 //距離がADSP以内の時にgd_posにGDS_POSを足してpc_posに代入(*6) if sqrdif<=ADSP{pc_posx=gd_posx+GDS_POSX:pc_posy=gd_posy+GDS_POSY} } } pos 100,450:mes "ピース x"+str(gdpc_posx)+" y"+str(gdpc_posy)+" 最寄交差点 ["+str(gd_posx/GDSIZ)+":"+str(gd_posy/GDSIZ)+"] 差分 x"+str(mindif_x)+" y"+str(mindif_y)+" 距離 "+str(sqrdif) boxf pc_posx,pc_posy,pc_posx+GDSIZ,pc_posy+GDSIZ wait 1:ms_x=mousex:ms_y=mousey redraw 1 loop //吸着ポイント収得 *adget gdpc_posx=pc_posx-GDS_POSX:gdpc_posy=pc_posy-GDS_POSY ;グリッド内の座標(*1) dif_x=gdpc_posx\GDSIZ:dif_y=gdpc_posy\GDSIZ ;左上の交差点からの差分(*2) //if dif_x>(GDSIZ/2):mindif_x=dif_x-GDSIZ:else:mindif_x=dif_x ;(これを計算だけでやったのが↓) mindif_x=dif_x-GDSIZ*(dif_x>(GDSIZ/2)) :mindif_y=dif_y-GDSIZ*(dif_y>(GDSIZ/2)) ;一番近い交差点までの差分(*3) gd_posx=gdpc_posx-mindif_x:gd_posy=gdpc_posy-mindif_y ;一番近い交差点(*4) sqrdif=sqrt(mindif_x*mindif_x+mindif_y*mindif_y) ;一番近い交差点までの距離(*5) return
重要なのは(*1)〜(*6)(こんなに分ける必要はないだろうけど・・・)

ピース座標をパズル盤面の座標に
ピースサイズでピース座標を割った余りが各ベースポジションまでの差分座標
その差分をピース座標から引くと近い左上のベースポジションが出せる
差分がサイズの半分以上なら一つ隣のポジションの方が近い
差分を線分距離にして判定
ウィンドウ座標に戻す

*2と*3が理解出来れば簡単だと思う

>吸着したことが判るように変数に1とか代入できるともっといいけど・・・

そんなのは、やりかたが分かれば自由に出来るでしょ
後、質問するならもっとやってる事を、分かるようにして欲しい
ピース分割の仕様ぐらいは、書いてもいんじゃない?
それと表示サンプルとかさ・・・

#説明の変数名が違ってたので再掲載



K

リンク

2006/5/16(Tue) 19:09:35|NO.753

ちょっと修正
> if ((st&256)>0) and GDSIZ>abs(ms_x-pc_posx) and GDSIZ>abs(ms_y-pc_posy) or drag=1 {

if ((st&256)>0) and pc_posx<ms_x and GDSIZ>(ms_x-pc_posx) and pc_posy<ms_y and GDSIZ>(ms_y-pc_posy) or drag=1 {

キャラ座標が中心と左上がごっちゃになってた・・・
(質問とは関係ない部分だけど)



kz3

リンク

2006/6/1(Thu) 14:59:26|NO.924

これの行方が気になるけど"ひろき"さんはどうしたのかなー



hiroki

リンク

2006/6/1(Thu) 17:35:14|NO.925

ぼくとちゃうよー (^^;)



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