【问题标题】:Monogame make objects in class move independentlyMonogame 使班级中的物体独立移动
【发布时间】:2021-09-16 09:39:26
【问题描述】:

我的代码有问题。我试图让 2000 块在屏幕上反弹。我已经使它与一个块一起工作,但是当我添加更多的 x 和 y 轴时,一旦它们中的一个碰到屏幕边缘的边框,就会更新它们。所以我希望所有对象 x 和 y 轴独立更新,而不是像现在这样一起移动。这是我的代码:

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using System;
using System.Collections.Generic;

namespace Project_blob
{
public class Game1 : Game
{
    private GraphicsDeviceManager _graphics;
    private SpriteBatch _spriteBatch;
    Texture2D pixelTexture;
    List<Block> blocks = new List<Block>();
    Block block;
    int speed1 = 1;
    int speed2 = -1;
    



    public Game1()
    {
        _graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
        IsMouseVisible = true;
    }

    protected override void Initialize()
    {
        
        Random rnd = new Random();
        // TODO: Add your initialization logic here

        block = new Block();
        for (int i = 0; i < 2000; i++)
        {
            var block = new Block();
            block.X = rnd.Next(0, 780);
            block.Y = rnd.Next(0, 500);
            block.Color = new Color(rnd.Next(256), rnd.Next(256), rnd.Next(256));
            blocks.Add(block);
            

        }
        base.Initialize();
    }

    protected override void LoadContent()
    {
        _spriteBatch = new SpriteBatch(GraphicsDevice);
        pixelTexture = Content.Load<Texture2D>("pixel");
        // TODO: use this.Content to load your game content here
    }

    protected override void Update(GameTime gameTime)
    {
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
            Exit();

        foreach (Block block in blocks)
        {
            if (block.X < 0) speed2 += 1;
            if (block.X > 770) speed2 += -1;
            if (block.Y > 450) speed1 += -1;
            if (block.Y < 0) speed1 += 1;
            if (speed1 < -1) speed1 = -1;
            if (speed1 > 1) speed1 = 1;
            if (speed2 < -1) speed2 = -1;
            if (speed2 > 1) speed2 = 1;
            block.X += speed2;
            block.Y += speed1;
        }

        base.Update(gameTime);
        
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        _spriteBatch.Begin();
        foreach (Block block in blocks)
        {
            block.Draw(_spriteBatch, pixelTexture);
        }
        _spriteBatch.End();

        base.Draw(gameTime);
    }
}
}

然后是 Block.cs

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

namespace Project_blob
 {
 public class Block
{
        public int X { get; set; } = 100;
        public int Y { get; set; } = 100;
        public Color Color { get; set; } = Color.Red;
        public int speed1 = 1;
        public int speed2 = -1;

   
   


    public void Draw(SpriteBatch spriteBatch, Texture2D texture)
        {
            spriteBatch.Draw(texture, new Rectangle(X, Y, 30, 30), Color);
        }
    
}
}

如果您能在我的项目中帮助我,将不胜感激。

【问题讨论】:

    标签: c# block game-physics monogame bounce


    【解决方案1】:

    我建议将它们放在个人 Update() 类中。他们需要使用本地的speed1speed2 变量,并且应该删除game1.cs 中的全局speed1speed2 以避免混淆。

    类似这样的:

    在game1.cs中:

    protected override void Update(GameTime gameTime)
    {
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
            Exit();
    
        foreach (Block block in blocks)
        {
            block.Update();
        }
    
        base.Update(gameTime);
        
    }
    

    在 Block.cs 中:

    public void Update()
    {
        if (X < 0) speed2 += 1;
        if (X > 770) speed2 += -1;
        if (Y > 450) speed1 += -1;
        if (Y < 0) speed1 += 1;
        if (speed1 < -1) speed1 = -1;
        if (speed1 > 1) speed1 = 1;
        if (speed2 < -1) speed2 = -1;
        if (speed2 > 1) speed2 = 1;
        X += speed2;
        Y += speed1;
    }
    

    【讨论】:

      【解决方案2】:

      您的游戏中有speed1speed2 的全局变量,我认为您正在尝试为每个单独的块计算这些变量。只需在循环中将它们设为本地并在每次迭代时重置它们

       foreach (Block block in blocks)
       {
          var speed1 = 1;
          var speed2 = -1;
          if (block.X < 0) speed2 += 1;
          if (block.X > 770) speed2 += -1;
          if (block.Y > 450) speed1 += -1;
          if (block.Y < 0) speed1 += 1;
          if (speed1 < -1) speed1 = -1;
          if (speed1 > 1) speed1 = 1;
          if (speed2 < -1) speed2 = -1;
          if (speed2 > 1) speed2 = 1;
          block.X += speed2;
          block.Y += speed1;
       }
      

      【讨论】:

      • 这似乎在它们独立移动时起作用,但它们在撞到墙壁时不再“弹跳”
      猜你喜欢
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 2012-07-20
      • 2020-09-10
      • 2012-01-03
      • 2021-12-23
      • 2016-03-25
      • 1970-01-01
      相关资源
      最近更新 更多