c# - 不能修改返回值

标签 c# monogame

我是 C# 的新手,所以,如果这个问题有点愚蠢,请提前道歉,我在尝试运行该程序时遇到错误。从 visual Studio 2012 我收到此错误消息 “无法修改 'GameName1.Cartman.Position' 的返回值,因为它不是变量”2 次,在第 30 行和第 31 行。我希望有人能帮助我解决这个问题。

代码如下:

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GameName1
{
    class Cartman
    {
        public Vector2 Position { get; set; }
        public float Scale { get; set; }
        public int Direction { get; set; }
        public float Rotation { get; set; }
        public Texture2D Texture { get; set; }

    public Vector2 Origin {
        get
        {
            return new Vector2(Texture.Width / 2, Texture.Height / 2);
        } 
    }

    public Rectangle BoundingBox
    { 
        get 
        {
            return new Rectangle(
                (int)(Position.X = Texture.Width / 2 * Scale), // line 30
                (int)(Position.Y = Texture.Width / 2 * Scale), // line 31
                (int)(Texture.Width * Scale),
                (int)(Texture.Height * Scale)
                );
        }
    }
    public Cartman()
    {
        Direction = 1; //standaard naar rechts
    }
    }
}

这是我的另一个类:

#region Using Statements
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;
using Microsoft.Xna.Framework.GamerServices;
#endregion

namespace GameName1
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        private Cartman _cartman;

        public Game1()
            : base()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here

            _cartman = new Cartman();
            _cartman.Position = new Vector2(100, 100);
            _cartman.Scale = 0.3f;

            base.Initialize();
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: use this.Content to load your game content here
            _cartman.Texture = Content.Load<Texture2D>("cartman");

        }

        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
                Exit();

            // TODO: Add your update logic here
            _cartman.Position = new Vector2(_cartman.Position.X + 1 *_cartman.Direction, _cartman.Position.Y);

            _cartman.Rotation += 0.3f * _cartman.Direction;

            if(!GraphicsDevice.Viewport.Bounds.Contains(_cartman.BoundingBox))
            {
                _cartman.Direction *= -1;
            }
            base.Update(gameTime);
        }

        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Orange);

            // TODO: Add your drawing code here
            spriteBatch.Begin();

            spriteBatch.Draw(   _cartman.Texture,
                                _cartman.Position,
                                null,
                                Color.White,
                                _cartman.Rotation,
                                new Vector2 (0,0),
                                _cartman.Scale,
                                SpriteEffects.None,
                                0);

            spriteBatch.End();
            base.Draw(gameTime);
        }
    }
}

最佳答案

当类型为结构时,属性的返回值不被视为变量。

所以这样:

(int)(Position.X = Texture.Width / 2 * Scale),

尝试为调用 Position 属性的结果的 X 属性分配一个新值,但是 the Vector2 type is a struct, not a class .

这基本上是在告诉您您正试图搬起石头砸自己的脚,因为返回一个结构会返回一个副本。如果没有弹出此错误,您将修改副本。

换句话说,上面的代码是类似这样的:

var temp = Position;
(int)(temp.X = Texture.Width / 2 * Scale),

但是,由于该变量被认为是结构的副本,因此在这种情况下“temp”变量实际上并不存在,因此编译器会阻止您这样做。

因此您需要将位置向量读出到一个变量,对其进行修改,然后将整个变量赋值回该属性。

有点像这样:

Position = new Vector2(Texture.Width / 2 * Scale, Texture.Width / 2 * Scale);
return new Rectangle(
    (int)Position.X,
    (int)Position.Y,
    (int)(Texture.Width * Scale),
    (int)(Texture.Height * Scale)
    );

关于c# - 不能修改返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23549720/

相关文章:

c# - C#封装内部类并访问外部

c# - 无法访问此站点错误

c# - 拦截每次鼠标点击 WPF 应用程序

c# - 静态变量不变

c# - 声音错误(MonoGame)

c# - 从服务中检索 Json 并传递给 ApiController

c# - 将字符串转换为十六进制,然后转换为字节数组

installation - 使用 Xamarin Studio 运行新的 MonoGame 项目

c# - 将 WIndows Store MonoGame 应用程序转换为 Android

c# - KeyboardState.GetPressedKeys() 是如何组织的?