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


HSPTV!掲示板


未解決 解決 停止 削除要請

2022
0722
あいそとーぷ動作を軽くするにはどうしたらいいですか?2解決


あいそとーぷ

リンク

2022/7/22(Fri) 22:15:57|NO.96837

音ゲーを作っているのですが譜面の流れる速度が早くなったり遅くなったりしてしまいます。
どのようにすれば動作を軽くして一定の速度で流れるようにさせれるのでしょうか?

以下がそのコードです。


SX = 640 :SY = 480 screen 0,SX,SY,0+4 title "太鼓の達人みたいなゲーム" //譜面生成 origin="" repeat 200 ,1 if cnt\10=0{ if cnt\30=0 :origin+="2" :else :origin+="1" }else:origin += "00" loop //定数の初期化 strrep origin ,"0","0" NON = strlen(origin)-stat //The_NUMBER_OF_NOTES(ノーツの数) #const SON 75 //SIZE_OF_NOTES(ノーツの大きさ) #const POSY 150 //ノーツのY座標 #const SPD 8 //Spead(ノーツの速さ) *init ;変数の初期化 clrobj dim posx ,1024 ;ノーツのX座標 dim notes ,1024 ;ノーツの種類 dim flug ,1024 ;ノーツの消去フラグ dim key ,3,4 ;一次元(0:昔,1:今,2:押したときか否か) 二次元(0:D,1:F,2:J,3:K) num = 0 ;今流している最新のノーツ num2 = 0 ;これから消すノーツ kind = 0 ;キーの種類 gosub *Background color :font "",50 pos 0,0 :button "start",*main pos 100,0 :mes "PRESS ANY KEY" onkey *main stop *Main onkey 0 clrobj repeat redraw 0 gosub *GetNotes ;譜面取得 gosub *CheckKey ;キーが押されているか調べる gosub *Judgment ;判定(表示機能は未実装) gosub *MoveNotes ;譜面を動かす redraw 1 wait 1 if flug(NON-1) = 1 :gosub *MoveNotes :break ;最後のノーツが消えた時 loop pos 0,0 button "restart",*init ;もう一回やる stop //-------------------------------------------------- *GetNotes if cnt < strlen(origin) & strmid(origin,cnt,1) != 0{ //これから流すノーツを取得 posx(num) = SX-((SX-50)\SPD)//場所の初期化 notes(num) = strmid(origin,cnt,1) //ノーツ情報を取得 num++ } return *MoveNotes gosub *background repeat num cnt2 = num-cnt-1 if flug(cnt2) != 1 { posx(cnt2) -= SPD //進める if posx(cnt2) <= -SON : flug(cnt2) = 1 :num2++//スルーしたとき // ノーツ描写 color 255,255,255 circle posx(cnt2),POSY,SON+posx(cnt2),POSY+SON,1 color circle posx(cnt2),POSY,SON+posx(cnt2),POSY+SON,0 if notes(cnt2) = 1 :color 255,0,0 if notes(cnt2) = 2 :color 0,0,255 circle posx(cnt2)+3 ,POSY+3 ,SON+posx(cnt2)-3 ,POSY+SON-3 ,1 } loop return *CheckKey repeat 4 :key(0,cnt) = key(1,cnt) :loop ;昔のデータを保存 //キー取得 getkey key(1,0) ,'D' getkey key(1,1) ,'F' getkey key(1,2) ,'J' getkey key(1,3) ,'K' repeat 4 :key(2,cnt) = key(1,cnt)^key(0,cnt)&key(1,cnt) :loop ;今押されたのかどうか return *Judgment if key(2,1) = 1 | key(2,3) = 1{ kind = 2 ;D,Kは青ノーツ }else:if key(2,0) = 1 | key(2,2) = 1{ kind = 1 ;F,Jは赤ノーツ }else:kind = 0 if kind = notes(num2) & num > 0 { ;押されたキーとノーツの色が同じとき //判定(表示機能は未実装) h = posx(num2)-50 if -SPD<h & h<SPD{ logmes "PERFECT" }else:if -SPD*3<=h & h<=SPD*3 { logmes "GREAT" }else:if -SPD*5<=h & h<=SPD*5 { logmes "GOOD" }else:if -SPD*6<=h & h<=SPD*6 { logmes "HIT" }else:if h<-SPD*6 { logmes "MISS" } if h<=SPD*6 :flug(num2)=1 :num2++;ノーツを消す } return *Background //背景描写 color 255,255,255 :boxf color 050,080,080 :boxf 0 ,POSY-25 ,SX ,POSY+SON+25 //判定円描写 color 200,200,200 circle 50 ,POSY ,50+SON ,POSY+SON ,0 circle 50+10 ,POSY+10 ,50+SON-10 ,POSY+SON-10 ,0 line 50+SON/2 ,POSY-25 ,50+SON/2 ,POSY+SON+25 /*//判定を可視化 color 0,0,255 :boxf 50-SPD*6,0,50+SPD*6,SY color 0,255,0 :boxf 50-SPD*5,0,50+SPD*5,SY color 255,255,0 :boxf 50-SPD*3,0,50+SPD*3,SY color 255,0,0 :boxf 50-SPD*1,0,50+SPD*1,SY;*/ return



この記事に返信する


沢渡

リンク

2022/7/23(Sat) 12:04:23|NO.96839

waitではなくawaitを使ってはどうでしょう?

await 17-(cnt\3=0) //3ループに1回は16ミリ秒、それ以外は17ミリ秒待つ
このように、きっかり60FPSになるように待ち時間を設定したら、
今のところは上手くいきました。

もしくは、有用そうなモジュールを見つけましたので、
これを導入した上でwaitをfps_waitに置き換えるという方法もあります。
https://wiki.hsp.moe/Module%EF%BC%8FFPS%E5%88%B6%E5%BE%A1.html
(『モジュール』の項目の『+』を押すとモジュールのコードが出てきます)



あいそとーぷ

リンク

2022/7/23(Sat) 23:31:57|NO.96842

解決しました!
ありがとうございます!



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