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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
1020
おぼ【STG】自機に被弾しても大丈夫な耐久力の設定方法の質問です。6解決


おぼ

リンク

2018/10/20(Sat) 20:26:39|NO.85624

ご無沙汰しております。おぼです。

相変わらず、シューティングゲームの研究中です。

アイデアがわからなかったので質問です。下記のスクリプトで、自機が5回被弾しても大丈夫なようにしたいのですが、どこをどう変更すればよいのか思いつきませんでした。どこをどうすればよいのか具体的にご教授願います。


#include "hsp3dish.as" title "Dish Shooting" *init ; 画面の準備 ; celload "title.png",2 celload "chr.png",3 celload "bg.png",4 mmload "explos.wav",0 mmload "inject.wav",1 mmload "sel.wav",2 mmload "cappi08.mp3",3 *gtitle_start mmstop mmplay 2 *gtitle ; スタートボタンチェック ; stick a,$130 if a&128 : end if a&$130 : goto *gamestart redraw 0 ; タイトルの表示 ; gmode 0,320,480 pos 0,0:gcopy 2,0,0 ; スコアの表示 ; color 255,255,255 pos 0,0:mes "SCORE:"+score redraw 1 await 1000/30 goto *gtitle *gamestart ; ゲーム開始時の変数リセット ; mmplay 3 ; 音楽を鳴らす mmplay 2 score = 0 ; スコア sizex=ginfo_sx:sizey=ginfo_sy ; 画面サイズ mx=sizex/2:my=sizey-80 ; 自機のX,Y座標 mxlimit=sizex-48 ; 自機X最大値 mylimit=sizey-48 ; 自機Y最大値 mapx=0:mapy=0 ; 背景表示用の座標 mflag=0 ; 自機の爆発フラグ frame=0 ; フレーム数 ; 自機レーザー用変数リセット ; lmax=4 dim lflag,lmax dim lx,lmax dim ly,lmax ; 敵用変数リセット ; emax=16 etime=0 einter=18 dim eflag,emax : dim etype,emax dim ex,emax : dim ey,emax dim epx,emax : dim epy,emax exlimit = sizex+48 eylimit = sizey+48 ; 敵ミサイル用変数リセット ; amax=16 msrint=2 dim aflag,amax dim ax,amax : dim ay,amax dim apx,amax : dim apy,amax axlimit = exlimit * 100 aylimit = eylimit * 100 *main redraw 0 ; 背景の表示 ; gmode 0,320,480 pos 0,mapy:gcopy 4,0,0 if mapy>0 { gmode 0,320,mapy pos 0,0:gcopy 4,0,960-mapy } mapy=mapy+2:if mapy>960 : mapy=mapy-960 ; それぞれの処理を呼び出す ; stick a,$10f if a&128 : end gosub *my_move gosub *laser_move gosub *enemy_move gosub *missile_move ; スコアの表示 ; color 255,255,255 pos 0,0:mes "SCORE:"+score redraw 1 await 1000/30 if mflag>150 : goto *gtitle_start frame++ goto *main *my_move ; 自機の移動と表示 ; if mflag>0 : goto *my_end if a&256 : goto *my_mouse if a&2 : my=my-6 if a&8 : my=my+6 if a&1 : mx=mx-6 if a&4 : mx=mx+6 goto *my_check *my_mouse x=mousex-24:y=mousey-24 px = x - mx if px>6 : px=6 if px<-6 : px=-6 mx = mx + px py = y - my if py>6 : py=6 if py<-6 : py=-6 my = my + py *my_check if mx<0 : mx=0 if mx>mxlimit : mx=mxlimit if my<240 : my=240 if my>mylimit : my=mylimit pos mx,my:gmode 2,48,48:gcopy 3,0,0 return *my_end ; 自機の爆発 ; mflag=mflag+1:a=0:i=mflag/4\3+5 pos mx,my:gmode 2,48,48:gcopy 3,i*48,0 return *my_hit ; 座標(x,y)が自機の領域内かを調べる ; if mflag>0 : vx=999 : vy=999 : return vx=mx-x:if vx<0 : vx=-vx vy=my-y:if vy<0 : vy=-vy return *laser_move ; 自機レーザーの処理 ; ;if (a&16)=0 : goto *noshoot if mflag>0 : goto *noshoot if frame&7 : goto *noshoot repeat lmax if lflag.cnt=0 { lflag.cnt=1 lx.cnt=mx : ly.cnt=my break } loop ;mmplay 1 *noshoot gmode 2,48,48,256 repeat lmax if lflag.cnt>0 { ly.cnt=ly.cnt-12 if ly.cnt<-48 : lflag.cnt=0 x=lx.cnt:y=ly.cnt pos x,y : gcopy 3,48,0 gosub *enemy_hit if hit>0 : mmplay 0 : lflag.cnt=0 : score=score+50 } loop return *enemy_move ; 敵の処理 ; etime=etime+1 if etime<einter : goto *enemy_put etime=0 ; 敵を発生させる ; y=-48 x=rnd(sizex)-24 type=rnd(2)+3 px=rnd(5)-2 py=1 speed=rnd(4)+2 px=px*speed/2:py=py*speed+1 repeat emax if eflag.cnt=0 { eflag.cnt=1 ex.cnt=x : ey.cnt=y epx.cnt=px : epy.cnt=py etype.cnt=type break } loop *enemy_put ; 敵を表示する ; gmode 2,48,48 repeat emax if eflag.cnt=0 : goto *noenemy x=ex.cnt:y=ey.cnt if eflag.cnt>1 : goto *edead x=x+epx.cnt:y=y+epy.cnt pos x,y : gcopy 3,etype.cnt*48,0 if x<-48 : eflag.cnt=0 if x>exlimit : eflag.cnt=0 if y<-48 : eflag.cnt=0 if y>eylimit : eflag.cnt=0 ex.cnt=x:ey.cnt=y gosub *my_hit if vx<48 : if vy<48 : mflag=1 : mmplay 0 ; 敵からミサイル発射 ; msrate=rnd(100) if msrate<msrint : gosub *missile_add *noenemy loop return *edead ; 敵の爆発 ; i=eflag.cnt+1:if i>16 : i=0 : goto *edead2 pos x,y : gcopy 3,(i/4\3+5)*48,0 *edead2 eflag.cnt=i:goto *noenemy *missile_add ; 敵ミサイルを発生させる ; (x,y)の位置に発生させる repeat amax if aflag.cnt>0 : goto *mslnext aflag.cnt=1 ax.cnt=x*100 : ay.cnt=y*100 px=mx-x : py=my-y if py>=0 : apy.cnt=600 if py<0 : py=-py : apy.cnt=-600 if py=0 : py=1 px=px*600/py if px>800 : px=800 if px<-800 : px=-800 apx.cnt=px break *mslnext loop return *missile_move ; 敵ミサイルの処理 ; gmode 2,32,32 repeat amax if aflag.cnt=0 : goto *nomsl x=ax.cnt:y=ay.cnt x+=apx.cnt y+=apy.cnt if x<-3200 : aflag.cnt=0 if x>axlimit : aflag.cnt=0 if y<-3200 : aflag.cnt=0 if y>aylimit : aflag.cnt=0 ax.cnt=x:ay.cnt=y x=x/100:y=y/100 pos x,y : gcopy 3,96,0 gosub *my_hit if vx<32 : if vy<32 : mflag=1 *nomsl loop return *enemy_hit ; 座標(x,y)が敵の領域内かを調べる ; hit=0 repeat emax if eflag.cnt!=1 : continue vx=ex.cnt-x:if vx<0 : vx=-vx vy=ey.cnt-y:if vy<0 : vy=-vy if vx<48 : if vy<48 : eflag.cnt=2 : hit=1 loop return

