[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 08/16 23:53 / Filesize : 244 KB / Number-of Response : 980
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C#, C♯, C#相談室 Part46



1 名前:デフォルトの名無しさん [2008/04/22(火) 00:31:59 ]
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。
c++厨の嵐はスルー汁。

前スレ
C#, C♯, C#相談室 Part45
pc11.2ch.net/test/read.cgi/tech/1200911737/

その他テンプレ>>2-5くらい

709 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 12:51:30 ]
大抵現実に影響があるようなパフォーマンス問題は
そんな細かい話ではない。


710 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 12:53:58 ]
デリゲートがキャッシュするよりnewってのは初めて聞いたな。
どこででた話?
それかひょっとして非常に使用頻度の低いデリゲートの話?


711 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 12:56:14 ]
>709 けどそれって、C#の開発経験があるって言えるんですか?
毎日好きな言語で遊んで、顧客が限定してきた時だけC#って奴と差がないじゃん。

712 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:03:29 ]
visual studioでメッドを全部折りたたむ技ってないですか?

713 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:05:09 ]
>>711??
何のことを言ってるんだ?


714 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:06:11 ]
こういう事を
>そんな細かい話
って言い捨てること。

715 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:18:25 ]
>>714
プロならコストと効率を考えて、大して効果の上がらない箇所の最適化に
拘って労力を注ぐくらいなら、もっと他にすることがあるだろうと思うがな
そういうところをいじくり倒せるのはむしろ趣味で遊んでる奴のほうじゃね

716 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:25:04 ]
>715
>プロならコストと効率
そりゃどの言語でもそうだよ。
話をループさせてることに気付いてる? 会話下手?

俺は優しいから"C#でのコストと効率"の経験って解釈してあげるよ。

717 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:28:38 ]
>>716
煽る以外に言い返す言葉が見つからないならレスするなよ



718 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:33:19 ]
>715のプロとしてのコストと効率の経験と、趣味で遊んでる奴との混同具合が心配です。

719 名前:デフォルトの名無しさん [2008/06/05(木) 13:46:50 ]
usingを使ってStreamReaderを読んでますが、
whileで最後まで読んで、もう一度whileで読みたいのですが、
どうすればいいんでしょうか。

720 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:52:18 ]
>>719
こういうこと?
streamReader.BaseStream.Seek(0, SeekOrigin.Begin);


721 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 13:54:51 ]
>>712
アウトラインのことなら、編集 - アウトラインで

722 名前:719 mailto:sage [2008/06/05(木) 14:00:03 ]
>>720
おお!!出来ました!助かりました!
ありがとうございます!


723 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 14:16:28 ]
優先度の問題。
そんな細かい話を気にする必要があることだってあるが、
現実には引っかかるのはもっと別のところであることがほとんど。
もっと気をつけるべきとこは他にいっぱいある。
ってだけの話、無意味とは言わん。


724 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 14:19:08 ]
だろうね。 大概解ってるだろ。
俺、>709って初見じゃないもん。 定期的に湧く厨だと思った。

725 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 14:19:37 ]
条件分岐の効率なんて、文字列処理一発でも挟まれば全く無意味。
だから処理効率より設計の方を重視する方がいい、ほとんどの場合は。


726 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 14:24:24 ]
>>724
誰かさんはこの程度でベンチテスト毎回やるんだと言ってるから相当優先度が高いんだろ
解ってるとは思えん

727 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 14:29:50 ]
次のようにXMLファイルを読み込もうとしてるのですが、
どうやら読み込みに失敗している環境があるらしいのです。
if (File.Exists(Directory.GetCurrentDirectory() + "\\" + "data.xml") == true)
{
 Type[] et = new Type[] { typeof(Data) };
 System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(ArrayList), et);
 using (System.IO.FileStream fs = new System.IO.FileStream(Directory.GetCurrentDirectory() + "\\" + "data.xml", System.IO.FileMode.Open))
 {
  DataList = (ArrayList)serializer.Deserialize(fs);
 }
}
そこでまず、本当にXMLファイルの読み込みに失敗しているのかメッセージボックスでチェックしたいのですが、
try
{
 using (System.IO.FileStream fs = new System.IO.FileStream(Directory.GetCurrentDirectory() + "\\" + "data.xml", System.IO.FileMode.Open))
 {
  DataList = (ArrayList)serializer.Deserialize(fs);
 }
}
catch
{
MessageBox("読み込み失敗");
}
こんな風に書いちゃってもいいのでしょうか?



