えー現在はセーブ、タイトル関連をまだちょっと後回しにして、いよいよゲームの心臓部である練習部分に取り掛かってます。単純な走力の増減はなんとかなるとして問題はテンションとの連動ですね。今回は前作の調子と違って普通にプレイすると中央付近を行ったりきたりするような感じにしたいんだけど、その辺の匙加減はやっぱり他の人にもやってもらわないと上手く行かないんだろうな~。
っつーことでこの辺で本格的にテストプレイ者を募集しようかなと思ってます。条件は・・・、いやこういうのやったことないから正直よくわかんないけど、プレイして意見をくれる人で、作者の気まぐれでセーブデータがぶっ壊されても平気な人とかかな。期間はたぶん5月1日、早くて4月29日ぐらいから2週間とかそのぐらい。あるいはもっと伸びるかも。メールのやり取りになると思うので協力してくれる人はコメ欄かメールフォームからメアド晒してください。
ついでに気分転換に作ったゴミswfファイルを載せてみます。1次元の処理なんだからやろうと思えば難しくはないんだよな~。もちろん駅伝部ゲーム2とは何の関係もないけどね。
進捗率37%ぐらい。枠部分はいろいろと面倒くさいので後回しにして先にセーブ部分を作ってみた。全くデータを弄らずゲーム内の配列をセーブ用の配列にただ置き換えただけでやってみたところ、データ量は約290KBでした。えー、この時点で前作の20倍以上。セーブデータを3つ作るとすると約870KB。ただしデータの8割以上が0かundefinedなので、今後1024KBを超える可能性もアリと。
う~ん、各大会の各区間ごとの値等省略した部分が結構あるのにこの数字ですか。いろいろ圧縮したりしても200KB以上は避けられそうにないですねぇ。まぁ最初からそのつもりではあったんだけど。
さてさて、一応ゲームの大枠が出来てきたところでここからは思ったこととかを適当に書いてみる。まずは前作がいかに単純なつくりだったかってことね。一応終盤のバランス調整は頑張ったしタイムの表示方法や戦歴リストとかはそこそこ拘ったけど、ごく一部の仕組みを除いて本当につくりが単純なんだよな~。こんなのに2年とか掛けたなんて信じられんわ。
そして今作も思ったほど複雑ではないです。というかむしろ単純さが増したかも。今回はほぼ全ての部分を単一のムービークリップで作ったのでfunctionでの使いまわしが楽になったという部分が大きい。ようやくattachMovieとfunctionの組み合わせにも慣れてきたしね。
あと仕組みの部分とは関係ないけどゲーム的には箱根駅伝って退屈だなーとか思った。一応山はあるけど基本的にスタミナ系の練習だけやってりゃ勝てそうだんもんな~。ある程度短い距離の区間もあってその辺の適正を見極めて配置させる必要がある全日本とかの方がゲーム的には面白そうだよね。
ついでに、もし2の完成が待ちきれないって人がいらっしゃったら旧作をやり続けるよりこのゲームでもやった方が楽しいと思うよ。ってかスピード、スタミナ、メンタルの3要素なのか。考えることは同じか・・・。
![]()
その駅伝本戦の仕様は、まぁ基本的には前作と同じ感じです。ただあまりこの辺には手間を掛けたくないのでHAGONE以外の駅伝は簡略化します。出場校を20に絞って枠とかの扱いもテキトー。もちろん全日本が20校じゃ物足りないとかいう人がいれば変えると思いますが、とりあえず2はこのままで行ってもいいかな~と。使いまわしバンザイ。
んで一応今後の予定ですが、駅伝の枠及び記録関連を作り終わって40%。年度の引継ぎとセーブ部分が終わって50%。練習等での能力の変動を一通り作って60%。ある程度(10年プレイして三大駅伝いずれも5位以内とか)ゲームとして成り立っていることを確認して70%。そこから他の人にも協力してもらってテストプレイをしつつ数値等の調整をして完成まで持っていくと。普段はどこかで敢えて寝かせたりもしますが(作るのに飽きるとも言う)、今回はあくまで"3"が完成形、今作ってる"2"はそのベータ版とかそういう位置づけなので出来れば一気に作り上げたいですねぇ。
進捗率25%ぐらい。思いつきでこんなの作ってたらすげー時間食った。こういうグラフ系の描写には大体三角関数が必要なんだけど中卒ニートの頭には難解過ぎますって。たまたまこんな解説を見つけたから何とかなったんだけどさ~。
ちなみに図は上位がちょうどインカレで勝てるぐらいの走力をランダムで入れたデータになってます。単純なランダムなので円に近い形になっていますが実際に練習を重ねるともっと歪になるかと…。
それからスカウト部分もだいたい出来上がりました。監督レベルと同じだけのポイントをそれぞれの能力に割り振る感じですね~。エースが欲しいなら1番手極振りで、全体的にそこそこのレベルにしたいなら全体に振ると。地域のところももう出来上がってるけど説明はめんどい…。
さてさて、いい加減駅伝部分に着手しないといけませんな。
前回更新時に関カレ、インカレは既に出場者の選択と仮のタイムと順位が出せるようになっていて、もう完成は時間の問題と思ってたらそう上手くは行かなかった。まずはソート関連。出場者を選ぶときには種目ごとにID順になってるんだけど、結果を表示するときは見栄え的に順位で並べたほうがいい。でも人数が不定ということで従来のやり方だとたぶんよくないと。
その辺りについてダラダラ書かせていただくと、えーいやここを説明するのは面倒くさいな・・・。とりあえずレースのパターンをいろいろ作るとなるとタイムによって順位が一意に決まるようにしたほうが修正とかが楽と思ったのですよ。例えばある年の関カレ1万mは28分50~55秒なら6位とかね(実際は違うけど)。でもこのままだと例えば自校の1人目が28分53秒、2人目が28分52秒、3人目が28分51秒のときに3人とも6位になってしまうと。これを1人目8位、2人目7位、3人目6位とするシステムが本当に面倒くさくてそこだけで3時間とか掛かった。
さらに個人と全体での記録を残したりそれを表示させたり、まぁ色々あったわけですよ・・・。いや本当に今週に入ってからは毎日3~5時間は制作に当たってたんだけどそれでも今日までかかったからね~。インカレ部分だけで合わせて15時間ぐらい?ん、15時間?そのうちソート関連が3時間って計算合わなくね?まぁいいか。絵描いてたりもしてたしね。とにかくインカレでこんなに時間掛けてどうすんだよって感じですよね。しかもまだパターンは1通りずつしか作ってないし。駅伝部分はスムーズに進むといいなぁ・・・。
えー、そのゲーム内インカレとかについてですが、今のところかなりゲーム的というか、現実とは結構かけ離れたものになりそうな感じです。以下に仕様を列挙します。
時期
関カレ5月 インカレ6月 ユニバ8月
概要
ユニバは奇数年のみの開催。各大会とも1日で全種目実施。実施順は検討中。
出場資格
関カレ及びインカレ それぞれ標準記録を突破した人の中から各種目3人まで。1人が何種目出てもok。標準記録は基本的に2011年の現実の大会に沿っているが、一部変更あり。
ユニバ 該当年のインカレで2位以内の人が強制的に出場。ハーフのみ違う選考にするかも。
タイムとか
各種目とも力を出し切るaパターンと牽制するbパターンを用意。どっちが出るかは運次第。その他、性格によって普段の記録会よりも力を出しやすい(本番に強い)or出しにくい(本番に弱い)なんてのも作る予定。
とりあえずこんなもんか。性格自体が未実装なので最後の部分はまだ構想段階です。今週中には駅伝の基本部分を作り上げたいなぁ。まぁどうなるかわかんないけど通しのテストプレイ開始で完成度60%ぐらいだと思うので、1日2%ペースなら今月中にはかなり出来上がる計算?いや進捗率自体独断だからかなり怪しいんだけどさ。はい。そんなところです。頑張りません。
えーさて、せっかくなのでスクリプトでも公開してみますかね。ほぼ完成扱いになっている記録会の基本的な部分です。
-----
rentugi = [];
imabest = [];
if (this._parent.kihon[1]<10) {
this.yearh = "0"+this._parent.kinon[1]+"年";
} else {
this.yearh = this._parent.kihon[1]+"年";
}
this.hiduke = this._parent.mon+"月"+this._parent.day+"日";
for (i=1; i<21; i++) {
this.attachMovie("kirohito", "kirohi"+i, 5200+i);
mest = "kirohi"+i;
this[mest]._x = Math.floor((i-1)/10)*260-140;
this[mest]._y = (i-1)%10*30+50;
this[mest].krk2 = this._parent.buin[i][this._parent.kihon[4]];
if (i<6) {
this[mest].krk1 = "4年";
} else if (i<11) {
this[mest].krk1 = "3年";
} else if (i<16) {
this[mest].krk1 = "2年";
} else {
this[mest].krk1 = "1年";
}
for (p=40; p<60; p++) {
this._parent.buin[i][p] = this._parent.buin[i][p+1];
}
this._parent.buin[i][50] = this._parent.kihon[2];
this._parent.buin[i][55] = this._parent.kirokutipe;
this._parent.buin[i][60] = "";
if (this._parent.buin[i][20]>20) {
karihiro = this._parent.buin[i][20]-20;
} else {
karihiro = 0;
}
karisupi = this._parent.buin[i][11]+this._parent.buin[i][12]+this._parent.buin[i][13]-karihiro;
karisuta = this._parent.buin[i][14]+this._parent.buin[i][15]+this._parent.buin[i][16]-karihiro;
karisesi = this._parent.buin[i][17]+this._parent.buin[i][18]+this._parent.buin[i][19]-karihiro;
switch (this._parent.kirokutipe) {
case 1 :
takiai = "記録会 1500m";
this._parent.buin[i][45] = 秘密だよ!
if (Math.random()*1<(this._parent.buint[i]-1)*(this._parent.buint[i]-1)/16) {
this._parent.buin[i][45] += 2700;
}
if (this._parent.buin[i][45]<??000) {
this._parent.kantoku[46] = 1;
}
if (this._parent.buin[i][45]<??500) {
this._parent.kantoku[47] = 1;
}
break;
case 2 :
takiai = "記録会 5000m";
this._parent.buin[i][45] = 秘密だよ!
if (Math.random()*1<(this._parent.buint[i]-1)*(this._parent.buint[i]-1)/16) {
this._parent.buin[i][45] += 2700;
}
if (this._parent.buin[i][45]<??000) {
this._parent.kantoku[48] = 1;
}
if (this._parent.buin[i][45]<??000) {
this._parent.kantoku[49] = 1;
}
if (this._parent.buin[i][45]<??000) {
this._parent.kantoku[50] = 1;
}
break;
case 3 :
takiai = "記録会 10000m";
this._parent.buin[i][45] = 秘密だよ!
if (Math.random()*1<(this._parent.buint[i]-1)*(this._parent.buint[i]-1)/16) {
rentime[i] += 2700;
}
if (this._parent.buin[i][45]<??0000) {
this._parent.kantoku[51] = 1;
}
if (this._parent.buin[i][45]<??4000) {
this._parent.kantoku[52] = 1;
}
if (this._parent.buin[i][45]<??8000) {
this._parent.kantoku[53] = 1;
}
if (this._parent.buin[i][45]<??2000) {
this._parent.kantokui[54] = 1;
}
if (this._parent.buin[i][45]<??6000) {
this._parent.kantoku[55] = 1;
}
break;
case 4 :
takiai = " ハーフマラソン";
this._parent.buin[i][45] = 秘密だよ!
if (Math.random()*1<(this._parent.buint[i]-1)*(this._parent.buint[i]-1)/16) {
rentime[i] += 2700;
}
if (this._parent.buin[i][45]<??00) {
this._parent.kantoku[56] = 1;
}
if (this._parent.buin[i][45]<??40) {
this._parent.kantoku[57] = 1;
}
if (this._parent.buin[i][45]<??80) {
this._parent.kantoku[58] = 1;
}
if (this._parent.buin[i][45]<??20) {
this._parent.kantoku[59] = 1;
}
break;
}
if (this._parent.buin[i][45]<this._parent.buin[i][this._parent.kirokutipe+30]) {
this._parent.buin[i][this._parent.kirokutipe+30] = this._parent.buin[i][45];
this._parent.buin[i][this._parent.kirokutipe+34] = this._parent.kihon[1]*1000+this._parent.kihon[2];
this._parent.buin[i][21] += 2;
if (this._parent.buin[i][21]>20) {
this._parent.buin[i][21] = 20;
}
imabest[i] = 1;
this[mest].krk4.gotoAndStop("更新");
if (this._parent.buin[i][45]<this._parent.rekodo[10][this._parent.kirokutipe*4-1]) {
for (p=1; p<11; p++) {
if (this._parent.buin[i][45]<this._parent.rekodo[p][this._parent.kirokutipe*4-1]) {
for (z=this._parent.buin[i][this._parent.kirokutipe+60]; z>p; z--) {
this._parent.rekodo[z][this._parent.kirokutipe*4] = this._parent.rekodo[z-1][this._parent.kirokutipe*4];
this._parent.rekodo[z][this._parent.kirokutipe*4-1] = this._parent.rekodo[z-1][this._parent.kirokutipe*4-1];
this._parent.rekodo[z][this._parent.kirokutipe*4-2] = this._parent.rekodo[z-1][this._parent.kirokutipe*4-2];
this._parent.rekodo[z][this._parent.kirokutipe*4-3] = this._parent.rekodo[z-1][this._parent.kirokutipe*4-3];
}
for (zss=1; zss<21; zss++) {
if (this._parent.buin[zss][this._parent.kirokutipe+60]<this._parent.buin[i][this._parent.kirokutipe+60] && this._parent.buin[zss][this._parent.kirokutipe+60]>=p) {
this._parent.buin[zss][this._parent.kirokutipe+60]++;
}
}
this._parent.buin[i][this._parent.kirokutipe+60] = p;
this._parent.rekodo[p][this._parent.kirokutipe*4-1] = this._parent.buin[i][45];
this._parent.rekodo[p][this._parent.kirokutipe*4] = this._parent.buin[i][this._parent.kirokutipe+34];
this._parent.rekodo[p][this._parent.kirokutipe*4-3] = this._parent.buin[i][1];
this._parent.rekodo[p][this._parent.kirokutipe*4-2] = this._parent.buin[i][2];
break;
}
}
}
}
if (this._parent.kirokutipe == 4) {
this[mest].krk3 = this._parent.roadire(this._parent.buin[i][45]);
} else {
this[mest].krk3 = this._parent.trackire(this._parent.buin[i][45]);
}
rentugi[i] = this._parent.buin[i][45];
}
-----
ネタバレを防ぐため一部加工してありますが、隠しきれてなかったり意図的に隠してないところもあるのでよく見るとあの辺の仕様がわかっちゃうかもね。そういや調子をどうタイムに反映させるかはまだ決めて無いんだったな~。まぁ練習メニューの詳細を決めるのと同時ぐらいにやればいいか。
ちなみにこのスクリプトで最も苦労したのは終盤ですね。終盤の4分の1ぐらい。これが歴代のデータを管理する部分なんだけどfor文の入れ子に次ぐ入れ子でbreakが入ったりしてもう大変でしたよー。いや本当にどのfor文が何を指してるかとか面倒くさすぎるんだけど、省略する方法もわかんないからしょうがないんだよね。ああ。これでバグが見つかったら泣ける。
プロフィール
感想及び評価は完全に独断で手当たり次第根こそぎプレイしてガンガン書いてます。☆平均1.8ぐらい。
かつてはFlash8でゲーム制作も行っていました。
Youtuber(天野ガム)としても活動してます
https://twitter.com/5Qqvac8TFmxr6wG
ブログ内検索
カテゴリー
アーカイブ
メールフォーム
最新コメント
最新記事
P R
カレンダー
アクセス解析
