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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1119
botanライフとランダムアイテム9解決


botan

リンク

2020/11/19(Thu) 21:37:42|NO.91822

スレッドなどを参考に作りました。
教えていただきたいのは、
.薀ぅ佞良充
敵に衝突した際、自機を一瞬赤くして再び初期位置からやり直してスタートさせるやり方
アイテムを20秒経過ごとに出し、取得するまでバリアかライフの全回復かわからないアイテム
です。
,離薀ぅ佞魯廛蹈哀薀爐鮑遒辰燭呂困覆里任垢、なぜか表示されず、何が足りないか知りたいです。
はバリアのみ作りました。
どれか1つでもわかるものがあればご教授いただきたいです。
よろしくお願いいたします。

wx=400:wy=600 ; 画面サイズ
screen 0,wx,wy
color 0,150,150:boxf 0,0,400,600

dim fight ;自機の残機数
dim blast ;自機の爆発カウンタ

;自機の初期化
x=(400-30)/2
y=(600-30)-16
fight=3
blast=0

mx=200:my=300 ; プレイヤーの座標
msp=4 ; プレイヤーの移動スピード
ms=20 ; 衝突判定のしきい値である半径
mfs=30 ; 自機のフォントサイズ
mf=1 ;自機の生存フラグ
itm=0 ;1以上でバリア

;アイテム
itx=-fs/2 ;アイテムの初期x
ity=wy/2 ;アイテムの初期y
itf=0 ;アイテムが存在するか
itsp=2;アイテムのスピード

;120秒間
countermax=120*60
counter=1

cf=1:ct=-1

frame=0

fs=30 ;フォントサイズ

*start
redraw 0 ; 画面更新開始
color 0,200,200:boxf 0,0,400,600

;自機
if blast==0{
stick key,%11111 ; キー入力
;limit p1,p2,p3(一定範囲内の整数を返す) 対象となる値,最小値,最大値
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 ) ; 下移動
if itm > 0 : itm--
pos mx-mfs/2,my-mfs/2
if itm : color 0,0,255 : else color
font"MS ゴシック",mfs:mes "●"
}else:if (blast>1){
blast--
}else:if (fight>0){ ;残機数
fight-- ;残機数--
blast=0 ;自機の爆発カウンタ
mx=(200-30)/2 ;自機の復活
my=(300-30)-16
}else{
mf=0 ;残機0なら自機の生存フラグなし
}

;▲
if cf {
dist=abs(cx-mx)+abs(cy-my)
if dist<(ms*2) {
if itm == 0 { goto *gameover }; バリアではない場合*gameover
else { cf=0 : ct=3*60 };3秒経過後再び出てくる
}
;新しい座標=aline(現在の座標,追いかける座標)
cx=alien(cx,mx)
cy=alien(cy,my)
gsel 0
pos cx-fs/2,cy-fs/2
color 255,255,255:gmode 4,0,0,256 ;画像背景の透明化
color
mes "▲"
}

;アイテムの出現
if frame=60*5 : itf=1

if itf { ;アイテムが存在
itx+=itsp
if itx>wx : itf=0 ;画面外に出たら消える

dist=abs(itx-mx)+abs(ity-my) ; 敵との距離
if dist<(ms*2) : itm=10*60 : itf=0 ;10秒間バリアできる
pos itx-fs/2,ity-fs/2
mes "?"
}

if ct==0 {
cf=1
}else{
if ct>0 {
ct--
}
}

;タイマー
color 0,0,0
pos 0,580:font"MS ゴシック",20:mes "TIME:"+(counter/60)

redraw 1
await 1000/60
if countermax<=counter{
gosub *gameover
}
counter++
frame++
goto *start

*life
msg=""
repeat fight
msg+="●"
loop
font MSGOTHIC,30,1
color 255,0,0:pos 330,30-30:mes msg
font MSGOTHIC,50
return

