経験値制LvUPでメンバー可変のときがわかりません(自分でも意味分かんない)(質問掲示板

投稿:    mini rdjk5242 投稿:2012/02/20 18:12:20(最新:2012/02/23 14:01:23)
冒険に役立つスクリプト
ここを読んで、経験値制LvUPを作ろうと思っています。

でもここに載っているのは、最初からの固定メンバーのLvUPです。

メンバーをところどころ変えてプレイするゲームにして、
敵キャラクターはIDごとに経験値を決める感じで、
メンバーは一人一人個別にLvUPして、
誰が倒したかでその人にだけ経験値が入る・・・・・
例AがXを倒した。AはX[0]だけ経験値を手に入れて、Bは手に入らなかった。
みたいな感じで。


色々書きましたが・・・・箇条書きでまとめると↓
  • 個別式経験値制LvUP
  • 敵[A]はいつも経験値X
  • パーティーメンバーは時々変わる

こんなことできるんですか?
できたらよければ教えて下さい。

なお配列の知識はほぼないです。
よろしくお願いします。

コメントする

コメントするには、ログインする必要があります。

コメント一覧

Nyan mini rurun9(投稿日:2012/02/23 14:01, 履歴)
while文の書き方は理解できていますでしょうーか?
また、今回の場合getKillCountは使う必要が無いと思います

全てのendにはコメントで何を閉じているのか、必ず書いておきましょー
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/02/23 04:56, 履歴)
   mini rdjk5242(投稿日:2012/02/23 04:37, 履歴)
自分で試してみたのですが、敵を倒したらフリーズしてしまいました。
特にエラーなどは表示されてないです。
どこがいけないんでしょうか?

#配列の設定 
 setVariable("Exp",createArray())   
 setVariable("総合Exp",createArray())   
 setVariable("Next",createArray())   
 setVariable("キャラID",createArray())   
getVariable("キャラID")[0]="playerCharacter"  
getVariable("キャラID")[1]=8677
getVariable("キャラID")[2]=8678 
getVariable("キャラID")[3]=8730
getVariable("キャラID")[4]=9163 
getVariable("キャラID")[5]=2613
#配列の初期化 
i=0  
while i<getArrayLength(getVariable("キャラID")) 
 getVariable("Exp")[i]=0   
 getVariable("総合Exp")[i]=0   
 getVariable("Next")[i]=100   
i=i+1   
end  
#敵キャラクターのidごとの経験値の設定 
def enemy(id)  
 case id  
   when 8677  
    return 40
   when 8678
    return 50  
   when 2613
    return 60
  end  
end 

 
#経験値&Lvupの計算 
def exp()  
i=0  
a=0 
while a<getArrayLength(getVariable("キャラID"))  
#getVariable("キャラID"))の配列数分繰り返す 
#getVariable("キャラID")がパーティなら 
if isPartyMember(getVariable("キャラID")[i])    
killCounts=getKillCountPartyMember(getVariable("キャラID")[i] ) 
  
#経験値の整理 
pt=0 
b=0  
while i < getArrayLength(killCounts)   
pt=pt+enemy(killCounts[i][0])*killCounts[i][1]  
b=b+1  
end  
 
 
if 0<getPartyMemberHP(getVariable("キャラID")[i] ) 
#経験値の計算↓   
 getVariable("Exp")[i]=getVariable("Exp")[i]+pt  
 getVariable("総合Exp")[i]=getVariable("総合Exp")[i]+pt  
 speak ("経験値を",getVariable("キャラID"),"p手に入れた!") 
#LvUPの計算 
if getVariable("Next")[i] <= getVariable("Exp")[i]   
 levelUpPartyMember( getVariable("キャラID")[i] )  
 speak("LvUP!") 
 speak(getValueFromCharacterParam( 
getPartyMemberParam( getVariable("キャラID")[i]  ), 
getCharacterViewNameIndex() ), "が",
getLevelPartyMember(getVariable("キャラID")[i] ), "Lvになった!") 
 getVariable("Exp")[i]=getVariable("Exp")[i]-getVariable("Next")[i]   
 getVariable("Next")[i]=getVariable("Next")[i]+5   
 
end   
end  
a=a+1 
i=i+1 
end  
end
end

setCustomParamMenuEnable(true)
setCustomParamMenuName("経験値")
def onShowCustomParameter() 

