トップページgamedev
1001コメント322KB

シューティングゲーム製作技術総合 17機目

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2008/11/27(木) 10:18:19ID:bBI1A+d5
ゲームプログラマなら誰もが通る、もしくは、通った道。青春の香り?
それは「シューティングゲーム製作」・・・。

このスレでは、そんなシューティングゲームの製作技術や技術の検証、成功談
失敗談笑い話、難易度の設定方法論、多弾の是非などについて語り合いましょう。
もちろんBulletMLなどで弾幕を作成してみたり、自分の作ったシューティングを
晒してみたり、プロジェクトをはじめてみるなどもOK!

ただし、シューティングの未来とか既存のゲームの話題などは、関連する他の
スレでやってくれ。

過去スレ,関連スレは >>2-3で。
0638名前は開発中のものです。2009/03/05(木) 19:17:32ID:brqYBTxt
>>636
だからFire、Exist、Touch等はMove内の処理だろ?
各オブジェクトの移動と描画をMoveとDrawに分けてるんだから
細分化って何をどうしたいんだ?
0639名前は開発中のものです。2009/03/05(木) 19:20:00ID:FsoDo+yK
おちつけ
0640名前は開発中のものです。2009/03/05(木) 19:57:43ID:K8fBdWo9
俺はこんなの。
各自オブジェクトがスクリプトで行動を切り替えてる。
自殺もするのでオブジェクトを管理して回してる奴が生き死にを確認したりもしてる。
 
//インタプリタなスクリプト。Objectから呼んでActionを主に更新する。
class Script{
  
};
 
//MoveとかFireとかの基底のインタフェース
class Action{
  bool update(void);//処理が終了していたらtrueを返すとかそんなの
};
 
//敵、自機、弾、その他の基底のインタフェース
class Object{
protected:
  Script scr;
  Action act;
public:
  void update(void);//この中でact.update()を処理したりScriptを呼んでactの切り替えをする。
  void draw(void);//描く
};
 
なんか面白い組み方があったら教えてほしい。
という技術の話題を振ってみる。
0641名前は開発中のものです。2009/03/05(木) 20:02:25ID:1d/NzH52
なぜか上げてた。特に意味はない。

>>638
なんだ、その。いや、ゲーム全体からみりゃそうなんだが。

if ポーズ中じゃないなら
{
forループ
オブジェクト配列[i].Move()
forループ
オブジェクト配列[i].Fire()
forループ
  forループ
   Touch(オブジェクト配列[i],オブジェクト配列[j])
}
forループ
  オブジェクト配列[i].Draw()

とかやんね?
0642名前は開発中のものです。2009/03/05(木) 20:12:12ID:1d/NzH52
>>640
今の所、難易度別の行動設定とか用意してないんで、オブジェクトの行動は敵の種類ごとにべた書きだなー。


0643名前は開発中のものです。2009/03/05(木) 20:19:46ID:/7Ei5x6Q
>>640
なんかJAVA JAVAっぽいね
それはおいといて
これの Object 派生させるの?
0644名前は開発中のものです。2009/03/05(木) 20:24:42ID:g++EGVdD
>>640>>641同じ人なの?

>>643
この作りでObjectを派生させたらナンセンスだと思う。
オブジェクト配列を派生するなら判る。

派生とかクラス設計の人は
>オブジェクト配列[i].Fire()
>Touch(オブジェクト配列[i],オブジェクト配列[j])
などをやらない
「オブジェクト配列に、Fireを行わないオブジェクトや、
Touchが不用なオブジェクトを入れられ無いっておかしくね?」

…と思うんじゃね?
0645名前は開発中のものです。2009/03/05(木) 20:25:20ID:K8fBdWo9
>>643
ほとんどのクラスをスマートポインタラッパにしてjavaのようにC++で書いてる。
で、
class Bullet : public Object
class Enemy : public Bullet
とかしてる。
MyShipをどこから派生させると美しいかは毎回悩む。
06463722009/03/05(木) 20:27:09ID:g++EGVdD
>>645
3人目ゲット
0647名前は開発中のものです。2009/03/05(木) 20:41:04ID:K8fBdWo9
>>646
?
0648名前は開発中のものです。2009/03/05(木) 20:45:15ID:1d/NzH52
>>644
んにゃ別。

