I made the following changes/additions to the game engine:

1) In the GameEngine class, I added logic to the addEntity method so an entity will only be added to the resepctive entity list if it is not null.
Note that the method addEntity is private and is called by the public methods addEnemy, addPlayerShot, addEnemyShot and addPowerup.

2) In the GameEngine class, I added more decimal places to the debug information for the loop sleep time.

3) In the class Entity2D I added some additional comments

4) In the EntityImage class, I added the same code to the setImage method that already exists in the loadImage method with respect to waiting until the image is loaded (by checking the image observer) before accessing image attributes such as the width and height to set the image dimensions.

5) In the class EntityShape I added a constant DEFAULT_COLOR rather than using the reference Color.RED.

6) In the class EntityRectangle for the constructor EntityRectangle(Color color) I was not assigning the user specified color to the color attribute and was instead using the default color. I corrected this so not the user specified color is now used.

7) In the class StaticText I added a default message if the user did not define one and I also added a method setText so the user can change the message. Note that the the text is static with regards to not moving on the screen. The contents can change as in the case of a score.

8) I added two new methods to the GameUtility class, calcAngleMoveX and calcAngleMoveY

9) I fixed a problem with testing the collisions between the player shot and the enemies. I use a nested loop where I comapare each player shot (the outer loop) with each enemy (the inner loop). I had the condition for testing if the player shot was alive outside of the inner loop. Therefore, if a player shot collided with an enemy on iteration i and was marked as dead (i.e., !alive), the dead player shot would still be compared to the remaining enemies if they also collided with the dead shot. I moved the condition to test for a dead player shot inside of the inner loop. Now when the player shot collides with a particular enemy, it is marked dead and will not be comapred to any other enemies in the remaining iterations in the inner loop.