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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0704
ミント同じ処理をまとめるには?6解決


ミント

リンク

2012/7/4(Wed) 11:04:34|NO.47482

どうもお久しぶりです。

久しぶりにプログラミングをやったのですが、
どうやら自分の頭がかなり頑固になったみたいで、以前なら効率的に作れるだろう物が作れなくなってしまいました orz
仕事の関係で1ヶ月以上放置した結果・・・これだよ!!



 -やりたいこと-
「スペカを移動させるなど」同じ処理なのに、変数を分けてあるのは非効率なので、まとめる方法はあるのか?
Q:配列は?
A:「cnt」を置くと一緒に動いてしまう。なので「cnt」で判断できそうだけど、それだと意味ないような・・・

  -内容-
1:スペカ(文字)を表示、時間がたったらスペカ(文字)を上に移動させる。
2:移動した後、特定の位置についたらスペカ(文字)の場所を固定させる。
3:スペカ(ボス)撃破後、スペカ名1の役割を終わらす (Aキーがボス撃破の擬似的な役割)
4:その後「スペカ2枚目」に突入する。
5:「スペカ2枚目」は「スペカ1」と同じ動き(処理)します。

 -補足-
普通に配置しただけのソースと、【switch】を使ったソース両方用意してみました・・・



なんだか久しぶりのせいか、説明まで下手なのかもしれない。
わかりずらいところとかあったら言ってください。
それではよろしくお願いいたします。
---------------------------------------------

screen 0,640,480 ;****************メインループ*********** *メイン redraw 0 : color : boxf ;***************カウンター************** color ,255,255 pos 0,0 : mes "スペカカウンター " + SPK_c pos 0,20 : mes "Aを押した数 " + A_KAZU pos 510,450 : mes "【↑画面外↑】 " ;*************************************** gosub *スペカ名 ///スペカ1枚目/// color 255, : pos SPKN_x,SPKN_y : mes "スペルカード1枚目" ///スペカ2枚目/// if A_KAZU = 2 : color ,255 : pos SPKN_NI_x,SPKN_NI_y : mes "スペルカード2枚目" line 500,0,500,480 ;ゲーム画面と画面外の境界線 ;*************対応キー****************** //(Aキーはボス撃破の擬似的な役割をしてもらってます)// getkey Akey,65 ;Aキー if Akey { if cek = 0 : A_KAZU++ : cek = 1 } else { cek = 0 } redraw : await 15 goto *メイン ;**************スペカ名***************** *スペカ名 ///スペカ1枚目/// if SPKN_f = 0 { ;フラグ SPKN_x = 205 ;X SPKN_y = 250 ;Y SPKN_f = 1 ;フラグ } ///スペカ1枚目/// SPK_c++ ;スペカカウンター if SPK_c >= 101 { SPK_c -= 1 ;スペカカウンターが100で止める SPKN_y -= 2 ;「スペカ名」を上に移動 if A_KAZU = 2 : SPKN_NI_y -= 2 ;「スペカ名2」を上に移動 } if SPKN_y <= 30 : SPKN_y = 30 ;「スペカ名」の場所を固定 if A_KAZU = 1 : SPKN_x = 510 ;「スペカ1」を撃破したら「スペカ名1」を吹っ飛ばす ///スペカ2枚目/// if SPKN_NI_f = 0 { ;フラグ SPKN_NI_x = 205 ;X SPKN_NI_y = 280 ;Y SPKN_NI_f = 1 ;フラグ } ///スペカ2枚目/// if A_KAZU = 1 : SPK_c = 0 ;もう一回数えてもらうために、スペカカウンターをリセット if A_KAZU = 1 : A_KAZU = 2 ;A数を強引に2にして、カウントしてもらう if SPKN_NI_y <= 30 : SPKN_NI_y = 30 ;「スペカ名2」の場所を固定 if A_KAZU = 3 : SPKN_NI_x = 510 ;「スペカ2」を撃破したら「スペカ名2」を吹っ飛ばす return
-----------------------------------------------------------------
 【switch】を使ったソース

