C#キャラクターの座標をマップ上の画面上の座標に変換させるには

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
samusu0905
記事: 336
登録日時: 10年前

C#キャラクターの座標をマップ上の画面上の座標に変換させるには

#1

投稿記事 by samusu0905 » 9年前

タイトルに書いた通りですが、キャラクターの座標をマップ上の画面上の座標に変換させるにはどうすれば宜しいでしょうか?
コードを提示しておきます。

コード:

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;       //ゲームクリアでは無い
            }
        }
    }
}
これが一応ステージクラスのソースコードとなります。
どんな処理を書けばマップ上のキャラクターの位置を変更できるか教えてもらえると幸いです。
ヒントをお願いします。
最後に編集したユーザー samusu0905 on 2015年3月17日(火) 22:56 [ 編集 2 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#2

投稿記事 by softya(ソフト屋) » 9年前

質問です。
なぜ、いまさら滅びかけのXNAなのでしょうか?
就職では不利になっても有利になると思えませんよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

samusu0905
記事: 336
登録日時: 10年前

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#3

投稿記事 by samusu0905 » 9年前

回答有難うございます。

>なぜ、いまさら滅びかけのXNAなのでしょうか?
>就職では不利になっても有利になると思えませんよ。
実は専門学校でXNAを使用したゲーム制作を学びながら制作していたので、XNAを使用したゲーム制作をしていました。
学校で学んでいたので、就職にも少しは有利なのだろうと思ったのですが.....違いましたか。

コードは求めていませんので、文言でヒントをお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#4

投稿記事 by softya(ソフト屋) » 9年前

> 学校で学んでいたので、就職にも少しは有利なのだろうと思ったのですが.....違いましたか。

XNAだと3年ぐらい前なら大丈夫だったです。
今だと、XNAの現状を知らなさすぎるをアピールする結果となるので、印象としてはマイナスでしょう。
XNAが動く環境としてXbox360は今更ですよね。Windows8.1やWindows10のストアアプリでは使えませんし、WindowsPhone7はもっと今更ですし。結局Windows8.1で動くけどWindows10で動くのかってのも分からないです。

>コードは求めていませんので、文言でヒントをお願いします。

マップを別クラスで管理して、クラスのインスタンスを差し替えればよいのでは?
マップをファイルから読み込みぐらいはしないと本格的には利用しづらいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

samusu0905
記事: 336
登録日時: 10年前

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#5

投稿記事 by samusu0905 » 9年前

回答有難うございます。

>XNAだと3年ぐらい前なら大丈夫だったです。
>今だと、XNAの現状を知らなさすぎるをアピールする結果となるので、印象としてはマイナスでしょう。
では、今のゲーム業界でC#は不要ですか?それとも必要ですか?
また、C#での制作経験が必要であればC#の何の機能(XNAのような)でゲーム制作すれば宜しいでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#6

投稿記事 by softya(ソフト屋) » 9年前

samusu0905 さんが書きました:回答有難うございます。

>XNAだと3年ぐらい前なら大丈夫だったです。
>今だと、XNAの現状を知らなさすぎるをアピールする結果となるので、印象としてはマイナスでしょう。
では、今のゲーム業界でC#は不要ですか?それとも必要ですか?
また、C#での制作経験が必要であればC#の何の機能(XNAのような)でゲーム制作すれば宜しいでしょうか?
C#ですが、ゲーム業界では前より重要な位置を占めています。
それがXNAフレームワークでは無いというだけです。
C#にとってXNAはフレームワーク=ライブラリです。C#の一部ではありません。
C#の機能の一部だと誤解されているなら、C#とは何かかを勉強しなおしてください。

さて本題のC#のゲームへの活かし方ですが、ゲームエンジンとC#で調べてみてください。
現状を知らなさすぎるので、これもまた勉強です。
一緒に周辺情報を学ばれることを望みます。

【補足】
ゲーム業界は日進月歩です。
昨日のものは既に古いかもしれないと言う意識で取り組まないと取り残されてしまう事が良くあります。
2から3年前の情報では激変している可能性があることは意識しておくべきでしょう。

【さらに補足】
samusu0905 さんが書きました: また、C#での制作経験が必要であればC#の何の機能(XNAのような)でゲーム制作すれば宜しいでしょうか?
前にも言ったとおり、ゲーム作りの本質さえ理解できていればC#であろうが、C++であろうが、DirectXだろうがOpenGLだろうがXNAだろうが差異はすぐ吸収できます。
そこを掴めていないゆえに、言語や表面上のAPI/ライブラリ/フレームワークに戸惑うのです。
変化が急激なC#に手を出さず変化がゆるやかなC++とDXライブラリで修行するのも手ですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

samusu0905
記事: 336
登録日時: 10年前

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#7

投稿記事 by samusu0905 » 9年前

ご丁寧に説明有難うございます。

>C#にとってXNAはフレームワーク=ライブラリです。C#の一部ではありません。
>C#の機能の一部だと誤解されているなら、C#とは何かかを勉強しなおしてください。
了解です。てっきりXNAもC#の一部かと思ってました。ですが、誤解であるとわかったので、
C#を改めて勉強しなおします。

>ゲームエンジンとC#で調べてみてください。現状を知らなさすぎるので、これもまた勉強です。
>一緒に周辺情報を学ばれることを望みます。
そうですね。今ではもう僕自身は全て勉強するしかないと思ってますので、
ゲームプログラマーに必要な言語は全部勉強ですね。

さっそく調べてみます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#8

投稿記事 by softya(ソフト屋) » 9年前

> そうですね。今ではもう僕自身は全て勉強するしかないと思ってますので、
> ゲームプログラマーに必要な言語は全部勉強ですね。

基礎も出来ていないに手を広げても使えない言語が増えていくだけですよ。
まず基礎をちゃんとやりましょう。
言語をひとつに絞り、ライブラリ/環境もしばらく固定して、具体的なゲームサンプルを見ずに数千行規模のオリジナルのゲームプログラムを書けるようになること。
大事なことを疎かにしていると何も進んでいない事になります。

ここに来て一年以上経過していると思いますが、1年前に質問したことは何も見ずに自力で解決できますか? 自力でプログラムを書けますか?
もし出来ないなら、何か学習方法を間違っている可能性が高いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe()

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#9

投稿記事 by ISLe() » 9年前

samusu0905 さんが書きました:マップを6画面に増やしてキャラクターを4画面目に表示させるにはどうすれば宜しいでしょうか?
マップの種類を増やしたいということであれば、
mapData_Stage1配列を3次元配列にして、6画面分のマップデータの初期値を持たせ
Initializeメソッドのマップデータをコピーしている箇所に何番目のマップかという添字を加えれば良いかと思います。
samusu0905 さんが書きました:どんな処理を書けばマップ上のキャラクターの位置を変更できるか教えてもらえると幸いです。
マップの種類を増やしたいという話ではないのですかね。


softya(ソフト屋) さんが書きました:前にも言ったとおり、ゲーム作りの本質さえ理解できていればC#であろうが、C++であろうが、DirectXだろうがOpenGLだろうがXNAだろうが差異はすぐ吸収できます。
そこを掴めていないゆえに、言語や表面上のAPI/ライブラリ/フレームワークに戸惑うのです。
変化が急激なC#に手を出さず変化がゆるやかなC++とDXライブラリで修行するのも手ですよ。
今年後半にはDirectX12が出るかもしれない時期に、XNAもDXライブラリもともにDirectX9ベースです。
XNAの変化がさほど急激なのでしょうか、というか既に止まってから長いですよね。

XNAはVisual Studio 2013に対応するアップデートが出ているようですし、DXライブラリよりデバッグしやすいと思います。
DXライブラリはブレークポイント使って止めるとデスクトップが長時間固まりますから。

提示されたコードはかなり応用に向いてないものであるとは思いますが、C#やXNAであることとの関係は薄いと思います。

samusu0905
記事: 336
登録日時: 10年前

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#10

投稿記事 by samusu0905 » 9年前

>>ISLeさん
回答有難うございます。

>マップの種類を増やしたいということであれば、
>mapData_Stage1配列を3次元配列にして、6画面分のマップデータの初期値を持たせ
>Initializeメソッドのマップデータをコピーしている箇所に何番目のマップかという添字を加えれば良いかと思います。
なるほどです。ご丁寧なご説明有難うございます。

>マップの種類を増やしたいという話ではないのですかね。
私の説明不足でした。質問で抜けていることがありました。申し訳ないです。
マップを増やすこともしたいのですが、その前にキャラクターのY座標をマップ上の画面に変換させるにはどうしたらよいかお聞きしたかったのです。
キャラクターのX座標をマップ上の画面に変換することは出来てますが、Y座標をX座標と同じように変換させるところで、手こずってしまいました.....。

ISLe()

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#11

投稿記事 by ISLe() » 9年前

samusu0905 さんが書きました:マップを増やすこともしたいのですが、その前にキャラクターのY座標をマップ上の画面に変換させるにはどうしたらよいかお聞きしたかったのです。
キャラクターのX座標をマップ上の画面に変換することは出来てますが、Y座標をX座標と同じように変換させるところで、手こずってしまいました.....。
提示されたコードはY方向にスクロールするようになっていないので、変換する必要がないのでは?

Y方向にもスクロールさせたい、ということでしょうか。

samusu0905
記事: 336
登録日時: 10年前

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#12

投稿記事 by samusu0905 » 9年前

回答有難うございます。

>Y方向にもスクロールさせたい、ということでしょうか。
そうですね。Y座標もスクロールさせるつもりです。
X座標とY座標ともにスクロールさせようと考えております。
訳の分からない説明してすみません!

>提示されたコードはY方向にスクロールするようになっていないので、変換する必要がないのでは?
では、Y座標もスクロールするようになっていれば変換の必要ありですか?

ISLe()

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#13

投稿記事 by ISLe() » 9年前

samusu0905 さんが書きました:では、Y座標もスクロールするようになっていれば変換の必要ありですか?
スクロールさせたいなら、変換する必要がある、ですかね。

stageXがX方向のスクロール座標(オフセット)です。
Y方向についても同様となるようにコードを追加・変更してください。

X方向と同じにするということで、新しいことをするわけではないので、stageXの周辺を丁寧にさらってください。

samusu0905
記事: 336
登録日時: 10年前

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#14

投稿記事 by samusu0905 » 9年前

了解です。
ではさっそくX方向と同じような処理を書いてみます。

samusu0905
記事: 336
登録日時: 10年前

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#15

投稿記事 by samusu0905 » 9年前

Y方向のスクロールコードは追加しました。
コード追加後、実行したら実際にスクロールは出来ました。
追加後のコードです。

コード:

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, 0, 0, 0, 0, 0},
            { 0, 0, 0,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            { 0, 0,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,32, 0, 0, 0, 0},
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,32, 0, 0, 0},
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,32,32, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,32, 0, 0},
            {32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,32, 0, 0, 0, 0,  0, 0, 0, 0, 0,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
            { 0,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0,32, 0, 0, 0, 0, 0},
            { 0, 0,32,32, 0, 0, 0, 0, 0, 0, 0,32,32, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0,  0, 0,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 4,11, 0, 0,32, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,32},
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 1, 2, 4,32,32,32,11, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0,32,32, 0, 0, 0, 0, 0, 0, 0},
            {32,32,32,32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  1, 2, 2, 4,32,32,32,32,32,11, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,32,32, 0, 0},
            {32,32,32,32,32, 0, 0,32,32,32,32,32,32,32,32,32, 32,32,32,32,32,32,32,32,32,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;           //ステージのX座標
        private float stageY;           //ステージのY座標
        private Vector2 bornPosition;   //敵が発生する座標


        /// <summary>
        /// コンストラクタ
        /// </summary>
        public Stage()
        {

        }


        /// <summary>
        /// 初期化
        /// </summary>
        public void Initialize()
        {
            stageX = 0;     //スクロール位置は左
            stageY = 768;   //スクロール位置は上

            //縦横にループして、コピーする
            for (int y = 0; y < StageMap.YMax; y++)
            {
                for (int x = 0; x < StageMap.XMax; x++)
                {
                    //内容をコピーする
                    //ステージマップ1
                    mapData1[y, x] = mapData_Stage1[y, x];
                }
            }
        }


        /// <summary>
        /// 表示
        /// </summary>
        /// <param name="renderer"></param>
        public void Draw(Renderer renderer)
        {
            //背景
            //表示(名前と座標を指定)
            renderer.DrawTexture("stage",new Vector2(0,0));


            //マップ1でのブロック表示
            //縦横の順で2重ループ
            for (int y = 0; y < StageMap.YMax; y++)
            {
                for(int x = 0; x < StageMap.XMax; x++)
                {
                    //実施
                    MapDrawOne1(renderer, x, y);
                }
            }
        }


        /// <summary>
        /// ステージブロックの表示の実施
        /// </summary>
        /// <param name="renderer"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        private void MapDrawOne1(Renderer renderer, int x, int y)
        {
            int ct, tx, ty;

            //マップからキャラクター(地形)番号を切り出す
            //縦、横の順番で指定
            ct = mapData1[y, x];

            //0なら描画しない
            if (ct == 0)
            {
                return;
            }


            //数値にブロックサイズを掛けて、表示する座標を算出する
            x *= StageMap.BlockSize;
            y *= 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(x), GetScreenY(y)),
                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>
        public void ScrollDown()
        {
            //画面端でなければ(スクロールできる範囲ならば)
            if (stageY < StageMap.Height)
            {
                stageY--;
            }
        }


        /// <summary>
        /// 上へのスクロール
        /// </summary>
        public void ScrollUp()
        {
            //画面端でなければ(スクロールできる範囲ならば)
            if (stageY < StageMap.Height)
            {
                stageY++;
            }
        }


        /// <summary>
        /// マップ上の座標から画面上の座標への変換
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        public float GetScreenX(float x)
        {
            //マップ上の座標からマップスクロール座標を引き、画面上の座標を出す
            //マップ上のX座標を画面上の座標に変換
            x -= stageX;
            return x;
        }


        /// <summary>
        /// マップ上の座標から画面上の座標への変換
        /// </summary>
        /// <param name="y"></param>
        public float GetScreenY(float y)
        {
            //マップ上の座標からマップスクロール座標を引き、画面上の座標を出す
            //マップ上のY座標を画面上の座標に変換
            y -= stageY;
            return y;
        }


        /// <summary>
        /// マップ上の座標から画面上の座標への変換
        /// </summary>
        /// <param name="position"></param>
        /// <returns></returns>
        public Vector2 GetScreenPositionX(Vector2 position)
        {
            //プレイヤー上の座標からマップスクロール座標を引き、画面上の座標を出す
            //プレイヤーのX座標を画面上の座標に変換
            position.X -= stageX;
            return position;
        }


        //マップ上の座標から画面上の座標への変換
        public Vector2 GetScreenPositionY(Vector2 position)
        {
            position.Y -= stageY;
            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;       //ゲームクリアでは無い
            }
        }
    }
}
この後が手こずってるところです、
キャラクターのY座標を補正してはいるんですが、位置がかなりずれてしまっています。
「位置がずれてるなら直せばいいのでは?」っと言いたいところですよね。
実際にキャラクターのY座標の数値を変えたんですが、何も変わりませんでしたw