>Objectを派生させたらナンセンスだと思う。
マジカー。Fire()で実装が空とかなんだが。実際Fireしてもほんとに撃つかどうかはオブジェクト依存だしいいかなーと思ってる。
ってかFire()という名前が問題か。

Touchのほうは実際は、自機リスト、敵機リスト、背景オブジェリスト、前景オブジェリスト、などから
2つ選んでハードコーディングする。だからまぁ自機_敵機、敵機_自機弾_自機_敵弾の3つぐらいTouchを利用したループがある。

自分で言っててあんまりきれいな実装じゃないかも。
0649名前は開発中のものです。2009/03/05(木) 20:48:41ID:JU51dqJC
>>645
継承がis aの関係じゃない時点で美しくない
0650名前は開発中のものです。2009/03/05(木) 20:53:18ID:g++EGVdD
富豪的にはありなんだろうけど…。 今俺本当に日本語書けてる?
以下、俺の思い浮かべる評判の悪いクラス設計の例。 「is a」ぐらいは守ってる?
vector<Obj *> ObjArray;
class Obj
{
  virtual void Update()
  {
    Move();
  }
  virtual void Move(){/*実装*/}
};
class EnemyObj :Obj
{
  virtual void Fire(){/*実装*/}
  void Update()
  {
    Move();
    Fire();
  }
};
class EnemyA :EnemyObj
{void Fire(){/*ユニークな実装*/} void Move(){/*ユニークな実装*/}};
class Barrier :Obj
{
  bool IsTouch(Obj tgt){/*実装*/}
  void Update()
  {
    Move();
    foreach(vector<Obj *>,tgt,ObjArray)IsTouch(Obj tgt);//foreachの構文が今ググったら違った!?
  }
};
0651名前は開発中のものです。2009/03/05(木) 20:54:12ID:/7Ei5x6Q
>>645
class Enemy : public Bullet
だと Bullet 属性も継承することになるんだが・・・
Bulletクラスに破裂するという操作があると
Enemyにも引き継がれるが

それだったら Object に破裂操作を最初っから純仮想関数で宣言しておき
class Bullet : public Object;
class Enemy : public Object;
の方が自然じゃない?

とりあえず >> 372 のソースが見たいものだが
オブジェクト=メモリのかたまりと考えてるのか?
0652名前は開発中のものです。2009/03/05(木) 20:55:41ID:K8fBdWo9
>>649
640のObjectは例えで、ScriptとかActionはもう少し上で持ってる。
updateだけを持ってるクラスがだいたいの基底。
で、Enemyは高級なBullet的な定義をするんだけど
(BulletもAbstractBulletみたいなのを作って細分化した方がいいとか悩む)
MyShipはどこがいいのかに悩んでる。
 
どうだろうか?
0653名前は開発中のものです。2009/03/05(木) 21:04:28ID:K8fBdWo9
>>651
Bulletの破裂はEnemyの死。
Bulletだって弾を撃つことはある。
そんな感じでBulletに出来てEnemyに出来ないことがあまり考えつかないから class Enemy : public Bullet にしてる。
 
あと、EnemyAとかEnemyBってのは作ってなくて、全部スクリプトで決めてる。
 
Enemy img="res/enemy/zako1.bmp" x="100" y="100"
Move r="90" v="100"
Sleep sec="60"
 
みたいなの。
0654名前は開発中のものです。2009/03/05(木) 21:27:03ID:/7Ei5x6Q
>>650
それは Prototype パターンだね
0655名前は開発中のものです。2009/03/05(木) 21:39:01ID:g++EGVdD
ライフゲームの1セルを1オブジェクトにした実装はしない
と前書いた時通じたかと思った…

>>651
>とりあえず >> 372 のソースが見たいものだが
>オブジェクト=メモリのかたまりと考えてるのか?
DirectXの都合で、同じ描画のオブジェクトを集めたい

