アプリ版:「スタンプのみでお礼する」機能のリリースについて

すいません、質問というか困っていることがあります。
私は今C#でイライラ棒を作成しているのですが、ピクチャーボックス内での、プレイヤー(自機)の動かし方と。壁に当たった時の当たり判定のプログラミングが分りません。

グーグルなどで検索をかけましたが、私が納得するような回答はありませんでした。

C#に詳しい方、お手数ですがご教授お願いします。

できればソース付でお願いします。

A 回答 (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);
}

}
}
    • good
    • 0

 こんにちは。

本来は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);
}
    • good
    • 1

これだけでは回答できる人はいないと思いますよ?



ピクチャーボックスないで、プレイヤーはどうやって表示されているの?
壁はどういう風に描画しているの?

それも含めて全部わからないっていうなら、作成することはそもそも無理
ってことじゃないかな?
    • good
    • 0
この回答へのお礼

すいません、仰られるとおりですね。
ご指摘ありがとうございます。
ピクチャーボックス内では以下のようにステージを作っています。

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);

お礼日時:2010/07/03 09:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!