キャラクタークラスの表示メソッドにある表示処理(表示クラスの表示メソッド)と、表示クラスの表示関連のメソッドをオーバーロードする必要ってありますか?

コード:

/// <summary>
        /// 表示
        /// </summary>
        /// <param name="renderer"></param>
        public virtual void Draw(Renderer renderer)
        {
            //切り出し用
            int sx =0, sy = 0;

            //モードにより切り出し位置を求める
            switch(mode)
            {
                    //立ち
                case ActionMode.Stand:
                    //0→1→2→3→4の順でアニメーション
                    sx = timer / 13;
                    //5になったら1に戻す
                    if (sx == 5)
                    {
                        sx = 1;
                    }
                    sy = 0;
                    break;

                    //移動
                case ActionMode.Move:

                    //0→1→2→1の順番でアニメーション
                    sx = timer / 13;
                    //6になったら1に戻す
                    if (sx == 6)
                    {
                        sx = 1;
                    }
                    sy = 1;
                    break;


                //ダメージ
                case ActionMode.Damage:
                    //0→1→2→3→4順番にアニメーション
                    sx = timer / 13;
                    sy = 2;
                    break;


                //攻撃()
                case ActionMode.Attack:
                    //0→1→2→3→4→5→6の順番にアニメーション
                    sx = timer / 3;
                    //7になったら1に戻す
                    if (sx == 7)
                    {
                        sx = 1;
                    }
                    sy = 3;
                    break;


                    //ジャンプ(アニメーションしない)
                case ActionMode.Jump:

                    sx = 0;
                    sy = 4;
                    break;


                    //それ以外
                default:
                    break;

            }

            //番号から切り出し位置へ変換
            sx *= (int)size.X;
            sy *= (int)size.Y;

            //切り出し位置を決定
            Rectangle rect = new Rectangle(sx, sy, (int)size.X, (int)size.Y);

            if (stage.MapEnemyBorn() == true)
            {

            }

            //右向きならば
            if (dir == Direction.Right)
            {
                renderer.DrawTexture(name+"1", stage.GetScreenPositionX(position) - halfSize,rect);
            }
            else
            {
                //切り出し位置の変更
                rect.X = 700 - rect.X -(int)size.X;

                //表示(名前と座標と切り出す図形を指定)
                renderer.DrawTexture(name + "2", stage.GetScreenPositionX(position) - halfSize, rect);
            }
        }