728 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 14:32:37 ]
その時も文字列処理を引き合いに出してたな。
だいたい、その辺りにC#の用途の向き不向きボーダーラインがあるんかな。
More Effective C++みたいなイメージでは不毛と。

729 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:00:24 ]
>>727
肝心の例外情報握り潰したら話にならんだろ
つか今時CurrentDirectoryかよ

730 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:02:22 ]
>729は catch の後ろに何もない事を言っている様だ。
try .. catchのヘルプに戻ろう。

731 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:35:17 ]
CurrentDirectoryの何が悪いのかわからん。
まさかレジストリやマイドキュメントに保存するのか?W

732 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:39:09 ]
カレントにするやつは無知か手抜きだろ

733 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:46:27 ]
exeのフォルダならともかく、
カレントは起動方法によって変わるから問題だろ
元々そういう仕様なら関係ないけど

734 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:46:32 ]
カレントディレクトリがショートカットとかで変更されたらどうするんだ?

735 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 15:49:56 ]
俺の負けだ。 言わせてくれ。
そこは

   throw; //スルー

だろ。
俺は敗者だ。 だけどなんかスッキリした。

質問者おいてこぼりだが、確かに>728の模範解答は期待。

736 名前:727 mailto:sage [2008/06/05(木) 15:54:41 ]
聞きたいのはCurrentDirectoryのところではなく、
usingステートメントをtryで囲んでもいいのかな?と思ったのです。

読み込み失敗時の例外情報はヘルプでFileStreamを調べたのですが例外の種類がわかりませんでした。
例外の種類はどうやって調べたらいいんでしょうか?

737 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:00:52 ]
起きえる例外がわからなければSystem.Exceptionで受ければいいだろ。
起きる例外はMSDNに載ってると思うけど。



738 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:13:54 ]
MSDNでFileStream コンストラクタ (String, FileMode)を引いたら例外の種類が書かれていました。
try
{
 using (System.IO.FileStream fs = new System.IO.FileStream(Directory.GetCurrentDirectory() + "\\" + "data.xml", System.IO.FileMode.Open))
 {
  DataList = (ArrayList)serializer.Deserialize(fs);
 }
}
catch(System.Exception e)
{
 MessageBox(e.ToString());
}
としましたが、usingをtryで囲ってもいいのかが知りたいです。


739 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:15:36 ]
どうして駄目だと思った?

740 名前:727 mailto:sage [2008/06/05(木) 16:31:25 ]
>>739
usingステートメントって例外が起きた時にステートメント内のdisposeを保証してくれるんですよね。
なのでtry句が複雑にネストしてしまう気がしたからです。
例外が自分の環境でも再現出来ればいいのですが、
他人の環境なので再現できないので、メッセージボックスを仕組んで原因を調べようかなと思いました。

741 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:43:55 ]
try句が複雑にネストしてしまう、の意味が分からない。

742 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:45:18 ]
usingをtry-finallyに展開してみる。
try { 
 readonly System.IO.FileStream fs = new System.IO.FileStream("data.xml", System.IO.FileMode.Open);
 try { DataList = (ArrayList)serializer.Deserialize(fs); }
 finally { fs.Dispose(); }
} catch(System.Exception e) { 
 MessageBox(e.ToString()); 

usingではcatchしてないからDeserializeで例外が起きた場合は外側のtry-catchブロックが補足する。
問題になるとすればcatchの段階でまだ開いている状態のfsにアクセスしたい場合。
Deserializeとfs.Dispose()の両方で例外が起きた場合。
こういったことが気になるなら、usingを使わずtry-catch-finally構造に変える。

743 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 16:50:38 ]
蒸し返してすまんが、CurrentDirectoryでひとこと。
コンソールアプリならカレントディレクトリは普通に使う。
GUIの場合は意味がない。
exeのあるディレクトリがカレントディレクトリであると考えているなら明らかに間違い。

