FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

二一十の剣~開発記3

こんばんわ。

今日もプログラムの話です。

前回の課題をいくつか解決した

前回の課題:
・プレイヤーとボールをクリックした際の判定の仕様
・ターンの仕組みの仕様
・設定モードの仕組みの仕様
→初期配置と1~5までのターンのみ設定できるようにする。
それぞれの設定に移行するためのボタンを設置する。
各設定は、プレイヤークラスとボールクラスを作成し、その中のメンバとして保存する。
画像クリックの判定は、画像の座標と画像のサイズをクラスに組み込むことで解決。
左クリックを押下時に、現在座標と比べての判定を行う。

実績:
・プレイヤークラスとボールクラスの作成を行った。
・ターンを設定するためのボタンを作成した。
・画像をクリックした時に、画像の切り替えができるようにした。
・再生ボタンを設置し、ボタンを押すイベントに、timer.Start()メソッドを移動し、任意のタイミングでアニメーションがスタートできるようにした。
・停止ボタンを設置し、ボタンを押すイベントに、timer.Stop()メソッドを設置し、任意のタイミングでアニメーションが停止できるようにした。

課題:
・初期配置モードの作成
→画像をドラッグで、移動できるようにする。また、情報を保存できるようにする。
・ターン1~5モードの作成
→画像をクリックすると、移動可能範囲を視覚的に表示できるようにする。また、ドラッグで移動後の場所を設定できるようにする。

行き当たりばったりでやってるせいか、仕様にブレがでることが多いが、プロトタイプを繰り返し作成する開発手法ということで、ご勘弁を。

しかし、C#の開発効率の良さは、C++と比較にならない。
winAPIよりも断然楽だ。


ソース:
mainFormクラス
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 SFS_PROTO
{
public partial class mainForm : Form
{
//タイマー
public Timer timer;

//現在のモードを示す(0:初期位置 1:1ターン目 2:2ターン目 3:3ターン目 ・・・)
private int mode = 0;

//画像読込み用
private Image imgField;
private Bitmap imgAlly1;
private Bitmap imgAlly2;
private Bitmap imgAlly3;
private Bitmap imgAlly4;
private Bitmap imgAlly5;
private Bitmap imgEnemy1;
private Bitmap imgEnemy2;
private Bitmap imgEnemy3;
private Bitmap imgEnemy4;
private Bitmap imgEnemy5;
private Bitmap imgBall;
private Bitmap img_onAlly1;
private Bitmap img_onAlly2;
private Bitmap img_onAlly3;
private Bitmap img_onAlly4;
private Bitmap img_onAlly5;
private Bitmap img_onEnemy1;
private Bitmap img_onEnemy2;
private Bitmap img_onEnemy3;
private Bitmap img_onEnemy4;
private Bitmap img_onEnemy5;
private Bitmap img_onBall;

//プレイヤーとボール
private Player ally1;
private Player ally2;
private Player ally3;
private Player ally4;
private Player ally5;
private Player enemy1;
private Player enemy2;
private Player enemy3;
private Player enemy4;
private Player enemy5;
private Ball ball;


//再描画イベント
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);

// コートの画像(test.bmp)の読み込みと表示
e.Graphics.DrawImage(imgField, 0, 0, 600, 300);
e.Graphics.DrawImage(ally1.work_image, ally1.work_x, ally1.work_y, ally1.width, ally1.height);
e.Graphics.DrawImage(ally2.work_image, ally2.work_x, ally2.work_y, ally2.width, ally2.height);
e.Graphics.DrawImage(ally3.work_image, ally3.work_x, ally3.work_y, ally3.width, ally3.height);
e.Graphics.DrawImage(ally4.work_image, ally4.work_x, ally4.work_y, ally4.width, ally4.height);
e.Graphics.DrawImage(ally5.work_image, ally5.work_x, ally5.work_y, ally5.width, ally5.height);
e.Graphics.DrawImage(enemy1.work_image, enemy1.work_x, enemy1.work_y, enemy1.width, enemy1.height);
e.Graphics.DrawImage(enemy2.work_image, enemy2.work_x, enemy2.work_y, enemy2.width, enemy2.height);
e.Graphics.DrawImage(enemy3.work_image, enemy3.work_x, enemy3.work_y, enemy3.width, enemy3.height);
e.Graphics.DrawImage(enemy4.work_image, enemy4.work_x, enemy4.work_y, enemy4.width, enemy4.height);
e.Graphics.DrawImage(enemy5.work_image, enemy5.work_x, enemy5.work_y, enemy5.width, enemy5.height);
e.Graphics.DrawImage(ball.work_image, ball.work_x, ball.work_y, ball.width, ball.height);

}