上記のコードがキャラクタークラスで、
下記のコードが表示クラスにある表示メソッドです。

コード:

/// <summary>
        /// 絵の表示(オーバーロード)
        /// 一部の表示
        /// </summary>
        /// <param name="name"></param>
        /// <param name="positionX"></param>
        /// <param name="rect"></param>
        public void DrawTexture(string name, Vector2 position, Rectangle rect)
        {
            spriteBatch.Draw(textures[name], position, rect, Color.White);
        }
もしオーバーロードが必要でしたら、オーバーロードさせますが・・・。
「オーバーロードなんて不要です」って言うのであれば、オーバーロードしないで、コードを書いてみますが・・・。


NNN

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#17

投稿記事 by NNN » 9年前

プレイヤーに設定した座標が書いてないし、その時の描画位置の座標もこちらは分からない
どれくらいどのようにずれるのかこちらは分からない

なのでソースだけ貼られても何も分からないですよ

ISLe()

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#18

投稿記事 by ISLe() » 9年前

丁寧にさらってくださいと書いたのですが、ScrollUpとScrollDownの条件式が同じだったりするのを見るとおざなりな印象です。
stageXが実際の動作に対してどのように作用するかの理解は進んだのでしょうか。

キャラクター表示クラスのDrawメソッドにあるRenderer.DrawTextureの呼び出しの引数が、表示クラスにある表示メソッドの型と合っていないようですが。
samusu0905さんのおっしゃる「オーバーロードする必要」というのはこの辺のことでしょうか。
最初からこのような(奇妙な)コードだったのでしょうか。


