1 名前:デフォルトの名無しさん mailto:sage [2010/03/22(月) 21:35:10 ] (#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。 前スレ C#, C♯, C#相談室 Part55 (実質56) pc12.2ch.net/test/read.cgi/tech/1260111240/ Visual C# 2008 Express Edition 日本語版 www.microsoft.com/japan/msdn/vstudio/express/vcsharp/ その他テンプレ>>1-5 くらい
520 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 14:05:19 ] DataTableに自作のクラスを入れることができますか? 入れようとするとToStringの中身が入ってしまうようですが。
521 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 14:14:59 ] できますん
522 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 14:40:23 ] >>514 継承できなければ委譲。拡張メソッドで行ける場合もある。
523 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 14:58:42 ] >>514 has-aでいいんじゃない? Marioをコンストラクタで受け取る FlowerMarioクラスを作ってやればいいと思う と、どう考えても回答者側の知識量ではない俺がいってみる。
524 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 14:59:52 ] >>520 できるよ 単に表示されるときにToStringが呼ばれてるだけでしょ
525 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 15:04:26 ] >>523 それは無意味 MarioとFlowerMarioの間に継承関係が無いなら アプリケーションがFlowerMarioをあらかじめ知っていないといけない
526 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 15:07:05 ] >>525 ああそうだね、じゃあ両方にインターフェースをつけるとか
527 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 15:07:30 ] >>512 Disposeできない時のためにFinalizeがあるんじゃないの
528 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 15:09:56 ] >>514 ステートマシンを内部に持てばいいんじゃないの、と適当言ってみる それをオブザーバーパターンで外から操作とか
529 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 15:13:24 ] Decoratorとか? まあゲームだったら結局仕様をきっちり決めて決め打ちが一番いいと思うけど
530 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 15:21:44 ] ゲームの場合、一度納品してから仕様変更なんて、基本的にはないだろうしな。
531 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 15:26:41 ] ゲームのキャラクターなんか激しく周りの環境に依存するんだから プラグイン的な拡張をやろうとすると結局グローバル環境的なものを丸ごと渡すことになって あんまり意味が無さそう
532 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 15:38:43 ] ありがとうございます >>519-531 Decoratorパターンていうんですね>>526 さんの 方法は一応考えたんですが、羽と花をとったときに 両方の効果を使える用にしたいなと思いまして。 >>528 調べてみます 拡張性に意味はないかもしれませんが勉強なので。
533 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 16:04:32 ] >>521 ,524 ありがとう 次のようなコードで試したんですが、使い方間違ってますか? foreach( DataRow row in table.Rows ) { row["col1"] = new MyClass(); MyClass obj = row["col1"] as MyClass; //失敗する }
534 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 16:16:39 ] それ、col1列のDataColumnのDataTypeがStringになってる
535 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 16:19:26 ] >>523 重要なことだからつっこませてもらうと、MarioがFireFlowerを取るとFireMarioになるんです。 Luigiクラスはいりません。バグの元ですから。
536 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 16:21:04 ] >>530 最近はオンラインアップデートがあるからなんとも言えなくなってきたかも。 追加要素という名のアンロックは別としても、修正パッチあたるよ。
537 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 16:29:22 ] てか、MODだろ
538 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 16:50:34 ] >>534 おぉ、できました。 ありがとう
539 名前:536 mailto:sage [2010/04/26(月) 17:00:05 ] ああ、家庭用ゲームだと思い込んでレスした
540 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 18:32:54 ] >>523 has-aならStateをキャラクターとアイテムが持ったらいいんじゃね? FireStateを持ったFireFlowerをMarioがとるとMarioがFireStateを持つようにする
541 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 20:14:52 ] 正直、マリオ程度のゲームなら 愚直にステート値でswitchするコードを書くほうが結局分かりやすいと思う。 こういうの、最近はすっかり「不吉な臭い」扱いになっちゃてるけどw デリゲートやインターフェイス使ってストラテージパターンみたいなことしても、 自己満足以上の効果はないと思う。
542 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 21:59:06 ] 風マリオと雷マリオと闇マリオと土マリオとマリエと・・・ stateの量の問題?
543 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 22:01:16 ] 実際のゲーム機の開発でそこまで綺麗にクラス使ってるのかね?
544 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 23:01:59 ] ゲーム機のゲームも結構な規模になってるだろし それなりに綺麗な設計せざるを得なくなってるんじゃないかね?
545 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 23:18:51 ] 家庭用ゲームのソースコードなんて見る機会無いからね。 このスレに業界人は居るのかなぁ。
546 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 01:35:19 ] テートスとかジーラテはスーコーあげあげだからねー ウィチスーでスーケーしてるほうが現実見てるってyou know?
547 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 01:45:26 ] 日本語でおk
548 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 02:25:00 ] StateまたはStrategypatternは時間がかかります。 switch caseを使用するのは現実的です。理解?
549 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 02:54:50 ] 把握した
550 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 06:59:08 ] スーコーあげあげいいなw スーコーマシマシ!
551 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 21:27:43 ] object同士でプリミティブ型であれば ある程度大小比較してくれる関数ってありますか? 具体的に言うとstringとint(byteなど)で比較を 正しく行いたいのですが。
552 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 21:39:01 ] "a"と100のどっちが大きいかなんか定義次第なんだから正しい比較も何もないだろ
553 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 21:41:11 ] どうやって"one"と5を比較できると思うんだ? 数値に変換できる文字列なら、数値に変換して比較するしかなかろう。
554 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 21:49:10 ] int.Parse
555 名前:551 mailto:sage [2010/04/27(火) 21:56:06 ] 書き忘れました。 型が同じことが前提です。 >>552-554 ありがとう やはりParseが一般的ですか。 DataViewもParseで比較してるのかな。
556 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 22:04:26 ] 型が同じって、Objectに入ってるInt32同士を比較したいってことなのか? ならComparerクラスとか
557 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 22:13:55 ] もう、自分がやろうとしていることを意味的に把握してないから人にうまく説明できないわけで、 その時点でちょっと.....
558 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 22:15:50 ] 関係ないけどstringやobjectは組み込み型だけどプリミティブ型ではないよ
559 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 22:55:53 ] >>502 なぬ? >>512 残念ながら一貫してそうはなってない。
560 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 23:55:42 ] まあ確かにWin9xでなきゃ目くじら立ててDisposeする必要がないものでもIDisposable 実装してたりするし 関係ないけどインターフェイスを「継承」する、って言い回しはJava方面の方言? それとも単にありがちな誤用ってだけなのか。
561 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:03:00 ] ありがちな誤用
562 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:03:04 ] >>560 C#方言。 インターフェイスの概要 インターフェイスには、次の特徴があります。 インターフェイスは抽象基本クラスに似ています。インターフェイスを継承する非抽象型は、すべてのインターフェイス メンバを実装する必要があります。 インターフェイスは直接インスタンス化できません。 インターフェイスには、イベント、インデクサ、メソッド、およびプロパティを含めることができます。 インターフェイスには、メソッドの実装が含まれません。 クラスと構造体は、複数のインターフェイスを継承できます。 インターフェイス自体が複数のインターフェイスを継承できます。
563 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:06:37 ] >>555 型が同じなら、IComparableにキャストしてCompareToするとか。 codepad.org/m37TS28P
564 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:09:13 ] かと思ったら、Javaでも使ってるな。 interface inheritance 言語規定より。 This (multiple) interface inheritance allows objects to support (multiple) common behaviors without sharing any implementation. この(多重)インタフェース継承は,オブジェクトがいかなる実装も共有せずに(多重の)共通的な振る舞いをサポートすることを可能とする。
565 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:14:38 ] インターフェースはインターフェースを継承できる
566 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:15:28 ] >>565 なるほど、それが「実装」だったら確かにおかしいな。
567 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:38:38 ] Javaだと、implements と extends とキーワード異なるけれども、C#だと、どっちもコロンだから用語を忘れてしまうんだな。
568 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 02:12:26 ] クラスがインターフェースを継承している時点で実装があるはずなんだから、継承だけ使えば意味通じるでしょ
569 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 02:19:02 ] >>565
570 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 07:58:33 ] >具体的に言うとstringとint(byteなど)で比較を >正しく行いたいのですが。 >型が同じことが前提です。 どっちだよw
571 名前:デフォルトの名無しさん [2010/04/28(水) 08:01:22 ] >>551 遅レスだけどこんなのダメだっけ if (obj1 is IComparable) { return (obj1 as IComparable).CompareTo(obj2); }
572 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 11:06:44 ] インターフェースて使った事ないんだけど どういうときに使うの?
573 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 11:40:01 ] >>572 継承関係にない型の間に共通の機能を持たせて、同じように扱いたいとき。 >>563 ,571がまさにそれ。 C#の言語仕様(foreachだのusingだの)とも密接に結びついているので、 知らず知らずのうちにインターフェースを活用しているはず。 たとえば、IEnumerableを実装しさえすれば、どんな型でもforeachで列挙できる。
574 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 11:53:40 ] >>563 >>571 これって文字の比較であって、数値の比較じゃないでしょ?
575 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 11:55:54 ] >>574 何を言ってるんだ
576 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 12:02:44 ] >>574 冷静になるんだ
577 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 12:34:27 ] あるクラスを継承してメンバ関数だけオーバーライドして使いたい場合 元のクラスで扱っても大丈夫でしたっけ?
578 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 12:36:13 ] >元のクラスで扱っても大丈夫でしたっけ? インスタンスを作った後も元のクラスで扱っても大丈夫でしたっけ?
579 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 12:38:51 ] 元のクラスで扱うってのはどういうことなんだ? 継承元のクラスにキャストするとかそういうこと?
580 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 12:41:53 ] >>579 ゲームの中にでてくる物体(障害物、自機、敵など)はすべて座標系など特定の 情報を持つという部分では共通ですが、動きだけが違うので管理上は継承前の クラスで管理して、動きに関連するメンバ関数だけを差し替えを実現したい・・ という感じです
581 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 12:46:35 ] オーバーライドしなくてもいいんじゃないか? 継承先で個別に実装すれば 100%書き換えることが前提になってる感じだからむしろIFとかにしてみるとか・・・ いや・・・いろいろ方法はあると思うが 継承元で関数書いてもどうせ空の実装とかにしかならんだろうし オーバーライドしなけりゃ元の動作のまんまになってしまうのはバグの元だと思うんだ・・・
582 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 12:47:23 ] >>580 普通にできるが
583 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 12:49:39 ] >>581 むかーしgcc上で書いた物を移植中なので.netなりの方法はないかなあと模索してたりします。 C時代は関数ポインタのテーブルを用意して・・・とかやってたんですけどね >>582 どんな感じでやればいいですかね?
584 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 12:54:08 ] >>583 いやだから基本クラスで動き意外の関数作って 継承したクラスで新しく動きの関数作ればいいだけだけど 何が問題なの?
585 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 12:58:17 ] class 物体 { public void 動き以外の処理(){} } class 自機:物体 { public void 動きの処理(){} }
586 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 12:58:27 ] >>584 Hogeクラスを継承したHogeA,HogeB・・・・・HogeZとかあったとして 管理はList<Hoge>として全体をまとめたいんです・・
587 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 12:58:42 ] 抽象クラス使えば?
588 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 13:03:24 ] >>586 >>573
589 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 13:13:10 ] 関数ポインタ使っていたなら、そのまま構造体を抽象クラスにして、関数ポインタを仮想関数にしたら、完成のように思うが。
590 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 14:47:22 ] >>577 やってみたらいいのに何でわざわざ面倒な手順を踏んでるんだ?
591 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 15:27:18 ] まあvirtualでググればいいんじゃないかな!かな! >>577
592 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 18:20:03 ] 模索している割には他の提案を聞き入れようとしない件について もし判ってないならそれは技術力不足以外の何物でもないな
593 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 18:47:36 ] >>592 聞き入れないわけではなく聞いた上で調べた結果実装を考えた際に こういう時どうしようとか悩んでるわけなんですよ たとえばクラスを継承してインスタンスを作る際は確かに一つの メンバ関数をオーバーライドですれば済みますが状態がわかった際に インスタンス化されてしまってるクラスのメンバ関数を状態遷移に応じて さらにオーバーライドできるかとか できないなら、昔書いたように関数ポインタもどきを実装するしかないのだろうかとか でもクラスに関数ポインタぽいことを実装すると関数ポインタのテーブルを もったインスタンスがいっぱいできる?・・・とか
594 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 18:48:18 ] >状態がわかった際に この記述は無しで
595 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 18:57:23 ] >>593 デリゲート
596 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 19:00:03 ] 頭の中が混乱してるみたいですね。 デザインパターンのテンプレートメソッドとストラテジーあたりを勉強するといいかも。 理解できないならIF文で押し切れw
597 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 20:05:06 ] 以下のようなメソッドを用意して、データをネットワーク越しに通信するプログラムを書いています。 private byte[] CompressBytes(object rawData) { using (MemoryStream stream = new MemoryStream()) { using (DeflateStream compressedStream = new DeflateStream(stream, CompressionMode.Compress, true)) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(compressedStream, rawData); } return stream.ToArray(); } }
598 名前:597 mailto:sage [2010/04/28(水) 20:06:16 ] private object DecompressBytes(byte[] compressedData) { using (MemoryStream stream = new MemoryStream(compressedData)) { using (DeflateStream decompressedStream = new DeflateStream(stream, CompressionMode.Decompress)) { BinaryFormatter formatter = new BinaryFormatter(); return formatter.Deserialize(decompressedStream); } } } 単一のプログラムでテストする場合は問題なく動作するのですが、 クライアント・サーバのプログラムにそれぞれメソッドを組み込んで通信をしていると、 return formatter.Deserialize(decompressedStream); の部分で、「デコード中に無効なデータが見つかりました。」というエラーが出ます。 具体的にはNetwork Streamに対してbyte配列を書き込み、 相手側で読み出すという作業をしているだけなのですが、ローカルとネットワークの場合で挙動が変わるのかよくわかりません。 # ネットワーク越しといっても、サーバプログラムで127.0.0.1に対してポートを開いて、クライアントプログラムで127.0.01にアクセスしているので、マシンスペックに違いは無いはずなのですが… もし何か注意することがあれば教えていただけないでしょうか?
599 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 20:10:35 ] www.sherwooddungeon.com/SherwoodDungeon.htm こんな3Dネトゲが4M程度で実現できてるんだけど C#でやるにはwebdeveloperとかsilverlightが必要?
600 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 20:14:07 ] 俺的に3Dゲームはudkやsource modを使うのが一番現実的だと結論付けた
601 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 20:22:13 ] >>599 inしてみたが週末Flashスレで貼られる戦車のゲームとエリア規模は似てるな まあ4MBってのも圧縮した状態だと小さくなるしなあ
602 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 20:26:47 ] 気軽に対戦ゲーム作りたくてもサーバーが難しいよね
603 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 20:32:16 ] ↓ここで簡単厨のターン
604 名前:デフォルトの名無しさん [2010/04/28(水) 21:17:01 ] まぁ俺にかかったら1日で何でもできるけどね
605 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 22:22:27 ] >>598 そのエラーが出てるとこのデータの中身はどうなってるんだ? ちゃんと送りつけた時と一緒になってるか? まずはそこからだ
606 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 22:30:49 ] >>602 ほとんどのレンタルサーバーはゲーム禁止だからな ATPAGESではOKだが、負荷をかけすぎるとアカウント自体止められる
607 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 22:34:13 ] >>583 abstract class foo { foo(){} abstract bar(){} } class xxx : foo { override bar(){} } とやって、xxxのインスタンスをList<foo>にでも突っ込めばいける
608 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 22:36:24 ] あと、遷移ごとにfooを継承したクラスを作って突っ込めばいい 詳しくResponserパターンでくぐってみろ
609 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 22:45:58 ] デザインパターンなんてみんな覚えてるの?
610 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 23:24:35 ] >>609 そりゃデザパタから入った人は「覚える」って意識になるんだろな。
611 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 23:46:55 ] 趣味で一人でプログラミングするなら、無理にオブジェクト指向を意識する必要はないけどな。 下手にクラス設計に凝るくらいなら、ひたすらstaticでプログラム組んだ方がましだと思う。 どうせ誰かにソースを見せたり、過去の資産を利用したり、誰かから仕様変更を言い渡されたりはしないんだろ。
612 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 23:48:17 ] >>611 妄想で語るな
613 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 23:51:44 ] いや、正しい
614 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 23:55:35 ] いや、過程に過ぎない つまり妄想
615 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 23:58:52 ] 構造体の配列で回して、キャラのタイプIDでswitchしまくりで別に問題ない
616 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 00:10:33 ] 趣味なら作ってて楽しければいいし、どんなソースでも動けばいいんだよ。
617 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 00:12:40 ] 正解
618 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 00:39:40 ] うん。 でもね、べつにクラス設計とかって伊達で導入されてるわけじゃないんだけどな。 規模が大きくならないとあんまり意味がないってことなら同意だけど。
619 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 01:19:21 ] >>616 動いたけどsbyteで済むようなただのフラグ用の変数すらintで書いていて起動しただけで10MB超のメモリを食ったのは恥ずかしい経験w やっていくうちに分かるってのはあるが、どんなソースでもとかいう気持ちだといつまで経っても向上しないような気はする。
620 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 01:38:49 ] まあ目的と手段を間違えないことだな