0

レーザービーム用のミラー(ボールスプライト)を開発中です。そこで、ミラー(長方形)の比率に従ってレイズビームをリダイレクトしようとしています。衝突するオブジェクトが衝突するのではなく、ある角度 (45 度) である場合、ボールを正しい角度に衝突させるにはどうすればよいですか。

ここに私の作品のスクリーンショットがあります ここに画像の説明を入力

ここに私のコードがあります:

protected override void Initialize()
{
    // TODO: Add your initialization logic here
    ballPosition = new Vector2(this.GraphicsDevice.Viewport.Width / 2,
                   this.GraphicsDevice.Viewport.Height * 0.25f);
    blockPosition = new Vector2(this.GraphicsDevice.Viewport.Width / 2,
                               this.GraphicsDevice.Viewport.Height /2);
    ballVelocity = new Vector2(0, 1);

    base.Initialize();
}

protected override void LoadContent()
{
    // Create a new SpriteBatch, which can be used to draw textures.
    spriteBatch = new SpriteBatch(GraphicsDevice);

    ballTexture = Content.Load<Texture2D>("ball");
    blockTexture = Content.Load<Texture2D>("mirror");

    //create rectangles based off the size of the textures
    ballBounds = new Rectangle((int)(ballPosition.X - ballTexture.Width / 2),
    (int)(ballPosition.Y - ballTexture.Height / 2), ballTexture.Width, ballTexture.Height);

    blockBounds = new Rectangle((int)(blockPosition.X - blockTexture.Width / 2),
    (int)(blockPosition.Y - blockTexture.Height / 2), blockTexture.Width, blockTexture.Height);

    origin.X = blockTexture.Width / 2;
    origin.Y = blockTexture.Height / 2;
    // TODO: use this.Content to load your game content here
    Font1 = Content.Load<SpriteFont>("SpriteFont1");
    FontPos = new Vector2(graphics.GraphicsDevice.Viewport.Width - 100, 20);

}

private float RotationAngle;
  float circle = MathHelper.Pi * 2;
  float angle;

protected override void Update(GameTime gameTime)
{
    //check for collision between the ball and the block, or if the ball is outside the bounds of the screen

    if (ballBounds.Intersects(blockBounds) || !GraphicsDevice.Viewport.Bounds.Contains(ballBounds))
    {
        //we have a simple collision!
        //if it has hit, swap the direction of the ball, and update it's position
        ballVelocity = -ballVelocity;
        ballPosition += ballVelocity * ballSpeed;
    }
    else
    {
        //move the ball a bit
        ballPosition += ballVelocity * ballSpeed;
    }

    //update bounding boxes
    ballBounds.X = (int)ballPosition.X;
    ballBounds.Y = (int)ballPosition.Y;

    blockBounds.X = (int)blockPosition.X;
    blockBounds.Y = (int)blockPosition.Y;

    keyboardState = Keyboard.GetState();

    float val = 1.568017f/90;

    if (keyboardState.IsKeyDown(Keys.Space))
        RotationAngle = RotationAngle + (float)Math.PI;

    if (keyboardState.IsKeyDown(Keys.Left))
        RotationAngle = RotationAngle - val;

    angle = (float)Math.PI / 4.0f;  // 90 degrees
    RotationAngle = angle;
    //   RotationAngle = RotationAngle % circle;
        displayText = RotationAngle.ToString();
    base.Update(gameTime);
}

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

    spriteBatch.Begin();

    // Find the center of the string
    Vector2 FontOrigin = Font1.MeasureString(displayText) / 2;
    spriteBatch.DrawString(Font1, displayText, FontPos, Color.White, 0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
    spriteBatch.Draw(ballTexture, ballPosition, Color.White);
    spriteBatch.Draw(blockTexture, blockPosition,null, Color.White, RotationAngle,origin, 1.0f, SpriteEffects.None, 0f);

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

1 に答える 1

0

オブジェクトがサーフェスに衝突すると、オブジェクトの速度ベクトルがサーフェスの法線ベクトルに反映されることを知っておく必要があります。

接触点で法線ベクトルを計算する必要があります。法線に沿った速度の成分は方向を切り替えますが、法線に垂直な速度の成分は同じままです。

このリンクは役に立つはずです。

于 2013-09-26T23:21:38.633 に答える