2014-05-05

HEX間の距離の求め方

 HEXタイプのSLGを作ろうとすれば、当然ある二つのHEXが何HEX離れているのかを知りたくなる事があります。ところが、これについてはっきりと解説してあるサイトが見当たらなかったのです。仕方がないのでうんうん唸りながらどうにかこうにか、計算式を発見しました。
 ただし、いまのところエラーは出ていないものの、この計算式が正しい証明はありません。経験上うまくいっているだけというのをご了承ください。

続きを読む »

スポンサーサイト



2014-05-12

「難しい」と「めんどくさい」の違い

 私はよくマゾゲーマーといわれます。Victoriaを輸入禁止でプレイしたり、Wizardlyをリセット禁止でプレイしたりしますし、Hearts of Iron 2のお気に入りMODはエイリアンMODです。
 SRPGなんかもお気に入りは結構難しい部類のファイアーエムブレムトラキア776とかベルウィックサーガです。
 しかし、めんどくさいのは嫌いだったりします。たとえばベルウィックサーガでは安全かつ効率的にスキルを上げようとすればHPの回復する敵を殺さないように、いつまでもちくちくと攻撃を当てたりする事になります。私はそういうプレイができないような制限をつけてプレイしました。・・・おかげで、途中で詰んでクリアできませんでしたが。

 これはゲームを製作する側としても変わってません。たとえばCampers&treasuresなんかも、めんどくさくならないように注意しました。
 倒した敵によって取れるアイテムが違ったりしてもよかったでしょう。しかしあのゲームは戦闘中に増援として敵が追加されます。どんな敵が出てくるかはやってみないとわからない。あるアイテムをドロップする敵が出てくるかもしれないからと、あえて倒せるリーダーを倒さずに残しておき、他を全滅させてからリーダーを倒すみたいな手順をとらせるのは望ましくないと思いました。
 あるいは戦闘終了後のHP回復量ももうちょっと制限することもできました。当初の予定では、HPの何割かが回復した状態で翌日の戦闘を行う事になっていました。しかしそれも、めんどくさい作業をさせる事になります。キャンプの中にいればHPが回復するわけですから、翌日の戦闘を有利に進めるためには、リーダーだけを残しておいて、キャンプでHPを回復させてからリーダーを倒すという手順をとる事になるでしょう。

 SummonPanthersの場合、各ユニットには成長要素がありませんし、主人公の成長システムもかなり単純化されてます。たとえば、各ユニットに成長要素があり、そのユニットの構成員が経験値を獲得するようにする事もできました。それぞれのユニットが敵ユニットにダメージを与えたらそれに応じて成長するとか。敵を倒した総数で、主人公の成長度合いも変化したりとか。
 でもそうなると、本来の作戦目標としては必要のない戦闘を行う方が有利になってしまいます。育てたいユニットでとどめをさせるように攻撃順を調整するとか、無駄に敵を全滅させようとしてしまうでしょう。

 私としては、プレイヤーに楽しんでほしいと思っている作業以外は、できるだけさせないようにしたいと思っています。メインの目標達成以外のことをしないといけなくなるのは(たとえそれをするかしないかが自由意志にゆだねられているとしても)めんどくさいのです。
 だから私はゲームを作るとき、ある程度漠然としたゲームシステムを思い浮かべた後、「で? それでプレイヤーは何をして楽しめばいいんだ?」ということに対する答えをはっきりさせておきます。これがあれば必要のないシステムを削るときにも、必要なシステムを追加するときにも迷わずにすみます。
 まぁ、だから私のゲームは地味なのかもしれませんが。

2014-05-17

リストから要素を一つランダムに取り出す方法

 これは、わざわざ記事にするまでもない方法だと思います。みんな、自分なりにこういうのは作ってるでしょう。まぁ、一応。

class CharacterList{
std::list< Character* > characterlist;

public:
 Character* GetRandomCharacter(){
  std::list< Character* >::iterator it_list = characterlist.begin();

  int rand = GetRand(characterlist.size() - 1);
  for(int n = 0;n < rand;n++){
   it_list++;
  }
  return *it_list;
 }
}

 vectorの場合はもっと単純に、randを添字にして指定すればすみます。
 ただしこれには注意点があり、characterlistが空だとエラー落ちします。characterlistに誰も入っていないケースが存在する場合は、呼び出しもとで注意する必要があります。
 なお、GetRand関数はDXライブラリの関数です。

2014-05-24

次のゲーム

 製作はゆるっと進行中です。
 とりあえず、メイン画面の大体の枠組みができてきました。まだちょっとめんどくさい処理をしないといけないイベント報告ウィンドウが残ってますが、他は基礎的な機能は持たせました。まだまだ種類が少ないので、枠組みだけなんですが。
 今月中に残りのウィンドウを一通りそろえたら、来月は戦闘処理を作ってしまいます。大体の戦闘ルールは考えてありますが、仕様の調整も含めて一ヶ月もあれば終わるでしょう。今回は乱数処理を正規分布させてみることにしたので、ちょっとめんどくさい処理を用意しましたが、さほど複雑なシステムでもなく。
 敵のデータを用意し始めるのは8月からの予定ですが。ゲームらしい動作をしてくれるようになるのは9月ころですかねぇ・・・。

Copyright (C) 旅の雲. All rights reserved. Template by Underground