|
|
|
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)」 みたいな感じで代入すればいけるんじゃねー?っと気がついた。
ちょっと試しにやってきて考えながら試行錯誤してみます。
その後、それがよかったらメインスクリプトで通用するかチェックしないと・・・
|
|
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)
| |
|
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さんありがとうございました。
|
|