// マウスのボタンを押す
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);

switch (e.Button)
{
// 左クリック
case MouseButtons.Left:
//クリック座標が、アイコン上かどうかを判断
ally1.isOnIcon(e.X,e.Y);
ally2.isOnIcon(e.X, e.Y);
ally3.isOnIcon(e.X, e.Y);
ally4.isOnIcon(e.X, e.Y);
ally5.isOnIcon(e.X, e.Y);
enemy1.isOnIcon(e.X,e.Y);
enemy2.isOnIcon(e.X, e.Y);
enemy3.isOnIcon(e.X, e.Y);
enemy4.isOnIcon(e.X, e.Y);
enemy5.isOnIcon(e.X, e.Y);
ball.isOnIcon(e.X,e.Y);

//再描画
Invalidate();
break;
// 右クリック
case MouseButtons.Right:

break;
// 上記以外をクリック
default:

break;
}

}

// マウスのボタンを離す
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
}

// マウスを動かす
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
}

// タイマーのインターバルごとに呼び出されるTickメソッド
private void timer_TICK(object sender, EventArgs e)
{
//アニメーションロジック
ally1.work_x++;
ally1.work_y++;


// 再描画実行
Invalidate();

}

//コンストラクタ
public mainForm()
{
InitializeComponent();
// 画面のちらつきを抑えるため、以下の設定を追加
SetStyle(
ControlStyles.DoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true);


//全ての画像をメモリに読み込んで置く
//フィールド
if (imgField == null) imgField = Image.FromFile("Field.bmp");
//プレイヤー::アイコンを読み込み、背景の黒を透明色として設定
if (imgAlly1 == null) imgAlly1 = new Bitmap("ally1.bmp");
imgAlly1.MakeTransparent(Color.Black);
if (imgAlly2 == null) imgAlly2 = new Bitmap("ally2.bmp");
imgAlly2.MakeTransparent(Color.Black);
if (imgAlly3 == null) imgAlly3 = new Bitmap("ally3.bmp");
imgAlly3.MakeTransparent(Color.Black);
if (imgAlly4 == null) imgAlly4 = new Bitmap("ally4.bmp");
imgAlly4.MakeTransparent(Color.Black);
if (imgAlly5 == null) imgAlly5 = new Bitmap("ally5.bmp");
imgAlly5.MakeTransparent(Color.Black);
if (imgEnemy1 == null) imgEnemy1 = new Bitmap("enemy1.bmp");
imgEnemy1.MakeTransparent(Color.Black);
if (imgEnemy2 == null) imgEnemy2 = new Bitmap("enemy2.bmp");
imgEnemy2.MakeTransparent(Color.Black);
if (imgEnemy3 == null) imgEnemy3 = new Bitmap("enemy3.bmp");
imgEnemy3.MakeTransparent(Color.Black);
if (imgEnemy4 == null) imgEnemy4 = new Bitmap("enemy4.bmp");
imgEnemy4.MakeTransparent(Color.Black);
if (imgEnemy5 == null) imgEnemy5 = new Bitmap("enemy5.bmp");
imgEnemy5.MakeTransparent(Color.Black);
//ボール::アイコンを読み込み、背景の赤を透明色として設定
if (imgBall == null) imgBall = new Bitmap("ball.bmp");
imgBall.MakeTransparent(Color.Red);

if (img_onAlly1 == null) img_onAlly1 = new Bitmap("on_ally1.bmp");
img_onAlly1.MakeTransparent(Color.Black);
if (img_onAlly2 == null) img_onAlly2 = new Bitmap("on_ally2.bmp");
img_onAlly2.MakeTransparent(Color.Black);
if (img_onAlly3 == null) img_onAlly3 = new Bitmap("on_ally3.bmp");
img_onAlly3.MakeTransparent(Color.Black);
if (img_onAlly4 == null) img_onAlly4 = new Bitmap("on_ally4.bmp");
img_onAlly4.MakeTransparent(Color.Black);
if (img_onAlly5 == null) img_onAlly5 = new Bitmap("on_ally5.bmp");
img_onAlly5.MakeTransparent(Color.Black);
if (img_onEnemy1 == null) img_onEnemy1 = new Bitmap("on_enemy1.bmp");
img_onEnemy1.MakeTransparent(Color.Black);
if (img_onEnemy2 == null) img_onEnemy2 = new Bitmap("on_enemy2.bmp");
img_onEnemy2.MakeTransparent(Color.Black);
if (img_onEnemy3 == null) img_onEnemy3 = new Bitmap("on_enemy3.bmp");
img_onEnemy3.MakeTransparent(Color.Black);
if (img_onEnemy4 == null) img_onEnemy4 = new Bitmap("on_enemy4.bmp");
img_onEnemy4.MakeTransparent(Color.Black);
if (img_onEnemy5 == null) img_onEnemy5 = new Bitmap("on_enemy5.bmp");
img_onEnemy5.MakeTransparent(Color.Black);
//ボール::アイコンを読み込み、背景の赤を透明色として設定
if (img_onBall == null) img_onBall = new Bitmap("on_ball.bmp");
img_onBall.MakeTransparent(Color.Red);

//プレイヤーとボールのインスタンス作成
ally1 = new Player();
ally2 = new Player();
ally3 = new Player();
ally4 = new Player();
ally5 = new Player();
enemy1 = new Player();
enemy2 = new Player();
enemy3 = new Player();
enemy4 = new Player();
enemy5 = new Player();
ball = new Ball();

//プレイヤーとボールの画像設定
//初期画像
ally1.work_image = imgAlly1;
ally2.work_image = imgAlly2;
ally3.work_image = imgAlly3;
ally4.work_image = imgAlly4;
ally5.work_image = imgAlly5;
enemy1.work_image = imgEnemy1;
enemy2.work_image = imgEnemy2;
enemy3.work_image = imgEnemy3;
enemy4.work_image = imgEnemy4;
enemy5.work_image = imgEnemy5;
ball.work_image = imgBall;

//クリック時
ally1.imgClicked = img_onAlly1;
ally2.imgClicked = img_onAlly2;
ally3.imgClicked = img_onAlly3;
ally4.imgClicked = img_onAlly4;
ally5.imgClicked = img_onAlly5;
enemy1.imgClicked = img_onEnemy1;
enemy2.imgClicked = img_onEnemy2;
enemy3.imgClicked = img_onEnemy3;
enemy4.imgClicked = img_onEnemy4;
enemy5.imgClicked = img_onEnemy5;
ball.imgClicked = img_onBall;

//クリックしていない時
ally1.imgNonClick = imgAlly1;
ally2.imgNonClick = imgAlly2;
ally3.imgNonClick = imgAlly3;
ally4.imgNonClick = imgAlly4;
ally5.imgNonClick = imgAlly5;
enemy1.imgNonClick = imgEnemy1;
enemy2.imgNonClick = imgEnemy2;
enemy3.imgNonClick = imgEnemy3;
enemy4.imgNonClick = imgEnemy4;
enemy5.imgNonClick = imgEnemy5;
ball.imgNonClick = imgBall;

//プレイヤーとボールの初期位置
ally1.work_x = 40;
ally1.work_y = 1;
ally2.work_x = 70;
ally2.work_y = 1;
ally3.work_x = 100;
ally3.work_y = 1;
ally4.work_x = 130;
ally4.work_y = 1;
ally5.work_x = 160;
ally5.work_y = 1;
enemy1.work_x = 300;
enemy1.work_y = 1;
enemy2.work_x = 330;
enemy2.work_y = 1;
enemy3.work_x = 360;
enemy3.work_y = 1;
enemy4.work_x = 390;
enemy4.work_y = 1;
enemy5.work_x = 420;
enemy5.work_y = 1;
ball.work_x = 200;
ball.work_y = 1;


// アニメーションのためのタイマー設定
timer = new Timer();
timer.Interval = 40; // インターバルの間隔(イベント) 
timer.Tick += new EventHandler(timer_TICK);
}

