C# c XNA收集会减慢移动速度

C# c XNA收集会减慢移动速度,c#,xna,collision,monogame,intersect,C#,Xna,Collision,Monogame,Intersect,我正忙于一个cxna4.02drpg游戏,有以下问题。 为了检测收集,我循环遍历列表中存储的所有TileStore对象 TileStore是一个包含以下内容的对象: 长方形 布尔步行 布尔皮克布尔酒店 但是经过一些集合检测和移动后,我的角色变得非常缓慢 要在代码中显示这一点。在类游戏屏幕中,我处理游戏场移动、绘制、收集和判断的所有操作 当我按下向右箭头键时,以下代码将在更新方法中执行 public void update(KeyboardState keyboard, KeyboardState

我正忙于一个cxna4.02drpg游戏,有以下问题。 为了检测收集,我循环遍历列表中存储的所有TileStore对象

TileStore是一个包含以下内容的对象:

长方形 布尔步行 布尔皮克布尔酒店 但是经过一些集合检测和移动后,我的角色变得非常缓慢

要在代码中显示这一点。在类游戏屏幕中,我处理游戏场移动、绘制、收集和判断的所有操作

当我按下向右箭头键时,以下代码将在更新方法中执行

public void update(KeyboardState keyboard, KeyboardState oldKeyboard, GameTime gameTime)
    {
        // Update this after every game tick -> GameTIme
        elapsed += (int)gameTime.ElapsedGameTime.TotalMilliseconds;

        if (elapsed >= delay)
        {
            if (frames >= 8)
            {
                frames = 0;
            }
            else
            {
                frames++;
            }

            elapsed = 0;
        }

        /*******************************************************************
         * RIGHT KEY CHECK (collesion, out off screen, Movement en animation) *
         *******************************************************************/


        // Walk right if there is no collision
        if (collisionRight == false)
        {
            // Check out of screen
            if (character.pos.X <= screenWidth - 64)
            {
                if (Keyboard.GetState().IsKeyDown(Keys.Right))
                {
                    // Determine which sprite to load
                    character.charSprite.Y = 704;

                    // Character animation
                    character.charSprite.X = 64 * frames;

                    // Move character by increase x pos by 1
                    character.pos.X += 1;

                    // Check to walk left again
                    if (intersect(character.pos) == false && collisionRight == false)
                    {
                        collisionLeft = false;
                    }
                    else
                    // Else intersect disable movement right
                    {
                        collisionRight = true;
                    }
                }
            }
        }
    }
我的相交碰撞方法如下所示

public bool intersect(Rectangle player)
{
    // Loop through the tileobject list defined in Tile class
    for (int i = 0; i < Tile.tileObject.Count; i++)
    {
        // Check if tileObject is not walkable
        if (Tile.tileObject[i].walkable == false)
        {
            // Collesion => Intersects c#
            if (Tile.tileObject[i].Rectangle.Intersects(player))
            {
                return true;
            }   
        }
    }
    return false;
}
所以每次我按下右键,下键,左键,上键都会检查相交点。我认为在播放了几分钟后,for循环调用了很多东西,这些东西会导致播放/移动缓慢的角色

有没有人也经历过这个问题

一辆车怎么能在几分钟后不让我的动作变得很慢呢

编辑显示完整代码

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using System.IO;
using Microsoft.Xna.Framework.Storage;
using System.Xml.Serialization;
using System.Xml.Linq;
using System.Diagnostics;


namespace Quester
{
    public class GameplayScreen
    {
        // Scherm grenzen / borders
        private int screenWidth;
        private int screenHeight;

        // Texture
        private Texture2D creditsLogo;
        private Texture2D background;

        // Sprite class
        private Tile tile;
        private Character character;

        // Vector
        private Vector2 logoPosition;
        private Vector2 backgroundPosition;

        // Spritefont
        public SpriteFont mainFont;

        // Walking Delay
        float elapsed;
        float delay = 175f;
        int frames = 0;
        int counter = 0;

        // Collission
        bool collisionLeft = false;
        bool collisionRight = false;
        bool collisionTop = false;
        bool collisionBottom = false;