ソースだけ貼られても何も分からない、のではなく、重要な部分をわざわざ避けている、ふうに見えます。

samusu0905
記事: 336
登録日時: 10年前

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#19

投稿記事 by samusu0905 » 9年前

>プレイヤーに設定した座標が書いてないし、その時の描画位置の座標もこちらは分からない
すみません!提示忘れてました!プレイヤーがどこの位置にいるのか、そのコードをお見せします。
こちらになります。下記がプレイヤークラスの初期化メソッドです。

コード:

/// <summary>
        /// 初期化
        /// (抽象クラスにオーバーライド)
        /// </summary>
        public override void Initialize()
        {
            //座標の初期化
            position.X = 180;
            position.Y = 398;


            //方向の初期化
            dir = Direction.Right;

            //モードの初期化
            mode = ActionMode.Stand;

            //タイマーの初期化
            timer = 0;


            //移動速度の初期化
            speed.Y = 0;

            //ゲーム継続
            isDead = false;
        }

>stageXが実際の動作に対してどのように作用するかの理解は進んだのでしょうか。
そこはすでに理解してます。

>samusu0905さんのおっしゃる「オーバーロードする必要」というのはこの辺のことでしょうか。
>最初からこのような(奇妙な)コードだったのでしょうか。
そうですね。キャラクタークラスの表示メソッドのRenderer.DrawTexture()関数の引数と表示クラスにある表示メソッドの引数をオーバーロードするべきなのかってことですね。
とても足らない説明ですみません....。