speakFullScreen(true, "現在のステータス\n\n",getValueFromCharacterParam( 
getPartyMemberParam( getVariable("キャラID")[0]  ), 
getCharacterViewNameIndex() ),"    ",getLevel(),"Lv   Next  ",
(getVariable("Next")[0]-getVariable("Exp")[0]),"\n",
getValueFromCharacterParam( 
getPartyMemberParam( getVariable("キャラID")[3]  ), 
getCharacterViewNameIndex() ),"    ",getLevel(),"Lv   Next  ",
(getVariable("Next")[3]-getVariable("Exp")[3]),"\n",
getValueFromCharacterParam( 
getPartyMemberParam( getVariable("キャラID")[4]  ), 
getCharacterViewNameIndex() ),"    ",getLevel(),"Lv   Next  ",
(getVariable("Next")[4]-getVariable("Exp")[4]))
end
drawCustomParam()

addPartyMember(getVariable("キャラID")[3])
addPartyMember(getVariable("キャラID")[4])
Nyan mini rurun9(投稿日:2012/02/22 13:42, 履歴)
ハイハイ、一旦休憩。

>全部まとめてみました
>これでちゃんと作動しますか?

自分で書いてるスクリプトの動作確認は自分でするのです
もし何がどうなっているのか自分で理解していないのならこの先はありません

>expと総合expはなんで分けるか

別に分ける必要性はありません
というか他人の考えたものを流用するよりも、「経験値を貯めてレベルが上がる仕組み」を各自でスクリプトを組んだ方が納得がいくし早いですよん
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/02/22 04:38, 履歴)
1)

その通りです。


2)

getValueFromCharacterParam関数でステータスの取得ができます。


この関数の第1引数に必要な
ステータス配列を取得する関数が
getPartyMemberParam関数です。


そして、第2引数は
ステータス配列からどのステータスを取得するか、ですが
この引数の内容は、あらかじめ決められている関数を指定します。

今回の場合は名前を取得するので
「getCharacterNameIndex()」または
「getCharacterViewNameIndex()」となります。


以上をまとめると、次のようなスクリプトになります。
speak(getValueFromCharacterParam(
        getPartyMemberParam(
          getVariable("キャラID")[i]
        ),
        getCharacterViewNameIndex()
      ),
      "が",
      getLevelPartyMember(
        getVariable("キャラID")[i]
      ),
      "Lvになった!")



補足)

・変数"PT"でエラーが出ると思います(おそらく"pt")

・enemy関数内の敵キャラクターIDは
 結局、配列変数を使用しない?

・途中、charaIDとgetVariable("キャラID")[i]が混在しているのが
 分かりにくく、もったいない。
 charaIDに代入したのでしたらcharaIDを使用すれば良いですし、
 getVariable("キャラID")[i]を使用するならcharaIDは必要ないです。

・最後の"a"と"i"への数値代入は、もう関数から抜けるだけですから
 代入をしている意味がないです。
   mini rdjk5242(投稿日:2012/02/22 03:39, 履歴)
foodmakesさんの記事、すごくわかりやすいですね。
敵はcoseでまとめた方がやりやすいのかな?
今までのを全部まとめてみました。
#配列の設定
 setVariable("Exp",createArray())  
 setVariable("総合Exp",createArray())  
 setVariable("Next",createArray())  
 setVariable("キャラID",createArray())  
getVariable("キャラID")[0]="playerCharacter" 
getVariable("キャラID")[1]=12 
getVariable("キャラID")[2]=28 
getVariable("キャラID")[3]=29 
#配列の初期化
i=0 
while i<getArrayLength(getVariable("キャラID"))
 getVariable("Exp")[i]=0  
 getVariable("総合Exp")[i]=0  
 getVariable("Next")[i]=100  
i=i+1  
end 
#敵キャラクターのidごとの経験値の設定
def enemy(id) 
 case id 
   when 29 
    return 10 
   when 14 
    return 20 
   when 56
    return 30
  end 
end
#id(29,14,56)=経験値(10,20,30)

#経験値&Lvupの計算
def exp() 
i=0 
a=0
while a<getArrayLength(getVariable("キャラID")) 
#getVariable("キャラID"))の配列数分繰り返す
#getVariable("キャラID")がパーティなら
if isPartyMember(getVariable("キャラID")[i])   
charaID=getVariable("キャラID")[i]
killcounts=getKillCountPartyMember(charaID)
 
