Screen Shake

From TRCCompSci - AQA Computer Science
Revision as of 12:42, 9 February 2019 by Admin (talk | contribs)
Jump to: navigation, search

In order to complete this tutorial you will need a working monogame project, it will need to draw something to be able to see the screen shake.

Variables

Within the Game1.cs class, add the following variables with your existing ones:

bool shakeScreen = false;
Vector2 shakeOffset = new Vector2(15,0);
int shakeCount = 0;
in maxShakes = 10;

The boolean will set when the screen should shake, the vector2 called shakeOffset will be the direction and amount of shake (15 is the X value and 0 is the Y value). Finally shakeCount will be incremented so we can stop the screen shake when we hit a number of shakes.

Update Method

Now in the update method we need to have something to control when to shake, the code below uses the 'S' key. The shake is achieved by multiplying the shakeOffset by -1. This will alternate the shakeOffset between (15,0) and (-15,0):

            if (Keyboard.GetState().IsKeyDown(Keys.S))
                shakeScreen = true;

            if (shakeScreen && shakeCount<maxShakes)
            {
                shakeOffset *= -1;
                shakeCount++;
            }
            else
            {
                shakeCount = 0;
                shakeScreen = false;
            }

We also use shakeCount and MaxShakes to get the same number of shakes every time. The code above also switches the shakeScreen boolean back to false. So pressing the 'S' key once will do the full number of shakes and then stop.

Draw Method

We are going to use the shakeOffset and apply it to the spriteBatch when the shakeScreen boolean is true:

if (shakeScreen)
    spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null, null, Matrix.CreateTranslation(shakeOffset.X, shakeOffset.Y, 0));
else
    spriteBatch.Begin();

If we want to shake the screen we use one spriteBatch.Begin() which applies a translation offset, and if we do not want a shake we use just a normal spriteBatch.Begin().