        // Constructor
        public GameplayScreen(SpriteBatch spriteBatch, Texture2D creditsLogo, int screenWidth, int screenHeight, SpriteFont mainFont, Texture2D background, Texture2D mainCharacter, ContentManager Content)
        {
            this.creditsLogo = creditsLogo;
            this.screenWidth = screenWidth;
            this.screenHeight = screenHeight;
            this.mainFont = mainFont;
            this.background = background;
            //sprite = new Sprite(tileSet, new Vector2(0, 0), spriteBatch, screenWidth, screenHeight);
            //sprite2 = new Sprite(tileSet2, new Vector2(0, 0), spriteBatch, screenWidth, screenHeight);
            tile = new Tile(spriteBatch, screenWidth, screenHeight, Content);
            character = new Character(mainCharacter, spriteBatch);
        }

        public void Initialize()
        {
            // Background position
            backgroundPosition = new Vector2(0, 0);

            // Logo positioneren
            logoPosition = new Vector2((screenWidth / 2) - (creditsLogo.Width / 2), (screenHeight / 8));
        }

        public void update(KeyboardState keyboard, KeyboardState oldKeyboard, GameTime gameTime)
        {
            // Update dit naar elke game tick -> gameTime
            elapsed += (int)gameTime.ElapsedGameTime.TotalMilliseconds;

            if (elapsed >= delay)
            {
                if (frames >= 8)
                {
                    frames = 0;
                }
                else
                {
                    frames++;
                }

                elapsed = 0;
            }

            // Druk op Spatie om naar het menu te gaan!
            if (Keyboard.GetState().IsKeyDown(Keys.Space))
            {
                playScreenSelected = true;    // Zet splashScreenSelected op true, zodat je wordt doorgestuurd naar het menu
            }


            /*******************************************************************
             * DOWN KEY CHECK (collesion, uit het scherm, bewegen en animatie) *
             *******************************************************************/


            // Je kan alleen naar beneden lopen als en geen collision is
            if (collisionTop == false)
            {
                // Checken als character niet uit het scherm loopt.
                if (character.pos.Y <= screenHeight - 64)
                {
                    if (Keyboard.GetState().IsKeyDown(Keys.Down))
                    {
                        // Bepalen welke sprite wordt ingeladen
                        character.charSprite.Y = 640;

                        // Character animeren door middel van frames
                        character.charSprite.X = 64 * frames;

                        // Verhoog positie met 1
                        character.pos.Y += 1;

                        // Check om weer naar beneden te kunnen lopen
                        if (intersect(character.pos) == false && collisionTop == false)
                        {
                            collisionBottom = false;
                        }
                        // Check als en een intersect plaats vindt disable naar beneden lopen
                        else
                        {
                            collisionTop = true;
                        }
                    }
                }
            }


            /*******************************************************************
             * UP KEY CHECK (collesion, uit het scherm, bewegen en animatie) *
             *******************************************************************/


            // Je kan alleen naar boven lopen als en geen collision is
            if (collisionBottom == false)
            {
                // Checken als character niet uit het scherm loopt.
                if (character.pos.Y >= 0)
                {
                    // Walk up
                    if (Keyboard.GetState().IsKeyDown(Keys.Up))
                    {
                        // Bepalen welke sprite wordt ingeladen
                        character.charSprite.Y = 512;

                        // Character animeren door middel van frames
                        character.charSprite.X = 64 * frames;

                        // Verlaag positie met 1
                        character.pos.Y -= 1;

                        // Check om weer naar boven te kunnen lopen
                        if (intersect(character.pos) == false && collisionBottom == false)
                        {
                            collisionTop = false;
                        }
                        // Check als en een intersect plaats vindt disable naar boven lopen
                        else
                        {
                            collisionBottom = true;
                        }
                    }
                }
            }


            /*******************************************************************
             * LEFT KEY CHECK (collesion, uit het scherm, bewegen en animatie) *
             *******************************************************************/


            // Je kan alleen links lopen als en geen collision is
            if (collisionLeft == false)
            {
                // Checken als character niet uit het scherm loopt.
                if (character.pos.X >= 0)
                {
                    // Walk left
                    if (Keyboard.GetState().IsKeyDown(Keys.Left))
                    {

                        // Bepalen welke sprite wordt ingeladen
                        character.charSprite.Y = 576;

                        // Character animeren door middel van frames
                        character.charSprite.X = 64 * frames;

                        // Verlaag positie met 1
                        character.pos.X -= 1;

                        // Check om weer naar rechts te kunnen lopen
                        if (intersect(character.pos) == false && collisionLeft == false)
                        {
                            collisionRight = false;
                        }
                        // Check als en een intersect plaats vindt disable naar Links lopen
                        else
                        {
                            collisionLeft = true;
                        }
                    }
                }
            }


            /*******************************************************************
             * RIGHT KEY CHECK (collesion, uit het scherm, bewegen en animatie) *
             *******************************************************************/


            // Je kan alleen rechts lopen als en geen collision is
            if (collisionRight == false)
            {
                // Checken als character niet uit het scherm loopt.
                if (character.pos.X <= screenWidth - 64)
                {
                    if (Keyboard.GetState().IsKeyDown(Keys.Right))
                    {
                        // Bepalen welke sprite wordt ingeladen
                        character.charSprite.Y = 704;

                        // Character animeren door middel van frames
                        character.charSprite.X = 64 * frames;

                        // Verhoog positie met 1
                        character.pos.X += 1;

                        // Check om weer naar Links te kunnen lopen
                        if (intersect(character.pos) == false && collisionRight == false)
                        {
                            collisionLeft = false;
                        }
                        else
                        // Check als en een intersect plaats vindt disable naar Rechts lopen
                        {
                            collisionRight = true;
                            Tile.tileObject.Clear();
                        }
                    }
                }
            }
        }