言語が痛いので、模擬コードです
class DrawAbleObj
{
  描画位置配列;
  void Draw(){/*SetStreamSource()1回に、SetMatrix()とDrawPrimitive()を配列要素数回 */}
  virtual update()
  add(座標)…など
}
class bullet :
class enemy :
class enemy_bullet :
/*初期化*/
DrawAbleObj配列.add(new bullet())
DrawAbleObj配列.add(new enemy())
DrawAbleObj配列.add(new enemy_bullet())
/*メインループ内のDraw*/
  foreach(型,i,DrawAbleObj配列)
    i.Draw();

>>652
MyShipに継承させたい物はあんまりないな
グローバルまで行かなくても、参照されて困らない所に在ればよくね?
0656名前は開発中のものです。2009/03/05(木) 21:39:53ID:/7Ei5x6Q
>>653
その構造だと Enemy インスタンスが消滅すると
Bullet インスタンスも消えてしまうけど
Bullet インスタンスを残しておきたい場合などの表現が不可能になる

Enemy *enemy = new Enemy
enemy->Fire(); // ここでbulletが複数作られる
enemy->End(); // 敵の消滅
delete enemey; // ここでbulletも全部消える

継承という概念が分かってない
どこかで不具合がでてくる
設計で悩んでる
0657名前は開発中のものです。2009/03/05(木) 21:45:45ID:/7Ei5x6Q
>>655
君は問題ない
0658名前は開発中のものです。2009/03/05(木) 21:47:03ID:K8fBdWo9
>>656
Enemyが死んでもBulletは死なないように作ってる。
なんでBulletが消えるのか分からない。
EnemyのFireをBullet管理者が受け取ってBulletが生成されてるだけで、Enemyとの関連はない。
0659名前は開発中のものです。2009/03/05(木) 21:47:30ID:sv4Dn5ZX
一体何の話かわからない俺はベターC
0660名前は開発中のものです。2009/03/05(木) 21:53:28ID:g++EGVdD
>>654
いちお、生存期間中にCloneを作る事はないよ

自称Strategyのつもり、Update()に多態性を持たせたい
しかし、生存期間中にEnemyAがEnemyBにキャストされるような事はないので、自称

>>657
thx
0661名前は開発中のものです。2009/03/05(木) 21:59:43ID:/7Ei5x6Q
#include <stdio.h>

class Object
{
protected:
double x;
public:
virtual void Fire() = 0;
};

class Bullet : public Object
{
public:
virtual void Fire();
};

class Enemy : public Bullet
{
public:
virtual void Fire();
};

//----------------------
// 永遠に呼ばれない
void Bullet::Fire()
{
x = 2.0;
printf( "%f\n", x );
}
//----------------------
0662名前は開発中のものです。2009/03/05(木) 22:00:07ID:/7Ei5x6Q

void Enemy::Fire()
{
x = 1.0;
printf( "%f\n", x );
}

void main()
{
Object *obj = new Enemy;

obj->Fire();

delete obj;
}

となり無駄が生じる
0663名前は開発中のものです。2009/03/05(木) 22:03:17ID:kKvbso12
>656こんな事言う人に問題ないと言われても安心できないと思うんだが
というかID:/7Ei5x6Qがなにを言いたいのか分からない
0664名前は開発中のものです。2009/03/05(木) 22:06:05ID:K8fBdWo9
>>661
BulletもEnemyもFireは持ってない。
BulletもEnemyも呼ばれるのはupdateとdrawだけ。
それぞれの行動はupdateの中でScriptが決めてActionに実体がある感じ。
 
class Fireはないけどあえて書くなら
class Fire : public Action
class Move : public Action
みたいになっている。
0665名前は開発中のものです。2009/03/05(木) 22:11:08ID:/7Ei5x6Q
>>664
すまんね ちと混合していた
Fire() はないようだね

君は Composite パターン

問題ない

ただ、複雑になるのはある程度予測しといた方がいい
0666名前は開発中のものです。2009/03/05(木) 22:15:21ID:/7Ei5x6Q
>>664
いや
class Enemy : public Bullet
ここが問題

それでいくなら Decorator パターン

class Decorator : public Object
class Bullet : public Decorator
class Enemy : public Decorator
class MyShip : public Decorator
ではどうかね?
0667名前は開発中のものです。2009/03/05(木) 22:21:16ID:g++EGVdD
>>663
>>656のミスリードには気付いてたけど、僕がいう事じゃ無いし