Directory.GetCurrentDirectory() + "\\" + "data.xml", 
この部分は余計。相対パスならカレントからの相対パスになるので
"data.xml"
だけでで十分。

744 名前:727 mailto:sage [2008/06/05(木) 17:04:26 ]
>>742
分かりやすい説明ありがとうございました。

>>743
参考になりました。ありがとうございます。

745 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 17:21:07 ]
>>742
>Deserializeとfs.Dispose()の両方で例外が起きた場合。
キャッチされるのは後からの例外の方だったよね?

746 名前:デフォルトの名無しさん [2008/06/05(木) 20:00:17 ]
質問させていただきます。
フォーム上に画像を表示するプログラムを書きたいのですが、
イベントとして、フォームが表示されたと同時に描画したいのです。
このような場合、イベントはどのように記述すればよいのでしょうか。
もしくは、イベントを使わない方法があればそちらもご教授ください。

747 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:01:16 ]
GUIのプログラムの中で
GUIとは何の関係もないオブジェクトAが居ますが
デバッグ用途でGUIのとあるメッセージウィンドウに文字列を出力させたいとします。
オブジェクトAのようなGUIに無関係なオブジェクトが大量に居るような場面で
それらの出力文字列をGUIのとあるメッセージウィンドウに文字列を出力させたいわけですが。
どうやってそのオブジェクト達とメッセージウィンドウ間をインターフェイスさせればよいでしょうか?
Qtをちょこっと触ったことがあるのですが、その場合はsignal/slot機構を使って、わりと簡単に実現できたのですが
C#の場合はsignal/slotの代わりにeventを使うことになるかと思います。
eventの型となるdelegateをどこで宣言するかなぁ〜と考えるのですが、
どこにも宣言したくありません。
どうすればいいですか?




748 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:50:02 ]
メッセージ表示するもしくは通知するTraceListenerでも作ればいいんでない?


749 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:16:43 ]
>>735ってどういう意味?

750 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:15:02 ]
>>743
逆に言えば、カレントディレクトリがexeのあるディレクトリであることを
プログラム側で保障すれば問題ないということでもある

まあ、その場合でも相対パス使うだろうから、
Directory.GetCurrentDirectory()は不要だけどな

751 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:18:57 ]
>>750
Open/Saveダイアログを使うとカレントディレクトリが動いたりしなかったっけ。
以前はまった記憶がある。

752 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:37:16 ]
ていうか、おまいらデリゲート使うときに毎回宣言してるの?
自分はDelegate<Result,Param1>とか宣言しといて全部それつかってる。
おかげでFuncとどう整合性とろうか思案中だがなぁorz

753 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:42:08 ]
イベントハンドラはEventHandler<TEventArgs>使え

754 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:59:49 ]
outやrefに対応できないんだよな…


755 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:05:31 ]
class Reference<T> { public T Value { get; set; } }
こんなの作っとけば

756 名前:750 mailto:sage [2008/06/06(金) 00:07:58 ]
>>751
確かに、FileDialog使うときは

RestoreDirectory = true

にしないとまずいな
てか、既定値がfalseとかありえん

757 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:48:22 ]
>>755
世の中そうもいかんこともあるのよ。
リモーティングとか。




758 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 01:29:58 ]
>>752
まさにこういう使い方をするために、宣言時に識別子を省略出来たらいいのに。

759 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 04:03:17 ]
>>754
それは知恵が足りないだけ。
できるよ。

760 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 07:08:25 ]
マルチプルアイコンを含むIconインスタンスから、各アイコンを取得したいのですが、
どうすればよいのでしょうか。

761 名前:760 mailto:sage [2008/06/06(金) 07:46:58 ]
自己解決しました。
Icon.Save()でバイナリデータを得て、それを分割した上でIconコンストラクタに与えればいいですね。
もっとスマートな方法がありそうな気もしますが、とりあえずそれでいきます。

762 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 09:30:47 ]
コンストラクタでSize指定だけはできる

763 名前:747 mailto:sage [2008/06/06(金) 12:09:04 ]
>>753
>>イベントハンドラはEventHandler<TEventArgs>使え

どうもです。
こういうのがあるんですね。
ただこれだとEventArgsカスタムクラスをどこかで定義しなければならないです。
EventArgsカスタムクラスに依存するのがなんだかシャクなんで。

