記事一覧

トップ > プログラミング > C#

矢印を書きたいだけ

最近学校の方で研究用の新システム作りを行っています。しかし、今まではJavaで書いていたのをフルスクラッチでC#で書き直しているのですが、JavaよりもC#の方が便利な関数が多くていいね。今日は、矢印を書けるようにしたいなー、と思って矢印を書けるようなWPFのプロパティを探していたのだけれども、どうもないみたいなので、微妙に自作しようと思ったら案外時間がかかった。
ちなみに、C#4.0+WPFで記述しているのでそのままではVS2008以降を持っていないと役に立たないかも?
thisはCanvasのサブクラスを指します。
コード


public void Arrow()
{
Path p = new Path();
p.Stroke = Brushes.LightSteelBlue;//線の色
p.StrokeThickness = 2;//線の太さ
LineGeometry l1 = new LineGeometry();//メインの線
LineGeometry l2 = new LineGeometry();
LineGeometry l3 = new LineGeometry();
l1.StartPoint = new Point(10, 10);//始点を適当に設定(実際には引数で渡す)
l1.EndPoint = new Point(-210, -210);//終点を適当に設定
double length = Math.Sqrt(Math.Pow(l1.EndPoint.X-l1.StartPoint.X,2)+Math.Pow(l1.EndPoint.Y-l1.EndPoint.Y,2));
l2.StartPoint = l1.EndPoint;
l3.StartPoint = l1.EndPoint;
double sita = Math.Atan2(l1.EndPoint.Y-l1.StartPoint.Y,l1.EndPoint.X-l1.StartPoint.X);
l2.EndPoint = new Point(l1.EndPoint.X - length / 10.0 * Math.Cos(sita + Math.PI / 4), l1.EndPoint.Y - length / 10.0 * Math.Sin(sita + Math.PI / 4));//Math.PI/4は線の角度を45度にするということ。
l3.EndPoint = new Point(l1.EndPoint.X - length / 10.0 * Math.Cos(sita - Math.PI / 4), l1.EndPoint.Y - length / 10.0 * Math.Sin(sita - Math.PI / 4));
GeometryGroup g = new GeometryGroup();
g.Children.Add(l1);
g.Children.Add(l2);
g.Children.Add(l3);
p.Data = g;
this.Children.Add(p);

}

....      \
------------>
. ...     /
     
      ↑ここの座標ってどうやって求めればいいんだという話。

ちょっと考えれば簡単だったのに・・・
こういうGeometry系の計算は何度やっても苦手だ・・・。数学をもっと勉強するべきだったなぁ。

GSDKでゲームでも作ればいいと思うよ。

たまにはプログラミングの日記でも。
今回は、C#とManagedDirectXを利用した、広島大学ゲーム制作同好会オリジナルのゲームライブラリであるGSDKを用いたゲームの作り方の参考になるんじゃないかと思って、ソースを配布します。
詳しくは、GSDK開発者でGSDの会長でもあるつーささんのページへこっちへ。
http://tu3.jp/
まあ、ここでは自分が実際にゲームを作っていく上で気づいたことと、あと大学祭で展示したゲームのソースコードを配布してあると思うよ。
とりあえずGSDKに関する情報は多ければ多いほどいいでしょ?

ソースコードはこちら
ファイル 955-1.zip

見事にソースコードしかありませんな。
画像がないので当然動作しません。もちろんGSDKも添付されてません。
あと、大学祭のときのいい加減なコードまんまだし・・・
バイナリとか、リソースとか、GSDKとかはまあそのうち許可を取ってから配布するかもね。

あと役に立つかも、GSDKのQ&A
Q.うごかねえよ。
ManagedDirectXが必要だぜ。DirectXを入れただけではだめで、.Netが入った状態でDirectXを入れるとインストールされますよ。すでにDirectXが入ってても再インストールしてみよう。

Q.LoaderLockでるよ?
Ctrl+Alt+E押して、ManagedDebugging→LoaderLockのチェックを外す。公式にも書いてあるね。

Q.シーンっているの?
必要っぽい。

Q.パッド入力はどうやってとるん?
GSDK.DInput.ButtonsStateという配列で、キーコンフィグに応じたパッドorキーボードの状態が返ってくるっぽい。
例えば、
buttons = GSDK.DInput.ButtonsState;
if (buttons[1 + Pudnum].Pressed)
で、ボタン1(デフォだと↓キーだっけ?)が押されているかを判定できる。2コンはインデックスを+16(buttons[17]が2コンの下ボタンか)

Q.エラーでないのに何も描画されないよ
D3DTexture#Drawメソッドの乗算色(引数で言うとcolor)にArgb.Whiteとかを指定。0だと、黒を乗算するから真っ黒背景に真っ黒を描画するから何もみえんな。

Q.デバッグ出力したい
Tsukikage.GameSDK.Debug#WriteLine()
using System.Linq;がusingされてると競合するから、これは外す。

Q.テクスチャを回転して描画したいが、一周が1て・・・
仕様です。がんばって三角関数の計算をするんだwwww
時計回りで、12時が0みたいですな。三角関数とかなら、反時計回りが回転方向のような気もするが。
例えば、進行方向に頭を向けるミサイルなら
Angle = (Math.Atan2(Vy, Vx) + Math.PI / 2) / (2 * Math.PI) + AutoAngleAdder;
Vyがy方向の移動速度、Vxがx方向の移動速度
AutoAngleAdderはテクスチャの向きが時計の12時が頭でない場合とかに。
まあ、重そうだよね。

まあ、自分は制作者じゃないのでくわしい仕様は(´・ω・`)知らんがな

ちなみに、このソースではタスクコントローラを使わずに、自前でObjectGroupを定義してスプライトを管理しているから、あんまり参考にはならんかも。
結構癖のあるプログラムだし。

Q.

七夕の日なのでMicrosoft製品がただで手に入る方法でも

今日は七夕のようですね。
笹の葉に願いをかけて、織姫と彦星の幸せを祈っていますか?
自分はもちろん他人の恋愛なんてシンデシマエーという方針なので、
七夕なんてイベントは完全スルーしてやんよwww

というわけで今日の日記は、Microsoft製品をただor安く手に入れて(゚д゚)ウマーな方法でも紹介しようか。
まあ、ライセンスには気をつけろよ!
  ┌───────────────────────
  │  
─┼○ ゲイツ製品ただでよこせ
  │  
  └───────────────────────
続きを読む

ページ移動

  • 前のページ
  • 次のページ