後はみんなの好き嫌いをアンケート程度の気分で聞いておく
>>661
ぐらいだったら、僕は許すな
アンチパターンも許すけど、

>Draw(){/*SetStreamSource()1回に、SetMatrix()とDrawPrimitive()を配列要素数回 */}
は譲れないな
0668名前は開発中のものです。2009/03/05(木) 22:23:48ID:/7Ei5x6Q
>>660
なるほど EnemyA, EnemyB に目がいっていた

君がしたいのは Iterator パターンでは?
0669名前は開発中のものです。2009/03/05(木) 22:50:23ID:/7Ei5x6Q
//----------------------
// 永遠に呼ばれない
void Bullet::Fire()
{
printf( "部長ぉぉぉぉぉぉぉ!!!\n" );
}
//----------------------
とかしてもいいかな
0670名前は開発中のものです。2009/03/05(木) 22:53:56ID:/7Ei5x6Q
//----------------------------------------------------------------------------
// 永遠に呼ばれない
void Bullet::Fire()
{
MessageBox( HWND_DESKTOP, "返事がないようだ ただの屍のようだ", "error?", MB_OK );
or
MessageBox( HWND_DESKTOP, "パターンが分からないようだ", "error?", MB_OK );

}
//----------------------------------------------------------------------------
0671名前は開発中のものです。2009/03/05(木) 23:03:09ID:vElUtQql
いまさらだけど、>>656
>Enemy インスタンスが消滅すると
>Bullet インスタンスも消えてしまう
な に を い っ て い る ん だ ?

継承を理解してないな。


それはそうと個人的には class Bullet : public Enemy なんだけどな。 弾は特殊な敵って意味合いで。
0672名前は開発中のものです。2009/03/05(木) 23:13:05ID:/7Ei5x6Q
>>671
ミスリードと言ってるだろ

反応ないから寝る
0673名前は開発中のものです。2009/03/05(木) 23:16:48ID:/4jagLW1
なんとなくメモリの動的確保をしたくない俺は
ずらずらとスパゲティ書いてるw
0674名前は開発中のものです。2009/03/05(木) 23:42:12ID:1d/NzH52
うむ。まだデザパタがまだ生成パターンしか読み終わってないうちにはちと辛いな、デザタパで説明が完結されるとorz
てかみんな柔軟だな。実際のコードを覗いてみたいぜ。・・・C++は多分読めないけど
0675名前は開発中のものです。2009/03/06(金) 00:03:12ID:Eu3rRFpD
>>674
ID:/7Ei5x6Q の言ってることはあまり気にしない方がいいよ。
0676名前は開発中のものです。2009/03/06(金) 07:29:29ID:xstPUn85
>>675
ID変えてからの反応ではもう誰も信頼せんよ
そんなに否定するなら代案だせよ

ID:K8fBdWo9「だれか〜このソースどうにかしてくれませんか〜?」
ID:/7Ei5x6Q「こういうのはどうかね?」
ID:K8fBdWo9「・・・」

この船は先に進むんですか?
0677名前は開発中のものです。2009/03/06(金) 08:00:37ID:UQFJ8zhz
>>676 港につきません。
0678名前は開発中のものです。2009/03/06(金) 11:06:50ID:HHW0AAKz
どこをどう勘違いしたら>>656みたいな解釈になるんだ。

ていうか

>継承という概念が分かってない

