• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:「HSP」で左クリック判定がうまく判定されません)

「HSP」で左クリック判定がうまく判定されません

このQ&Aのポイント
  • マウスの左クリック判定があいまいに判定されます。
  • 原因が不明なので教えて下さい。(初心者なので。。)

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>開始したり停止したりして不安定なものになっています。 なるほど、それは、getkeyのタイミングに依るものだと思います。(実際には、HSPの作成者に聞いてみないとわかりませんが) 「左マウスがクリックされた」というのをどのタイミングで見つけているのか 2つ考えられると思います。 1)今まさにボタンが押されている状態である。 2)ボタンは押されて次の瞬間指は離されていて、現在はクリックされていない。 2の状態でプログラムにクリックされたということが伝わるなら問題ないですが、 1の様な場合、もう既に処理が終わっている(動作を切り替えている)のにまだ(ゆっくりクリックしていて)マウスが押されていて、次の処理(また切り替える、実質戻ってしまう)が行われてしまう。 のかもしれません。 多分、この1の場合なのでしょうね。 動作を確実なものにするためには、一端マウスがクリックされた(getkeyが1を返した)という状態からgetkeyがいったん0になるまで処理を再びしないようにするということが必要だと思います。

dido123
質問者

お礼

ヒントを貰い解決しました。 ありがとうございます。 *main getkey k1,2 if (k1 == 1):print "OK" wait 1 ^^^^^^^^ (ここを wait 15に変更する) goto *main stop ことでクリック判定が反復することがなくなりました。 もっと良い方法があるとは思いますがwait処理を入れる方法でいきたいと思います。

dido123
質問者

補足