#経験値の整理
pt=0
b=0 
while i < getArrayLength(killCounts)  
pt=pt+enemy(killCounts[i][0])*killCounts[i][1] 
b=b+1 
end 

#(charaID)が生きていれば
if 0<getPartyMemberHP(charaID)
#経験値の計算↓  
 getVariable("Exp")[i]=getVariable("Exp")[i]+PT 
 getVariable("総合Exp")[i]=getVariable("総合Exp")[i]+pt 
 speak ("経験値を",getVariable("キャラID"),pt手に入れた!)
#LvUPの計算
if getVariable("Next")[i] <= getVariable("Exp")[i]  
 levelUpPartyMember( getVariable("キャラID")[i] ) 
 speak("LvUP!")
 speak(?????,"が",getLevelPartyMember(charaID),"Lvになった!") 

 getVariable("Exp")[i]=getVariable("Exp")[i]-getVariable("Next")[i]  
 getVariable("Next")[i]=getVariable("Next")[i]+5  

end  
end 
a=a+1
i=i+1
end 
a=0
i=0
end

ふぅ・・・なんだか長くてよくわからなくなってきた・・・
これでちゃんと作動しますか?
今この段階でわからないことはあと2つです。

1、getVariable("exp")とgetVariable("総合exp")はなんで分けるか

2、スクリプトの途中であった????の部分(LVが上がったキャラの名前)

前者は、自分なりにはメニューなどで
「獲得経験値=総合exp
 次のLvまであと=Next」
のようにするためだと思っています。

後者は、関数リファレンスで調べたのですが、だいぶ省略してあるので
よくわからないのです。
長文すいません、お願いします。
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/02/21 23:51, 履歴)
foodmakesさま>

この記事、とても分かりやすいですね。
情報ありがとうございます。


rdjk5242さま>

配列の番号は
個々の変数名ごとに与えられているため
キャラクターで使用する配列変数名と
敵キャラクターで使用する配列変数名が異なる場合
番号は別にずらしたりしなくても良いです。

経験値などの変数とIDの番号を揃えたのは
「プレイヤーキャラクターの何番目が
 何のキャラクター」というような
管理がしやすくなるためです。
User icon mini 退会したユーザー(投稿日:2012/02/21 22:50, 履歴)
http://page.rmake.jp/wikis/37
私はいつもここ見てます。
参考までに。
   mini rdjk5242(投稿日:2012/02/21 17:55, 履歴)
ありがとうございます。

倒した人だけに経験値が入るようにするには、getKillCountPartyMember関数を使うんですよね。

キャラクターの[3,4,5]が敵キャラだとして、
#開始スクリプト
setVariable("もらえるP",createArray())  
getVariable("もらえるP")[3]=10
getVariable("もらえるP")[4]=20
getVariable("もらえるP")[5]=30

にして、getVariable("キャラID")[3~5]の数値を決めておいて、
#exp()の中
#↑省略
if 0<getPartyMemberHP( getVariable("キャラID")[i] )  
 a=getKillCountPartyMember(getVariable("キャラID")[i])
 getVariable("Exp")[i]=getVariable("Exp")[i]+a
 getVariable("Exp")[i]=getVariable("Exp")[i]+a
 getVariable("総合Exp")[i]=getVariable("総合Exp")[i]+a
end


こんな感じですか?
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/02/21 06:02, 履歴)
後述のスクリプトは
必要ありません。

"キャラID"配列、"Exp"配列、"総合Exp"配列、"Next"配列
の各配列の番号がそれぞれ
0番目のキャラクター、1番目のキャラクター・・・
という扱い方になっていますから。


それよりも重要なのは、
使用する全キャラクターの数だけ
それぞれの配列が正しく
初期化(初期値が入っている状態)されて
いるかどうかというところです。

また、各配列の長さがきちんと
同一になっている必要もあります。
   mini rdjk5242(投稿日:2012/02/21 05:16, 履歴)
getVariable("キャラID")[i]がそのまま使えるんですね。

次に経験値の獲得なのですが、
 setVariable("Exp",createArray()) 
 setVariable("総合Exp",createArray()) 
 setVariable("Next",createArray()) 

i=0
while i<4
 getVariable("Exp")[i]=0 
 getVariable("総合Exp")[i]=0 
 getVariable("Next")[i]=100 
i=i+1 
end 

