トップページ⇒tech
189コメント62KB

オブジェクト指向でドラクエ

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
OOな皆さま、出番です。

「オブジェクト指向の視点から、ドラゴンクエストを考えてみよう」という趣旨のスレです。

子供の頃やったドラクエを、オブジェクト指向で捉えた場合どんな設計で作るのかに興味を持ちました。
RPGだって「現実世界をゲーム上でシミュレート」なんだから、相性はいいはずです。
オブジェクト指向で分析すればどんなカタチになるか、面白そうじゃないですか?
「勇者はどんなクラス」とか、「マップはどう表現しよう」とか、
はたまた「このイベントはユースケースではどんなものになるんだろう」
みたいな討議をしていきましょう。

もちろん”車輪の再開発”で”妄想”なスレです。成果などは期待しません。
「言いだしっぺの法則で成果物出せやゴラァ」系のあおりは無しの方向で。

基本的には、DQ�Tをターゲットにします(昨今のは煩雑になりがちなので)
が、それ以外のDQシリーズや、転じて2DRPG全体に対しても、扱っていっても良いかと思います。

実装例などを出す場合には、言語は問いませんが、基本はJavaでおながいします。
(わかる人が多いと思うので。)

じゃぁ、みんなお願いね。

System.out.println("へんじがない。ただのしかばねのようだ。");

0002デフォルトの名無しさんNGNG
クソスレ
0003デフォルトの名無しさんNGNG
子供の頃やったのは
ハイドライド、ザナドゥ、ブラックオニキス、ファイアーストーンなどです
ドラクエなんてありませんでした
0004デフォルトの名無しさんNGNG
そんなもんマ板でやれ。
0005デフォルトの名無しさんNGNG
>>1
板違いです。
ゲーム製作技術板
http://pc5.2ch.net/gamedev/
0006デフォルトの名無しさんNGNG
子供のころやったのは
アーストレック、表参道アドベンチャー、南青山アドベンチャーでした。
ドラクエなんてありませんでした。
0007デフォルトの名無しさんNGNG
勇者クラスつくりました!

public class Braver extends Actor {
 public String speak() {
  if ( Math.random() > 0.5 ) {
   return "はい";
  } else {
   return "いいえ";
  }
 }
}