//【switch】を使ったソースです// screen 0,640,480 ;****************メインループ*********** *メイン redraw 0 : color : boxf ;***************カウンター************** color ,255,255 pos 0,0 : mes "スペカカウンター " + SPK_c pos 0,20 : mes "Aを押した数 " + A_KAZU pos 510,450 : mes "【↑画面外↑】 " ;*************************************** gosub *スペカ名 ///スペカ1枚目/// color 255, : pos SPKN_x,SPKN_y : mes "スペルカード1枚目" ///スペカ2枚目/// if A_KAZU = 2 : color ,255 : pos SPKN_NI_x,SPKN_NI_y : mes "スペルカード2枚目" line 500,0,500,480 ;ゲーム画面と画面外の境界線 ;*************対応キー****************** //(Aキーはボス撃破の擬似的な役割をしてもらってます)// getkey Akey,65 ;Aキー if Akey { if cek = 0 : A_KAZU++ : cek = 1 } else { cek = 0 } redraw : await 15 goto *メイン ;**************スペカ名***************** *スペカ名 switch A_KAZU ;比較元 (値はAキーを押した数) case 0 ///スペカ1枚目/// if SPKN_f = 0 { ;フラグ SPKN_x = 205 ;X SPKN_y = 250 ;Y SPKN_f = 1 ;フラグ } SPK_c++ ;スペカカウンター if SPK_c >= 101 { SPK_c -= 1 ;スペカカウンターが100で止める SPKN_y -= 2 ;「スペカ名」を上に移動 } if SPKN_y <= 30 : SPKN_y = 30 ;「スペカ名」の場所を固定 swbreak ;比較実行脱出 case 1 SPK_c = 0 ;もう一回数えてもらうために、リセット SPKN_x = 510 ;「スペカ1」を撃破したら「スペカ名1」を吹っ飛ばす A_KAZU = 2 ;数を強引に2にして、カウントしてもらう swbreak ;比較実行脱出 case 2 ///スペカ2枚目/// if SPKN_NI_f = 0 { ;フラグ SPKN_NI_x = 205 ;X SPKN_NI_y = 280 ;Y SPKN_NI_f = 1 ;フラグ } SPK_c++ ;スペカカウンター if SPK_c >= 101 { SPK_c -= 1 ;スペカカウンターが100で止める SPKN_NI_y -= 2 ;「スペカ名2」を上に移動 } if SPKN_NI_y <= 30 : SPKN_NI_y = 30 ;「スペカ名2」の場所を固定 swbreak ;比較実行脱出 case 3 SPKN_NI_x = 510 ;「スペカ2」を撃破したら「スペカ名2」を吹っ飛ばす swbreak ;比較実行脱出 swend ;ブロックが終了 return



この記事に返信する


ミント

リンク

2012/7/4(Wed) 13:19:55|NO.47483

む 「if SPKN_f(A_KAZU)」 みたいな感じで代入すればいけるんじゃねー?っと気がついた。
ちょっと試しにやってきて考えながら試行錯誤してみます。
その後、それがよかったらメインスクリプトで通用するかチェックしないと・・・



MillkeyWeler

リンク

2012/7/4(Wed) 16:48:09|NO.47486

こんな感じ?

screen 0,640,480 //スペルカード情報 [処理情報(X,Y,FLAG),カードNo] dim SPKN,3,250 SPKN(0)=205,250,1 ;****************メインループ*********** *メイン redraw 0 : color : boxf ;***************カウンター************** color ,255,255 pos 0,0 : mes "スペカカウンター " + SPK_c pos 0,20 : mes "Aを押した数 " + A_KAZU pos 510,450 : mes "【↑画面外↑】 " ;*************************************** gosub *スペカ名 repeat 250 if SPKN(2,cnt) = 1 { pos SPKN(0,cnt),SPKN(1,cnt) : mes "スペルカード "+cnt+" 枚目" } loop line 500,0,500,480 ;ゲーム画面と画面外の境界線 ;*************対応キー****************** //(Aキーはボス撃破の擬似的な役割をしてもらってます)// getkey Akey,65 ;Aキー if Akey { if cek = 0 { SPKN(0,A_KAZU)=510 A_KAZU++ SPKN(0,A_KAZU)=205,250,1 SPK_c=0 cek = 1 } } else { cek = 0 } redraw : await 15 goto *メイン ;**************スペカ名***************** *スペカ名 SPK_c++ if SPK_c>100 { if SPKN(2,A_KAZU) = 1 { if SPKN(1,A_KAZU) >= 30{ ;スペカカウンターが100で止める SPKN(1,A_KAZU) -= 2 } } SPK_c = 100 } return

