• ベストアンサー

HSPについて

screen 0,320,240,1,dispx-320>>1,dispy-240>>1 mes "coin:a" mes "hit:s" mci "open Coin.wav alias abc" mci "open hit.wav alias def" *key onkey *push stop *push if iparam=65 : mci "play abc" if iparam=83 : mci "play def" wait 30 goto *key 文化祭用にプログラムを組んだのですが、実行してもらえれば分かると思いますが、特定のキーを押すと1回目は問題なく再生されるのですが、2回目に同じキーを押すと音がでません。 キーを押すと、特定の音が出るように組みました。 どのようにすればいいでしょうか? よろしくお願いします. 言語はHSPです。

noname#21101
noname#21101

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

  • ベストアンサー
  • dinowave
  • ベストアンサー率48% (20/41)
回答No.2

screen 0,320,240,1,dispx-320>>1,dispy-240>>1 onexit *MciClose mes "coin:a" mes "hit:s" mci "open Coin.wav alias abc" mci "open hit.wav alias def" *key onkey *push stop *push if iparam=65 :mci "seek abc to 0" :mci "play abc" if iparam=83 :mci "seek def to 0" :mci "play def" wait 30 goto *key *MciClose mci "close def" mci "close abc" wait 2 これで直りますよ~♪ このやり方が正しいかは分からないけど 再生する前に、再生する位置を最初にもどしてみました mci "seek def to 0" ですね あと余計な命令、mci "close abc" とか別に気にしないで下さい(^^; だけど、再生するならsndloadで読みこんで、sndで再生したほうがよいのでは? それなら自動的に最初に戻って再生してくれますし

noname#21101
質問者

お礼

ありがとうございました。 おかげさまでうまくいきました。

その他の回答 (1)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

HSPはよく知りませんが、キーを取り込んでうまくいかない一般例を2つほど。 (1)1文字入力の後にエンターが必要で計2文字入力となる。   対策は、1文字(エンター)読み捨て。 (2)2回目の入力の時にキーがまだ押されていないと、「ヌル」をたくさん読み込んでしまう。   対策はキーインのところで、ヌルを読み飛ばすループを作り、ヌル以外を拾う。 的外れだったらご免なさい。

noname#21101
質問者

お礼

御回答ありがとうございました。 今後の参考にさせていただきます。

関連するQ&A

  • HSP 耐久力のある敵

    こんにちは。HSPでSTGを制作しております そこで「耐久力のある敵」を作ったのですが 【敵と敵2のヒットが一緒になってしまうので、敵と敵2が同時に消えてしまいます】 原因は「敵と敵2」を一緒にしていることなんですが、 一緒にしないとこの先ソースが大きくなってしまうため一緒にするしかないと思ってます この場合選択肢がいくつかあると思います 1:敵を一緒にまとめたソース(これ)で解決する 2:敵を一緒にまとめる方法を変えて改善するか 3:当たった時の処理を変えるか 1を選択しなんとかしたいのですが、何かもっとよい方法がありましたら教えてください それではよろしくお願いします  -- ソース -- screen 0,380,450 buffer 1 // picload "自機.bmp" gsel 0,1 buffer 3 // picload "でかい妖精2.bmp" gsel 0 myx = 150 : myy = 350 ;自機座標 mySpd = 4 ;自機スピード ;←自機弾 TMMAX = 100 dim SHOT,100 dim SX,100 : dim SY,100 ;妖精 DKMAX = 2 repeat DKMAX DK_ene(DTK) = 0 DK_enex(DTK) = 0 : DK_eney(DTK) = 0 DTK++ loop ;****************メインループ************************* *メイン redraw 2 : color 20,20,20 : boxf ;****************カウンター************************* color 255,0,0 pos 10,90 : mes "←敵カウンター " + HIT pos 10,110 : mes "→敵カウンター " + HIT2 ;**************************************************** gosub *弾移動 gosub *自機移動 gosub *妖精 gosub *敵VS弾 ;自機 pos myx,myy : gmode 4,29,42,255 : gcopy 1,1,0 ;妖精 DTK = 0 repeat DKMAX if DK_ene(DTK) = 1 : pos DK_enex(DTK),DK_eney(DTK) : gmode 4,58,45,255 : gcopy 3,0,0 DTK++ loop ;自機弾 repeat TMMAX if SHOT(cnt) = 1{ pos SX(cnt),SY(cnt) : gmode 2,9,8,255 : gcopy 1,1,43 }loop redraw : await 15 goto *メイン ;**************自機の移動******************************* *自機移動 stick key,15 if key & 1 : myx = myx - mySpd if key & 2 : myy = myy - mySpd if key & 4 : myx = myx + mySpd if key & 8 : myy = myy + mySpd return ;****************弾の移動****************************** *弾移動 getkey keyZ,90 ;Zキー repeat TMMAX if (keyZ) and SHOT(cnt) = 0 and rensya = 0 { SHOT(cnt) = 1 : SX(cnt) = myx + 10 : SY(cnt) = myy - 10 : rensya = 500 } if SHOT(cnt) = 1 : SY(cnt) -= 10 if SY(cnt) < 0 : SHOT(cnt) = 0 if rensya > 0 : rensya -= 1 loop return ;****************妖精***************************** *妖精 ;敵X座高 DK_ENX(0) = 100 DK_ENX(1) = 200 ;位置 DTK = 0 repeat DKMAX  if DK_ene(DTK) = 0 : DK_ene(DTK) = 1 : DK_enex(DTK) = DK_ENX(DTK) : DK_eney(DTK) = 150 DTK++ loop return

  • Rubyにおける正規表現(一致しない)

    Rubyを使って、テキスト処理をやっています。 どうしても、うまく行かないところがあります。 サジェスチョンをお願いします。 正規表現にて、 2つの条件フラグが成立していて、かつ、特定の文字列を含まないという条件です。 1行の内容は、textに入っています。 if (myFlag1==1) && (myFlag2==1) && (!/abc def/) then xxxxxxxx end (!/abc def/)は、perlでの表現です。Rubyでは、少なくとも (!/abc def/=~text) かな、と考えましたが、ダメでした。 (/abc def/!=text) でも、だめでした。 宜しくお願いいたします。

  • 変数に「.」が含まれる場合...

    例えば・・・ Dim ABC As String '変数ABC の型宣言 ABC = "1.0" DEF = "522" …とまぁ、こんな感じの時。(文法とか、いいかげん) 変数ABCに「.」が含まれている時といない時に 特定の動作をさせたいんです。 変数ABC「.」が含まれていない時 ABC = DEF 「.」が含まれている時 「.」より右の数字を消して ABC & DEF Select Case、もしくはIF文を使って動作させる予定です 変数は、3文字限定です。それと、「.」の位置は 左か真ん中になることもあります。 例)ABC = .12 ABC = 0.1   ABC = 012 …なんとなく、Format関数を使ったら できそうな気がするんですが…。

  • excel2002vbaで選択しているセルがハイパーリンクとそれ以外のものを区別する方法

    ハイパーリンクをenterキーでリンク先に飛べるようにマクロを挿入したのですが、ハイパーリンク以外のセルでenterキーを押下した時に、「インデックスが有効範囲にありません」というエラーメッセジが表示されていまい通常のセル移動が行えません。 使用しているマクロは以前に掲載されていた以下のマクロをしようしています。 何かいい方法はあるでしょうか? Sub Auto_Open() '起動時 キー設定 On Call SettingKeys(True) End Sub Sub Auto_Close() '終了時 キー設定 Off Call SettingKeys(False) End Sub Sub SettingKeys(flg As Boolean) If flg Then Application.OnKey "{Enter}", "JumpHyperLink" Application.OnKey "~", "JumpHyperLink" Else Application.OnKey "{Enter}" Application.OnKey "~" End If End Sub Sub JumpHyperLink() If TypeName(Selection) = "Range" Then Selection.Hyperlinks(1).Follow NewWindow:=False End If End Sub

  • DOMについて教えてください

    DOMについて教えてください classの名前が class="abc"となっている時、下記のようなコードでヒットします。 IDの名前が id="def"となっている時、If objE.idName = "def" Thenなんて書くとエラーになります。 この場合どういうふうに書けばいいんでしょうか。 For Each objE In div2.getElementsByTagName("DIV") If objE.className = "abc" Then htmData1 = objE.innerText

  • 特定カラム値が規定値以上になった場合発動するトリガ

    MySQLのトリガについて教えてください。 投票システムを作っています。 テーブル名 abc ( abc1_id(プライマリ) , abc2_vote_volume(INT) ) テーブル名 def ( def1_id(プライマリ) , def2_vote_volume(INT) ) があります。 テーブル名 abc にある abc2_vote_volume(INT)にはユーザーが1票づつ投票します。 abc2_vote_volume(INT)が49までのうちは何も起こらず、 abc2_vote_volume(INT)が50を超えたら「テーブル名 def 」に全てをコピーしていくトリガの作成を考えました。 私が考えたのは下記の表現なのですが、エラーとなります。 FOR AS IF UPDATE 49<NEW.adc2_vote_volume が見るからに怪しいのですが、改定方法が分かりません。 詳しい方、ご教授頂けますようお願いいたします。 DELIMITER // CREATE TRIGGER a_ref AFTER UPDATE ON abc FOR AS IF UPDATE 49<NEW.adc2_vote_volume INSERT INTO def SET def1_id =NEW.abc1_id,abc2_vote_volume=NEW.abc2_vote_volume ON DUPLICATE KEY UPDATE def1_id =NEW.abc1_id,abc2_vote_volume=NEW.abc2_vote_volume; END; // DELIMITER

    • ベストアンサー
    • MySQL
  • PHP 配列について

    PHPで簡単なプログラムを作っています。 上手い方法があれば教えてください。 例えば $arr = array(); $arr(0) = "ABC"; $arr(1) = "DEF"; $arr(2) = "GHI"; $arr(3) = "JKL"; $arr(4) = "MNO"; この様な配列があり、これを以下の様に「特定のデータを削除し空いているキーを詰めたい」場合どうしたら良いのでしょうか? この場合は"DEF"を削除。 $arr(0) = "ABC"; $arr(1) = "GHI"; $arr(2) = "JKL"; $arr(3) = "MNO"; アドバイスお願いします。

    • ベストアンサー
    • PHP
  • 定石? perlで入力ファイルを処理する方法

    以下のようなファイルを入力して、配列/連想配列に格納、これを後段の処理に利用したいと考えています。結構複雑なことをやってようやく処理できたのですが、もっと良い方法はありませんでしょうか。 逆に入力ファイルのフォーマットを処理しやすいものにしてしまっても構いません(perl形式で記述してrequireする方法はここではNGとします)。アイディア宜しくお願い致します。 1. #はコメント 2. 最終イメージ  Vegetable: Tomato, Lettuce, Potato Fish : Salmon, Tuna, Fruit : Banana, Orange ※ ####~次の####までを塊として処理する部分で、ちょっと冗長な気がしています --- >8 --- >8 --- >8 --- >8 --- >8 # This is comment line # File created by ... # since 5/May/2009 #### Vegetable Tomato Lettuce Potato # Carrot <-- Comment line #### Fish Salmon Tuna #### Fruit Banana Orange --- >8 --- >8 --- >8 --- >8 --- >8 <<スクリプト例>> # ここでは@keyにカテゴリ(Vegetable, Fish, Fruit)、@valueに各々の食品名(Tomato, lettuce,...)を入れています #! /usr/bin/perl my $flag_first_match = 1; my $flag_hit = 0; my @key; my @value; open (LIST, "aaa.txt") || die "open error"; while(<LIST>){ if($flag_hit == 1){ $flag_hit = 0; $flag_seek = 1; if($flag_first_match==1){ $flag_first_match = 0; } } if(m/####\s+(.*)$/){ $key_tmp = $1; $flag_hit = 1; $flag_seek = 0; } chomp(); if(m/^\s*$/){next;} if(m/^#\s+/){next; } if($flag_hit==1 && $flag_first_match ==0 ){ # for on-going loop push(@value, $ref_tmp); } if($flag_hit == 1){ # for next loop push(@key, $key_tmp); $ref_tmp = []; } if($flag_seek == 1){ push(@$ref_tmp, $_); } } close(LIST); ### 印字確認 { local $, = ", "; for($i=0; $i < @key; $i++){ printf ("%2d | %-35s: ", $i, $key[$i]); foreach $ref ($value[$i]) { for ($j=0; $j < @$ref; $j++){ print "$j= @$ref[$j] "; } } print "\n"; } } <<出力>> 0 | Vegetable : 0= Tomato 1= Lettuce 2= Potato 1 | Fish : 0= Salmon 1= Tuna 2 | Fruit :

    • ベストアンサー
    • Perl
  • BASIC言語でmciSendCommand関数を扱う時

    Active Basicでゲームを作っています。 BGMを流すときに、PlaySound関数で音を鳴らそうと思ったのですが、 これはwav形式しか鳴らせないと知り、mciSendCommand関数を勉強することにしました。 mciSendCommand関数で、BGM(今回はmid)を読み出そうと思ったのですが、 『リピート再生』が出来ません。 いろいろ探してみたのですが、理解できませんでした。 そこで、いろいろ実験したのですが、どうも思うように動いてくれません。 MainWndとMenuの二つのウインドウがあります。 グローバル変数に Dim bErr As Long Dim mop As MCI_OPEN_PARMS を定義してあります。 ↓書いたコード(Menuウインドウ) mop.lpstrElementName=".\BGM\bgm01.mid" bErr=mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,mop) If bErr Then MessageBox(hMainWnd,"BGMの読み込みに失敗しましたので、強制終了します。","Error",MB_OK or MB_ICONHAND) SendMessage(hMainWnd,WM_CLOSE,0,0) End If '再生 Dim mpp As MCI_PLAY_PARMS mpp.dwCallback=hMainWnd bErr=mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY,mpp) If bErr Then MessageBox(hMainWnd,"BGMの再生に失敗したので、強制終了します。","ERROR",MB_OK or MB_ICONHAND) SendMessage(hMainWnd,WM_CLOSE,0,0) End If SetWindowPos(hMainWnd,HWND_TOP,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW) SetTimer(hMainWnd,2,213000,0) ここで、1回目の再生処理を入れて、SetTimer関数で、曲の長さ分のタイマーをセットして、曲が終了したらもう一度再生しなおすという方法でしました。 (探したサイトには、『リピート機能は無い』と書いてあったので) ↓タイムアウト時の処理(MainWnd) If TimerID=2 Then Dim mpp As MCI_PLAY_PARMS mpp.dwCallback=hMainWnd mpp.dwFrom=0 bErr=mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY,mpp) If bErr Then MessageBox(hMainWnd,"BGMの再生に失敗したので、強制終了します。","ERROR",MB_OK or MB_ICONHAND) SendMessage(hMainWnd,WM_CLOSE,0,0) End If End If 初めて扱う部分なので、まだ良く分かっていません。 どなたか良いやり方をご存知の方がいらっしゃいましたらご教授下さい。 お願いします。

  • IF関数で表示される特定の文字の色を変えたい

    IF関数で表示される特定の文字の色を変えたい Excelです。 例えば、 =if(a1=0,"abc012","def345") という関数を作って、このabcの色だけ赤に変えたいです。 マクロで Sub Macro1() Dim rng As Range Dim ptr As Integer Const tStr As String = "abc"  For Each rng In ActiveSheet.Cells.SpecialCells(xlCellTypeConstants, 23)   ptr = InStr(rng.Value, tStr)   If ptr > 0 Then    rng.Characters(Start:=ptr, Length:=Len(tStr)).Font.ColorIndex = 3   End If  Next rng End Sub と組んだのですが、普通にabcと打つと赤に変わるのですが、IF関数で表示されるabcは赤に変わりません。 どうすればいいか教えてください。