です。
よろしくお願いいたします。



この記事に返信する


あらや

リンク

2018/10/20(Sat) 21:31:04|NO.85626

画像ファイルもサウンドファイルも無く、実行確認できないため
ヒントだけ提示させて頂きます。


RPGのHPのように考えると出来るかもしれません。

例として

自機のHPが 5
ダメージが 1

被弾したときにHPがダメージ分減る
HPが0になったら終了

という形で実現できるのではないでしょうか。



注意点として、
被弾した際にちゃんと弾を消さないと
ループしたときに再度同じ弾に当たっていると判定されて
5フレーム(30FPSならば約0.17秒)で終了してしまいますのでお気を付けください。



おぼ

リンク

2018/10/20(Sat) 23:05:10|NO.85627

おぼです。

>>あらやさん

ダウンロードリンク:http://fast-uploader.com/file/7095599289234/

ご指摘いただいていた、画像とサウンドファイルをダウンロードできるようにしました。これでどうでしょうか?

着眼点は、ご教授くださったものと同様だってのですが、実装ができないあたりに自分の実力不足を感じます。実装するとどんな感じなのか具体的にお願いいたします。

よろしくご教授お願いします。



あらや

リンク

2018/10/21(Sun) 09:37:55|NO.85631

こんな感じでしょうか

