如何向不同方向移动球?

时间:2017-03-16 14:15:43

标签: c# monogame pong

现在,当我击中空格键时,它将向左或向右移动,我希望球能够第一次直接进行。然后当球击中墙壁,阻挡或线后,我希望球随机指向“-1” “ 不知何故。这是我的第一个学校游戏项目,它是一个单线乒乓球游戏。

编辑:编辑我添加了“boll_speed.X = random.Next(-1,1);”,这完美无缺!

  • linje = line
  • liv = lives
  • boll = ball
  • poang = points
  • 我现在不使用“blockröd= blockred”
  • blockgrön= blockgreen

    public class Game1 : Game
    {
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    SpriteFont spritefont;
    Texture2D linje_texture;
    Texture2D boll_texture;
    Texture2D blockröd_texture;
    Texture2D blockgrön_texture;
    Texture2D gameover_texture;
    Rectangle linje_rect;
    Rectangle boll_rect;
    Rectangle blockröd_rect;
    Rectangle blockgrön_rect;
    Rectangle gameover_rect;
    
    Vector2 linje_speed;
    Vector2 boll_speed;
    
    Random random;
    
    int liv;
    int poang;
    int highscore;
    
    List<Rectangle> block = new List<Rectangle>();
    
    bool Start = false;
    
    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    
        graphics.PreferredBackBufferWidth = 760; 
        graphics.PreferredBackBufferHeight = 620;
    }
    
    protected override void Initialize()
    {
        linje_speed.X = 5f;
        boll_speed.X = boll_speed.X = random.Next(-1, 1);
        boll_speed.Y = 6f;
        liv = 3;
        poang = 0;
    
        random = new Random();
    
        base.Initialize();
    }
    
    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        spritefont = Content.Load<SpriteFont>("Fonts/Myfont");
        linje_texture = Content.Load<Texture2D>("Pics/linje-lång");
        boll_texture = Content.Load<Texture2D>("Pics/boll");
        blockgrön_texture = Content.Load<Texture2D>("Pics/block-grön");
        blockröd_texture = Content.Load<Texture2D>("Pics/block-röd");
        gameover_texture = Content.Load<Texture2D>("Pics/GameOver");
        linje_rect = new Rectangle((Window.ClientBounds.Width - linje_texture.Width) / 2, 580, linje_texture.Width, linje_texture.Height);
        boll_rect = new Rectangle((Window.ClientBounds.Width - boll_texture.Width) / 2, 556, boll_texture.Width, boll_texture.Height);
        gameover_rect = new Rectangle((Window.ClientBounds.Width / 2) - (gameover_texture.Width / 2), (Window.ClientBounds.Height / 2) - gameover_texture.Height / 2, gameover_texture.Width, gameover_texture.Height);
    
        block.Add(blockgrön_rect);
        block.Add(blockröd_rect);
        for (int i = 1; i < 5; i++)
        {
            for (int g = 1; g < 13; g++)
            {
                block.Add(new Rectangle((g * 63) - 60, (i * 40), blockgrön_texture.Width, blockgrön_texture.Height));
            }
        }
    }
    
    protected override void UnloadContent()
    {
        // TODO: Unload any non ContentManager content here
    }
    
    protected override void Update(GameTime gameTime)
    {
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
            Exit();
        if (Start == true) 
        {
            boll_rect.X += (int)boll_speed.X;
            boll_rect.Y += (int)boll_speed.Y;
        }
    
        if(Start == false)
        {
            boll_rect.X = linje_rect.X + ((linje_texture.Width / 2) - (boll_texture.Width / 2));
        }
        if (boll_rect.X > Window.ClientBounds.Width - boll_texture.Width || boll_rect.X < 0) 
            boll_speed.X *= -1;
    
        if (boll_rect.Y > Window.ClientBounds.Height - boll_texture.Height || boll_rect.Y < 0) 
            boll_speed.Y *= -1;
    
        if (boll_rect.Y > Window.ClientBounds.Height - boll_texture.Height) 
        {
            liv -= 1;
            Start = false;
            boll_rect.X = (Window.ClientBounds.Width - boll_texture.Width) / 2; 
            boll_rect.Y = 556; 
            linje_rect.X = (Window.ClientBounds.Width - linje_texture.Width) / 2;
            linje_rect.Y = 580; 
        }
    
        KeyboardState ks = Keyboard.GetState();
        if (ks.IsKeyDown(Keys.Left)) 
        {
            linje_rect.X -= (int)linje_speed.X;
        }
        else if (ks.IsKeyDown(Keys.Right)) 
        {
            linje_rect.X += (int)linje_speed.X;
        }
        else if (ks.IsKeyDown(Keys.Space)) 
        {
            Start = true;
        }
    
        if (linje_rect.X > Window.ClientBounds.Width - linje_texture.Width) 
            linje_rect.X = (Window.ClientBounds.Width - linje_texture.Width);
    
        if (linje_rect.X < 0) 
            linje_rect.X = 0;
    
        if (linje_rect.Intersects(boll_rect)) 
        {
            boll_speed.Y *= -1;
        }
    
        base.Update(gameTime);
    }
    
    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.Black);
    
        spriteBatch.Begin();
        if (liv > 0)
        {
            spriteBatch.Draw(linje_texture, linje_rect, Color.White);
            spriteBatch.Draw(boll_texture, boll_rect, Color.White);
            spriteBatch.DrawString(spritefont, "Liv kvar: " + liv, Vector2.Zero, Color.White);
            spriteBatch.DrawString(spritefont, "Points: " + poang, new Vector2(350, 0), Color.White);
            spriteBatch.DrawString(spritefont, "Highscore: " + highscore, new Vector2(660, 0), Color.White);
            foreach (Rectangle g in block) 
            {
                spriteBatch.Draw(blockgrön_texture, g, Color.White);
            }
        }
        if (liv == 0)
        {
            spriteBatch.Draw(gameover_texture, gameover_rect, Color.White);
        }
        spriteBatch.End();
    
        base.Draw(gameTime);
    }
    }
    

