C# c XNA收集会减慢移动速度
我正忙于一个cxna4.02drpg游戏,有以下问题。 为了检测收集,我循环遍历列表中存储的所有TileStore对象 TileStore是一个包含以下内容的对象: 长方形 布尔步行 布尔皮克布尔酒店 但是经过一些集合检测和移动后,我的角色变得非常缓慢 要在代码中显示这一点。在类游戏屏幕中,我处理游戏场移动、绘制、收集和判断的所有操作 当我按下向右箭头键时,以下代码将在更新方法中执行C# c XNA收集会减慢移动速度,c#,xna,collision,monogame,intersect,C#,Xna,Collision,Monogame,Intersect,我正忙于一个cxna4.02drpg游戏,有以下问题。 为了检测收集,我循环遍历列表中存储的所有TileStore对象 TileStore是一个包含以下内容的对象: 长方形 布尔步行 布尔皮克布尔酒店 但是经过一些集合检测和移动后,我的角色变得非常缓慢 要在代码中显示这一点。在类游戏屏幕中,我处理游戏场移动、绘制、收集和判断的所有操作 当我按下向右箭头键时,以下代码将在更新方法中执行 public void update(KeyboardState keyboard, KeyboardState
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毫秒,则“已用时间”可能会持续增长,但根据您所显示的代码,这不会导致问题。如果有问题,可能是代码中的其他地方。您可能需要共享更多代码。至于逻辑本身,当我编写一个使用碰撞的游戏时,我甚至没有检查碰撞,直到我足够接近对象。但这可能并不总是适用。我需要更多地了解这个游戏。