0

如果问题标题不清楚,我很抱歉,但是用我廉价的英语,我找不到清楚地问它的方法。

但我可以很长地解释它。

所以我意识到如果我设计我的世界(对于世界,我的意思是整个游戏,它将是一个级别)10.000x10.000 ......这将非常足够,除了几个其他精灵(我的意思是像 4 或5,最大为 50x50,没什么大不了的。)

所以我想,为什么不把我的整个地图制作成 10.000x10.000(或者说成吨的 512x512)图片?但我有一个问题,你可以“互动”的东西很少。他们会(和他们一起,我的意思是我的“world.jpg”中的东西)总是呆在同一个地方,但是玩家(实际上是你知道的精灵)会移动,因此我的 10.000x10.000 将“移动”。

所以看下图,黑点是“玩家”,红点是一扇门。

除非他走到世界尽头,否则世界总是以黑点为中心。正如你所看到的,(看图片第 1 部分和第 2 部分)当他向东移动一点时,红点看起来移动了。但我只是移动了我的 10.000x10.000 图像。这就是我所说的 10kx10k pic 上的东西会移动。

无论如何,但正如你在图片的最后部分看到的那样,当他靠近红点时,我想要我的“行动”

怎么做 ?

- 下面的部分与主要问题并不真正相关

当他移动时,使用 10kx10 pic 而不是世界上出现的另一个精灵有用吗?但是如果我想这样做,我不仅会检查他是否在附近,而且还会检查他的观点以了解我是否应该或不应该向他展示精灵。

如果我在他谈到我想要的坐标时展示我的东西会更有用,或者使用一张大图可以吗?

谢谢。

4

3 回答 3

1

我会建议地图的结构有点像这样..

public class Map
{
     public MapPoint[,] mapPoints;       //the map
     public Player player;               //the player/user object
     public Vector2 DrawHeroPosition;    
     //where at the screen the player is going to be drawn
     public Vector2 RangeStart;          
     //what part of the map who is going to be drawn
     public int SizeX;     //number of mapPoints the screen can contain at one time 
     public int SizeY;     //number of mapPoints the screen can contain at one time 

     //MapPoint represents a specific 512x512 point (mapPoint) its position at
     //the map but also includes the sprite that is going to be drawn and objects
     //that the player can interact with at that place (like the door)

     //the player object includes reference to where in the world it is place

     public Map(ContentManager theContentManager, int x, int y)
     {
        MapSizeX = x;
        MapSizeY = y;
        int ScreenSizeX = 9;
        int ScreenSizeY = 9;
        mapPoints = new MapPoint[MapSizeX , MapSizeY];

        //ad code for generating/creating map...
        //important that you store the MapPoints position inside each mapPoint

        player = new Player(mapPoints[0,0]);  //crate a player who knows where he is
    }

    public void Update()
    {
       //in the update method you do a lot of things like movement and so
       //set what part of the map the game should draw if the game for example
       //can show 9x9 512points at a single time

       //give range value from the players position
        RangeStart.X = player.PositionX;

        //test if the maps position is in the left corner of the map
        //if it is draw the map from the start..(RangeStart.X = 0)
        if (player.PositionX - (ScreenSizeX / 2) < 0) { RangeStart.X = 0; }
        //if not draw the hero in the mitle of the screen
        else
        {
            RangeStart.X = player.PositionX - (ScreenSizeX / 2);
        }
        //if the hero is in the right corer, fix his position
        while (RangeStart.X + ScreenSizeX > MapSizeX)
        {
            RangeStart.X--;
        }

        //the same thing for the Y axle
        RangeStart.Y = player.PositionY;
        if (player.PositionY - (ScreenSizeY / 2) < 0) { RangeStart.Y = 0; }
        else
        {
            RangeStart.Y = player.PositionY - (ScreenSizeY / 2);
        }
        while (RangeStart.Y + ScreenSizeY > MapSizeY)
        {
            RangeStart.Y--;
        }

        //time to set the position of the hero...
        //he works like the opposite of the range, if you move what part of the map
        //you draw you dont change the heros draw position, if you dont move the range
        //you have to move the hero to create the illusion of "moment"

        //if you are in the left part you have to move the heros draw position..
        if (player.PositionX - (ScreenSizeX / 2) < 0) 
        { DrawHeroPosition.X = player.PositionX; }

        //if you are in the right part
        else if (player.PositionX+1 > MapSizeX - (ScreenSizeX / 2))
        {
            DrawHeroPosition.X = player.PositionX - (MapSizeX - ScreenSizeX);
        }

        //if you aint in a corner, just place the hero in the middle of the map
        else
        {
            DrawHeroPosition.X = (ScreenSizeX / 2);
        }


        //the same thing for Y
        if (player.PositionY - (ScreenSizeY / 2) < 0) 
        { DrawHeroPosition.Y = player.PositionY; }
        else if (player.PositionY+1 > MapSizeY - (ScreenSizeY / 2))
        {
            DrawHeroPosition.Y = player.PositionY - (MapSizeY - ScreenSizeY);
        }
        else
        {
            DrawHeroPosition.Y = (ScreenSizeY / 2);
        }

    }