这些部分出现问题:

        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))
            Exit();
        if (Start == true) 
        {
            boll_rect.X += (int)boll_speed.X;
            boll_rect.Y += (int)boll_speed.Y;
        }
        if (boll_rect.X > Window.ClientBounds.Width - boll_texture.Width || boll_rect.X < 0) 
            boll_speed.X *= -1;

        if (boll_rect.Y > Window.ClientBounds.Height - boll_texture.Height || boll_rect.Y < 0) 
            boll_speed.Y *= -1;
        else if (ks.IsKeyDown(Keys.Space)) 
        {
            Start = true;
        }
        if (linje_rect.Intersects(boll_rect)) 
        {
            boll_speed.Y *= -1;
            boll_speed.Y += random.Next(-100, 101) / 100.0f;
            boll_speed.X *= -1;
            boll_speed.X += random.Next(-100, 101) / 100.0f;
        }

3 个答案:

答案 0 :(得分:2)

我会给你一般的想法。请根据您的示例进行调整

假设您想要移动到电路板上的所有方向,现在将您的电路板想象成一个二维数组(所有像素在该电路板上都有x,y表示)

(0,0)标记了电路板的左上角,而(宽度,高度)标记在右下角。你的球位于(x,y)位置的棋盘中间,其中x> 0和x&lt; (板的宽度)和y&gt; 0和y&lt;高度。

根据下图,您有8个不同的指示

enter image description here

现在是时候将这些方向转换为逻辑结构了。你需要为它创建一个数组,假设我们想从NW方向开始。我将创建一个数组,其中包含您需要添加到(x,y)位置的数字,以便继续按照您选择的方向前进。如果你看到我正在创建一个双向数组

enter image description here

现在这是你想法的伪代码:

    int[,] directions = new int[,]{{-1,-1,-1,0,1,1,1,0}, {-1,0,1,1,1,0,-1,-1}};

    public void Move(Game game)
    {
       Point currentPosition = GetYourCurrentPosition(); //the x, y
       int direction = GetYourRandomDirection() //this should be a random number between 0 and 7, beucase the array for directions has 8 positions. 


           int xDirection = directions[0, direction];
           int yDirection = directions[1, direction];

            //move inside the board forever
            while(true)
            {
               while(ICanMoveTo(currentPosition.X + xDirection, currentPosition.Y + yDirection)
               {
                 //keep moving on the same direction
                 currentPosition.X += xDirection;
                 currentPosition.Y += yDirection;
               } 

               //if you can't move anymore in the same direction, then change
               direction = GetYourRandomDirection();
               xDirection = directions[0, direction];
               yDirection = directions[1, direction];
             }
        }

答案 1 :(得分:1)

Random.Next(-1)应该会给你越界错误。

您可以使用类似Random.Next(-200, 0)/100.0f的内容,它会返回介于-2和0之间的负数(包括-2,不包括0)。

但请注意,这种倍增将导致球随着时间的推移而减速。它可能加速到当前速度的两倍,但它可以一步减速到接近0。因此,我宁愿首先在y方向上反转球速度,如果你击中水平线,则在x中保持相同,如果你击中垂直线,则在x中反转并保持在y。然后随机添加零均值常数。

boll_speed.Y *= -1;
boll_speed.Y += random.Next(-100, 101)/100.0f; // Add random number between -1 and 1 with 0.01 precision.
// and nearly the same for X. Depending on the lines hit.

答案 2 :(得分:0)

我认为你的意思是你希望球在到达窗口边界或线条时随机改变方向。如果是这样的话:

您为方向更改使用常量值。添加随机函数以将boll_speed乘以。

例如,在伪代码中,而不是-1,执行随机(-1)。