*gameover
color 0,150,150:boxf 0,0,400,600
font msgothic,50
color 0,0,0:pos 100,300
mes "GAME OVER"
redraw 1
stop

;▲
#defcfunc alien int value1, int value2
csp=2 ; 敵の移動スピード
res=limit( value2-value1, -csp, csp )
return value1+res



この記事に返信する


メルクーフ

リンク

2020/11/22(Sun) 09:41:11|NO.91833

 とりあえず,世韻任垢、gosub *lifeがどこにも無いので*life〜returnが実行されないのが原因です。

 △録靴靴ぅ薀戰襪鮑遒辰gosubかgotoで飛んで自機を赤く表示させる・ライフを減らす・座標を初期値に戻す・returnかgoto *startで戻す、は乱数を使うという方法が考えられますが、現在自分のことだけで手いっぱいなのでちゃんとしたスクリプトを書くことまでできません。すみません。
 他の方が私よりもっといい方法を教えてくださると思います。



こち

リンク

2020/11/22(Sun) 21:47:28|NO.91837

私からも1つ。

(3)のアイテムの件


書かれているプログラムでは
5秒ごとにアイテムが出現となっていますね。
これを20秒ごとにの条件に合わせる必要があります
if文で条件を追加するのもいいですが
変数を使ったほうが楽です。

プログラムの最初
各変数を初期値を書いているところに

isettm=20

以上を書いてください。

それから、アイテムの出現の部分で

if frame=60*isettm とすれば

20秒になったらの意味になりますよね
その後の40秒..になったらの条件が必要になります
そこで
isettm=isettm+20
このように20プラスしてあげれば40になり
条件が変わり40秒経過したときにアイテム出現となります。
その後も、20秒ごとにアイテム出現です。

if frame=60*isettm {
itf=1
isettm=isettm+20
itx=-fs/2 ;アイテムの初期x
ity=wy/2 ;アイテムの初期y
}

以上のように書き直して動きをみてください。


続いて
アイテムを取ったときにバリアか回復かにしたいですが。
メルクーフさんが書かれていた乱数を使ったほうが
緊張感があっていいかもしれません。

rnd関数を使います。

プログラムの最初
各変数を初期値を書いているところに

randomize

以上をまず書いてください。
乱数の初期化になります。詳しくはヘルプを見てください

それからプログラムの後半で
10秒間バリアできる と書かれているところに
条件を追加してあげます。

まずバリアか回復かの判断になる数を作ります
ここでrnd関数を使います

hatena=rnd(2)

意味は、0から1までの範囲でランダムに1つ数値を
用意したhatena に入れます。

このあとに、hatenaの数値に合わせて条件を書いてあげれば
いいわけです。


if dist<(ms*2) {
hatena=rnd(2)
if hatena=0{
itm=10*60 : itf=0 ;10秒間バリアできる
}
if hatena=1{
fight=3 : itf=0 ;回復する
}
}


以上のように書き直して動きをみてください。


私からは以上になります。

プログラム制作がんばってください。



botan

リンク

2020/11/24(Tue) 02:14:01|NO.91844

メルクーフさん

お忙しい中、回答していただきありがとうございます。

;▲の中の if itm==0{goto *gameover} のgameoverの部分をlifeにしてみたのですがうまくいかず、
ほかにどこに書けばいいのかわからずどこにも書いていませんでした…

>>自機を赤く表示させる・ライフを減らす・座標を初期値に戻す
これはすべて一つのラベルに入れればよいのでしょうか?
理解が足らずすみません…。



botan

リンク

2020/11/24(Tue) 02:23:55|NO.91845

こちさん

回答していただきありがとうございます。

教えていただいた通り書いたところ、無事アイテムが20秒ごとに出現しました!
アイテムのランダムはまだライフのプログラムができていないためできているのかわかりませんが引き続きやっていきます。
ありがとうございました!



botan

リンク

2020/11/24(Tue) 02:27:12|NO.91846

