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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0623
リセット関数を利用した遊びプログラム4解決


リセット

リンク

2015/6/23(Tue) 22:32:20|NO.69845

関数を利用したプログラムを作ってみました。
これを見て、改良した方がいい点などありましたら、教えてください!!



*start /*初期化*/ m1 =0.0 m2 =0.0 f =0.0 mx1=0.0 my1=0.0 mx2=0.0 my2=0.0 a =0.0 mx =0.0 my =0.0 x =0.0 y =0.0 a =0.0 q =0.0 mousexx=0.0 mouseyy=0.0 /*メインプログラム*/ repeat -1 redraw 0 color 255,255,255:boxf stick ky,0 mousexx = double(mousex) mouseyy = double(mousey) if (ky=256)&(m2=0)&(m1=1){ /*第2の点の座標を入力*/ mx2=mousexx my2=mouseyy m2=1 } if (ky=256)&(m1=0){ /*第1の点の座標を入力*/ mx1=mousexx my1=mouseyy m1=1 } if m1=1{ color 255,0,0 /*第1の点の表示*/ pos mx1,my1 mes "■" } if m2=1{ /*第2の点の表示*/ color 0,0,255 pos mx2,my2 mes "▼" } if (m1=1)&(m2=1)&(f=0){ /*第1の点と第2の点の傾きの計算*/ f=1 my = my1-my2 mx = mx1-mx2 if (mx=0):m2=0:mx=1:f=0 //0除算対策 a=my/mx //傾きを計算 qx=-1.0 //移動量の設定 qy=-1.0 //移動量の設定 if mx<0:qx*=-1 //移動量の選択 if my<0:qy*=-1 //移動量の選択 } if f=1{ /*第1の点kから第2の点の移動*/ if (a<=1)&(a>=-1){ x+=qx y=a*x }else{ y+=qy x=y/a } x0=mx1+x:y0=my1+y //移動する点の表示&移動 color 0,255,0 pos x0,y0 mes "●" } if (x0+16>mx2+16)&(x0<mx2+16)&(y0+16>my2)&(y0<my2+16){ /*移動しきった処理*/ goto *start } redraw 1 await 5 loop

基本的なプログラムの説明・変数代入の意味等は説明していません。
そのほか、分からない・説明不足がありましたらお知らせください。



この記事に返信する


リセット

リンク

2015/6/23(Tue) 22:44:49|NO.69846

忘れていました。
使い方は、2か所をクリックするだけです。



kanahiron

リンク

2015/6/23(Tue) 23:18:31|NO.69848

0除算のチェックが抜けていたので再掲しました

直したほうがいいのは、repeat-loopをgotoで抜けているところです
何度もクリックするとネストが深くなりエラーが出ます
規模の大きいプログラムになると厄介なバグとなって出てくるので注意です

また動かす処理ですが、1pxずつ動かしているために遅く、awaitを5にして誤魔化してる気がします
await 5は200fpsとなりHSPの処理の遅さだとPCに掛かる負荷が大きくなってしまいます
またリフレッシュレート以上の画面更新をしても表示されるのはタイミングの合ったフレームだけしか表示されないので、
最後のほうが見えない、なんて事にもなります
ゲームなどでは大体await 16で大丈夫です(62.5fps)

自分もならこう書きます
onclickあたり少し誤魔化してる気がしますが… もう少しスマートにかけるようになりたい(´・ω・`)

onclick gosub *start stop *start if clif = 0{ mx1 = mousex my1 = mousey clif = 1 return } else { mx2 = mousex my2 = mousey distance = int(sqrt((mx1-mx2)*(mx1-mx2) + (my1-my2)*(my1-my2))/3.2+0.5) if ((mx1 = mx2) & (my1 = my2)) | (distance = 0){ clif = 0 return } vx = (0.0+mx2-mx1)/distance vy = (0.0+my2-my1)/distance clif = 0 } onclick 0 repeat distance redraw 0 color 255,255,255:boxf color 255,0,0 /*第1の点の表示*/ pos mx1,my1 mes "■" /*第2の点の表示*/ color 0,0,255 pos mx2,my2 mes "▼" color 0,255,0 pos mx1+vx*cnt,my1+vy*cnt mes "●" redraw 1 await 16 loop color 255,255,255:boxf:color onclick 1 return



Velgail

リンク

2015/6/24(Wed) 01:29:19|NO.69849

(以降全力投球のため初心者向けじゃないけど)
関数というから見てみたけども… えっと、作ったんじゃないのね。

将来のために(又は何かをへし折るため(折るな))私の場合のソースコードです。

分かる人にはとても読みやすいコード…?


#define global waitframes 100//移動にかかる時間(1/60秒単位) #module /*クリックするまで待ち、クリックした座標を返す命令*/ #deffunc getClickPosition var x,var y repeat stick ky,0 if(ky&256){ break } await 16 loop x=mousex y=mousey return /*第1の点の保存*/ #deffunc startPosition int x,int y sp_x=x sp_y=y printStartPosition return /*第1の点の表示*/ #deffunc printStartPosition color 255,0,0 pos sp_x,sp_y mes "■" return /*第2の点の保存*/ #deffunc endPosition int x,int y ep_x=x ep_y=y printEndPosition return /*第2の点の表示*/ #deffunc printEndPosition color 0,0,255 pos ep_x,ep_y mes "▼" return /*ムーブ映像を作る*/ #deffunc moving mes waitframes repeat waitframes redraw 0 color 255,255,255:boxf /*点の表示*/ printStartPosition printEndPosition /*イージング(HSP3.4以降)を使う。便利*/ setease sp_x,ep_x,linear my_x=getease(cnt,waitframes) setease sp_y,ep_y,linear my_y=getease(cnt,waitframes) /*移動する点の表示*/ color 0,255,0 pos my_x,my_y mes "●" redraw 1 await 16 loop color 255,255,255:boxf return #global repeat getClickPosition mx,my startPosition mx,my getClickPosition mx,my endPosition mx,my moving loop



リセット

リンク

2015/6/24(Wed) 21:58:43|NO.69855

皆さん!!
ありがとうございました。
あ、関数というのは、数学的な関数を言っていましたが、
内容のいい、プログラムが拝見出来たのでとてもよかったです!!
ありがとうございました。
修正等検討してみたいと思います。



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