        /// <summary>
        /// Kijken of player met object intersect
        /// </summary>
        /// <param name="player">Player rectangle</param>
        /// <returns></returns>
        public bool intersect(Rectangle player)
        {
            for (int i = 0; i < Tile.tileObject.Count; i++)
            {
                if (Tile.tileObject[i].walkable == false)
                {
                    if (Tile.tileObject[i].Rectangle.Intersects(player))
                    {
                        return true;
                    }   
                }
            }


            //// Loop door alle tiles heen
            //foreach (TileStorage tiles in tile.tileObject)
            //{
            //    // Check of tile walkable is
            //    if (tiles.walkable == false)
            //    {
            //        // Check of er een collission detectie is tussen player en tile
            //        if (tiles.Rectangle.Intersects(player))
            //        {
            //            return true;
            //        }
            //    }
            //    counter++;
            //}

            //counter = 0;
            return false;
        }

        // DRAW
        public void Draw(SpriteBatch spriteBatch, GameTime gameTime)
        {
            spriteBatch.Begin();

            // Draw the map => param tile size
            tile.Draw(128);

            spriteBatch.DrawString(mainFont, "Y Position: " + character.pos.Y, new Vector2(10, 100), Color.Black);
            spriteBatch.DrawString(mainFont, "X Position: " + character.pos.X, new Vector2(400, 100), Color.Black);
            spriteBatch.DrawString(mainFont, "Tiles dection : " + Tile.tileObject.Count, new Vector2(800, 100), Color.Black);



            // Draw the character
            character.Draw();

            // Weergave van het logo
            //spriteBatch.Draw(creditsLogo, logoPosition, Color.White);

            spriteBatch.End();
        }

        // bool splashScreenSelected (GET & SET)
        public bool playScreenSelected { get; set; }

    }
}
类别:游戏屏幕游戏场 链接:hostcode.sourceforge.net/view/3092 类:通过贴图平铺循环以生成字段并绘制它 链接:hostcode.sourceforge.net/view/3093 类:用于平铺的平铺存储区对象 链接:hostcode.sourceforge.net/view/3094 类:字符绘制字符 链接:hostcode.sourceforge.net/view/3095 类:映射创建具有行/列的映射 链接:hostcode.sourceforge.net/view/3096
我看不到有任何东西会在一段时间后积累并减缓事情的发展。如果每帧持续花费的时间超过8毫秒,则“已用时间”可能会持续增长,但根据您所显示的代码,这不会导致问题。如果有问题,可能是代码中的其他地方。您可能需要共享更多代码。至于逻辑本身,当我编写一个使用碰撞的游戏时,我甚至没有检查碰撞,直到我足够接近对象。但这可能并不总是适用。我需要更多地了解这个游戏。