>最初からこのような(奇妙な)コードだったのでしょうか。
専門学校で資料を参考程度に見てゲームを作る授業で、あのようなコードを書いていました。
奇妙・・・ですか。ISLeさんにはそのように見えたんですね。
授業で教わったので、私はあまり気にしませんが。

この場合、オーバーロードが必要かどうかそれを知りたいですね。
どうでしょうか?

samusu0905
記事: 336
登録日時: 10年前

Re: C#キャラクターの座標をマップ上の画面に変換させるには

#20

投稿記事 by samusu0905 » 9年前

トピックスの質問内容を変更しました。
簡潔に言うと、プレイヤーの座標をマップ上の画面上の座標に変換させる処理をお聞きしたかったのです。
面倒な説明ばかりして申し訳ないです。変換方法が知りたかっただけです。

ISLe()

Re: C# キャラクターをマップ6画面の内、4画面目に表示させる方法について

#21

投稿記事 by ISLe() » 9年前

samusu0905 さんが書きました:>stageXが実際の動作に対してどのように作用するかの理解は進んだのでしょうか。
そこはすでに理解してます。
でしたらY座標に関して、同様に書きかえるだけです。


引数の型が合っていないのにコンパイルエラーにならないのがわたしには奇妙に思えるということです。
コードの質の話はしていません。

