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


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0611
ohnoコードに時間制限を付けてほしいです2未解決


ohno

リンク

2024/6/11(Tue) 17:47:20|NO.101809

以下のコードに30秒の時間制限を設けてほしいです。



//------------------------------------------------------------------------------
// シューティング・ゲームのミニ講座 for HSP(Ver.3.3.2) //============================================================================== // 第9回「完成ソース」by 科学太郎 //------------------------------------------------------------------------------ //-------------------------------------- // メイン部 //-------------------------------------- *Init ;スコアの管理 dim Score ;現在スコア dim HiScore ;最高スコア ;自機の管理 dim x ;自機の横軸 dim y ;自機の縦軸 dim fight ;自機の残機数 dim blast ;自機の爆発カウンタ ;弾丸の管理 dim tamaF,10 ;有無フラグ dim tamaX,10 ;弾丸の横軸 dim tamaY,10 ;弾丸の縦軸 ;敵機の管理 dim enemyF,20 ;有無フラグ dim enemyX,20 ;敵機の横軸 dim enemyY,20 ;敵機の縦軸 dim enemyZ,20 ;敵機の爆発カウンタ ;流星の管理 dim starF,50 ;有無フラグ dim starX,50 ;流星の横軸 dim starY,50 ;流星の縦軸 ;スコアの初期化 Score=0 HiScore=9900 ;自機の初期化 x=(600-50)/2 y=(400-50)-16 fight=3 blast=0 *Start screen 0,600,400,SCREEN_FIXEDSIZE title "シューティング・ゲームのミニ講座" redraw 0 color:boxf color $00,$FF,$FF:font "HG明朝E",50:pos (600-50*11)/2,100:mes "シューティング・ゲーム" color $FF,$FF,$00:font "HG明朝E",30:pos (600-30* 6)/2,180:mes "〜ミニ講座〜" color $FF,$FF,$FF:font "HG明朝E",16:pos (600- 8*15)/2,250:mes "[SPC]キーで開始" color $FF,$FF,$FF:font "HG明朝E",16:pos (600- 8*15)/2,282:mes "[ESC]キーで終了" redraw 1 repeat stick key if(key & $10):break if(key & $80):end await 20 loop *Main font MSGOTHIC,50 randomize repeat redraw 0 stick key,%11111 gosub *EnemyBirth gosub *StarBirth gosub *StarDraw gosub *FightDraw gosub *EnemyDraw gosub *TamaDraw gosub *TelopDraw redraw 1 await (1000/60) loop stop //-------------------------------------- // 自機の描画 //-------------------------------------- *FightDraw if(blast==0){ if(key&1):x-=5:if(x<0):x=0 if(key&2):y-=5:if(y<0):y=0 if(key&4):x+=5:if(x>550):x=550 if(key&8):y+=5:if(y>350):y=350 if(key&16):gosub *TamaBirth color $00,$FF,$00:pos x,y:mes "山" } else:if(blast>1){ blast-- color $FF,$00,$00:pos x,y if(blast\10<5):mes "※":else:mes "*" } else:if(fight){ fight-- blast=0 x=(600-50)/2 y=(400-50)-16 } else{ dialog "もう一度、ゲームを行いますか?",3,"ゲームオーバー" if(stat==7):end ;スコアの初期化 Score=0 ;自機の初期化 x=(600-50)/2 y=(400-50)-16 fight=3 blast=0 ;配列の初期化 dim starF,50 dim tamaF,10 dim enemyF,20 } return //-------------------------------------- // 流星の発生 //-------------------------------------- *StarBirth if(starCycle):starCycle--:return foreach starF if(starF(cnt)==0){ starF(cnt)=1 starX(cnt)=rnd(600) starY(cnt)=0 break } loop starCycle=3 return //-------------------------------------- // 流星の描画 //-------------------------------------- *StarDraw color $00,$00,$00:boxf foreach starF if starF(cnt){ starY(cnt)+=2:if(starY(cnt)>=400):starF(cnt)=0:continue color $FF,$FF,$00 pset starX(cnt),starY(cnt) } loop return //-------------------------------------- // 弾丸の発生 //-------------------------------------- *TamaBirth if(tamaTrigg):tamaTrigg--:return foreach tamaF if(tamaF(cnt)==0){ tamaF(cnt)=1 tamaX(cnt)=x tamaY(cnt)=y break } loop tamaTrigg=8 return //-------------------------------------- // 弾丸の描画 //-------------------------------------- *TamaDraw foreach tamaF if tamaF(cnt){ tamaY(cnt)-=8:if(tamaY(cnt)<-50):tamaF(cnt)=0:continue pos tamaX(cnt),tamaY(cnt) color $FF,$FF,$00:mes ":" } loop return //-------------------------------------- // 敵機の発生 //-------------------------------------- *EnemyBirth if(enemyCycle):enemyCycle--:return foreach enemyF if(enemyF(cnt)==0){ enemyF(cnt)=1 enemyX(cnt)=rnd(600/50)*50 enemyY(cnt)=-50 enemyZ(cnt)=0 break } loop enemyCycle=30 return //-------------------------------------- // 敵機の描画 //-------------------------------------- *EnemyDraw foreach enemyF if enemyF(cnt){ if(enemyZ(cnt)==0){ enemyY(cnt)+=3:if(enemyY(cnt)>400) :enemyF(cnt)=0:continue if FightCrash(enemyX(cnt),enemyY(cnt)) :enemyZ(cnt)=60:ScoreCalc 100:continue if TamaCrash(enemyX(cnt),enemyY(cnt)) :enemyZ(cnt)=60:ScoreCalc 100:continue pos enemyX(cnt),enemyY(cnt) color $00,$FF,$FF:mes "Ж" } else:if(enemyZ(cnt)>1){ enemyZ(cnt)-- color $FF,$00,$00:pos enemyX(cnt),enemyY(cnt) if(enemyZ(cnt)\10<5):mes "※":else:mes "*" } else{ enemyF(cnt)=0 } } loop return //-------------------------------------- // テロップの描画 //-------------------------------------- *TelopDraw msg="" repeat fight msg+="山" loop y(1)=0:x(1)=(20) y(2)=0:x(2)=(600-20)-(16*11) x(3)=0:y(3)=(400-20) font MSGOTHIC,20,1 color $FF,$FF,$00:pos x(1),y(1):mes strf("Score:%08d",Score) color $FF,$FF,$00:pos x(2),y(2):mes strf("HiScore:%08d",HiScore) color $00,$FF,$00:pos x(3),y(3):mes msg font MSGOTHIC,50 return //-------------------------------------- // スコアの加算 //-------------------------------------- #deffunc ScoreCalc int _score_ Score+=_score_ if(Score>HiScore):HiScore=Score return //-------------------------------------- // 自機の衝突判定 //-------------------------------------- #defcfunc FightCrash int _x_,int _y_ if(blast==0)and(abs(x-_x_)<50)and(abs(y-_y_)<50){ blast=60 return 1 } return 0 //-------------------------------------- // 自機弾の衝突判定 //-------------------------------------- #defcfunc TamaCrash int _x_,int _y_ n=0 foreach tamaF if tamaF(cnt){ if(abs(tamaX(cnt)-_x_)<50)and(abs(tamaY(cnt)-_y_)<50){ tamaF(cnt)=0 n=1 break } } loop return n //------------------------------------------------------------------------------ // End of lesson-9.hsp //------------------------------------------------------------------------------