getkey のところの cek がいまいちわからなかったが、問題ないよね・・・



ミント

リンク

2012/7/4(Wed) 22:27:34|NO.47496

>MillkeyWelerさん
回答ありがとうございます。

返事が遅れたのは「SPKN(0,A_KAZU) = 205,250,1」でなんでフラグが代入できるのか謎だったからです。
あ、ちなみに今でも謎なので二次元配列勉強しなおしてきますね。
レス見ましたよ、という返事のみ書かせてもらいます。

>>getkey のところの cek がいまいちわからなかったが、問題ないよね・・・
「cek」はAキーをずっと押しているときに、数が進まないようにするための処置です。

*メイン redraw 0 : color : boxf color 255,255 getkey Akey,65 ;Aキー if Akey { ;Aキー押されたら実効 if cek = 0 { A_KAZU++ ;Aキーをカウントする cek = 1 ;「cek」に1を立てることにより、これ自体を実行させない(Aキーをカウント) } } else { cek = 0 ;Aキーを押してないときは「cek」は0になります } pos 0,0 : mes A_KAZU redraw : await 15 goto *メイン


んで、色々解体中で、見せるようではないソース

screen 0,640,480 dim SPKN,3,3 ;P2 ... 0,1,2 のための配置数 ;P3 ... ループ回数 SPKN(0) = 205,250,1 ;X,Y,フラグ ;****************メインループ*********** *メイン redraw 0 : color : boxf ;***************カウンター************** color ,255,255 pos 0,0 : mes "スペカカウンター " + SPK_c pos 0,20 : mes "Aを押した数 " + A_KAZU //0枚目// pos 0,50 : mes "【0枚目】 " pos 0,70 : mes "SPKN(0,0) " + SPKN(0,0) pos 0,90 : mes "SPKN(1,0) " + SPKN(1,0) //1枚目// pos 0,120 : mes "【1枚目】 " pos 0,140 : mes "SPKN(0,1) " + SPKN(0,1) pos 0,160 : mes "SPKN(1,1) " + SPKN(1,1) //2枚目// pos 0,190 : mes "【2枚目】 " pos 0,210 : mes "SPKN(0,2) " + SPKN(0,2) pos 0,230 : mes "SPKN(1,2) " + SPKN(1,2) //フラグ// pos 0,260 : mes "【フラグ】 " pos 0,280 : mes "SPKN(2,0) " + SPKN(2,0) pos 0,300 : mes "SPKN(2,1) " + SPKN(2,1) pos 0,320 : mes "SPKN(2,2) " + SPKN(2,2) pos 510,450 : mes "【↑画面外↑】 " ;*************************************** gosub *スペカ名 repeat 3 if SPKN(2,cnt) = 1 { ;Aキーが増えない限り実行されない pos SPKN(0,cnt),SPKN(1,cnt) : mes "スペルカード "+cnt+" 枚目" }loop /*/ SPK(2,0) = 1 SPK(2,1) = 1 SPK(0,0) = 205,1 : SPK(1,0) = 250,1 SPK(0,1) = 205,1 : SPK(1,1) = 250,1 /*/ line 500,0,500,480 ;ゲーム画面と画面外の境界線 ;*************対応キー****************** //(Aキーはボス撃破の擬似的な役割をしてもらってます)// getkey Akey,65 ;Aキー if Akey { if cek = 0 { SPKN(0,A_KAZU) = 510 ;ふっとばす A_KAZU++ ;Aを押した数 SPKN(0,A_KAZU) = 205,250,1 ;X205,Y250,フラグ SPK_c = 0 ;スペカカウンター cek = 1 } } else { cek = 0 } /*/ SPK(0,0) = 205,250,1 SPK(0,1) = 205,250,1 /*/ redraw : await 15 goto *メイン ;**************スペカ名***************** *スペカ名 SPK_c++ ;スペカカウンター if SPK_c > 100 { if SPKN(2,A_KAZU) = 1 { ;フラグ if SPKN(1,A_KAZU) >= 30 { ;Yが30以下になったら実行 SPKN(1,A_KAZU) -= 2 ;Yを上に移動 } } SPK_c = 100 ;スペカカウンターを100で止める } /*/ SPK(1,0) = 250(Y) SPK(1,1) = 250(Y) /*/ return