GetScreenPositionからGetScreenPositionXに変更する段階でY座標がどこかに消えてしまっているのではないかと思うのですがね。


samusu0905さんがオーバーロードをどういう意味で使っているかもよくは分かりませんが、正しい意味でのオーバーロードだとして、この場合、オーバーロードが必要とは思いません。

想像ですが、書きかえる過程でコンパイルエラーが大量に出るので、それを黙らせるため、というところですかね。

samusu0905
記事: 336
登録日時: 10年前

Re: C#キャラクターの座標をマップ上の画面上の座標に変換させるには

#22

投稿記事 by samusu0905 » 9年前

回答有難うございます。
>samusu0905さんがオーバーロードをどういう意味で使っているかもよくは分かりませんが、正しい意味での
>オーバーロードだとして、この場合、オーバーロードが必要とは思いません。
そうですか。では、オーバーロードは必要ないというわけですね。
了解です。

samusu0905
記事: 336
登録日時: 10年前

Re: C#キャラクターの座標をマップ上の画面上の座標に変換させるには

#23

投稿記事 by samusu0905 » 9年前

皆さんのアドバイスのおかげさまで解決できました。
ISLeさんが言った通りにX座標と同じようにしたら上手く変換成功しました。
以下がコードとなります

コード:

/// <summary>
        /// マップ上の座標から画面上の座標への変換
        /// </summary>
        /// <param name="position"></param>
        /// <returns></returns>
        public Vector2 GetScreenPosition(Vector2 position)
        {
            position.X -= stageX;
            position.Y -= stageY;
            return position;
        }
単純にX座標を変換した後に、Y座標も一緒に変換したら出来ました。
色々とご迷惑をお掛けしました。
また少し成長しました。自分自身で難しく考えすぎていました。

閉鎖

“C言語何でも質問掲示板” へ戻る