この記事に返信する


ABATBeliever

リンク

2024/6/11(Tue) 18:52:24|NO.101810

全コード転載はえぐいですね,,,,

さて、HSPで時間を測るにはいくつか方法がありますが、シューティングゲームならあんま精度いりませんよね
API叩くのも面倒ですし、gettime命令で行きましょう

StartTime=((gettime(4)*60)+gettime(5))*60+gettime(6)

これは時、分、秒を記録するやつです。 これをゲーム開始の場所に書き込み、
if (StartTime+30)=((gettime(4)*60)+gettime(5))*60+gettime(6) {hogehoge}
これをloop内に書き込めばいいんじゃないですかね
ただし、gotoするとネストがたまっちゃうのでbreakして下でgotoしましょ

goto *main のところ弄ったら処理を追加できます

パッチ

*Main font MSGOTHIC,50 randomize StartTime=((gettime(4)*60)+gettime(5))*60+gettime(6)//Ransomed repeat redraw 0 stick key,%11111 gosub *EnemyBirth gosub *StarBirth gosub *StarDraw gosub *FightDraw gosub *EnemyDraw gosub *TamaDraw gosub *TelopDraw redraw 1 await (1000/60) if (StartTime+30)=((gettime(4)*60)+gettime(5))*60+gettime(6) {break} //Ransomed loop goto *Start //Ransomed





ABATBeliever

リンク

2024/6/11(Tue) 18:57:37|NO.101811

そういえばこれだと特定の時間に始めると一生終わりませんので
gettime(4)は時
gettime(5)は分
gettime(6)は秒
なので、どういう条件でバグるのかは考えてみてくださいね
あるいはWinAPIを調べましょ



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.101809への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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