ってのはID:/7Ei5x6Q 自身の話かな。
とりあえずC++のサイト回って勉強してみては?
0679名前は開発中のものです。2009/03/06(金) 12:07:53ID:Eu3rRFpD
>>676
ID:K8fBdWo9が低レベルすぎて話にならない所をやんわり流してるんだろ。
0680名前は開発中のものです。2009/03/06(金) 12:11:05ID:Eu3rRFpD
>>676
間違えた
ID:/7Ei5x6Qが低レベルすぎて話にならない所をやんわり流してるんだろ。
0681/7Ei5x6Q2009/03/06(金) 12:58:32ID:xstPUn85
そうなのかい?
君のはデコレータパターンとコンポジットパターンの組み合わせだよ
もしくはパターンに当てはめられるのが嫌だったのかな
ごめんよ・・・
0682名前は開発中のものです。2009/03/06(金) 13:07:51ID:q2+zc1Kz
クラス?継承?new?知らんがな(´・ω・`)

構造体最強ヒャァハァァァァー
0683名前は開発中のものです。2009/03/06(金) 13:36:30ID:dVN9ZSyA
よう、俺。
0684名前は開発中のものです。2009/03/06(金) 13:57:04ID:C76RJ9rx
>>682 その結論はオカシイ
 このパターン厨の書いてることは、パターンの名前で
ググる事ができる奴が見たら赤面もんのことばかりだぞ…

>>674の持ってる本がちょっと分厚過ぎるじゃないか?
GoFは、たった23個しか無くて判りやすい図が入ってる


…STG制作にはアンチパターン>>655が要る事もあるが、
発想の種子ぐらいにはなるんじゃない?
0685名前は開発中のものです。2009/03/06(金) 14:06:02ID:q2+zc1Kz
>>684
いや、俺はガチで会話についていけないだけだww
最近になってポインタの使い道がわかって喜んで関数作って動いてSUGEEEEEEEEってやってるレベルだ

独学マンセー
0686名前は開発中のものです。2009/03/06(金) 14:15:36ID:wgorap74
みんな いったい誰と戦っているんだ!?
0687名前は開発中のものです。2009/03/06(金) 15:03:36ID:xstPUn85
ブルマは脱いだらアカンがな(`・ω・´)
0688名前は開発中のものです。2009/03/06(金) 16:33:57ID:QhFILLD4
このスレでは、そんなシューティングゲームの製作技術や技術の検証、成功談
失敗談笑い話、難易度の設定方法論、多弾の是非などについて語り合いましょう。
もちろんBulletMLなどで弾幕を作成してみたり、自分の作ったシューティングを
晒してみたり、プロジェクトをはじめてみるなどもOK!


何でここ喧嘩と設計の話ばっかりなの?
実際に作ってる奴いるの?
0689名前は開発中のものです。2009/03/06(金) 17:41:36ID:wgorap74
これは自作自演でうpする前フリだな
06906852009/03/06(金) 18:57:39ID:E7ymH2OK
作ってるぜっ(・∀・)半年前に一度うpしてるぜ
0691名前は開発中のものです。2009/03/06(金) 19:33:21ID:fB/frkhf
頑張ってクラスとか継承とか使ってみるものの、こんがらがって死ぬ
設計がいかに大事かがセッ分かった気がする
0692名前は開発中のものです。2009/03/06(金) 19:49:27ID:g/bnT2ZX
俺はObject クラス作って基本、自機や敵、それらの弾、爆発、背景等はみんなObjectから派生させて作ってる
敵から出る弾は当たり判定チェックの関係上、壊せる弾は敵と同じ扱い(Enemy派生)、壊せん奴は別扱い
ただ、getxとか使うとイメージ的に負荷かかりそうで座標とかpublicにしてるためStructチックになってしまってるorz
以前は強引にfriend使ってたw
まあとりあえず完成させればいいよな、どこかは言わんが以前別スレにうpしてる
0693名前は開発中のものです。2009/03/06(金) 19:58:07ID:CCKZ0ZvT
>>692
特定した
0694名前は開発中のものです。2009/03/06(金) 20:04:30ID:xstPUn85
>>692
当たり判定は どこのクラスでやってる?
0695名前は開発中のものです。2009/03/06(金) 20:35:02ID:t1RJlJqe
作ってるぜ、劣化サイヴァリアみたいなの。ここのレスはレベルが高くて理解出来ないけど。
0696名前は開発中のものです。2009/03/06(金) 20:40:28ID:C76RJ9rx
この流れなら言える!!
ちょい前までゲーム制作ブログのオマケでSTGも挙げてたけど、全部消してバックれたぜw


…移転先や安否を気遣うメールは一通たりとも来なかったぜ… orz
きっと、色々内情を察してくれたんだ、多分、きっと多分
0697名前は開発中のものです。2009/03/06(金) 20:45:54ID:g/bnT2ZX
当たり判定はゲーム本体のクラスでやる予定(以前はグローバル関数でやってた)
0698名前は開発中のものです。2009/03/06(金) 21:37:07ID:xstPUn85
>>696
バックれたら 移転先もわからんだろうw
0699名前は開発中のものです。2009/03/06(金) 21:42:08ID:ZZrBBfbz
>>697
ミジンコがうじ虫になるくらいの進化じゃないか!