わからなくなったときは小さくするのが一番・・・
けど久しぶりの二次元配列のためか、何で「SPKN(2,0)」に入ってくれるのか・・・
3番目のデータだから?そんな解釈でいいのか不安なのでお勉強し直しです。


dim SPKN,3,3 SPKN(0,0) = 205,250,1 mes "SPKN(0,0) " + SPKN(0,0) mes "SPKN(1,0) " + SPKN(1,0) mes "SPKN(2,0) " + SPKN(2,0) mes "SPKN(0) " + SPKN(0) mes "SPKN(1) " + SPKN(1) mes "SPKN(2) " + SPKN(2)



MillkeyWeler

リンク

2012/7/4(Wed) 22:49:03|NO.47498

そうそう。2次元配列であってるよー。
フラグってのは、表示させるか、させないかの判定で使ってます。

2次元配列の話については、HSPについている説明より、HSP Wiki とかを見ると、詳しくわかるよ。
あと、どーゆー風になってるのかーってのは、自分で試してみるのがいい。


dim spkn,4,250 SPKN(0,0)=205,250,1 SPKN(0,1)=999,777,1 dialog ""+SPKN(0,1)+" / "+SPKN(1,1)
こんな感じで。

お勉強がんばってね^^



ミント

リンク

2012/7/4(Wed) 23:30:49|NO.47500

よく見たらすでに自分自身で答え書いてましたね・・・
はぁ・・・思ったより1ヶ月放置は危険のようだ。


情報整理してなかったせいか、自分のわからないことが伝わりませんでした。
>>SPKN(0) = 205,250,1
ここで意味わかんな謎ゾーンに突入しました。
2次元配列理解できるんだから、1次配列理解できるはずなのにね・・・とほほ・・・

pos 0,70 : mes "SPKN(0,0) " + SPKN(0,0) pos 0,90 : mes "SPKN(1,0) " + SPKN(1,0) pos 0,260 : mes "【フラグ】 " pos 0,280 : mes "SPKN(2,0) " + SPKN(2,0) /*/ SPKN(0) = 205,250,1 ;分解した物 SPKN(0) = 205 ;X SPKN(1) = 250 ;Y SPKN(2) = 1 ;フラグ /*/
とやったらあっというまに全てを理解しました。


>>フラグってのは、表示させるか、させないかの判定で使ってます。
自分が言いたかったことは・・・
>>返事が遅れたのは「SPKN(0,A_KAZU) = 205,250,1」でなんでフラグが代入できるのか謎だったからです。
これです。フラグがなんで勝手に入ってくれるのか?です・・・
まぁ、事故解決しましたけどね。


けどMillkeyWelerさん、追記の回答ありがとうございます。
メインスクリプトにぶち込むつつ動作を確認します。
それでOKサインが出来たら解決にチェックします。



ミント

リンク

2012/7/7(Sat) 16:26:13|NO.47540

すいませんだいぶ遅れました。
出来たもの自体は昨日ぐらいでしたが、いかんせん心配性なもので色々いじくってました。

イメージどおりの動きで正常に動き。
そして処理してくれて、なおかつまとめることが出来ました。


MillkeyWelerさんありがとうございました。



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