*gamestartに以下を追加

mhp = 5 ; 自機HP mdamage = 1 ; ダメージ
HPとダメージは先日の説明通りです。
HPはともかくダメージは変数にする必要は無いかもしれませんが一応……




*missile_moveの最後
>if vx<32 : if vy<32 : mflag=1
この1行を下記の2行に変更

if vx<32 : if vy<32 : mhp -= mdamage: aflag.cnt=0 if( mflag == 0 && mhp <= 0 ): mflag = 1
1行目がHPからダメージ分減らして、弾を消す処理
2行目が 自機が爆発していない & HPが0以下になった場合 自機爆発フラグを1にする

この2行目の『mflag == 0』の箇所が無いと
常にmflagが1になって爆発のアニメーションが進まなくなります。



おぼ

リンク

2018/10/21(Sun) 14:34:04|NO.85632

おぼです。

ご教授ありがとうございました。無事、耐久力を付けられました。

前にも似たようなことを質問しましたが、いつも思うことなのですが、私の頭が悪いのか、あらやさんの頭がいいのかわかりませんが、いったいどうすれば、自分の思った機能を実装できるようになるのかわからないです。昔のベーシックの勉強をすればいいのでしょうか?C言語やJavaのほうが簡単に思えるのですが、スマホアプリの開発となると、HSPのほうが敷居が低いように感じるのです。でも一向にHSPの実力が付きません。オフィシャル公式ブックを読んでみても自分には実力が付いたようには思えませんでした。HSPを使うにあたって知っておくとよい言語とかあるのでしょうか?それとも勉強の仕方がまずいのでしょうか?もしよろしければアドヴァイスのようなものをいただければ幸いです。

よろしくお願いいたします。



あらや

リンク

2018/10/21(Sun) 15:34:45|NO.85634

スマホアプリに関しては確かにJavaよりもHSPの方が敷居は低いでしょうね。
現在のHSPでは常駐アプリやらスマホの通知機能なんかは(たぶん)出来ないでしょうが
ちょっとしたゲームを作るくらいならHSPだと簡単です。

プログラムの考え方については言語を問わず、慣れの問題だと思います。

おぼさんの年齢がわかりませんが小学生以上だと仮定して話をさせていただくと
小学生の頃に算数で文章を計算式にするようなことがあったと思います。

例)
 A君がB円を持って買い物に行きました。
 1個C円のDをE個、1個F円のGをH個買ったとき
 合計いくらになって、お釣りはいくらだったでしょうか。

このような文章から計算式にするのに
最初のうちは多少苦労したのではないでしょうか?
おそらく、成長するにつれてこのくらいなら簡単に出来るようになったでしょう。


プログラムもこれに近い所がありまして
今回の場合ですと、HPなんかの考え方は思いついていたものの
それをソースに書くにはどうしたらいいのかがわからないという状況だったようですが
ある程度慣れていれば、思いついた段階でどこにどう書くかというのは凡そ見当がつきます。

他者の書いたソースだと内容の理解に若干時間が掛かりますが
自分の書いたソースならば凡その見当ではなく
明確に『どこどこに何々を追加すればできるかな』という所まで考えられるようになります。

まあ、自作でも長いソースだとそれなりに時間が掛かったりしますが……

とりあえずは何らかの完成品を作るのではなく
もっとシンプルなソースを色々書いてみると慣れていくのではないかと思います。

例えばデザインとか全く考えず簡単なストップウォッチみたいなツールですとか、
タイマーみたいなもの、スクリーンセーバーのように図形が動き続けるもの
他者作品の演出など一部だけを(サンプルソースなどは無しで)再現してみるなど
知識が無いと出来ない物はひとまず置いておくとして
今自分の能力で何々をするにはどう書けば出来るのかというのを考えるのが一番だと思います。

今回の質問もおぼさんの最初のソースが理解できているのならば
能力的には自力で解決できた問題のはずです。

あとはフローチャートの書き方なんかを学んでみるのもいいかもしれません。

私に言えるのはこのくらいです。
長々と失礼いたしました。



おぼ

リンク

2018/10/21(Sun) 19:34:11|NO.85640

おぼです。

>>あらやさん

貴重なアドヴァイスありがとうございます。今思えば、人が書いたソースばっかり覚えようとしていました。

短くてもいいから、自力で組み立てることが大切なんですね。勉強の方針を変えようと思います。

また質問をすることがあるかもしれませんが、その時はよろしくお願いいたします。

ありがとうございました。おぼ。



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