マジレスするならグローバル関数でやるのと大差ないぞ、それ。
0700名前は開発中のものです。2009/03/06(金) 21:50:00ID:QYwcIkUm
JAVAで作ってるのは俺くらいか……
つい最近調べてみたら、なんか東方遊夜雀なんてもんが開発されてたりするのね。
ハードル高いwwww
0701名前は開発中のものです。2009/03/06(金) 21:58:23ID:g/bnT2ZX
駄目なのか
他にも敵クラス辺りに当たり判定するメンバ関数作ることも考えてるけど
まあ呼び出すところは変わらんけど
0702名前は開発中のものです。2009/03/06(金) 22:02:00ID:QYwcIkUm
普通はbulletクラスかplayerクラスにisHit関数を付けるもんだろう。
だってそうしないと弾固有の当たり判定とかとれないじゃん。
0703名前は開発中のものです。2009/03/06(金) 22:23:03ID:k/SdMtBY
>>697
俺の場合、
class CollisionListener {
public:
  int getX();
  int getY();
  int getWidth();
  int getHeight();
  void touched(CollisionListener* obj) // objは衝突相手
};

class Player : public CollisionListener;
class Bullet : public CollisionListener;
class Enemy : public CollisionListener;

/* 衝突判定のカテゴリを分類する。(例:プレイヤなら敵、敵弾、地面と衝突。敵弾ならプレイヤ、地面と衝突) */
enum CollisionGroup { Player, PlayerBullet, Enemy, EnemyBullet, Ground };

/* 衝突検知を管理するクラス(ほんとは○○マネージャとかいう名前はダメなんだとかうんたらかんたら……) */
class CollisionManager {
public:
  void addListener( CollisionGroup type, CollisionListener* listener ); // リスナ(プレイヤ、敵とか)を登録する
  void removeListener( CollisionGroup type, CollisionListener* listener ); // 登録を抹消する
  void detect(); // 登録されたリスナの衝突を検知し、衝突したならリスナのtouchedメソッドを呼び出す
};
0704名前は開発中のものです。2009/03/06(金) 22:27:05ID:C76RJ9rx
ぶっちゃけ関連ページが全部消えててメアドだけ生きてるとは普通思わないもんな

>>701
これくらいなら「ダメ出し」があったとしても、クラス設計の善し悪しの話で、
>>702みたいなのをifで逃がすことになると、クラス設計が下手だと言われる。

 その関数の中に、switchやifが沢山含まれるなら、設計を変える事で
良くなる『可能性』があるし、将来の拡張でswitchやifを加えないで済む『可能性』もある


アドホックなswitchやifも許し… 
…今クラス設計の話をしてるんだから、参考にすべきだ(゚Д゚)ハッ!
0705名前は開発中のものです。2009/03/06(金) 22:51:03ID:QYwcIkUm
それはそうとおまえらに質問。
クラス名の相談なんだが、敵の弾クラスはbulletでいいと思うんだが、自分の発射した弾はなんて名前にするのがベスト?
bulletクラスを継承してないからplayerBulletって名前にするのも変だし……
0706名前は開発中のものです。2009/03/06(金) 22:59:54ID:C76RJ9rx
shot に一票
0707名前は開発中のものです。2009/03/06(金) 23:06:52ID:ZZrBBfbz
>>705
EnemyBullet,PlayerBullet
って明記してしまえば後で見ても間違わない気がする。
気がするだけかもしれない。

Object -> Enemy -> EnemyBullet
   ├ -> Player
   └ -> PlayerBullet
みたくなるだろうけど、それでよければ。
0708名前は開発中のものです。2009/03/06(金) 23:07:20ID:QYwcIkUm
>>706せんきゅー。shotって命名しておいたぜ!
それと、携帯アプリのSTGだとどういうインターフェイスで弾撃たせるのが楽かな?
自動で撃ってしまうとそれはそれで戦略性が低くなってしまいそうなのだが。
0709名前は開発中のものです。2009/03/06(金) 23:09:44ID:ZZrBBfbz
>>707は矢印の方向に継承するってことでヨロ。

