A 回答 (4件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
以下のクラス構成では如何でしょうか。
1.人・抽象クラス:Person
移動処理を実装する。町人クラスと主人公クラスで継承。
public abstract class Person {
public int walk() {
return 0;
}
public int run() {
return 0;
}
}
2.ステータス・クラス:Status
主人公クラスと敵キャラクラスがメンバ変数として利用。
public class Status {
public int hp;
public int mp;
public int power;
public int physical;
public int speed;
public int knowledge;
}
3.町人クラス:Resident
人・抽象クラスを継承。
public class Resident extends Person {
}
4.主人公クラス:Hero
人・抽象クラスを継承。ステータスクラスをメンバ変数として定義。
public class Hero extends Person {
private Status status;
public Status getStatus() {
return this.status;
}
}
5.敵キャラ・クラス:Monster
ステータスクラスをメンバ変数として定義。
public class Monster {
private Status status;
public Status getStatus() {
return this.status;
}
}
ありがとうございます。
ステータスを構造体のように扱おうとは思っていました。
しかし、主人公と敵キャラは戦闘中に共通の抽象クラスで処理したいのです。
int attack(Chara chara)
のようなメソッドでは親クラスとして扱う必要があるので。
インターフェースを使おうとも思いましたが、どうすれば綺麗に使えるのかわかりません。
No.2
- 回答日時:
戦闘に関する処理を親クラスで定義する必要はありません。
戦闘処理を管理するクラスを用意することでもできます。
6.戦闘管理クラス;BattleManager
戦闘処理を管理するクラス。
public class BattleManager {
public static int attack (Status status, char chara) {
return 0;
}
public static int guard (Status status, int damage) {
status.hp = status.hp - damage;
return status.hp;
}
public static int magic (Status status, char chara) {
return 0;
}
}
7.戦闘インターフェース:BattleInterface
人クラスと敵クラスに実装させるインターフェース。
public interface BattleInterface {
int attack (char chara);
int guard (int damage);
int magic (char chara);
}
4’.主人公クラス:Hero
public class Hero extends Person implements BattleInterface {
private Status status = null;
public Hero() {
this.status = new Status();
}
public Status getStatus() {
return this.status;
}
public int attack(char chara) {
return BattleManager.attack(this.status, chara);
}
public int guard(int damage) {
return BattleManager.guard(this.status, damage);
}
public int magic(char chara) {
return BattleManager.magic(this.status, chara);
}
}
5’.敵キャラ・クラス:Monster
public class Monster implements BattleInterface {
private Status status;
public Status getStatus() {
return this.status;
}
public int attack(char chara) {
return BattleManager.attack(this.status, chara);
}
public int guard(int damage) {
return BattleManager.guard(this.status, damage);
}
public int magic(char chara) {
return BattleManager.magic(this.status, chara);
}
}
先の回答で移動処理を人・抽象クラスに定義しましたが、
戦闘処理クラスを抽象クラスにして、
移動処理を管理するクラスとして実装してもいいかもしれません。
もし移動処理、戦闘処理のほかに、修行処理とか新しい機能を追加したくなった時に
継承だけでクラスを設計しようとすると無理があります。
全体の仕様を考慮しながら柔軟なクラス設計を心がけましょう。
戦闘のオブジェクトはステータスだけではキャラクターを特定できないので
何らかのオブジェクトで渡す必要があるかと思うのですが
(this.status, chara)などのパラメータだけで様々な戦闘処理を網羅できるのでしょうか?
BattleManagerに関してはご指摘通りインターフェースを介して実装してみようと思います。
No.3
- 回答日時:
私も今Javaでゲームを作っていますが、
全てのゲームオブジェクト(Entityと呼んでいる)に
BaseEntity(クラス)を継承させ、
移動処理や攻撃処理などは必要に応じて
Movable(移動インタフェース)、Attackable(攻撃インタフェース)を用意し実装させています。
共通のインタフェースを実装しているオブジェクト同士は、
継承と同様まとめて操作できるので。
※BaseEntityより上位でも、さらに共通部分があればBase(クラス)を用意していますが。
ステータスはまだ未実装ですが、No.1さんのように、委譲する形で実装しようとは考えています。
やはり機能の追加はインターフェースなのですね。
>Movable(移動インタフェース)、Attackable(攻撃インタフェース)
私もこのように実装してみようと思います。
すべてBaseEnityを継承といっても、さらにその下に複数の親がいるのだと思いますが
以下のようなイメージで合っていますか?
BaseEntity
|
|-BattleChara-|-Friend (Movable, Attackable)
| |-Enemy (Attackable)
|-NonPlayerv(Movable)
|
|-OtherObject
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 声優 声優って途中から主要キャラの声をやることになった場合それまでのアニメを全部見るんですか? 例えば10 2 2022/04/09 12:50
- その他(アニメ・マンガ・特撮) 敵キャラのかっこいいと思う捨て台詞 1 2023/01/09 21:38
- その他(アニメ・マンガ・特撮) 最近のワンピースが好きな人は気分を悪くするかも知れないので見ないで下さい。 質問というよりはワンピー 4 2022/09/27 16:49
- その他(アニメ・マンガ・特撮) 幼稚園の頃に見たロボットアニメ 2 2023/06/05 10:40
- その他(アニメ・マンガ・特撮) 名探偵コナンの主人公の成長と変化が描かれないのは作者が蔑ろにしてるからですか? ここ最近、名探偵コナ 5 2022/07/05 12:09
- その他(アニメ・マンガ・特撮) 名探偵コナンって主人公酷いヒロイン可哀想を強調したい作品ですか? 色んな漫画恋愛漫画数々読んできたも 1 2022/07/27 04:54
- マンガ・コミック 異世界転生とかなろう系の作品のハーレム、最強系男主人公漫画の表紙ってなぜ大体女性キャラが書かれてるん 2 2022/05/09 00:19
- 邦画 80年代のドラマ?映画?だと思うのですが 2 2022/04/03 20:05
- 戦争・歴史 この映画のタイトルを教えてください 1 2023/03/05 06:55
- 倫理・人権 統一教会自民党や創価学会公明党やこれらと関係あるマスコミ関係者や自公工作員・自民党ネット 1 2022/09/22 22:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c++,ある関数のクラスから別の...
-
クラス間でのデータ参照
-
java-別クラスの変数の使い方を...
-
Java リフレクションについて
-
C++でfriendクラスにしているの...
-
範囲外の数値を代入したらエラ...
-
C#でほかのファイルにある自作...
-
リフレクション
-
SwingでgetContentPaneのエラー...
-
リレーションエンティティクラ...
-
C++ クラス名の前のdefine
-
Java
-
関数内の変数に<summary>コメン...
-
スーパークラスのコンストラク...
-
C#のクラスライブラリでメッセ...
-
整数値を任意のオブジェクトを...
-
親クラスから子クラスへアクセス。
-
違うクラスからの変数の共有化
-
C#にて別クラスの関数を使いたい
-
構造 他のクラスの構造体を別...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
C#でほかのファイルにある自作...
-
C++でfriendクラスにしているの...
-
java-別クラスの変数の使い方を...
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
ひとつのファイルにクラスは1つ?
-
Java
-
import と extends について
-
継承したクラス側のクラス名の取得
-
SwingでgetContentPaneのエラー...
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
アップキャスト、ダウンキャス...
-
C# インターフェイスの実装
-
visual studioのデザイナ画面で...
おすすめ情報