たとえば
talkerインターフェイスを用意するとして

interface ITalkter{
        public delegate void printf(string fmt,prams object[] args);
}

こういうことができたら、
ITalkerを継承したクラスを作ってしまえばそれでOKなんですけど
ITalkerインターフェイスに依存するのは納得できるんで。
ただ、interfaceでは型宣言出来ないらしく。。。
なんで出来ないんだろう。。。。
ちなみにtalkerは大量に居ます。
listenerは1個だけっていう想定。

何かいい方法はありませんか。


764 名前:747 mailto:sage [2008/06/06(金) 12:19:13 ]
もしくは
public event void delegate(object sender,params object[] arg) printf;
のような感じで
名無しの型を宣言すると同時に変数定義みたいなことができたらそれだけでいいですね。
こういうことって可能なんでしょうか?


765 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 12:25:10 ]
interface ITalkter{
 string PrintString{ get; }
}

こうとか

interface ITalkter{
 void Print(Action<string> print);
}

こうとか

interface ITalker{
void Print(IListener listener);
}

こうとかじゃだめなの?

766 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 12:46:17 ]
DebugListener/TraceListenerで十分だと思うけど。

767 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 13:27:34 ]
>>763
talkerの役割がよくわからないな。
実際に表示する部分なのか、それともメッセージを発行する元なのか?
それからdelegateをeventと1対1で作らなければいけないとか思ってないか?



768 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 14:49:41 ]
>>761
P/InvokeでExtractIconExとか。

769 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 17:41:02 ]
EventHandler<TEventArgs>を使いたくないのだったら、普通にAction<T>でも使うってのは?
オブジェクトAの中に
public event Action<string, object> printf;
を実装する。

これならカスタムクラス使わんで済むでしょ。

770 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 23:54:33 ]
>>747>>764
デリゲートを使うにはデリゲート型が事前に作成されている必要がある
また、匿名メソッドやラムダ式を使った場合でも、型が自動的に作成されることはない

なので、君がやりたいと考えていること(デリゲートを使用して云々)は恐らく不可能

まあ、本来の目的からすると、出力タイミングをGUI側で制御するなら>>765
オブジェクト側で制御するなら

interface ITalker {
  void SetPrintCallback(Action<string> print);
}

もしくは

interface ITalker {
  void SetListener(IListener listener);
}


>>769
void (object sender, T e) where T : EventArgs

に合致しないデリゲートをイベントにするのはやめれ
# MSのガイドラインなんて知らん、というなら止めはしないが

さらに言うと、
・デリゲート型の名前のサフィックスは EventHandler
・第2パラメータの型(上記 T)の名前のサフィックスは EventArgs
・2つのパラメータ名は上記の通り(sender, e)

771 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:33:51 ]
正直msのガイドラインなんか知ったこっちゃ無い


772 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:55:01 ]
なら使うな

773 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 06:58:46 ]
ここはCompact Frameworkの質問はおk?

774 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:01:03 ]
だから使わないんだって

775 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:01:24 ]
C#にからめればOK

776 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:03:46 ]
Compact FrameworkでWindows Mobile用2chブラウザを作ってるんだが、
スレ一覧にListViewを使ってるんだ。
ListViewItemCollectionにAddRangeが無くてforeachでスレデータ回してアイテム作ってAddさせてるんだが
どうにも低速なんだ。
AddRangeの代わりになるものは回してAdd以外ないだろうか。

777 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:19:17 ]
BeginUpdateやってる?



778 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:20:04 ]
>>777
やってる。

779 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:53:10 ]
ListViewへの追加はPCでもかなり遅いからなあ
1000件くらいになりそうなときはVirtualModeにしてるけど、Compactじゃ使えないのか

780 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 07:55:15 ]
>>779
2chの板のスレ一覧データだし、700項目くらいPCでやった場合ドパァッって表示されるんだがなあ。
VirtualはCFからは使えないな。

781 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 08:36:09 ]
自分で擬似的なものを描画するのが一番速いのかな

782 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 08:56:03 ]
MSのガイドライン無視したクラスライブラリって見てて恥ずかしい

