• ベストアンサー

すいません、質問というか困っていることがあります。

すいません、質問というか困っていることがあります。 私は今C#でイライラ棒を作成しているのですが、ピクチャーボックス内での、プレイヤー(自機)の動かし方と。壁に当たった時の当たり判定のプログラミングが分りません。 グーグルなどで検索をかけましたが、私が納得するような回答はありませんでした。 C#に詳しい方、お手数ですがご教授お願いします。 できればソース付でお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

 続きです。ペイントイベントはピクチャーボックス側を実装して下さい。 //当たり判定 private bool AtariHantei(Graphics g) { Point[] apt = new Point[] { new Point(0, 0), new Point(0, 20), new Point(20, 0), new Point(20, 20) }; for (int n = 0; n < apt.Length; ++n) { IntPtr hdc = g.GetHdc(); Color c = Color.FromArgb((int)GetPixel(hdc, pos.X + apt[n].X, pos.Y + apt[n].Y)); g.ReleaseHdc(hdc); if (pboxDate1.BackColor.R != c.R || pboxDate1.BackColor.G != c.G || pboxDate1.BackColor.B != c.B) { return true; } } return false; } //キャラ操作 private void Form1_KeyDown(object sender, KeyEventArgs e) { old = new Point(pos.X, pos.Y); switch (e.KeyCode) { case Keys.Left: pos = new Point(pos.X - 5, pos.Y); break; case Keys.Right: pos = new Point(pos.X + 5, pos.Y); break; case Keys.Up: pos = new Point(pos.X, pos.Y - 5); break; case Keys.Down: pos = new Point(pos.X, pos.Y + 5); break; } Graphics g = pboxDate1.CreateGraphics(); if (AtariHantei(g) == true) { MessageBox.Show("激突した"); } DrawStage(g); } //ピクチャボックスのペイント private void pboxDate1_Paint(object sender, PaintEventArgs e) { DrawStage(e.Graphics); } } }

その他の回答 (2)

回答No.2

 こんにちは。本来はMDXやXNAと言ったDirectX関連で実装するべきでは。  以下はC#とNetFrameworkのみです。参考程度に。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { [System.Runtime.InteropServices.DllImport("gdi32.dll")] static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos); //プレイヤーの現在位置 private Point pos = new Point(35, 35); //プレイヤーの以前の位置 private Point old = new Point(0, 0); public Form1() { InitializeComponent(); } private void DrawStage(Graphics g) { //プレイヤーの残像を消す g.FillEllipse(new SolidBrush(pboxDate1.BackColor), old.X, old.Y, 20, 20); //壁 g.FillRectangle(Brushes.Blue, 0, 0, 20, 559); g.FillRectangle(Brushes.Blue, 748, 0, 20, 559); g.FillRectangle(Brushes.Blue, 10, 0, 748, 20); g.FillRectangle(Brushes.Blue, 10, 539, 748, 20); g.FillRectangle(Brushes.Black, 70, 20, 20, 450); g.FillRectangle(Brushes.Black, 500, 120, 20, 419); g.FillRectangle(Brushes.Black, 70, 470, 350, 15); g.FillRectangle(Brushes.Black, 70, 330, 350, 15); g.FillRectangle(Brushes.Black, 70, 190, 350, 15); g.FillRectangle(Brushes.Black, 150, 400, 350, 15); g.FillRectangle(Brushes.Black, 150, 260, 350, 15); g.FillRectangle(Brushes.Black, 150, 120, 350, 15); g.FillRectangle(Brushes.Black, 150, 70, 20, 60); g.FillRectangle(Brushes.Black, 200, 20, 15, 60); g.FillRectangle(Brushes.Black, 250, 70, 15, 60); g.FillRectangle(Brushes.Black, 300, 20, 10, 60); g.FillRectangle(Brushes.Black, 350, 70, 10, 60); g.FillRectangle(Brushes.Black, 400, 20, 15, 60); g.FillRectangle(Brushes.Black, 450, 70, 15, 60); g.FillRectangle(Brushes.Black, 500, 20, 20, 60); g.FillRectangle(Brushes.Red, 700, 20, 48, 50); //プレイヤー g.FillEllipse(Brushes.Red, pos.X, pos.Y, 20, 20); }

  • Kazma_hk
  • ベストアンサー率26% (115/428)
回答No.1

これだけでは回答できる人はいないと思いますよ? ピクチャーボックスないで、プレイヤーはどうやって表示されているの? 壁はどういう風に描画しているの? それも含めて全部わからないっていうなら、作成することはそもそも無理 ってことじゃないかな?

jegann
質問者

お礼

すいません、仰られるとおりですね。 ご指摘ありがとうございます。 ピクチャーボックス内では以下のようにステージを作っています。 Graphics g = pboxDate1.CreateGraphics(); //壁 g.FillRectangle(Brushes.Blue, 0, 0, 20, 559); g.FillRectangle(Brushes.Blue, 748, 0, 20, 559); g.FillRectangle(Brushes.Blue, 10, 0, 748, 20); g.FillRectangle(Brushes.Blue, 10, 539, 748, 20); g.FillRectangle(Brushes.Black, 70, 20, 20, 450); g.FillRectangle(Brushes.Black, 500, 120, 20, 419); g.FillRectangle(Brushes.Black, 70, 470, 350, 15); g.FillRectangle(Brushes.Black, 70, 330, 350, 15); g.FillRectangle(Brushes.Black, 70, 190, 350, 15); g.FillRectangle(Brushes.Black, 150, 400, 350, 15); g.FillRectangle(Brushes.Black, 150, 260, 350, 15); g.FillRectangle(Brushes.Black, 150, 120, 350, 15); g.FillRectangle(Brushes.Black, 150, 70, 20, 60); g.FillRectangle(Brushes.Black, 200, 20, 15, 60); g.FillRectangle(Brushes.Black, 250, 70, 15, 60); g.FillRectangle(Brushes.Black, 300, 20, 10, 60); g.FillRectangle(Brushes.Black, 350, 70, 10, 60); g.FillRectangle(Brushes.Black, 400, 20, 15, 60); g.FillRectangle(Brushes.Black, 450, 70, 15, 60); g.FillRectangle(Brushes.Black, 500, 20, 20, 60); g.FillRectangle(Brushes.Red, 700, 20, 48, 50); //プレイヤー g.FillEllipse(Brushes.Red, 35,35,20,20);

関連するQ&A