またまた、ありがとうございました。(☆o☆)キラ~ン *main getkey k1,2 if (k1 == 1):print "OK" wait 1 goto *main stop 1回のクリックで6回もOKが表示されました。 ・・・どうしよう┐(´~`)┌ もう少し考えてみます。 尚、もう少しこの問題を掲載しときます。謝謝

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

あいまいに判定というのがいまひとつわからないですが、多分問題ないのではないかと思います。 処理が飛び飛びになるということだったら コンピュータは無限のスピードを持っているわけでないので、処理にはある程度時間がかかります。その時間の経過するウチにマウスが動いてしまいます。 また、マウスの発するイベント(座標を返す)も無限に短い時間で起こっているわけではありません。(マウスの解像度ともいいます。どれだけの距離を動いたことを感知するか) 勘違いしたコメントだったらすみません。

dido123
質問者

補足

早速のお返事ありがとうございます。(^-^)ゞ マウスを画面上で動かすと"□"の軌跡を表示するプログラムです。 右クリックした際は画面をクリアする処理です。 こちらは問題なく即座に反応します。 左クリックした際は"□"の軌跡を停止・開始させたいのですが開始したり停止したりして不安定なものになっています。 問題文章がわかりにくくてすいませんでした。m(。-_-。)m できればコメント下されればありがたいです。 よろしくお願いします。(^人^)、オネガイッ!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • HSP超初心者の質問。

    ↓のスクリプトで、テストを押した後画面をクリックしても*test1に戻りません。 どうすればいいでしょうか。 複数のラベルから呼び出したいので、goto命令は使わない方法でお願いします。 *test1 cls button gosub "テスト",*test2 stop *test2 cls mes "クリックして下さい" getkey a,1 if a=1 : return stop

  • HSPで歩行アニメーションのプログラムの組み方

    HSPのソースコード(プログラム)の組み方に ついての質問となります。 カーソルキーの入力によってアニメーションしながら移動 するような歩行移動のプログラムの組み方について 教えていただきたい。 画像参照 (1)~(4) 右キー (1)(2)(3)(4)の順に画像を切り替えながら移動 (5)~(8) 左キー (5)(6)(7)(8)の順に画像を切り替えながら移動 (9)~(12) 上キー (9)(10)(11)(12)の順に画像を切り替えながら移動 (13)~(16) 下キー (13)(14)(15)(16)の順に画像を切り替えながら移動 を左から順にコマ送りで移動させたい 歩行しているように この場合if関数を使えば良いはずなのですが プログラムの組み方がイマイチ初心者講座HPで見ても動画で見ても、図書館等で勉強しても分らなかったので 出来る方の知恵をお貸し頂きたく 質問します。 画像もupしときましたので参考に見てくださいね。 ◆自分で書いたプログラム◆ title "カーソルキーによる移動とアニメ処理" buffer 2 :picload "歩行.bmp" screen 0,640,480 cls 4 x=128 :y=128 *main redraw 0 boxf x,y,x+127,y+127 stick ky,15 if (ky=1) {x-=15 pt=x/15\4 pos x,y :gcopy 2,pt*64,0,64,64 redraw 1 wait 10 goto *main } if (ky=4) {x+=15 //左 pt=x/15\4 pos x,y :gcopy 2,pt*64,0,64,64 redraw 1 wait 10 if (ky=4) {x+=15 //右 pt=x/15\4 pos x,y :gcopy 2,pt*64,64,64,64 redraw 1 wait 10 goto *main } if (ky=2) {x+=15 //上 pt=x/15\4 pos x,y :gcopy 2,pt*64,128,64,64 redraw 1 wait 10 goto *main } if (ky=8) {x+=15 //下 pt=x/15\4 pos x,y :gcopy 2,pt*64,192,64,64 redraw 1 wait 10 goto *main ◆ここまで◆ でプログラムの書き方間違っているのだと思うのですが どこをどう変更して良いのか分からず悩んでいます ヘルプの参照等見ていても 良くわからなかったので 間違ってる部分の指摘または 新たにサンプルプログラム(ソース)を解説付きで 教えていただけると有難いです ○┓ペコリ

  • クリックして頂点を線で結ぶ

     マウスでクリックした点から点まで順々に線でつなげる(二回目のクリックで線一本がひける。)プログラムを組んでいるのですが、配列を使う以外の方法を探しています。どなたかいい方法があればご紹介ください。  ちなみに配列を使ったプログラムを以下に載せます。 import java.applet.*; import java.awt.Graphics; import java.awt.event.MouseListener; import java.awt.event.MouseEvent; public class tyouten extends Applet implements MouseListener{ int i=0,j=0; int[] xx=new int[100]; int[] yy=new int[100]; public void init(){ addMouseListener(this); } public void mouseClicked(MouseEvent e){ xx[i]=e.getX(); yy[i]=e.getY(); if(i<99) i++; if(i>0)repaint(); } public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void paint(Graphics g){ for (j=0;j<i-1;++j) g.drawLine(xx[j],yy[j],xx[j+1],yy[j+1]); for(j=0;j<i;++j) g.drawOval(xx[j]-1,yy[j]-1,2,2); } }

    • ベストアンサー
    • Java
  • EXCEL VBA でユーザー定義型データーをproperty get let を使って受け渡しをしたい

    Excel2002Sp3を使用しています。 (WindowsはXpSp3です) ユーザー定義型の各メンバーに対して、property get/let/set を使用してデーターの受け渡しを行いたいのですが、うまくいきません。 以下に作成したプログラムを載せてみます。 main1()とmain2()がありますが、 main2()だとうまくいきます。 しかし、メンバー個別のやりとりにはなっていません。 main1()のようにメンバー個別でやりとりできるようにする方法がわかりません。 property get/let/setの書き方でできるようになるのでしょうか。 それとも、メンバー個別でのやり取りは仕様上できないのでしょうか。 もしできるのであれば、サンプルコードを教えていただけると助かります。 よろしくお願いします。 ------------------- Class1 ------------------- Option Explicit Private m_xx As X Public Property Get xx() As X xx = m_xx End Property Public Property Let xx(p As X) m_xx = p End Property ------------------- Module1 ------------------- Option Explicit Type X a As Long b As Long End Type Sub main1() '個別にやり取り Dim cc As New Class1 Dim p As Long Dim q As Long cc.xx.a = 5 cc.xx.b = 2 p = cc.xx.a q = cc.xx.b MsgBox p & "," & q End Sub Sub main2() 'yyを用意してまとめてやり取り Dim cc As New Class1 Dim p As Long Dim q As Long Dim yy As X yy.a = 5 yy.b = 2 cc.xx = yy p = cc.xx.a q = cc.xx.b MsgBox p & "," & q End Sub ----------------------------------------

  • HSP あたり判定

    こんにちは初めまして。 現在「HSP」でSTG(シューテングゲーム)を作っております。 当たり判定がいまいち反応が悪くって困っております。 原因がわかる方いましたらよろしくお願いいたします。  ●解決したいこと【当たり判定がちゃんと綺麗に処理される】 プログラム -------------------------------------------------- screen 0,380,450 buffer 1 // picload "自機.bmp" gsel 0,1 buffer 2 // picload "敵.bmp" gsel 0,1 myx = 150 : myy = 350 ;自機の座標 mySpd = 5 ;自機スピード ;←弾 TM_SPD(0) = 5 ;自機弾のスピード(5) TM_CO(0) = 0 ;自機弾のカウンターの初期化(連射間隔を調整) TM_WAIT(0) = 10 ;連射間隔(10) ;→弾 TM_SPD(1) = 5 ;自機弾のスピード(5) TM_CO(1) = 0 ;自機弾のカウンターの初期化(連射間隔を調整) TM_WAIT(1) = 10 ;連射間隔(10) MYTMMAX = 7 ;自機弾の最大数 repeat MYTMMAX ;自機弾の最大数(7) ;←弾 mytm.cnt = 0 ;自機弾フラグ mytmx.cnt = 0 : mytmy.cnt = 0 ;自機弾の座標 ;→弾 mytm2.cnt = 0 ;自機弾フラグ mytmx2.cnt = 0 : mytmy2.cnt = 0 ;自機弾の座標 loop ;敵 TKMAX = 7 ;敵の最大数 repeat TKMAX ;敵の最大数(7) enemy.cnt= 0 ;敵フラグ emx.cnt = 0 : emy.cnt = 0 ;敵の座標 loop ;****************メインループ************************* *メイン redraw 2 : color 20,20,20 : boxf ;敵 gosub *敵機の処理 ;自機 gosub *自機の移動 gosub *自機の←弾 gosub *自機の→弾 ;当たり判定 gosub *敵VS弾 ;自機 pos myx,myy : gmode 2,29,42,255 : gcopy 1,1,0 ;敵 repeat TKMAX ;敵の最大数(7) if enemy.cnt = 1 : pos emx.cnt,emy.cnt : gmode 2,26,22,255 : gcopy 2,1,1 loop ;自機弾 repeat MYTMMAX ;自機弾の最大数(7) ;←弾 if mytm.cnt = 1 { pos mytmx.cnt,mytmy.cnt gmode 2,9,8,255 : gcopy 1,1,43 } ;→弾 if mytm2.cnt = 1 { pos mytmx2.cnt,mytmy2.cnt gmode 2,9,8,255 : gcopy 1,1,43 }loop redraw : await 10 goto*メイン

  • MS-DOSの起動ディスクでループする?

    どうにもいきづまってしまいましたのでお力を貸して下さい。 WindowsXPからMS-DOSの起動ディスクをフロッピーディスクで作成してAUTOEXEC.BATに下のように書いたのですがメニューから入力するところで止まらずうまくいきません。 Windowsのコマンドプロンプト上ではうまくいくのですが、調べてみたらコマンドプロンプトとMS-DOSが別ものということはわかったのですがどのように直していいかわかりません。 すみませんがご教授いただけないでしょうかよろしくお願いします。 環境 OS:Windows XP Pro PC:NEC VersaPro :Main cls @echo off rem メニュー echo キー入力後、エンターで決定して下さい echo [0] 処理 echo [E] 終了 rem 入力値の取得 set /p input= if defined input set input=%input:"=% rem 入力値判断 if /i "%input%" == "0" (goto KAKUNIN) if /i "%input%" == "E" (goto exit) else goto Main goto main :KAKUNIN cls echo 処理をしていいですか? Y/N set /p input= if defined input set input=%input:"=% if /i "%input%" == "Y" (goto SYORI) if /i "%input%" == "N" (goto Main) else goto KAKUNIN :SYORI 処理をする pause :exit

  • Hspゲーム

    HSPでブロック崩しを作ってます。ブロックを全て消したあとにgame clearと入れたいのですが、どのようなソースをどこに入れればいいのかわかりません。 これがソースです。 ;設定など #define Ver "3.12" #define SOFTNAME "ブロック崩し" #define TITLEBAR SOFTNAME+" #define EXENAME "block" #packopt type 0 #packopt name EXENAME #packopt runtime "hsp3c.hrt" #packopt hide 0 ;ウインドウの作成 screen 0,320,240 : title TITLEBAR ;初期化 *init ;主な変数の宣言  dim block,8,4;ブロックの状態 あれば1 repeat 4 : j=cnt repeat 8 : i=cnt block(i,j)=1 loop loop ball_flag = 0;ボールの状態 あれば1 ball_num = 2;ボールの残り数 ball_x = 320;ボールの座標 ball_y = 240;最初は見えないように画面外に ball_vx = 0;ボールの速度 ball_vy = 0 bar_x = 0;バーの座標 ;メインループ *main await 17;1秒に60回ループする ;キー入力処理 stick ky,15 if ky&128 : end;Escで終了 ;バーの座標はマウスの位置で決める bar_x = mousex - 24 ;ボールがあるときとないとき if ball_flag = 0 { if ky&256 {;クリックされたら ball_flag = 1 ball_x = bar_x + 16 ball_y = 208 ball_vx = 4 ball_vy = -4 } } else { ;前回の座標を記録(ブロックとの衝突判定で使う) ball_x_before = ball_x ball_y_before = ball_y ;速度の分だけ座標に足す ball_x += ball_vx : ball_y += ball_vy ;画面の端に当たったら反射 if ball_x < 0 { ball_x = 0 ball_vx = -ball_vx } if ball_x > 304 { ball_x = 304 ball_vx = -ball_vx } if ball_y < 0 { ball_y = 0 ball_vy = -ball_vy } if ball_y > 240 {;下に落ちたらボールを消す ball_flag = 0 ball_num-- if ball_num = -1 { pos 200,200 : color 255,255,255 mes "ゲームオーバー" stop } } ;バーに当たったら反射 if (204 < ball_y) & (ball_y < 209) { if (bar_x-16 < ball_x) & (ball_x < bar_x+48) { ball_vy = -ball_vy } } } ;ブロックとの衝突判定 tmp=0;二重のrepeat-loopから一気に抜け出すためのフラグ repeat 4 : j=cnt repeat 8 : i=cnt if block(i,j) = 1 { if (32 + i*32 - 16 < ball_x) & (ball_x < 62 + i*32) { if (32 + j*16 - 16 < ball_y) & (ball_y < 46 + j*16) { block(i,j) = 0;ブロックを消す ;前回のx座標がすでに範囲に入っていた場合y方向の向きを反転 if (32 + i*32 - 16 < ball_x_before) & (ball_x_before < 62 + i*32) { ball_vy = -ball_vy tmp=1 : break } ;前回のy座標がすでに範囲に入っていた場合x方向の向きを反転 if (32 + j*16 - 16 < ball_y_before) & (ball_y_before < 46 + j*16) { ball_vx = -ball_vx tmp=1 : break } ;どちらも入ってない場合は両方判定 ball_vx = -ball_vx ball_vy = -ball_vy } } } loop if tmp=1 : break loop ;いろいろ描画 redraw 0 color 0,0,0 : boxf;白で全体を塗りつぶす ;ボールとバー pos ball_x,ball_y : color 255,255,0 : mes "●" pos bar_x,220 : mes "-------" ;ブロック repeat 4 : j=cnt repeat 8 : i=cnt if block(i,j) = 1 { boxf 32 + i*32, 32 + j*16, 62 + i*32, 46 + j*16 } loop loop redraw 1 goto *main よろしくお願いします。

  • VBAで選択セルの判定について

    マウスでWorkSheetの任意のセルを選択して、CommandButton1をクリックします。 その際に、選択セルが"(NULL)"かどうかの判定をしたいのですが、 どのように記載したらよいのでしょうか。 If 「  ?  」= "" Then ・・・・・ EndIf

  • java 画像ファイル

    下記のプログラムは読み込んだファイルの拡張子を表示するプログラムの一部なのですが,コマンドライン引数で指定したファイルがPNG形式の時だけエラーが出ます.ほかの判定を消してPNG判定だけにするとエラーがでないので if の書き方に問題があるのではないかと思うのですが何がいけないのでしょうか? while (((ch = bis.read()) != -1)) { /*GMP判定*/ if((byte)ch == BMP_SIGNATURE[k]) { flg1++; if(flg1 == BMP_SIGNATURE.length) { System.out.println(args[0] + "はBMP形式のファイルです."); break; } } /*JPEG判定*/ else if((byte)ch == JPEG_SIGNATURE[k]) { flg2++; if(flg2 == JPEG_SIGNATURE.length) { System.out.println(args[0] + "はJPEG形式のファイルです."); break; } } /*PNG判定*/ else if((byte)ch == PNG_SIGNATURE[k]) { flg3++; System.out.println(flg3); if(flg3 == PNG_SIGNATURE.length) { System.out.println(args[0] + "はPNG形式のファイルです."); break; } } /*GIF判定*/ else if((byte)ch == GIF_SIGNATURE[k]) { flg4++; if(flg4 == GIF_SIGNATURE1.length) { System.out.println(args[0] + "はGIF形式のファイルです."); break; } } k++; }

    • ベストアンサー
    • Java
  • マウスのボタン判定について

    仕事でJAVAを使ってWINDOWSのアプリ画面を作っています。 質問なのですが、マウスイベントで右ボタン、左ボタンどちらが押されたか 判定すると思いますが、 1.右ボタンが押された場合、左ボタンは押されているか? という所で詰まっています。逆のパターンは判定できたのですが、何故か1のパターンが 判定できません。 ・JAVAのバージョン(1.3.1) ・開発端末のOS(WindowsXP HomeEdition) public void mousePressed( MouseEvent e ) { int modifiers = e.getModifiers(); // 右左同時押しの場合 if ( ( modifiers & InputEvent.BUTTON1_MASK ) == InputEvent.BUTTON1_MASK && ( modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK ) { // この判定には入る。 System.out.println( "同時押しです。" ) ; } // 左ボタンが押された場合 else if ( ( modifiers & InputEvent.BUTTON1_MASK ) == InputEvent.BUTTON1_MASK ) { // 右ボタンも押されているか? if ( ( modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK ) { // この判定には入っている。 System.out.println( "右ボタンも押されています。" ) ; } } // 右ボタンが押された場合 else if ( ( modifiers & InputEvent.BUTTON3_MASK ) == InputEvent.BUTTON3_MASK ) { // 右ボタンも押されているか? if ( ( modifiers & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK ) { // この判定には入らない。 System.out.println( "右ボタンも押されています。" ) ; } } } ※(大雑把に書くとこんな感じです。) 個人的にはJAVAのバージョンに依存するものなのかなぁと考えているのですが、 1.3.1では駄目なのでしょうか? 乱文、雑文ではありますが、ぜひともご教授をお願いします。

    • ベストアンサー
    • Java