// 再生ボタン
private void Start_Click(object sender, EventArgs e)
{
timer.Start();
}

// 停止ボタン
private void Stop_Click(object sender, EventArgs e)
{
timer.Stop();
}

// 初期配置ボタン
private void first_Click(object sender, EventArgs e)
{
mode = 0; //モードを初期配置(0)に設定
curMode.Text = "初期配置モード";
}

private void rurn1_Click(object sender, EventArgs e)
{
mode = 1; //モードをターン1(1)に設定
curMode.Text = "ターン1";
}

private void turn2_Click(object sender, EventArgs e)
{
mode = 2; //モードをターン2(2)に設定
curMode.Text = "ターン2";
}

private void turn3_Click(object sender, EventArgs e)
{
mode = 3; //モードをターン3(3)に設定
curMode.Text = "ターン3";
}

private void turn4_Click(object sender, EventArgs e)
{
mode = 4; //モードをターン4(4)に設定
curMode.Text = "ターン4";
}

private void turn5_Click(object sender, EventArgs e)
{
mode = 5; //モードをターン5(5)に設定
curMode.Text = "ターン5";
}
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Drawing;

namespace SFS_PROTO
{
//プレイヤー
public class Player
{
//メンバ
public int work_x, work_y; //座標-現在
public int[] pt_x; //座標-ターンごと
public int[] pt_y; //座標-ターンごと
public int width=20, height=20;   //アイコンの幅、高さ
public int range; //移動距離
public bool isClicked; //クリックされているかいないか
public Image work_image; //画像-現在
public Image imgNonClick; //画像-クリックしていない時
public Image imgClicked; //画像-クリック時


//メソッド

//座標設定セット
public void setPositions(int x, int y,int turnNumber)
{
pt_x[turnNumber] = x;
pt_y[turnNumber] = y;
}

//X座標設定
public void setX(int x)
{
work_x = x;
}

//Y座標設定
public void setY(int y)
{
work_y = y;
}

//X座標設定ゲット
public int[] getX()
{
return pt_x;
}

//Y座標設定ゲット
public int[] getY()
{
return pt_y;
}

//アイコン上をクリックしているかを判定し、画像の切り替えを行う
public bool isOnIcon(int x, int y)
{
//味方1
if ((this.work_x <= x) & (x <= this.work_x + this.width) &
(this.work_y <= y) & (y <= this.work_y + this.height))
{
this.work_image = this.imgClicked;
return true;
}else{
this.work_image = this.imgNonClick;
return false;
}
}
}

//ボール
public class Ball
{
//メンバ
public int work_x, work_y; //座標
public int[] pt_x; //X座標-ターンごと
public int[] pt_y; //Y座標-ターンごと
public int width=20, height=20; //大きさ
public int range; //移動距離
public bool isClicked; //クリックされているかいないか
public Image work_image; //画像-現在
public Image imgNonClick; //画像-クリックしていない時
public Image imgClicked; //画像-クリック時


//メソッド

//座標設定セット
public void setPositions(int x, int y, int turnNumber)
{
pt_x[turnNumber] = x;
pt_y[turnNumber] = y;
}

//X座標設定
public void setX(int x)
{
work_x = x;
}

//Y座標設定
public void setY(int y)
{
work_y = y;
}

//X座標設定ゲット
public int[] getX()
{
return pt_x;
}

//Y座標設定ゲット
public int[] getY()
{
return pt_y;
}
//アイコン上をクリックしているかを判定し、画像の切り替えを行う
public bool isOnIcon(int x, int y)
{
//味方1
if ((this.work_x <= x) & (x <= this.work_x + this.width) &
(this.work_y <= y) & (y <= this.work_y + this.height))
{
this.work_image = this.imgClicked;
return true;
}
else
{
this.work_image = this.imgNonClick;
return false;
}
}
}

//画面
public class SFS_PROTO
{


[STAThread]
static void Main()
{
// SFS_PROTOフォームインスタンスの作成
mainForm form = new mainForm();
// フォームの座標とサイズの決定
form.StartPosition = FormStartPosition.Manual;
form.Location = new Point(100,50);
form.Size = new Size(620,450);
// フォームの背景色
//form.BackColor = Color.FromArgb(0xee,0xee,0xee);


// プログラムの実行
Application.Run(form);
}
}
}

スポンサーサイト

Trackback

Comment Form

管理者にだけ表示を許可する

Comment

プロフィール

グレゴリオ鬼骨

Author:グレゴリオ鬼骨
大分市で活動しているフットサルチーム「グレゴリオ鬼骨」の公式ブログです。未経験者ばかりですが地元の仲間達とワイワイ楽しくかつ勝利を目指して活動しているフットサルチームです。

最新記事
カテゴリ
最新コメント
月別アーカイブ
リンク
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。