コードを提示しておきます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//XNA特有の機能
using Microsoft.Xna.Framework; //基本機能
namespace _2Dゲーム
{
/// <summary>
/// ステージ
/// </summary>
class Stage
{
//メンバー変数の宣言
//ステージのマップ
private int[,] mapData1 = new int[StageMap.YMax, StageMap.XMax];
//ステージ1のマップ
private int[,] mapData_Stage1 =
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0},
{ 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 4,11, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 7, 7, 7,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0},
{ 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 4, 7, 7, 7, 7, 7,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0},
{ 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,11, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
};
private float stageX; //ステージの座標
private Vector2 bornPosition; //敵が発生する座標
/// <summary>
/// コンストラクタ
/// </summary>
public Stage()
{
}
/// <summary>
/// 初期化
/// </summary>
public void Initialize()
{
stageX = 0; //スクロール位置は左
//縦横にループして、コピーする
for (int y1 = 0; y1 < StageMap.YMax; y1++)
{
for (int x1 = 0; x1 < StageMap.XMax; x1++)
{
//内容をコピーする
//ステージマップ1
mapData1[y1, x1] = mapData_Stage1[y1, x1];
}
}
}
/// <summary>
/// 表示
/// </summary>
/// <param name="renderer"></param>
public void Draw(Renderer renderer)
{
//背景
//表示(名前と座標を指定)
renderer.DrawTexture("stage",new Vector2(0,0));
//マップ1でのブロック表示
//縦横の順で2重ループ
for (int y1 = 0; y1 < StageMap.YMax; y1++)
{
for(int x1 = 0; x1 < StageMap.XMax; x1++)
{
//実施
MapDrawOne1(renderer, x1, y1);
}
}
}
/// <summary>
/// ステージブロックの表示の実施
/// </summary>
/// <param name="renderer"></param>
/// <param name="x1"></param>
/// <param name="y1"></param>
private void MapDrawOne1(Renderer renderer, int x1, int y1)
{
int ct, tx, ty;
//マップからキャラクター(地形)番号を切り出す
//縦、横の順番で指定
ct = mapData1[y1, x1];
//0なら描画しない
if (ct == 0)
{
return;
}
//数値にブロックサイズを掛けて、表示する座標を算出する
x1 *= StageMap.BlockSize;
y1 *= StageMap.BlockSize;
//絵は8ブロックで1行なのでxyの切り出し位置を算出する
tx = ct % 8; //余りでx位置を算出
ty = ct / 8; //商でY位置を算出(切捨て)
//数値にブロックサイズを掛けて、切り出し位置座標を算出する
tx *= StageMap.BlockSize;
ty *= StageMap.BlockSize;
//1ブロックを表示する
//(絵、座標、切り出す長方形を指定)
renderer.DrawTexture("block", new Vector2(GetScreenX(x1), y1),
new Rectangle(tx, ty, StageMap.BlockSize, StageMap.BlockSize));
}
/// <summary>
/// ブロックと衝突判定
/// </summary>
/// <param name="position"></param>
/// <returns></returns>
public bool CollisionPoint(Vector2 position)
{
int bx, by;
//座標をブロックのサイズで割って、どのブロックかを求める
bx = (int)(position.X / StageMap.BlockSize);
by = (int)(position.Y / StageMap.BlockSize);
//マップの上下は自由移動
if (by < 0 || by >= StageMap.YMax)
{
return true; //移動できる
}
//マップの右上は移動不可
if (position.X < 0 || bx >= StageMap.XMax)
{
return false; //移動できない
}
//0なら移動できる
if (mapData1[by, bx] == 0)
{
return true; //移動できる
}
else
{
return false; //移動できない
}
}
/// <summary>
/// 横方向のブロックとの衝突判定
/// </summary>
/// <param name="position"></param>
/// <param name="size"></param>
/// <returns></returns>
public bool CollisionSide(Vector2 position, float size)
{
//Yを1づつ増やしながら、上から下へ判定する
for (int i = 0; i < size; i++)
{
//その座標にブロックがあれば
if (CollisionPoint(position) == false)
{
return false; //移動できない
}
position.Y++; //下へ位置をずらす
}
return true; //移動できる
}
/// <summary>
/// 縦方向のブロックとの衝突判定
/// </summary>
/// <param name="position"></param>
/// <param name="size"></param>
public bool CollisionUpDown(Vector2 position, float size)
{
//xを1づつ増やしながら、上から下へ判定する
for (int i = 0; i < size; i++)
{
//その座標にブロックがあれば
if (CollisionPoint(position) == false)
{
return false; //移動できない
}
position.X++; //右へ位置をずらす
}
return true; //移動できる
}
/// <summary>
/// 左へのスクロール
/// </summary>
public void ScrollLeft()
{
//画面端でなければ(スクロールできる範囲ならば)
if (stageX < StageMap.Width - Screen.Width)
{
stageX++; //左へスクロール
}
}
/// <summary>
/// 右へのスクロール
/// </summary>
public void ScrollRight()
{
//画面端でなければ(スクロールできる範囲ならば)
if (stageX > 0)
{
stageX--; //右へスクロール
}
}
/// <summary>
/// マップ上の座標から画面上の座標への変換
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
public float GetScreenX(float x)
{
//マップ上の座標からマップスクロール座標を引き、画面上の座標を出す
//マップ上のX座標を画面上の座標に変換
x -= stageX;
return x;
}
/// <summary>
/// マップ上の座標から画面上の座標への変換
/// </summary>
/// <param name="position"></param>
/// <returns></returns>
public Vector2 GetScreenPosition(Vector2 position)
{
position.X -= stageX;
return position;
}
/// <summary>
/// ステージのマップからの敵の発生
/// </summary>
/// <returns></returns>
public bool MapEnemyBorn()
{
//縦横にループして90以上を探す
for (int y = 0; y < StageMap.YMax; y++)
{
for (int x = 0; x < StageMap.XMax; x++)
{
//敵のデータがあれば
if (mapData1[y, x] >= 90)
{
//座標をセット
bornPosition.X = x * StageMap.BlockSize;
bornPosition.Y = y * StageMap.BlockSize;
//次からは処理しないように書き替え
mapData1[y, x] = 0;
//敵が発生することを返す
return true;
}
}
}
//敵が発生しないことを返す
return false;
}
/// <summary>
/// 発生する敵の座標の獲得
/// </summary>
/// <returns></returns>
public Vector2 GetBornPosition()
{
//発生する敵の座標を返す
return bornPosition;
}
/// <summary>
/// ゲームクリアの判定
/// </summary>
/// <param name="position"></param>
/// <returns></returns>
public bool IsGameClear(Vector2 position)
{
int bx, by;
//座標をブロックのサイズで割って、どのブロックかを求める
bx = (int)(position.X / StageMap.BlockSize);
by = (int)(position.Y / StageMap.BlockSize);
//マップの上下は対象外
if (by < 0 || by >= StageMap.YMax)
{
return false; //ゲームクリアでは無い
}
//マップの左右は対象外
if (position.X < 0 || bx >= StageMap.XMax)
{
return false; //ゲームクリアでは無い
}
//24か25ならゲームクリア
if (mapData1[by, bx] == 24 || mapData1[by, bx] == 25)
{
return true; //ゲームクリア
}
//それ以外ならゲームクリアでは無い
else
{
return false; //ゲームクリアでは無い
}
}
}
}
どんな処理を書けばマップ上のキャラクターの位置を変更できるか教えてもらえると幸いです。
ヒントをお願いします。