783 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 09:15:58 ]
Formの上でGridクラス作ったが、20万件でも一瞬で追加・表示されるようになった(´・ω・`)

784 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 09:17:25 ]
ListViewってMSの中の底辺プログラマが作ったんだろうか

785 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:12:31 ]
作ったのがだいぶ昔のことで、
ここまで大量のデータが取り扱われるとは考えられなかったからだと思う。

786 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:29:20 ]
描いた円を上キーでジャンプさせるにはどうすればいい?

787 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:41:02 ]
意味が分かりませんがKeyDownイベントでそういう処理書けばいいんじゃないでしょうか



788 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:54:23 ]
いや、そのKeyDownの中身が分からなくって

789 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:56:34 ]
KeyDownイベントの中身で円を描く場所を変えて描画処理に投げる

790 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:56:35 ]
円をどうやって描いてるかジャンプってどういう意味なのか分からなくって

791 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 11:58:45 ]
プログラミングが下手な人って質問も下手だよね

792 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:00:20 ]
ダブルバッファにしろよ
画面ちらつくぞ

793 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:20:11 ]
上向きの初速を与えて、一定の下向きの加速度を受けながら運動するようにしたい。
例えば、20進んで一瞬停止して、15進んで一瞬停止して、の繰り返しでいいのか

794 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:26:27 ]
v = v0 + gt と言う式を当てはめれば良いだけじゃん

795 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:32:28 ]
↑アホ

796 名前:デフォルトの名無しさん [2008/06/07(土) 12:37:46 ]
tをどうすれば?

797 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:40:12 ]
タイマーでも使ってろ



798 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:48:39 ]
変数tを入れれば位置まで出せる公式があったろ
リアルにやるならtをタイマーを使って現実時間とぴったり合わせりゃいい

799 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:58:07 ]
加速度を9.8/sずつ減らせばいいんでね?

800 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 15:15:33 ]
p0 : 初期位置
v0 : 初期速度
g : 重力加速度(約-9.8)
p(t) : 初期時刻からの経過時間tの時の位置

p(t) = p0 + v0*t + 0.5*g*t*t

801 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 15:23:50 ]
つかいつの間に重力加速度の話になったんだ

802 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 15:44:46 ]
>>800
それをwhileに入れれば出来そうだけど、ジャンプ中も左右移動したい

803 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 15:46:52 ]
なんかこのスレ方向性分かんなくなってきたなw


804 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 15:55:23 ]
ジャンプ中左右移動したいなら

new Timer( () =>
{
 位置更新
 描画
});

void KeyDown(...)
{
switch(key)
case ←:
   左にちょっとずらす
...
}
こんな感じで出来るのかな
普通は
while(true)
{
入力ゲット
 位置更新
 描画
 時間が来るのを待つ
}
こんな感じなのかな
よく知らん

805 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:46:12 ]
>>802
物理的に表現したいならこんな感じです

a:加速度 v:速度 p:位置 dt:微小時間
とすると、こういう微分方程式が成り立ちます

v(t)/dt = a
p(t)/dt = v(t)

dtはゲームなら1フレームの時間(約16.7ms)と考えるのが普通です
この式を例えば前進差分(ぐぐってね)で微分項を近似するとこうなります

( v(t+dt) - v(t) ) / dt = a
( p(t+dt) - p(t) ) / dt = v(t)

t+dt時間における速度と位置を知りたいので式を変形します

v(t+dt) = dt * a + v(t)
p(t+dt) = dt * v(t) + p(t)

この式をゲームのプログラムなんかではこう表現します

void Update( float dt )
{
 velocity += dt * acceleration;
 position += dt * velocity;
}

で、左右移動したいとき、というのは速度に値が加えられている状態なんで、
velocityに対して基本速度を加えておけばOKです


806 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:51:23 ]
って書き終わって凄く後悔した
スレ違いにもほどが

807 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 19:23:48 ]
>805はY方向だけなので、Xは別にしないとだめだぞ。
横への移動を表す加速がY方向へは関係しないとき、XとYは独立して扱えるからよい子のみんなは気をつけよう。



808 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 19:40:07 ]
気をつけるまでも無く自明だと思うのですが!

809 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:07:23 ]
型を書いてないからアレだけど
ベクトル型を使うのが普通なんで






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<244KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef