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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0908
ねこ5秒間敵の動きを速くする7解決


ねこ

リンク

2020/9/8(Tue) 23:56:12|NO.91333

プログラミング未経験です。
自機にゆっくり追尾してくる敵を5秒間だけスピードを上げ、また元のスピードに戻る動作を教えていただきたいです。
よろしくお願いします。



この記事に返信する


kの字

リンク

2020/9/9(Wed) 22:27:22|NO.91335

常に値が減るカウンターを作って、任意のタイミングで値を代入して、
カウンターが0以上の値の時は移動速度を上げるというのはどうでしょう。

repeat redraw 0 color 0,0,0:boxf color 0,255,255 if 0<counter:pos 0,0:mes "カウンター:"+counter if x<mousex:x+:if 0<counter:x+ ;マウスを追尾、カウンターが0以上ならさらに追尾 if x>mousex:x-:if 0<counter:x- if y<mousey:y+:if 0<counter:y+ if y>mousey:y-:if 0<counter:y- pos x,y:mes "〇" await 16 redraw 1 stick a if a=256:counter=300 ;左クリックすると5秒カウントダウン開始 counter-- ;カウンターの値を常に減らす loop



ねこ

リンク

2020/9/10(Thu) 00:20:13|NO.91336

kの字さん

回答ありがとうございます!
①上下左右のキーを使って自機である"●"を動かし、それを敵の"○"が追尾し当たったらゲームオーバー
②2分間の制限時間を設けて20秒、40秒、1分…と20秒区切りで5秒間敵の動きを速くする

①と②のようなゲームを作りたいのですが、先ほど作成していただいたプログラムと下記の私が打ったものとどのように組み合わせれば完成しますか?
間違いだらけで申し訳ないですがぜひ教えていただきたいです。よろしくお願いします!


mx=400:my=300 ; プレイヤーの座標
msp=4 ; プレイヤーの移動スピード

;自機
stick key,15 ; キー入力
if key&1 : mx=limit( mx-msp, 0, wx ) ; 左移動
if key&4 : mx=limit( mx+msp, 0, wx ) ; 右移動
if key&2 : my=limit( my-msp, 0, wy ) ; 上移動
if key&8 : my=limit( my+msp, 0, wy ) ; 下移動
:mes "●"



雪月夜

リンク

2020/9/22(Tue) 14:07:33|NO.91425

ねこさんとkの字さんのソースを組み合わせると、とりあえず以下のようになります。

mx=400:my=300 ; プレイヤーの座標 wx=ginfo_winx wy=ginfo_winy msp=4 ;プレイヤーの移動スピード mse=1 ;敵の移動スピード ;120秒間 countermax=120*60 counter=1 repeat ;自機移動 stick key,15 ; キー入力 if key&1 : mx=limit( mx-msp, 0, wx ) ; 左移動 if key&4 : mx=limit( mx+msp, 0, wx ) ; 右移動 if key&2 : my=limit( my-msp, 0, wy ) ; 上移動 if key&8 : my=limit( my+msp, 0, wy ) ; 下移動 ;敵機移動 tmse=mse if x<mx:x+tmse ;プレイヤーを追尾 if x>mx:x-tmse if y<my:y+tmse if y>my:y-tmse ;描写処理 redraw 0 color 0,0,0:boxf color 0,255,255 pos 0,0:mes "TIME:"+(counter/60) ;敵機描写 pos x,y:mes "〇" ;自機描写 pos mx,my:mes "●" redraw 1 await 16 if countermax<=counter{ break } counter++ ;カウンターの値を常に増やす loop

これに①と②を追加するわけですが…

まず①は、数学の『三平方の定理』を用いることで実現できます。
自機と敵との距離を計算し、その距離が一定未満かどうかを判定することで、接触したかどうかを判断できます。
HSPには『sqrt』という平方根を求める関数があるので、それを使ってください。

次に②ですが、どのくらいの時間が経過したかは『await』とcounter変数を用いて計算します。
awaitに指定する引数はミリ秒で、1000を指定すると一秒待機します。
1000を60で割ると16.6666…で大体16なので、『await 16』でループごとにcounterを1ずつ足していけば、counterが60になるころには一秒経過したことになります。
敵の動きが早くなるのは、開始から20~25秒、40~45秒、60~65秒…ということなので
現在のcounterを60で割って経過時間(秒)を求め、それをさらに20で割って剰余を求めれば、
その値が『0以上5未満かどうか』という判定を行えて、判定が真だったら『敵のスピードを上げる』という処理を行うことが出来ます。

こんなところでしょうか、是非実装を頑張ってみてください。



ふじこlp

リンク

2020/9/22(Tue) 18:34:49|NO.91426


//10行目から16行目まで repeat ;自機移動 stick key,15 ; キー入力 if key&1 : mx=limit( mx-msp, 0, wx ) ; 左移動 if key&4 : mx=limit( mx+msp, 0, wx-ginfo_mesx ) ; 右移動 if key&2 : my=limit( my-msp, 0, wy ) ; 上移動 if key&8 : my=limit( my+msp, 0, wy-ginfo_mesy ) ; 下移動 //以下略
としないとプレイヤーが画面から出るみたいですね…



ねこ

リンク

2020/9/26(Sat) 01:42:06|NO.91448

雪月夜さん

丁寧に説明していただいてありがとうございます。
教えていただいたことをもとに作ってみようと思います!
ありがとうございました!



ねこ

リンク

2020/9/26(Sat) 01:44:09|NO.91449

ふじこlpさん

回答ありがとうございます。
確かにこれなら画面外に出ませんね!
ありがとうございました!



ねこ

リンク

2020/9/26(Sat) 01:46:01|NO.91450

答えてくださった皆さんありがとうございました!



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