1 名前:名前は開発中のものです。 mailto:sage [2008/11/27(木) 10:18:19 ID:bBI1A+d5] ゲームプログラマなら誰もが通る、もしくは、通った道。青春の香り? それは「シューティングゲーム製作」・・・。 このスレでは、そんなシューティングゲームの製作技術や技術の検証、成功談 失敗談笑い話、難易度の設定方法論、多弾の是非などについて語り合いましょう。 もちろんBulletMLなどで弾幕を作成してみたり、自分の作ったシューティングを 晒してみたり、プロジェクトをはじめてみるなどもOK! ただし、シューティングの未来とか既存のゲームの話題などは、関連する他の スレでやってくれ。 過去スレ,関連スレは >>2-3 で。
482 名前:名前は開発中のものです。 [2009/03/05(木) 20:25:20 ID:K8fBdWo9] >>643 ほとんどのクラスをスマートポインタラッパにしてjavaのようにC++で書いてる。 で、 class Bullet : public Object class Enemy : public Bullet とかしてる。 MyShipをどこから派生させると美しいかは毎回悩む。
483 名前:372 mailto:sage [2009/03/05(木) 20:27:09 ID:g++EGVdD] >>645 3人目ゲット
484 名前:名前は開発中のものです。 [2009/03/05(木) 20:41:04 ID:K8fBdWo9] >>646 ?
485 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 20:45:15 ID:1d/NzH52] >>644 んにゃ別。 >Objectを派生させたらナンセンスだと思う。 マジカー。Fire()で実装が空とかなんだが。実際Fireしてもほんとに撃つかどうかはオブジェクト依存だしいいかなーと思ってる。 ってかFire()という名前が問題か。 Touchのほうは実際は、自機リスト、敵機リスト、背景オブジェリスト、前景オブジェリスト、などから 2つ選んでハードコーディングする。だからまぁ自機_敵機、敵機_自機弾_自機_敵弾の3つぐらいTouchを利用したループがある。 自分で言っててあんまりきれいな実装じゃないかも。
486 名前:名前は開発中のものです。 [2009/03/05(木) 20:48:41 ID:JU51dqJC] >>645 継承がis aの関係じゃない時点で美しくない
487 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 20:53:18 ID: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の構文が今ググったら違った!? } };
488 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 20:54:12 ID:/7Ei5x6Q] >>645 class Enemy : public Bullet だと Bullet 属性も継承することになるんだが・・・ Bulletクラスに破裂するという操作があると Enemyにも引き継がれるが それだったら Object に破裂操作を最初っから純仮想関数で宣言しておき class Bullet : public Object; class Enemy : public Object; の方が自然じゃない? とりあえず >> 372 のソースが見たいものだが オブジェクト=メモリのかたまりと考えてるのか?
489 名前:名前は開発中のものです。 [2009/03/05(木) 20:55:41 ID:K8fBdWo9] >>649 640のObjectは例えで、ScriptとかActionはもう少し上で持ってる。 updateだけを持ってるクラスがだいたいの基底。 で、Enemyは高級なBullet的な定義をするんだけど (BulletもAbstractBulletみたいなのを作って細分化した方がいいとか悩む) MyShipはどこがいいのかに悩んでる。 どうだろうか?
490 名前:名前は開発中のものです。 [2009/03/05(木) 21:04:28 ID: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" みたいなの。
491 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 21:27:03 ID:/7Ei5x6Q] >>650 それは Prototype パターンだね
492 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 21:39:01 ID: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に継承させたい物はあんまりないな グローバルまで行かなくても、参照されて困らない所に在ればよくね?
493 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 21:39:53 ID:/7Ei5x6Q] >>653 その構造だと Enemy インスタンスが消滅すると Bullet インスタンスも消えてしまうけど Bullet インスタンスを残しておきたい場合などの表現が不可能になる Enemy *enemy = new Enemy enemy->Fire(); // ここでbulletが複数作られる enemy->End(); // 敵の消滅 delete enemey; // ここでbulletも全部消える 継承という概念が分かってない どこかで不具合がでてくる 設計で悩んでる
494 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 21:45:45 ID:/7Ei5x6Q] >>655 君は問題ない
495 名前:名前は開発中のものです。 [2009/03/05(木) 21:47:03 ID:K8fBdWo9] >>656 Enemyが死んでもBulletは死なないように作ってる。 なんでBulletが消えるのか分からない。 EnemyのFireをBullet管理者が受け取ってBulletが生成されてるだけで、Enemyとの関連はない。
496 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 21:47:30 ID:sv4Dn5ZX] 一体何の話かわからない俺はベターC
497 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 21:53:28 ID:g++EGVdD] >>654 いちお、生存期間中にCloneを作る事はないよ 自称Strategyのつもり、Update()に多態性を持たせたい しかし、生存期間中にEnemyAがEnemyBにキャストされるような事はないので、自称 >>657 thx
498 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 21:59:43 ID:/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 ); } //----------------------
499 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 22:00:07 ID:/7Ei5x6Q] void Enemy::Fire() { x = 1.0; printf( "%f\n", x ); } void main() { Object *obj = new Enemy; obj->Fire(); delete obj; } となり無駄が生じる
500 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 22:03:17 ID:kKvbso12] >656こんな事言う人に問題ないと言われても安心できないと思うんだが というかID:/7Ei5x6Qがなにを言いたいのか分からない
501 名前:名前は開発中のものです。 [2009/03/05(木) 22:06:05 ID:K8fBdWo9] >>661 BulletもEnemyもFireは持ってない。 BulletもEnemyも呼ばれるのはupdateとdrawだけ。 それぞれの行動はupdateの中でScriptが決めてActionに実体がある感じ。 class Fireはないけどあえて書くなら class Fire : public Action class Move : public Action みたいになっている。
502 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 22:11:08 ID:/7Ei5x6Q] >>664 すまんね ちと混合していた Fire() はないようだね 君は Composite パターン 問題ない ただ、複雑になるのはある程度予測しといた方がいい
503 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 22:15:21 ID:/7Ei5x6Q] >>664 いや class Enemy : public Bullet ここが問題 それでいくなら Decorator パターン class Decorator : public Object class Bullet : public Decorator class Enemy : public Decorator class MyShip : public Decorator ではどうかね?
504 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 22:21:16 ID:g++EGVdD] >>663 >>656 のミスリードには気付いてたけど、僕がいう事じゃ無いし 後はみんなの好き嫌いをアンケート程度の気分で聞いておく >>661 ぐらいだったら、僕は許すな アンチパターンも許すけど、 >Draw(){/*SetStreamSource()1回に、SetMatrix()とDrawPrimitive()を配列要素数回 */} は譲れないな
505 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 22:23:48 ID:/7Ei5x6Q] >>660 なるほど EnemyA, EnemyB に目がいっていた 君がしたいのは Iterator パターンでは?
506 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 22:50:23 ID:/7Ei5x6Q] //---------------------- // 永遠に呼ばれない void Bullet::Fire() { printf( "部長ぉぉぉぉぉぉぉ!!!\n" ); } //---------------------- とかしてもいいかな
507 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 22:53:56 ID:/7Ei5x6Q] //---------------------------------------------------------------------------- // 永遠に呼ばれない void Bullet::Fire() { MessageBox( HWND_DESKTOP, "返事がないようだ ただの屍のようだ", "error?", MB_OK ); or MessageBox( HWND_DESKTOP, "パターンが分からないようだ", "error?", MB_OK ); } //----------------------------------------------------------------------------
508 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 23:03:09 ID:vElUtQql] いまさらだけど、>>656 の >Enemy インスタンスが消滅すると >Bullet インスタンスも消えてしまう な に を い っ て い る ん だ ? 継承を理解してないな。 それはそうと個人的には class Bullet : public Enemy なんだけどな。 弾は特殊な敵って意味合いで。
509 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 23:13:05 ID:/7Ei5x6Q] >>671 ミスリードと言ってるだろ 反応ないから寝る
510 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 23:16:48 ID:/4jagLW1] なんとなくメモリの動的確保をしたくない俺は ずらずらとスパゲティ書いてるw
511 名前:名前は開発中のものです。 mailto:sage [2009/03/05(木) 23:42:12 ID:1d/NzH52] うむ。まだデザパタがまだ生成パターンしか読み終わってないうちにはちと辛いな、デザタパで説明が完結されるとorz てかみんな柔軟だな。実際のコードを覗いてみたいぜ。・・・C++は多分読めないけど
512 名前:名前は開発中のものです。 [2009/03/06(金) 00:03:12 ID:Eu3rRFpD] >>674 ID:/7Ei5x6Q の言ってることはあまり気にしない方がいいよ。
513 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 07:29:29 ID:xstPUn85] >>675 ID変えてからの反応ではもう誰も信頼せんよ そんなに否定するなら代案だせよ ID:K8fBdWo9「だれか〜このソースどうにかしてくれませんか〜?」 ID:/7Ei5x6Q「こういうのはどうかね?」 ID:K8fBdWo9「・・・」 この船は先に進むんですか?
514 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 08:00:37 ID:UQFJ8zhz] >>676 港につきません。
515 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 11:06:50 ID:HHW0AAKz] どこをどう勘違いしたら>>656 みたいな解釈になるんだ。 ていうか >継承という概念が分かってない ってのはID:/7Ei5x6Q 自身の話かな。 とりあえずC++のサイト回って勉強してみては?
516 名前:名前は開発中のものです。 [2009/03/06(金) 12:07:53 ID:Eu3rRFpD] >>676 ID:K8fBdWo9が低レベルすぎて話にならない所をやんわり流してるんだろ。
517 名前:名前は開発中のものです。 [2009/03/06(金) 12:11:05 ID:Eu3rRFpD] >>676 間違えた ID:/7Ei5x6Qが低レベルすぎて話にならない所をやんわり流してるんだろ。
518 名前:/7Ei5x6Q mailto:sage [2009/03/06(金) 12:58:32 ID:xstPUn85] そうなのかい? 君のはデコレータパターンとコンポジットパターンの組み合わせだよ もしくはパターンに当てはめられるのが嫌だったのかな ごめんよ・・・
519 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 13:07:51 ID:q2+zc1Kz] クラス?継承?new?知らんがな(´・ω・`) 構造体最強ヒャァハァァァァー
520 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 13:36:30 ID:dVN9ZSyA] よう、俺。
521 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 13:57:04 ID:C76RJ9rx] >>682 その結論はオカシイ このパターン厨の書いてることは、パターンの名前で ググる事ができる奴が見たら赤面もんのことばかりだぞ… >>674 の持ってる本がちょっと分厚過ぎるじゃないか? GoFは、たった23個しか無くて判りやすい図が入ってる …STG制作にはアンチパターン>>655 が要る事もあるが、 発想の種子ぐらいにはなるんじゃない?
522 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 14:06:02 ID:q2+zc1Kz] >>684 いや、俺はガチで会話についていけないだけだww 最近になってポインタの使い道がわかって喜んで関数作って動いてSUGEEEEEEEEってやってるレベルだ 独学マンセー
523 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 14:15:36 ID:wgorap74] みんな いったい誰と戦っているんだ!?
524 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 15:03:36 ID:xstPUn85] ブルマは脱いだらアカンがな(`・ω・´)
525 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 16:33:57 ID:QhFILLD4] このスレでは、そんなシューティングゲームの製作技術や技術の検証、成功談 失敗談笑い話、難易度の設定方法論、多弾の是非などについて語り合いましょう。 もちろんBulletMLなどで弾幕を作成してみたり、自分の作ったシューティングを 晒してみたり、プロジェクトをはじめてみるなどもOK! 何でここ喧嘩と設計の話ばっかりなの? 実際に作ってる奴いるの?
526 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 17:41:36 ID:wgorap74] これは自作自演でうpする前フリだな
527 名前:685 mailto:sage [2009/03/06(金) 18:57:39 ID:E7ymH2OK] 作ってるぜっ(・∀・)半年前に一度うpしてるぜ
528 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 19:33:21 ID:fB/frkhf] 頑張ってクラスとか継承とか使ってみるものの、こんがらがって死ぬ 設計がいかに大事かがセッ分かった気がする
529 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 19:49:27 ID:g/bnT2ZX] 俺はObject クラス作って基本、自機や敵、それらの弾、爆発、背景等はみんなObjectから派生させて作ってる 敵から出る弾は当たり判定チェックの関係上、壊せる弾は敵と同じ扱い(Enemy派生)、壊せん奴は別扱い ただ、getxとか使うとイメージ的に負荷かかりそうで座標とかpublicにしてるためStructチックになってしまってるorz 以前は強引にfriend使ってたw まあとりあえず完成させればいいよな、どこかは言わんが以前別スレにうpしてる
530 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 19:58:07 ID:CCKZ0ZvT] >>692 特定した
531 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 20:04:30 ID:xstPUn85] >>692 当たり判定は どこのクラスでやってる?
532 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 20:35:02 ID:t1RJlJqe] 作ってるぜ、劣化サイヴァリアみたいなの。ここのレスはレベルが高くて理解出来ないけど。
533 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 20:40:28 ID:C76RJ9rx] この流れなら言える!! ちょい前までゲーム制作ブログのオマケでSTGも挙げてたけど、全部消してバックれたぜw …移転先や安否を気遣うメールは一通たりとも来なかったぜ… orz きっと、色々内情を察してくれたんだ、多分、きっと多分
534 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 20:45:54 ID:g/bnT2ZX] 当たり判定はゲーム本体のクラスでやる予定(以前はグローバル関数でやってた)
535 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 21:37:07 ID:xstPUn85] >>696 バックれたら 移転先もわからんだろうw
536 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 21:42:08 ID:ZZrBBfbz] >>697 ミジンコがうじ虫になるくらいの進化じゃないか! マジレスするならグローバル関数でやるのと大差ないぞ、それ。
537 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 21:50:00 ID:QYwcIkUm] JAVAで作ってるのは俺くらいか…… つい最近調べてみたら、なんか東方遊夜雀なんてもんが開発されてたりするのね。 ハードル高いwwww
538 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 21:58:23 ID:g/bnT2ZX] 駄目なのか 他にも敵クラス辺りに当たり判定するメンバ関数作ることも考えてるけど まあ呼び出すところは変わらんけど
539 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 22:02:00 ID:QYwcIkUm] 普通はbulletクラスかplayerクラスにisHit関数を付けるもんだろう。 だってそうしないと弾固有の当たり判定とかとれないじゃん。
540 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 22:23:03 ID: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メソッドを呼び出す };
541 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 22:27:05 ID:C76RJ9rx] ぶっちゃけ関連ページが全部消えててメアドだけ生きてるとは普通思わないもんな >>701 これくらいなら「ダメ出し」があったとしても、クラス設計の善し悪しの話で、 >>702 みたいなのをifで逃がすことになると、クラス設計が下手だと言われる。 その関数の中に、switchやifが沢山含まれるなら、設計を変える事で 良くなる『可能性』があるし、将来の拡張でswitchやifを加えないで済む『可能性』もある アドホックなswitchやifも許し… …今クラス設計の話をしてるんだから、参考にすべきだ(゚Д゚)ハッ!
542 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 22:51:03 ID:QYwcIkUm] それはそうとおまえらに質問。 クラス名の相談なんだが、敵の弾クラスはbulletでいいと思うんだが、自分の発射した弾はなんて名前にするのがベスト? bulletクラスを継承してないからplayerBulletって名前にするのも変だし……
543 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 22:59:54 ID:C76RJ9rx] shot に一票
544 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 23:06:52 ID:ZZrBBfbz] >>705 EnemyBullet,PlayerBullet って明記してしまえば後で見ても間違わない気がする。 気がするだけかもしれない。 Object -> Enemy -> EnemyBullet ├ -> Player └ -> PlayerBullet みたくなるだろうけど、それでよければ。
545 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 23:07:20 ID:QYwcIkUm] >>706 せんきゅー。shotって命名しておいたぜ! それと、携帯アプリのSTGだとどういうインターフェイスで弾撃たせるのが楽かな? 自動で撃ってしまうとそれはそれで戦略性が低くなってしまいそうなのだが。
546 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 23:09:44 ID:ZZrBBfbz] >>707 は矢印の方向に継承するってことでヨロ。 クラス図としてみたら逆になっちゃうけど突っ込んじゃらめぇ
547 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 23:10:38 ID:CCKZ0ZvT] プレイヤーの弾はChinkoにして可読性を著しく低下させてる
548 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 23:14:46 ID:ZZrBBfbz] >>710 おま…それアンタッチャブルじゃないか 触れないです><
549 名前:名前は開発中のものです。 [2009/03/07(土) 14:49:37 ID:oFkRuMFA] class OchinpoMilkとかやるだろ。 あとで後悔するんだけど。
550 名前:名前は開発中のものです。 mailto:sage [2009/03/07(土) 15:07:06 ID:bRexpzAJ] 確かにシューティングゲームだな
551 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 05:03:44 ID:j2H/7CnL] class AbstractManko { private: virtual long ChinkoPlease(size_t) = 0; }; //○月×日作成: すべてのクラスはこれを継承してねw名前変えないでねw
552 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 07:56:41 ID:XlVAa9br] すべての存在はAbstractなMankoから生まれる……
553 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 15:43:28 ID:B8bsQorT] なるほど。playerはmotherShipクラスから生成されて、enemyはalienMotherクラスから生成されるんだな……
554 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 16:19:58 ID:AO3ln+kr] ChinkoPlease(size_t) がprivate:って、 ありえねぇーことを宣言するなw。
555 名前:名前は開発中のものです。 [2009/03/08(日) 16:29:42 ID: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; }; が通るのは何で?
556 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 16:35:19 ID:lUOcnlf/] 何が疑問なのかわからないが、、、、virtual をオーバーライドした関数はvirtual が無くてもvirtual
557 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 16:54:34 ID: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; }
558 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 16:54:35 ID: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"; } とでもしとけば?
559 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 16:58:17 ID:XklWG2/f] >>721 *aa=NULL; はまちがい。aa=NULL;
560 名前:名前は開発中のものです。 [2009/03/08(日) 17:01:45 ID:3kCVX1OJ] C++はあまりわかんないです。 不思議だと思ったのは class Aのprivateな抽象関数aaを Aを継承したclass Bでpublicに実体を作っているところです。
561 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 17:07:12 ID:XklWG2/f] 「privateな抽象関数aa」は、class Bへ継承させても、継承されてないよ。だってprivateだもん。
562 名前:名前は開発中のものです。 [2009/03/08(日) 17:09:35 ID: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; };
563 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 17:11:14 ID:XklWG2/f] >>724
564 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 17:12:13 ID:iZlPrvU5] >>724 virtual抜いたらコンパイルできない。 codepad.org/MaZEDgo2 「privateな抽象関数aa」は、pubicな aa()でもオーバーライドできるだろ
565 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 17:15:16 ID: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(); とかで使えると思う。
566 名前:名前は開発中のものです。 [2009/03/08(日) 17:18:35 ID:3kCVX1OJ] 抽象関数を持つclass Aを継承したclassは、 class Aの抽象関数を実体化しなくてはいけない。 と思っていたのです。 そうではないのですね。 javaから入ったので不思議でした。
567 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 17:25:14 ID:iZlPrvU5] >>728 >class A の privateやvirtualなbb();とかあれば、 ねーよw codepad.org/aEfKdVPO
568 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 17:25:58 ID:XklWG2/f] ttp://msugai.fc2web.com/java/override.html >アクセス修飾子の規則の例外として、private 修飾されたメソッドはオーバーライドできません。 JavaもC++も同じじゃないかな?
569 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 17:27:59 ID:XklWG2/f] >>730 >>728 ごめんそれも間違いだ。bb();とか無理です。
570 名前:名前は開発中のものです。 [2009/03/08(日) 17:31:31 ID:3kCVX1OJ] privateな抽象関数を持つclass Aを継承したclass Bが実体化出来るのが不思議。 同class Aの抽象関数aaと同じ名前のpublicな関数をclass Bに作ったことで動く事が不思議。 同class Aの抽象関数aaを継承したclass Bでで作らないと実体化できない事が不思議。 なんかそんな感じです。 すみません。
571 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 18:00:50 ID:uTNKd2IK] プログラム板の初心者C++スレでやろうぜ・・・
572 名前:名前は開発中のものです。 mailto:sage [2009/03/08(日) 20:02:21 ID:t0AdkGXJ] Javaは違うのかもしれんがC++はそういう仕様なんでしょ メンバ変数も違うアクセス修飾詞でオーバーライドできるし 抽象関数を持ったクラスはそれを派生させて実装したクラスでないと実体化できんのはJavaでも同じでしょ
573 名前:名前は開発中のものです。 [2009/03/09(月) 00:20:55 ID:vdPDd+Q/] javaって派生先の仮想関数のアクセス修飾を変えれなかったんじゃなかったっけ?
574 名前:名前は開発中のものです。 [2009/03/09(月) 00:54:10 ID:4v1RPow6] オブジェクト指向も度がすぎると、使われもしないゴミクラスが 沢山残る罠。
575 名前:名前は開発中のものです。 [2009/03/09(月) 01:02:27 ID:4v1RPow6] ↑ただ単に今一、配慮を怠ったクラスを書くと そういう事になると言うのをいいたかっただけ。
576 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 01:43:12 ID:j7Fn6gwa] 継承が多くても、STG中にキャストする様なオブジェクトとかあんまり無いと思うけどな オブジェクト指向とか言うほど大げさなモノでも無い 抽象基底クラスを作り、それの配列かコンテナに継承した子のオブジェクトをいれる 遷移するモノならインターフェースを作り、継承した状態のオブジェクトを保存しておくだろ あんまり思い浮かばない。 楽につくる事が優先だ
577 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 02:29:20 ID:nD/Sv/Tx] 敵とか敵弾とか継承してもどうせ分けて扱っちゃうし・・・
578 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 05:33:07 ID:s3+yn2Ga] け、継承って何だ、クラスって何だ 敵の構造体とか、弾の構造体でいいだろっ 動的確保?知らんがな(´・ω・`)
579 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 05:50:33 ID:nD/Sv/Tx] いちいち動的確保なんかしてたら弾幕の生成でめちゃくちゃ処理落ちする 俺は最初に作っとくの
580 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 10:04:04 ID:c/sep/SW] ボス戦とかどうしてるんだ。 予め発射される弾の数を決めてるってことか?
581 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 10:41:10 ID:s3+yn2Ga] 一万発分くらい確保しとけばおkkkkkk
582 名前:名前は開発中のものです。 mailto:sage [2009/03/09(月) 10:48:15 ID:nD/Sv/Tx] >>743 一体何万発確保するつもり? 決めるといっても、せいぜい2〜3000発程度。これ以上多いとメモリ云々以前にゲームとして無理。