(-A-)あ〜もう、これでいいすか?
0008デフォルトの名無しさんNGNG
子供のころやったのは
スカッシュ、ブロックくずし、インベーダーでした。
ドラクエなんてありませんでした。
0009デフォルトの名無しさんNGNG
子供の頃やったのは、わけのわからない小躍りをさせられるマスゲームでした。
北朝鮮では大人がやらされるそうです。
0010デフォルトの名無しさんNGNG
微妙に面白そうにおもうけど、レス伸びてないなぁ…
(この板の人はヒマじゃないのか…)
0011デフォルトの名無しさんNGNG
new Actor(
"当店は最高のサービスをお客様に提供することをモットーとしております。",
"はぁ? 金持ってねえならさっさと野垂れ死ねや!"
);
0012デフォルトの名無しさんNGNG
(´-`).。oO(どんなコンストラクタが書かれているのだろう?)
0013デフォルトの名無しさんNGNG
class yusha {
UINT Hp;
void HpDec(Damage);
boolean TellDie();
};
0014デフォルトの名無しさんNGNG
(ローマ痔のクラス名がなんとも…)
0015デフォルトの名無しさんNGNG
public interface fight {
public void fight(){};
public void magic(){};
public void escape(){};
}
0016デフォルトの名無しさんNGNG
>>15 頭悪杉。ネーミングセンス無さ杉。
0017デフォルトの名無しさんNGNG
でも自分も書けないとw
001816NGNG
>>17
つーか、俺、市販RPG開発したことあるんだけど(藁
0019デフォルトの名無しさんNGNG
じゃあ俺、市販ゲーム機開発したことあるんだけど(裏
0020デフォルトの名無しさんNGNG
>>15 は、ネーミングセンスはおいといて、俺も同じ事考えてた。
FightAbleインターフェイスを作るってことを。

勇者は当然、2以降からのパーティバトルでのプレイヤーキャラとか。
モンスターもこのインターフェイスを実装する。

メソッドは…どうしようかな。
0021デフォルトの名無しさんNGNG
>>16
リファクタリングしたコードをうpしてください。
002216NGNG
>>21
悪いが、それはできない。著作権売っちまったから。
0023デフォルトの名無しさんNGNG
開発って言ってもピンキリだからな。
0024デフォルトの名無しさんNGNG
疑問に想うんだけど、オブジェクトでDQの「たたかい」の概念を作るってどうするのかな。

バトル可能なキャラオブジェクトのメソッド・パラメタは定型なもので、
バトルマスターっていうかジャッジメンターみたいなオブジェクトがいて、
そいつが実際の「たたかい」のコントロール(闘う順番、ダメージ通知とか)
をするんかな。

経験者様もいらっしゃるみたいですが。
おしえて、エロい人!
0025デフォルトの名無しさんNGNG
ローカルルール嫁

00261NGNG
あのう、1ですが…

>>5 , >>2

ゲーム作るっていうのじゃなく、分析したらどうなるの?的なスレにしたかったのですが。
例えば、職業SEの方々は「業務」の部分をモデル化して、クラス抽出で、実装じゃないですか。
その分析対象である「業務」部分が、誰でも知ってるもの(でドラクエ)なら、
今から設計の世界に入る技術者さんにも、良いリファレンスモデルになるのではないかと。
OOの入門書に「車を例に…」なんて多く出てくるところから、それよりも解りやすかろうと。

ゲ板で「クラス抽出を…」とかの話って出てくるんですかね?
はたまた「JAVAでシューティング作る〜」スレもム板にあることですし、
って言うのは都合の良い考え方ですかそうですか。
0027デフォルトの名無しさんNGNG
○○とゲームプログラミング Rev 3.0.0
http://pc5.2ch.net/test/read.cgi/gamedev/1075636615/
0028デフォルトの名無しさんNGNG
あれれ。良スレだと思ったんだけどな。
あくまでもゲームを作ることが目的なんじゃなくて、
データ構造などを、オブジェクト指向的に表現したらどうなるかって話でしょ。
とりあえず1の言いたいことは分かる。

じゃあ、アイテムあたりを行ってみようか。基本的なゲッター・セッターのメソッドは
めんどいので省略。
public abstract class Item{
  private int price;
  // プレイヤーが「つかう」コマンドを実行したときに呼び出される
  public abstract void used();
  // 「すてる」ことが出来るかどうか
  public abstract boolean canThrowOut();
}
public class Player{
  private static Player player; // ドラクエ1は一人旅なので、シングルトンパターンで。
  public static Player thePlayer(){
    return player;
  }
  private Player(){
  }
  public void use(Item item){
    item.used();
  }
  public void throwOut(Item item){
    if(item.canThrowOut()){
      System.out.println(this.name+" は "+item.getName()+" を なげすてた");
    }else{
      System.out.println("それを すてるなんて とんでもない!");
    }
  }
}
0029デフォルトの名無しさんNGNG
public class やくそう extends Item{
  public void used(){
    Player p = Player.thePlayer();
    System.out.println(p.getName()+"は やくそう をつかった! "+p.getName()+"のHPが かいふくした!");
    p.recover(30);
  }
  public boolean canThrowOut(){
    return true;
  }  
}
public class おうじょのあい extends Item{
  public void used(){
    Player p = Player.thePlayer();
    Position pos = p.getPosition();
    int x = pos.getX();
    int y = pos.getY();
    // あーめんどくさくなってきた。あとは省略
  }
  public boolean canThrowOut(){
    return false;
  }
}
0030デフォルトの名無しさんNGNG
もつ鍋
0031デフォルトの名無しさんNGNG
スライムを継承したスライムベス。
スライムベスを継承したメタルスライム。
スライムを継承したバブルスライム。
スライムを継承したホイミスライム。
キングスライム、メタルキング、スライムベホマズン・・・以下略

課題。
スライム属の全ての継承関係を作れ。
0032デフォルトの名無しさんNGNG
ひくいどりとホークブリザードの多重継承でにじくじゃくになるわけだが。
0033デフォルトの名無しさんNGNG
ドラクエ=糞
↓
HSP=糞
↓
onionsoftのTOPの物体=スライムのパクリ
↓
両方とも糞
↓
HSP=ドラクエ
0034デフォルトの名無しさんNGNG
どう考えてもマ板向けのネタだろ。
0035デフォルトの名無しさんNGNG
プレイヤーはどうやってItemを持つんだ?
class Yuusya {
List itemList;

void getItem(Item item) {
}

void dropItem(Item item) {
}
}
とかじゃあ、うまくいかんなあ。

あと、Itemを店で金払って買うっていう行動。
どう設計すんだろ?
0036デフォルトの名無しさんNGNG
実際に作ってみればいいんじゃないの?
0037デフォルトの名無しさんNGNG
class WeaponShop{
  List listItems;

  getItemList();

  buy( Item* item ){
    Player p = Player.thePlayer();
    int balance = p.getMoney();
    if( balance >= item->getPrice() ){
      System.out.println("おお!お目が高い");
      p.setMoney( balance - item->getPrice() );
      p.addItem( item );
    }
    else{
      System.out.println("おや、お金が足りないようですね");
    }
  }
}
0038デフォルトの名無しさんNGNG
>>35
オブジェクト指向がアダになるっつーか、
アイテムは単なる数値配列で持ったほうがラクじゃね?
0039デフォルトの名無しさんNGNG
そんなやり方してても手続き的なプログラムをクラスにまとめただけになるだろ。

せめて、キャラクタ共通の行動と道具の効果とシナリオ中のイベントの効果を
明確にしなければ、プロトコルを決めようがないじゃん。
0040デフォルトの名無しさんNGNG
正直、まともに作ろうと思ったら、
オーサリングされたシナリオと、それを読み込んで動くプレイヤー
という構造にしかならない。
0041デフォルトの名無しさんNGNG
そうすると、個々のモンスターやアイテムごとにクラスを定義することはなくなり、
それぞれシナリオからパラメータを読み込んでインスタンスとして生成する
ということになる。

野外マップ・ダンジョンマップ・街マップという
大体三つくらいのデータオブジェクトの固まりがあって、
エンカウントするモンスターの種類や数は野外マップオブジェクトの
各スクェアに書き込まれる属性。

モンスターは全部Monsterというひとつのクラスで表現され、
それぞれが名前、HP、MPや呪文/特殊能力の種類、強度、発動率などの
データを属性として持つインスタンスとして戦闘発生時に生成される。
0042デフォルトの名無しさんNGNG
>>41
それじゃ、Cで敵キャラ用の関数をmonster.cに書くのと何の変わりもないね。
全然OOにする意味無し。
0043デフォルトの名無しさんNGNG
Quake あたりのエンジン持ってきて、リアルタイムなDQになっちゃいそうだ
0044デフォルトの名無しさんNGNG
つまり、定型的なことしか起き得ない、
ルーチンワークなシナリオゲームにしかならないと。
0045デフォルトの名無しさんNGNG
じゃあ、人工知能を作るか。
シナリオ性が無くなるけど。
0046デフォルトの名無しさんNGNG
じゃあ、人工知能を作るか。
シナリオ性が無くなるけど。
0047デフォルトの名無しさんNGNG
じゃあ、人工知能を作るか。
シナリオ性が無くなるけど。
0048デフォルトの名無しさんNGNG
じゃあ、人工知能を作るか。
シナリオ性が無くなるけど。
0049デフォルトの名無しさんNGNG
じゃあ、人工知能を作るか。
シナリオ性が無くなるけど。
0050デフォルトの名無しさんNGNG
じゃあ、人工知能を作るか。
シナリオ性が無くなるけど。
0051デフォルトの名無しさんNGNG
じゃあ、人工知能を作るか。
シナリオ性が無くなるけど。
0052デフォルトの名無しさんNGNG
物を買うメソッドを追加してみた。

class Player{
  public static final int ITEM_MAX_SIZE = 10;
  private ArrayList items;
  private int money; // 所持金
  public void buy(Item i){
    if(this.money < i.getPrice()){
      throw new MoneyShortageException();
    }
    if(this.items.size() == ITEM_MAX_SIZE){
      throw new CannotAddItemException();
    }
    this.items.add(i);
    this.money -= i.getPrice();
  }
}
0053デフォルトの名無しさんNGNG
そこでthrowなのか・・・
0054デフォルトの名無しさんNGNG
buyの宣言でthrowsを入れとけ
0055デフォルトの名無しさんNGNG
テレビゲームじゃエラーは発生しないし、
例外でオチたりしない。まぁ最近はCD-ROMとかメモカとかあるけど。

デバグ用にエラー検出コードは入れるけど。
0056デフォルトの名無しさんNGNG
>>55はExceptionとErrorの違いを(ry
0057デフォルトの名無しさんNGNG
例えば武器屋だとか、薬屋だとかがあるとする。
class Shop {
List itemList;

List showItemList() {
return itemList;
}

//売る。
Item sell(Item item) {
return item;
}

//買い取る
void buy(Item item) {
}
}
これをどうやってPlayerクラスと使うかだな。
Itemを店に下取りに出したとき、確実にPlayerからそのアイテムが
無くなってなきゃいけない。
あと金の受け渡しはどうやる?
0058デフォルトの名無しさんNGNG
だからclassより先にinterface決めろやって。
0059デフォルトの名無しさんNGNG
キャラクタを表わすクラスがPlayerってのはどうなんだろう。
0060デフォルトの名無しさんNGNG
>>56
違いってなにか、教えてください
0061デフォルトの名無しさんNGNG
エラー∈例外
0062デフォルトの名無しさんNGNG
>>61
馬鹿。エラー⊂例外だろ
0063デフォルトの名無しさんNGNG
>57
とりあえず、interface Shoppingable でも規定した方がいいんでないか?
0064デフォルトの名無しさんNGNG
>>63
tradableにでもしとけ。buyableとsellableに分離してもいいな。
あと武器用にもoffensiveとdefensiveも定義しる。
0065デフォルトの名無しさんNGNG
魔法使いには Castable もいるねぇ
0066デフォルトの名無しさんNGNG
モンスターによって、アイテムやお金を落とすかどうかを定義かな

intarface IDroppable {
  boolean isDropped();
  int getMoney();
  IEnumerable getItems();
}

キャラクターと PlayerControllable は分離した方が良くないか?

class PlayerChara extends Character implements IPlayerControllable

つー感じで
0067デフォルトの名無しさんNGNG
メモリを潤沢に使える環境で開発している人たちが
うらやましいと感じてる、ゲームプログラマのオレ。
0068デフォルトの名無しさんNGNG
まぁスレタイ的に、メモリ潤沢は当然
0069はぐれメタノレNGNG
OOとOOPLは別物と言い残して逃げよう
0070デフォルトの名無しさんNGNG
>>66
>>キャラクターと PlayerControllable は分離した方が良くないか?

なぜ?
007166じゃないがNGNG
>>70
プレーヤーのキャラ選択でキャラにプレーヤーがつくのとつかないのとあるじゃん。
同じオブジェクトで表現したければ、クラスとしてはキャラで、プレーヤからの操作は
インターフェースで宣言するのがいいと思うが。
0072デフォルトの名無しさんNGNG
何でもable付ければ良いってもんじゃねえんだよ
0073デフォルトの名無しさんNGNG
対象は DQI じゃなかったのか
0074デフォルトの名無しさんNGNG
>70
モンスターやNPCもキャラクターClassの派生だと考えれば、プレーヤーのキャラ自体は
ユーザーが制御可能であるという点で特徴づけられるから
0075デフォルトの名無しさんNGNG
NPCとプレーヤーの共通点は、マップ上にグラフィックがあって2コマで動きますってぐらいか。
ドラクエ1形式を考えると、共通のキャラクタークラスを用意するより1つのインターフェイスを定義した方がいいんじゃないのかな。
モンスターはマップに出てこないからまた別だと思う。
0076デフォルトの名無しさんNGNG
>73
DQ2 を作るときに資源を活用できるようにだろ。次スレがDQ2か?
0077デフォルトの名無しさんNGNG
>>76
> 次スレがDQ2か?

だいぶ先は長いがな。あと925レスか。
0078デフォルトの名無しさんNGNG
>75
それは View レベルの問題だと思われ
OOとしての設計ではないと思うんだが、モンスターもPCもHPやらアビリティを持っている
訳で、そこらへんは統一した実装クラスにまとめておいた方が管理上、楽でしょ
マップとして必要なエリアにきたら、データからアクティベートしてエンカウント計算して
遭遇時にマップ上に表示すりゃいいわけで

って、何まじになってんだろ、漏れorz
0079デフォルトの名無しさんNGNG
>>15
みたいに

>public interface fight {
>public void fight(){};
>public void magic(){};
>public void escape(){};
>}

ってやるより、

interface Action{
 doAction(...);
};

class Fight implements Action{
};

class Magic implements Action{
};

class Escape implements Action{
};

みたいに行動ごとにクラス用意したほうが敵の攻撃方法をランダムに選ぶ時によくない?
0080デフォルトの名無しさんNGNG
>>79
戦闘用のインターフェースを定義して、キャラクターやモンスターのクラス
で実装する時に、各攻撃手段や呪文などをCommandパターンで実装する
のが定石だろうな。
008179NGNG
>>80
>戦闘用のインターフェースを定義して、キャラクターやモンスターのクラス
>で実装する時に、各攻撃手段や呪文などをCommandパターンで実装する
>のが定石だろうな。

ってのは、

interface Fighter{
 void onAttacked(Action action);
};

Action someAction = 勇者.getSelectedAction();
スライム.onAttacked(someAction);

って感じ?
0082デフォルトの名無しさんNGNG
それなら見方に呪文だのラリって見方に攻撃だのってのが、って見方がいないんだっけな。
薬草を使いたいときはどうすんだ?
0083デフォルトの名無しさんNGNG
この調子でsourcefogeまでいったらおもろいな。
いってしもたらつらいけど。
008479NGNG
薬草をクラスにすべきかは置いといて、

Yakusou implements Item, Action{
 
};

Action someAction = getSelectedAction();//薬草インスタンスを返す
Character someTarget = getSelectedTarget();//ターゲット(自分)を返す
someTarget.onAttacked(someAction);

ってな感じか?onAttackedは別の名前にすべきだと思うけど。
0085デフォルトの名無しさんNGNG
>>84
「薬草」というアイテム自体と「薬草を使う」という行為は
別オブジェクトにしたほうがいいな。

薬草の効果や商品価値などはそれぞれの薬草固有だし、
「薬草を使う」という行為と直接関係ないから。
それとは独立して「薬草を使う」「薬草を買う」等の行為を
それぞれオブジェクトにまとめるのがいい。
その上で、「使う」「買う」などを抽象クラスにすればいいのでは?
0086デフォルトの名無しさんNGNG
どうもイメージがわかないけど、
薬草を「買う」のと武器を「買う」のは同じinterfaceだよね。
008779NGNG
>>85
>「薬草」というアイテム自体と「薬草を使う」という行為は
>別オブジェクトにしたほうがいいな。

interface Item{
 UseProcedure getUseProcedure();
};

interface UseProcedure{
 void use(Unit target);
};

class Yakusou implements Item{
 UseProcedure getUseProcedure(){
  return new YakusouUseProcedure(this);
 }
};

class YakusouUseProcedure implements UseProcedure{
 void use(Unit target){
  target.heal(30);
 }
};

という感じか?薬草オブジェクトから「使う」オブジェクトがもらえるのは違和感ないけど、
「買う」オブジェクトがあるのは違和感あるな。
0088デフォルトの名無しさんNGNG
実際にはHP無い物体には使えないから、

 void use(Unit target){

のところは

void use(HP回復可能なインターフェイス target)

ってところか。
008979NGNG
>>88
自分でコード書いておいてなんだが、対象がないアイテムもあるだろうから、

interface UseProcedure{
 void use();
};

class YakusouUseProcedure implements UseProcedure{
 YakusouUseProcedure(Healable target);
 void use();
};

のほうがいいかな、と思った。
それとも「使う」のインターフェースを対象別に分けるべきかね?
0090デフォルトの名無しさんNGNG
勇者.use(薬草)

とかしたいよね。

void use(Healable item)
void use(あと何使うんだable item)

0091デフォルトの名無しさんNGNG
interface Effect {
 void affair(Chara chara);
 void affiar(Enemy enemy);
 ...
}

とかにした方がいいんでないか?
0092デフォルトの名無しさんNGNG
>>91
interface Healable じゃなくってってこと?
0093デフォルトの名無しさんNGNG
>>90
なんか勇者.use(...)は関係が密すぎる感じがする。
アイテムを使うのも、攻撃するのも、魔法を使うのも
メソッドじゃなくて、同じインターフェースを持ったオブジェクトにまとめたほうがよくね?

>>91
対象のオブジェクトによって動作を変えるためにメソッド二つ用意するくらいなら、
CharaとEnemyに同一スーパークラスを持たせて、
affairメソッド内でinstanceofで動作を変えるべきじゃない?
0094デフォルトの名無しさんNGNG
>93
明示的に処理を行いたいときがあるかな、と思ってね
しかし、こういうときほど多重継承のありがたみがわかるなぁ(w
0095デフォルトの名無しさんNGNG
>>94
> しかし、こういうときほど多重継承のありがたみがわかるなぁ(w

それはちょっと間違って(ry
0096デフォルトの名無しさんNGNG
>>93
そういうところでinstanceofは使うべきじゃないと思うな。if else if else if else if ......

0097デフォルトの名無しさんNGNG
>95
いや、実際、これまでの話の中で何度か「それは多重継承すればいいんじゃないか」と
思ってね
0098デフォルトの名無しさんNGNG
>>93
> affairメソッド内でinstanceofで動作を変えるべきじゃない?

せめてダブルディスパッチしてくれい…
00991NGNG
あのぅ、1ですが…

いやー、地下でスレ伸びててびっくりしました。集ってる方感謝っす。
途中、ケンモホロロに追い返されたので、素直にゲ板いってそれ系のスレ見てました。

さて、勢い出たんで、このスレ立てた時に考えたクラス体系を、
皆さんのやりかたを加味して書きたいと思います。
(一笑に伏された後、だれかがもっと良いのを出してくるのを期待してます)
01001NGNG
・クラス
Object
├Controler - 一階層かます(なくても良いかも)
|├GameControler - ゲームの進行を管理
|├GraphicControler - 表示を管理
|├SoundControler - 音の管理をする。
|├ButtleControler - 戦いを管理。
||         行動の順や、「この人が"戦う"選んでるからこの人にダメージ」なジャッジをする
|└MapControler - マップを管理(町、ダンジョンの切り替えなどをつかさどる)
|
└GameObject - 一階層かます(ゲーム内登場物という共通特性がある場合に。Nameとか)
 ├Actor - 演者。主に有生物。
 |├People - 町の人とか、戦わないマップキャラで終わる人々。
 |├Enemy(Monster?) - 敵。Battleable実装
 ||└[性格を持った敵] - 振る舞いが特化されていて、個々に実装必要な奴。ボスなど。Battleable実装
 |└MainActor(Player?) - 主人公とその仲間。Battleable実装。
 | └[性格を持った仲間] - それぞれ実装を必要とする場合のキャラ。
 |             NPCを含むためControlable実装は任意。
 ├Map - マップの名前とマップチップのデータを持つ。
 ├MapChip - マップの特性を持った構造体(構造定義せずに配列とかでも良い?)
 ├Item - アイテム共通の性格。
 |└[個々のアイテム] - 性格を持ったアイテム。振る舞いは個々に違うため別個に記述。
 ├Magic
 |└[個々の魔法] - 性格を持った魔法。振る舞いは個々に違うため別個に記述。
 └Skill(Action?) - スキル。プレイヤーごとにインスタンスを4つまで保持し、戦闘時コマンドとして表示。
  ├Spel - 呪文をとなえる。(PlayerのMagicリストを参照したい)。
  ├Fight - たたかう。
  ├UseItem - アイテムを使う。(Playerのアイテムリストを参照したい)
  ├Defence - 防御
  ├Escape - 逃げる。(隊列先頭の奴に強制的に付加されるって、なぁ)
  └[その他] - 昨今のドラクエの"とくぎ"など。
01011NGNG
・インターフェイス

Battleable - 戦闘ができる。Hp,Mp,つよさ全般のパラメータはここに含まれる。
Controlable - 戦闘時自分で操れる。
BattleUse - Item、Magicに任意で実装。戦闘中に使える。
FieldUse - Item、Magicに任意で実装。フィールドで使える。
EventUse - Itemに任意で実装。捨てられない。使うと無くなるなど。
Tradable - Peopleに実装。Shopから買うのではなくて売買資格のある人から買う、という概念で。
01021NGNG
Skillのところは適当すぎるかも。FF5のアビリティか…
MainActor,Enemyごとにメソッドとして実装したほうがいいのかな。
コントローラ的なものが居るって、なんか正しくないんでしたっけ?
あと職業の概念をどこにも入ってないっすね。
ああ・・・叩きどころは満載ですのでたたき台ということでどうか一つ…

MainActorは、みんなが"Player"クラスとして話されて居た箇所で、あえて名前を変えました。
うる覚えですが、なんかの本で
「Playerはゲームしている人自身で、応答が必要な時(DQのはい・いいえ等)にはPlayerにメッセージを送る」
な設計を正としていたのを見た気がしたので・・・
0103デフォルトの名無しさんNGNG
1

javadoc にしてどっかにupしる。
0104デフォルトの名無しさんNGNG
>>1
おかえり。
俺も昔RPGを作ろうと思ってどういうクラスわけすればいいか悩んだから、
ここの話を参考にゲーム作ってみたい。

で、なんか>>100の内容はちょっと範囲が広すぎるから
範囲をせばめて話を進めたほうがいいんじゃね?
とりあえず今まで戦闘の話が多かったから戦闘の話とか。

漏れはjavadocよりクラス図とシーケンス図がみたい。
0105デフォルトの名無しさんNGNG
>とりあえず今まで戦闘の話が多かったから戦闘の話とか。

次の話題にいこうよ。
0106デフォルトの名無しさんNGNG
で、>>1はどこいったんだ?
01071NGNG
すいませんすいません。
PG人足とはいえ、一応普通に働いてる人なので…

自分的には、「ゲームになってなくてもオブジェクト志向にこだわりたい」と想ってます。
上記をちゃんとクラス図に起こしたい気もしますが、その前に異論等、他の意見をききたかったです。

夢見がちな願望では、「オブジェクトの動きをウォッチするとゲーム画面ができる」っていう挙動が理想なのですが…

まとまってなくてすいません。
0108デフォルトの名無しさんNGNG
ウィンドウや、カーソルといったものも必要になるんじゃない?

0109デフォルトの名無しさんNGNG
>>107
「オブジェクトの動きをウォッチするとゲーム画面ができる」っていうのは違う気がする。
物事にはいろいろな側面があって、見る方向によって見え方が変わって当然。
こういうRPG(今回で言えばドラクエ1)をつくるっていう前提があるからというか、
その前提に立ってオブジェクトというか、クラス設計していくんじゃないのかな。
同じものでも視点が違えば(例えば武器屋のおっちゃんの視点から考えると)ぜんぜん違うものにならない?

01101NGNG
そうですね、そうだと想います。

セオリーというモノを余り知らないヒヨッ子なもので、定番の視点がわかんないっす。

ただ、「見る方向によって…」という観点なら、>>107 は「>>100 はこういう視点でクラス抽出してます」という表明でしょうか。

「設計の『正しい』は人それぞれ」、「視点によって変わる」を前提に、他の考えも期待してます。>皆様
0111デフォルトの名無しさんNGNG
> 同じものでも視点が違えば(例えば武器屋のおっちゃんの視点から考えると)ぜんぜん違うものにならない?
他の人がモデリングしたら違うはありだとおもうけど、他の登場人物から見た
ら違うってのは、客観的にうまいモデリングができてないってことじゃない?
システムとしての視点がずれてると、わかりにくく(他人が理解しにくく)なり
そう。
0112デフォルトの名無しさんNGNG
>1
ちなみに、絵を書くなら
http://objectclub.esm.co.jp/Jude/jude.html
0113デフォルトの名無しさんNGNG
>>111
武器屋のおっちゃんが主人公なゲームを作るとなると、経営シミュレーションゲームになるよね。
勇者も魔法使いもいらない。Customerだけ。モンスターに鉄斧売ってもいい。
いくらで仕入れていくらで売るか。在庫はいくらか。
製造もするなら原材料を仕入れて工場おさえて仕掛品の在庫管理も品質管理もせないかんね。
よーし。おっちゃん、隣の町にも出店しちゃうぞぉ。
0114デフォルトの名無しさんNGNG
>>113
用語してるのか、ヒニクってるのかわからん。
ここが、ツーチャソネロというところか…
0115113NGNG
>>114
「他の登場人物から見たら違うってのは、客観的にうまいモデリングができてないってことじゃない?」では無いんじゃないの?
って意味です。
0116デフォルトの名無しさんNGNG
>>115
大まかに同意。
そうなんだよ。>>109 は いいたいことはあるんだろうが、例がおかしい。
0117デフォルトの名無しさんNGNG
静かになった。
0118デフォルトの名無しさんNGNG
で、どうなったの?
0119デフォルトの名無しさんNGNG
あがってきたので、記念かキコ
・オブジェクト間の通信。
abstract class  CommandBase {
  CommandOwner owner;
  public abstract void send();
}
// ターゲットが、1つ
abstract class SimpleCommand extends CommandBase {
  CommandObserver commandObserver;
  public void send(){
    commandObserver.doCommand( this );
  }
}
// ターゲットが、複数
abstract class MultiCastCommand extends CommandBase {
  ArrayList commandObservers;
  public void send(){
    Iterator it = commandObservers.iterator();
    while( it.hasNext() ){
      CommandObserver target = ( CommandObserver )it.next();
      target.doCommand( this );    
    }
  }
}
ゲーム内オブジェクト間で影響を及ぼしあう
MagicCommand, ItemCommand, SpeakCommand, MenuCommand
プレイヤーからのイベント
AButtonCommand, BButtonCommand, StartButtonCommand
周期的に変化をさせる
TimeCycleCommand

0120119NGNG
Command の実行は、間にDispather をかまして、非同期にしたほうがいいかもしれない。
0121デフォルトの名無しさん NGNG
良スレだと思っていたのだが、止まっとるね。
0122デフォルトの名無しさんNGNG
あげ。
0123デフォルトの名無しさんNGNG
interface Pufpufable
{
____void Pufpuf(Target t);
}

Console.WriteLine("昨晩はお楽しみでしたね。");
0124デフォルトの名無しさん05/01/18 21:32:20
ドラクエと言ったら3しか知らないけど
あの程度のインターフェイスならWEBアプリで作れるな
BCEで分けて今から作り始めるとするよ
0125デフォルトの名無しさん05/01/20 00:59:29
>>124さんに期待
012612405/01/20 19:41:56
できたおー
0127デフォルトの名無しさん05/01/21 05:11:05
(eval(read))
0128デフォルトの名無しさん05/01/22 02:09:40
>>124さん
うpきぼんぬ。
0129デフォルトの名無しさん05/02/04 08:37:27
Javaみたいだけどこれはどうだい

Javaでドラクエを再現する
ttp://f57.aaa.livedoor.jp/~javagame/rpg/dq.html
0130デフォルトの名無しさん2005/05/01(日) 18:15:44
例えば勇者が魔王と戦う戦闘をプログラミングした場合、

勇者クラスに攻撃メソッドを
魔王に攻撃を受けるメソッドを作るのがいいのか

第三の全く別の戦闘クラスを作って値を仲介させたほうがいいのか 難しいところですね。

c初心者で意味不明だったらごめんなさい。
0131デフォルトの名無しさん2005/05/01(日) 18:18:25
仲間になるモンスターをどうクラス化するのだろう、
0132デフォルトの名無しさん2005/05/01(日) 23:51:54
>>130
俺は「第三の全く別の戦闘クラスを作って値を仲介させ」るやり方でやってる。
戦闘クラスに、主人公と敵のパラメータと、
プレイヤーが選択した行動(攻撃/呪文/道具/防御など)を渡して、
ダメージ計算やダメージを与えた結果などを、すべて戦闘クラスで処理してる。

>>131
宝箱を落とす確率と同じように、仲間になる確率というパラメータを、
モンスタークラスのメンバに持たせればよいのでは。
戦闘終了後に、その確率で仲間が増えるイベントを発生させる。
仲間を増やすのは、戦ってではなく、
普通に話しかけて仲間が増えるイベントと同じように作ればいい。
0133デフォルトの名無しさん2005/05/02(月) 00:04:24
シューティングなんかもそうだけど
AとBの当たりを調べるのに
当たり判定クラスを作成してそこからAとBの公開メソッドを呼ぶな
0134デフォルトの名無しさん2005/05/02(月) 00:28:36
当たり判定ルーチンはコンテナの外側に置きたいな
当たりデータはオブジェクトに付属させたいな
当たり判定ルーチンがキャラクターオブジェクトの公開メソッドになるのは嫌だな
0135デフォルトの名無しさん2005/05/02(月) 06:56:57
>>132
実際にどうコーディングするかというよりも、オブジェクト指向でガチガチにRPGを
モデリングしたらどうなるか、というのがスレの趣旨だと思う。

そういう視点で見ると、勇者に攻撃、魔王に防御判定とダメージ処理メソッドを置く方がいいと俺は思う。
0136デフォルトの名無しさん2005/05/02(月) 07:00:49
戦闘クラス(戦場クラス?)があってもスレの趣旨からは微塵も離れていないと思うんだが。
0137デフォルトの名無しさん2005/05/02(月) 08:44:31
あらゆるアイテムやらモンスターやらをそれらの基本クラスから継
承させるととんでもない数のサブクラスが出来てえらいことになり
そう。ItemやMonsterだけがクラスで、挙動は継承に依らずに実装
するほうがいいのかな。
0138デフォルトの名無しさん2005/05/02(月) 19:48:22
>>136
離れているとは誰も言っていない。
趣旨に沿うのであれば、135の方が俺は相応しいと思ったというだけ。
0139デフォルトの名無しさん2005/05/02(月) 22:02:21
>>131
敵としてのスライムと、仲間になるスライムが、同じ1つのクラスである必要性はないと思うが。
別にしろってんじゃなくて、そういう選択肢もありかなと。
0140デフォルトの名無しさん2005/05/03(火) 16:30:50
>勇者に攻撃、魔王に防御判定とダメージ処理メソッド
具体的にどんな感じ?
たとえばこう?

class 勇者{
 int 攻撃力;
 void 攻撃(魔王){
  魔王.防御判定(攻撃力);
 }
}

class 魔王{
 int HP;
 int 守備力;
 void 防御判定(攻撃力){
  HP -= 攻撃力 - 守備力;
 }
}
0141デフォルトの名無しさん2005/05/03(火) 16:38:03
仕様も決めずに、プログラム書いて
デスマが待ってるのは、このスレですか?
0142デフォルトの名無しさん2005/05/03(火) 17:52:24
ただの実装例だし、別にいいでしょ。
0143デフォルトの名無しさん2005/05/03(火) 18:12:04
> int 攻撃力;

なんで知力が攻撃力なんだ? と素で15秒思考が止まった。
0144デフォルトの名無しさん2005/05/03(火) 19:04:41
typedef int intellect;
0145デフォルトの名無しさん2005/05/03(火) 20:40:29
//ところで、ドラクエは何の言語で書かれてるの?
0146デフォルトの名無しさん2005/05/03(火) 21:02:21
//あの時代ならアセンブラとかじゃないの?
0147デフォルトの名無しさん2005/05/03(火) 21:13:56
//律儀にコメントタグ、ワロス
0148デフォルトの名無しさん2005/05/03(火) 21:51:28
/*
*アセンブラかぁ。
*何人月くらいかかるんだろー。
*/
0149デフォルトの名無しさん2005/05/03(火) 22:44:51
このスレみたいにRPGを題材にして
クラス設計を勉強していく、

ゲームで学ぶOOP

売れるかな

0150デフォルトの名無しさん2005/05/03(火) 23:24:44
RPGは選択ミスだと思われ。戦闘だけ作るならいいのかもしれんが。
「勇者クラス」とかはたまにOOPの教材にも出てくるしな。
0151デフォルトの名無しさん2005/05/04(水) 00:15:16
ゲーム製作の基本の基本から解説していくなら教材になるかも
ただ本一冊で済みそうもないな
0152デフォルトの名無しさん2005/05/04(水) 00:18:28
いろんな種類のゲームのクラス設計をUMLで。
詳細な説明はいらんからとにかくいろんなパターンを紹介してくれるような本欲しいな。
0153デフォルトの名無しさん2005/05/04(水) 00:46:29
>>150
結構いい題材だと思うけど。
アイテム、マップ、戦闘、ユーザーとのインターフェースなど題材は尽きない。
真面目に設計したらかなり実力がつくと思うぞ。
0154デフォルトの名無しさん2005/05/04(水) 02:20:30
実際にRPGを作ろうとすると、RPGツクールをデザインせにゃならんからなー。
「勇者クラス」を作って「モンスタークラス」を作ってとか、そういう分かりやすい話にはならないと思うが。
もっとシンプルなゲーム、例えばインベーダー辺りのモデリング手法を書いた方が面白い本になると思う。
0155デフォルトの名無しさん2005/05/04(水) 02:28:44
> 実際にRPGを作ろうとすると、RPGツクールをデザインせにゃならんからなー。
どういうこと?
0156デフォルトの名無しさん2005/05/04(水) 02:37:48
>>155
チラシの裏
{

いわゆる開発支援ツールを通じて開発するということでしょ
「ぽりごなみえ」みたいな
}
0157デフォルトの名無しさん2005/05/04(水) 02:39:53
>>156
そそ、そゆこと。
01581552005/05/04(水) 02:45:42
あーそういうことか。
漏れは設計することのみの本を考えてた。
実装までしようとしたらそりゃ大変だわな。
0159デフォルトの名無しさん2005/05/04(水) 02:48:24
いや、開発環境も設計の段階で必要だと思うけど・・・。
プレイヤ視点でエンジン部分だけを設計でRPG作ろうとしても、多分途中でコケると思うぞ。

むしろRPGツクールをどうやって作ればいいかという設計を考えた方が、
実際のRPG制作の上では近道だと俺は思う。まぁ、俺は途中で頓挫したんだがorz
0160デフォルトの名無しさん2005/05/04(水) 06:09:15
>>159
俺も挫折したタイプw

とりあえず、汎用的なエンジン/システムを作ってみよう、っていうスタンスだと恐らく完成しない。
明確な目的・需要があって作るのが良い。
その上でどこまで汎用的に設計するか決めるのが一番良いと経験的に思う。
0161デフォルトの名無しさん2005/05/04(水) 08:16:05
>>159
なるほど。今までのこのスレの流れは間違ってたんだな。

面白そうだな。ここでそういう話をできないかな。
0162デフォルトの名無しさん2005/05/04(水) 09:06:36
ここでの目的はドラクエか。
ドラクエといってもたくさんあるけどな。
1を継承して2を、2を継承して3を…と出来たらおもろいけどな。
0163デフォルトの名無しさん2005/05/04(水) 11:45:55
現在進行形でDQクローンを作ってる俺が来ましたよ。
ゲーム本体とマップエディタとかを平行して作ってるけど、
汎用性なんて全く考えてない。というか余分な機能作る余裕ない。
最低限DQとして必要な機能を実装するだけでも量が多くてアップアップですよ。
0164デフォルトの名無しさん2005/05/04(水) 12:29:09
interface AI
{
BattleCommand DecideCommand(BattleStrategy strategy);
…
}

class クリフト implements AI
{
public BattleCommang DecideCommand(BattleStrategy strategy)
{
return ザラキ;
}
}
0165デフォルトの名無しさん2005/05/04(水) 13:14:06
デスピサロ戦で1000回位全滅するとクリフトAIが
学習してザラキ唱えなくなるらしいよ。
0166デフォルトの名無しさん2005/05/04(水) 15:17:09
>>164
WARATA
0167デフォルトの名無しさん2005/05/04(水) 15:30:29
アイテムboxは一個しか持たなくていいから、クラス指向だと、シングルトン使ってもいいかもなー。

class ItemBox{//シングルトン
・・・
----------------
   List items;//アイテム袋の持ってる物と個数を管理
   BOOL Use(Actor&,ItemType);//アイテムの使用効果などを記述
   ItemBox GetInstance();//唯一のインスタンスを吐き出す。
---------------
・・・
}

class Hero :Actor{
・・・
-----------
 BOOL UseItem(ItemBox IB){
              return IB.Use(this,yakusou);
 }
-----------
・・・
}


あ、仲間増えるとこれ使えないや。
0168デフォルトの名無しさん2005/05/04(水) 15:45:32
パーティーを管理するクラスが必要じゃね?
0169デフォルトの名無しさん2005/05/04(水) 15:45:40
オブジェクト間通信のいい見本って無いかな??
クラスはなるべく一個ずつで完結して痛いわけなんだけど、
それじゃ、他のオブジェクトと通信が難しい。
うまい設計って無いかな?
0170デフォルトの名無しさん2005/05/04(水) 15:47:14
>>クラスはなるべく一個ずつで完結して痛いわけなんだけど、 
クラスはなるべく一個ずつで完結していたいわけなんだけど、 

誤字すいません。
0171デフォルトの名無しさん2005/05/04(水) 15:56:39
何が言いたいかよくわからん。一個ずつで完結って何だ?
0172デフォルトの名無しさん2005/05/04(水) 15:58:12
他クラスへの依存性をなるべく減らしたいって話かなぁ
0173デフォルトの名無しさん2005/05/04(水) 16:17:35
>>171
172のいうとおりで、なるべく再利用できる形で作っていきたいんです。(するかどうかはわからないけど、
今考えたのは、カプセル化して基礎を作って継承して2レイヤ目で通信機能を実装する方法。
バッシングされそうな設計なので、なんかいい方法ないかな??
と、思ったのです。
0174デフォルトの名無しさん2005/05/04(水) 16:21:53
クラス間通信っても、いろいろあるべや。
集約だったらその方法は使えないし。

パッケージ単位で完結するようにすればいいでは。
0175デフォルトの名無しさん2005/05/04(水) 16:30:49
>>168
DQ1は一人旅。
DQ2は3人で、DQ3は4人。

class party{
 List Members;//重複禁止だからMapの方がいいかもしれない。
 BOOL Uniqe();
 Actor& Search(string);//名前で検索。
 Actor& Search(int); //x番目で検索。
 BOOL Join(Actor&);//追加。
 BOOL Leave(string);//削除by名前
 BOOL Leave(int);//削除by X番目。
}

ほかに何かあったっけ?

 
 
0176デフォルトの名無しさん2005/05/04(水) 16:56:44
>>174
パッケージ単位にしても、うまい切り分けができないと難しいなぁ。
パッケージっていうと、ほとんど完成したアプリケーションしか思い浮かばない。OTL
うーん。
うまい切り分けを考えて、インターフェース指向を考えたんだけど、
これがなかなか、うまくマッチしないんだよなぁ。(勉強不足も否めないが。
ex.コンソールとGDIとDirectXにマッチするようなインターフェースを基本機能に絞って記述。
コンソールで開発して、Dxでリリースとかしたかった。
って、与太話になってるな。
ま、切り分けはセンスってことで、センスを磨くようにするなり。
サンキュー
0177デフォルトの名無しさん2005/05/04(水) 17:32:57
>>176
Observerパターンとかどうだろう?
0178デフォルトの名無しさん2005/05/04(水) 18:30:59
>>177
提案ありがとう。
検討してみる。
0179デフォルトの名無しさん2005/05/06(金) 22:14:26
うおぉーーーーーーりゃぁーーーーーーーーーーー
0180デフォルトの名無しさん2005/05/06(金) 22:16:36
http://p5057-ipad03aobadori.miyagi.ocn.ne.jp/
うぇwwwうぇwww
wwwwwwwwwwwwwww
wwwwwwwwwwwwwうはっwww
うぇwww
っうぇwwwwwww
wwwwwwwおkwww
0181デフォルトの名無しさん2005/05/07(土) 21:44:06
もうだめだーw
0182デフォルトの名無しさん2005/05/07(土) 21:57:45
http://YahooBB218124060027.bbtec.net/
wwwwwwwwwっうぇwwwwwwうはっwwwうはっwww
wwwwwwwwwwwwっ

おkwww

っうはっwwwwwwwwwwwwwwwうぇwww
0183デフォルトの名無しさん2005/05/10(火) 03:50:14
ドラクエ自体アセンブラなのにオブジェクト指向で作られてるって聞いたけどな
0184デフォルトの名無しさん2005/05/10(火) 22:58:46
まぁどの言語だってオブジェクト指向はできるわな
0185デフォルトの名無しさん2005/05/11(水) 04:30:03
>>183
> ドラクエ自体アセンブラなのに

ドラクエってアセンブラだったのか。。。
アセンブリ言語で開発されてんじゃなくて、ドラク自体がアセンブラなんだよな?
0186デフォルトの名無しさん2005/05/15(日) 19:56:16
むしろアセンブラがドラクエ
0187デフォルトの名無しさん2005/06/06(月) 22:56:18
age
0188デフォルトの名無しさん2005/08/12(金) 23:22:41
ロトってroot?
0189デフォルトの名無しさん2005/08/13(土) 03:20:15
たしか、Roto という綴をサントラCDで見た希ガス。
■ このスレッドは過去ログ倉庫に格納されています