def exp()
a=0
while a<getArrayLength(getVariable("キャラID"))
if isPartyMember(getVariable("キャラID")[i])  
 
if 0<getPartyMemberHP( getVariable("キャラID")[i] ) 
 getVariable("Exp")[i]=getVariable("Exp")[i]+PT
 getVariable("総合Exp")[i]=getVariable("総合Exp")[i]+PT 
if getVariable("Next")[i] <= getVariable("Exp")[i] 
 levelUpPartyMember( getVariable("キャラID")[i] ) 
 getVariable("Exp")[i]=getVariable("Exp")[i]-getVariable("Next")[i] 
 getVariable("Next")[i]=getVariable("Next")[i]+20 
end 
end 
end
end
a=a+1

こうしたときに、
if getVariable("キャラID")[i]==getVariable("キャラID")[0]
 getVariable("Exp")[i]=getVariable("Exp")[0]
 getVariable("総合Exp")[i]=getVariable("総合Exp")[0]
 getVariable("Next")[i]=getVariable("Next")[0]
end

こういう風にあらかじめ決めておかなくても大丈夫なんですか?
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/02/20 22:34, 履歴)
今回の場合、"キャラID"配列の長さは
0~5までなので6ですね。


突然出てきた"Party"変数は
よく分かりませんが、、、

LvUPの関数にセットする引数に必要な
キャラクターIDは"キャラID"配列に入っているため
その配列をそのまま使用すれば良いだけです。
#↑省略
  #LvUPの計算
  #(経験値の加算)
  
  if #(LvUPに必要な経験値の判定処理)
    #キャラクターのLvUP
    levelUpPartyMember(getVariable("キャラID")[i])
  end
#↓省略
   mini rdjk5242(投稿日:2012/02/20 22:24, 履歴)
「配列の長さ」って、この場合キャラIDだと[5]になるんですかね。


2個下の記事の#LvUPの計算なのですが、ここもキャラIDで分けますよね?
>>「配列の変数を準備したのですから、
   その配列に格納しているデータを取得して
   判定するようにしてみましょう」
ここから、パーティーIDをgetVariable[i]にして、
#LvUPの中(ここはユーザー定義関数で先に作る?)#
 getVariable("キャラID")[i]=Party
 levelUpPartyMember(Party)
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/02/20 19:09, 履歴)
補足「[]」を含む文字列をcodeでくくる場合、
{{{code
}}}

を使用すると、形が崩れません。
Cdv30200 aoi icon mini aoihikawa(投稿日:2012/02/20 19:08, 履歴)
そうですね。

あとは、折角
配列の変数を準備したのですから、
その配列に格納しているデータを取得して
判定するようにしてみましょう。

def keisan()
  i = 0 #カウンターの準備
  #配列の長さを取得
  ilen = getArrayLength(getVariable("キャラID")) 
  while i < ilen #配列の長さになるまで繰り返し
    #配列のカウンター数番目のIDを取得して判定する
    if isPartyMember(getVariable("キャラID")[i]) 
      #LvUPの計算
      
    end
    i = i + 1 #カウンターの更新
  end
end
   mini rdjk5242(投稿日:2012/02/20 18:50, 履歴)
えーっと・・・
たとえばIDが、[12][28][29][14][56]がいたとして、
  • 開始スクリプト
 setVariable("キャラID",createArray()) 
getVariable("キャラID")[0
="playerCharacter"
getVariable("キャラID")[1]=12
getVariable("キャラID")[2]=28
getVariable("キャラID")[3]=29
getVariable("キャラID")[4]=14
getVariable("キャラID")[5]=56
#ここでパーティーメンバー12と28を入れる

def keisan()
if isPartyMember(12)
#12のLvUpの計算
end
if isPartyMember(28)
#28のLvUpの計算
end
if isPartyMember(14)
#14のLvUpの計算
end]
にして、
  • 戦闘終了後
keisan()

でいいんですか?

なんかよく分かんないです。




Cdv30200 aoi icon mini aoihikawa(投稿日:2012/02/20 18:37, 履歴)
まず、ゲームに使用する
全キャラクターのIDを把握しておきます。

対象のキャラクターIDが
パーティに参加しているかどうかは
isPartyMember関数で判断ができます。

敵キャラクターのIDは戦闘開始時に
確定しています。

戦闘終了後、
パーティーに参加しているキャラクターの場合に
敵キャラクターのIDによって加算する経験値を算出し、
経験値を加算します。