クラス図としてみたら逆になっちゃうけど突っ込んじゃらめぇ
0710名前は開発中のものです。2009/03/06(金) 23:10:38ID:CCKZ0ZvT
プレイヤーの弾はChinkoにして可読性を著しく低下させてる
0711名前は開発中のものです。2009/03/06(金) 23:14:46ID:ZZrBBfbz
>>710
おま…それアンタッチャブルじゃないか
触れないです><
0712名前は開発中のものです。2009/03/07(土) 14:49:37ID:oFkRuMFA
class OchinpoMilkとかやるだろ。
あとで後悔するんだけど。
0713名前は開発中のものです。2009/03/07(土) 15:07:06ID:bRexpzAJ
確かにシューティングゲームだな
0714名前は開発中のものです。2009/03/08(日) 05:03:44ID:j2H/7CnL
class AbstractManko
{
private:
    virtual long ChinkoPlease(size_t) = 0;
};
//○月×日作成: すべてのクラスはこれを継承してねw名前変えないでねw
0715名前は開発中のものです。2009/03/08(日) 07:56:41ID:XlVAa9br
すべての存在はAbstractなMankoから生まれる……
0716名前は開発中のものです。2009/03/08(日) 15:43:28ID:B8bsQorT
なるほど。playerはmotherShipクラスから生成されて、enemyはalienMotherクラスから生成されるんだな……
0717名前は開発中のものです。2009/03/08(日) 16:19:58ID:AO3ln+kr
ChinkoPlease(size_t) がprivate:って、
ありえねぇーことを宣言するなw。
0718名前は開発中のものです。2009/03/08(日) 16:29:42ID:3kCVX1OJ
STGの話題じゃないけど
#include <iostream>

class A{
private:
        virtual void aa(void) = 0;
};
class B : public A{
public:
        void aa(void){}
};


int main(void){
        B b;
        b.aa();

        std::cout << "hello" << std::endl;
        char c;
        std::cin >> c;
        return 0;
};

が通るのは何で?
0719名前は開発中のものです。2009/03/08(日) 16:35:19ID:lUOcnlf/
何が疑問なのかわからないが、、、、virtual をオーバーライドした関数はvirtual が無くてもvirtual
0720名前は開発中のものです。2009/03/08(日) 16:54:34ID:iZlPrvU5
タイプセーフが無いC++的にはこうだよ。 タイプセーフな他の言語から見るととおかしいのだろうけど
#include <iostream>

class A{
private:
? ? ? ? virtual void aa(void) = 0;
public:
? ? ? ? void update(void){
? ? ? ? ? ? ? ? std::cout << "update" << std::endl;
? ? ? ? ? ? ? ? aa();
? ? ? ? };
};
class B : public A{
public:
? ? ? ? void aa(void){
? ? ? ? std::cout << "aa() of B called." << std::endl;}
};


int main(void){
? ? ? ? B b;
? ? ? ? A *a;
? ? ? ? a = &b;

? ? ? ? //a->aa(); エラー
? ? ? ? a->update();
? ? ? ?
? ? ? ? return 0;
}
0721名前は開発中のものです。2009/03/08(日) 16:54:35ID:XklWG2/f
???何で通らないと思うのか?

class A の private: virtual void aa(void) = 0;
は、どこでも使ってないから捨てられるだろ?
ちなみに *aa=NULL; って意味だから。aa(); とかやって実行するのは危険だね。
Windows なら特権エラー(不正な処理を実行しましたダイアログ)かな?

class B の public: void aa(void){}
は、main 始まったらすぐ実行されるね。ここは、
public: void aa(void){std::cout << "ot"; }
とでもしとけば?
0722名前は開発中のものです。2009/03/08(日) 16:58:17ID:XklWG2/f
>>721
*aa=NULL; はまちがい。aa=NULL;
0723名前は開発中のものです。2009/03/08(日) 17:01:45ID:3kCVX1OJ
C++はあまりわかんないです。
不思議だと思ったのは
class Aのprivateな抽象関数aaを
Aを継承したclass Bでpublicに実体を作っているところです。
0724名前は開発中のものです。2009/03/08(日) 17:07:12ID:XklWG2/f
「privateな抽象関数aa」は、class Bへ継承させても、継承されてないよ。だってprivateだもん。
0725名前は開発中のものです。2009/03/08(日) 17:09:35ID:3kCVX1OJ
>>724
そう思います。
でもこれが通らないんです。
#include <iostream>