.薀ぅ佞良充
敵に衝突した際、自機を一瞬赤くして再び初期位置からやり直してスタートさせるやり方

このふたつがまだできていないため、わかる方がいらっしゃればぜひ教えていただきたいです。
よろしくお願いいたします。



メルクーフ

リンク

2020/11/24(Tue) 19:18:37|NO.91850

 最初のうちは分からないことだらけなのが普通ですから、気にする必要はないですよ。むしろ私の書き方がいい加減で失礼しました。

 gosub *lifeの位置ですが、自機や敵が重なった時にその下に表示させたいなら、『;自機』の直前(color 0,200,200:boxf 0,0,400,600の下)、上に表示させたいなら『;タイマー』のredraw 1の直前に置くといいでしょう。
 それからライフのフォントサイズが大きすぎて画面からはみ出すようです。位置を左にずらすか、サイズを小さくした方がいいでしょう。

>> ;▲の中の if itm==0{goto *gameover} のgameoverの部分
 ここはバリアが無い時に敵にぶつかった時にどこに飛ぶのかの指示ですから、ここをlifeに変えると敵にぶつかった時に*lifeに飛ぶことになるし、gotoだからreturnできずエラーになります。むしろここは自機を赤く表示させる等の処理をするラベルに変えるといいと思います。
 一連の処理はそのラベル内に全て入れればいいと思います。あとスタート地点付近でぶつかる場合もあることから、敵の位置も変えた方がいいかもしれません。



botan

リンク

2020/11/28(Sat) 02:30:40|NO.91862

メルクーフさん

返信遅くなってしまいすみません。

>>最初のうちは分からないことだらけなのが普通ですから、
ありがとうございます…。頑張ります。

>>gosub *lifeの位置ですが、…
表示できました!ありがとうございます。

>> 一連の処理はそのラベル内に全て入れればいいと思います。
https://blog.goo.ne.jp/masaki_goo_2006/e/2faeea5e7cf57df4065cf9f2ebb3a0db
このサイトを参考にライフなど作っているのですが、どうもうまくいかず…
お忙しいかと思いますが、もし私のつくったプログラムの中にどのように付け足せばよいか教えていただきたいです…・
すみません、よろしくお願いいたします。



メルクーフ

リンク

2020/11/28(Sat) 19:03:25|NO.91864

 実のところ私は基本的なことだけ知ったら後は創意工夫だけでどうにかしていくタイプなので、他人のスクリプトを見て勉強したことがなく、そのため他人のスクリプトの解析は不得手なわけでして・・・ざっくりとは見ましたがblastが何の仕事するのか分からないし仕事してないし、そのためにmfが仕事できないし仕事していないということぐらいしか分かりませんでした。指定URLのブログも見ましたが、これを1から勉強するのはちょっと無理ですね。

 とりあえずは『;▲』内のif itm==0{goto *gameover}のジャンプ先を例えば*yararetaにして、

*yarareta color 255,0,0 pos mx-mfs/2,my-mfs/2 mes "●" redraw 1 await 500 fight-- if fight<=0 : goto *gameover mx=200:my=300 goto *start
というのを、これも例えば*gameoverの処理部分の後ろにでも入れておけばそれっぽいことはできますが、私が作るスクリプトならこれでいいんですが先のブログ記事を参考にして作るのなら疑問が残ります。

 後は根気よくブログ記事と格闘して自分でどうにかするか、スクリプト解析の得意な方に聞いてみるかしか思いつきません。
 お役に立てず、すみません。



botan

リンク

2020/11/29(Sun) 02:38:41|NO.91867

そうだったんですね。そうとは知らず無茶ぶりをしてしまいすみませんでした…
基礎をある程度知ったら自分の力で作れるのすごいです…羨ましい…

とても分かりやすいプログラムを書いてくださったおかげで理解できました!
ここまで長々と教えてくださり本当に助かりました。ありがとうございました!



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