    public void Draw()
    {

        int x = (int)RangeStart.X;
        int y = (int)RangeStart.Y;

        for(int counterX = 0; x < ((MapSizeX)); x++, counterX++)
        {
            for (int counterY = 0; y < (MapSizeY); y++, counterY++)
            {
               if (mapPoints[x, y] != null)
               {
                 mapPoints[x, y].Draw(spriteBatch, mapPoints[counterX,counterY].positonInMatrix);
                 //mapPoints[counterX,counterY] = where to draw
                 //mapPoints[x, y] = what to draw
               }
            }
            y = (int)RangeStart.Y;
        }
    }
}

我如何在 MapPoint 类中绘制...

public void Draw(SpriteBatch theSpriteBatch, Vector2 positonOnScreen)
    {
        positonOnScreen = new Vector2(positonOnScreen.X * base.Scale * 16,
        positonOnScreen.Y * base.Scale * 16);

        //base.Scale is just a variable for have the ability to zoom in/out
        //16 represents the original size of the picture (16x16 pixels)

        theSpriteBatch.Draw(mSpriteTexture, new Rectangle((int)positonOnScreen.X,
        (int)(positonOnScreen.Y), 64, 64),new Rectangle(0, 0, 16, 16), Color.White);
     }
于 2011-07-25T09:11:25.853 回答
1

如果您要求在红点半径范围内进行碰撞检测。您可以简单地使用以下测试(伪代码,我不会写 C# :-)

if( (player.GetPosition() - point.GetPosition()).length() < radius )
{ /* Do code here */ }

这将检测您的播放器是否在您的圆点的某个半径内,然后您可以执行您希望执行的任何操作。

希望这可以帮助!:)

于 2011-07-25T10:51:11.880 回答
0

好的,根据我对您问题的理解,您有一张大图像,其中包含您希望玩家与之交互的不同对象,是吗?我的意思是,图像文件本身具有玩家将与之交互的门或山丘或其他东西。

老实说,这是一个坏主意,所以我希望我误解了。最好让你的背景图像只是通用的东西,并在你的游戏中创建所有交互式对象类。如果你这样做,那么你可以让你的对象类包含基于它们的距离(圆碰撞)或基于你为它们定义的边界框相互交叉的行为。

圆形碰撞:

if (Math.Abs(Vector2.Distance(player.Position - obj.Position)) < player.Radius + obj.Radius)
    //do the action

矩形碰撞:

if (player.Bounds.Intersects(obj.Bounds))
   //do the action

此外,如果您计划制作 10,000 x 10,000 像素的图像,请了解 XNA 内容管道不会将大于 4,000 像素的图像导入到一侧。

如果您设置让播放器与图像背景中的像素进行交互,您可以手动创建一个交互式对象位置数组,也可以使用 Texture2D.GetData() 方法加载每个像素的颜色用于处理的图像——但请注意,这将需要很长时间,尤其是对于大型或大量纹理。

于 2011-07-25T21:48:18.093 回答