class A{
private:
        virtual void aa(void) = 0;
};
class B : public A{
public:
        //void aa(void){}
};


int main(void){
        B b;
        //b.aa();

        std::cout << "hello" << std::endl;
        char c;
        std::cin >> c;
        return 0;
};
0726名前は開発中のものです。2009/03/08(日) 17:11:14ID:XklWG2/f
>>724
0727名前は開発中のものです。2009/03/08(日) 17:12:13ID:iZlPrvU5
>>724
virtual抜いたらコンパイルできない。
http://codepad.org/MaZEDgo2

「privateな抽象関数aa」は、pubicな aa()でもオーバーライドできるだろ
0728名前は開発中のものです。2009/03/08(日) 17:15:16ID:XklWG2/f
>>724
ごめん間違えた。
「privateな抽象関数aa」は、class Bへ継承されているが class Bのpublic aa();の方が優先だから、
class Bのpublic aa();にしかアクセス出来ない。

ここでclass A の privateやvirtualなbb();とかあれば、継承されるから、
int main(void){
B b;
b.bb();
とかで使えると思う。
0729名前は開発中のものです。2009/03/08(日) 17:18:35ID:3kCVX1OJ
抽象関数を持つclass Aを継承したclassは、
class Aの抽象関数を実体化しなくてはいけない。
 
 
と思っていたのです。
そうではないのですね。
javaから入ったので不思議でした。
0730名前は開発中のものです。2009/03/08(日) 17:25:14ID:iZlPrvU5
>>728
>class A の privateやvirtualなbb();とかあれば、
ねーよw
http://codepad.org/aEfKdVPO
0731名前は開発中のものです。2009/03/08(日) 17:25:58ID:XklWG2/f
ttp://msugai.fc2web.com/java/override.html
>アクセス修飾子の規則の例外として、private 修飾されたメソッドはオーバーライドできません。
JavaもC++も同じじゃないかな?
0732名前は開発中のものです。2009/03/08(日) 17:27:59ID:XklWG2/f
>>730
>>728
ごめんそれも間違いだ。bb();とか無理です。
0733名前は開発中のものです。2009/03/08(日) 17:31:31ID:3kCVX1OJ
privateな抽象関数を持つclass Aを継承したclass Bが実体化出来るのが不思議。
同class Aの抽象関数aaと同じ名前のpublicな関数をclass Bに作ったことで動く事が不思議。
同class Aの抽象関数aaを継承したclass Bでで作らないと実体化できない事が不思議。
なんかそんな感じです。
すみません。
0734名前は開発中のものです。2009/03/08(日) 18:00:50ID:uTNKd2IK
プログラム板の初心者C++スレでやろうぜ・・・
0735名前は開発中のものです。2009/03/08(日) 20:02:21ID:t0AdkGXJ
Javaは違うのかもしれんがC++はそういう仕様なんでしょ
メンバ変数も違うアクセス修飾詞でオーバーライドできるし
抽象関数を持ったクラスはそれを派生させて実装したクラスでないと実体化できんのはJavaでも同じでしょ
0736名前は開発中のものです。2009/03/09(月) 00:20:55ID:vdPDd+Q/
javaって派生先の仮想関数のアクセス修飾を変えれなかったんじゃなかったっけ?
0737名前は開発中のものです。2009/03/09(月) 00:54:10ID:4v1RPow6
オブジェクト指向も度がすぎると、使われもしないゴミクラスが
沢山残る罠。
0738名前は開発中のものです。2009/03/09(月) 01:02:27ID:4v1RPow6
↑ただ単に今一、配慮を怠ったクラスを書くと
そういう事になると言うのをいいたかっただけ。
■ このスレッドは過去ログ倉庫に格納されています