Book Read Free

Introduction To Game Design & Programming in GameMaker Studio 2

Page 4

by Ben Tyers


  Crowd Funding

  Put simply, crowd funding is getting small amounts of money from lots of people. It is usually done via the internet, and is a great and growing way to fund small (and sometimes) large projects.

  KickStarter

  Kickstarter is a great site for raising funds for your game project. Basically, you offer rewards at set price tears, and people pledge money in advance of release of your game.

  IndieGoGo

  Similar to Kickstarter, though perhaps more suited to indie game projects.

  Patreon

  A great way to raise funds every month. Users make a monthly pledge (from as little as $1) to access your posts, blogs, etc.

  A great way to make use of this platform is to make a game that updates each month (for example a bonus level) and your patreons get this update (setting this up is easier than it sounds). $1 a time doesn’t sound a lot, but as soon as you start getting hundreds of patreons, this can stack up quite quickly.

  Social Media

  Although social media cannot raise funds itself (OK, there are exceptions), it is a great way to make people aware of your game, and crowdfunding / patreon projects. If you put good content out there, you will get followers. Keep your followers aware of your projects and progress.

  Steam Early Access

  Another option is Steam’s Early Access, you allow players to test and play various stages of your game throughout production. It has the added bonus of being able to get feedback early on and address any issues as they arrive. A great option all-round.

  Chapter 4 Game Assets

  Just a brief chapter on game assets, as it is covered in more detail in other chapters.

  I consider the following important points to consider when sourcing assets (both audio and graphics):

  Is it worth the price? Are you over paying for an asset that will mean many game sales before you get your investment back?

  Does the graphics / audio match in with you game theme and other assets?

  Have you purchased the correct licence?

  Have read the licence correctly?

  If using a free font, did you say thanks with a donation?

  Is the asset ready to use in your project? Or require lots of additional work?

  If it is a free asset, did you give credit to the author?

  Chapter 5 Refining Resources

  Off the shelf assets are unlikely to be game ready. This chapter shows some methods to prepare assets ready for use. Graphics are down in GameMaker Studio’2 built in editor, audio is done with Audacity.

  Graphics

  For the purpose of this chapter I’ll be using graphics from the excellent site: GameDeveloperStudio.com

  Note: I like to use PNG files for sprites, as they can be set to be transparent. JPG files do not have this, so would need editing prior to use.

  Sprites from this site come in two formats, as sprite sheets and as separate images.

  Figure 5_1 shows as sprite sheets, and Figure 5_2 as separate image.

  Figure 5_1: Sprite sheet example.

  Figure 5_2: Showing as separate images

  The figures below show the steps for importing and processing a sprite sheet. First right-click on Sprites in the resources tree:

  Figure 5_3: Right click and create a sprite

  Figure 5_4: Selecting edit image

  Figure 5_5: Selecting import strip image

  If you look at Figure 5_1 you will see the sprite sheet is 5 frames wide and 4 deep. If you open the folder that has the image in (do this is in Windows not GameMaker Studio 2), and hover the mouse over the image you’ll see a popup showing the whole dimensions of the sprite, as shown in Figure 5_6:

  Figure 5_6: Showing image dimensions

  Using a bit of math we can figure out that each subimage is 803 pixels wide and 846 high, and there are 20 images.

  If we plug these values to the importer, as shown in Figure 5_7:

  Figure 5_7: Showing import settings

  We then end up with the sub images added, as shown in Figure 5_8:

  Figure 5_8: Showing sprite after import convestion

  You now have sprites that are nearly ready for your game.

  The Figure’s below show the process for importing multiple sub images. First create a new sprite, name is spr_example_2 for example:

  Figure 5_9: Create a new sprite

  Next select Import Image:

  Figure 5_10: Selecting import option

  Next select which sprites you want to import, you can use control and shift to select multiple images. This is shown in Figure 5_11:

  Figure 5_11: Selecting multiple images to import

  Figure 5_12 below shows the sprites successfully imported:

  Figure 5_12: Showing sprite images imported

  The sprites for GameDeveloperStudio.com are of a very high quality and of a high resolution, so in most case you will want to change the size to suite your game.

  For example, spr_example_2 has a size of 1271 by 1080 pixels, see Figure 5_13:

  Figure 5_13: Showing sprite size

  It’s a quick and easy process to resize sprites, regardless of 1 or multiple frames. Open up the editor by clicking on Edit Image. As shown in Figure 5_14:

  Figure 5_14: Selecting edit image option

  Next under image, choose resize all frames:

  Figure 5_14: resize all frames option

  Figure 5_15 shows an example setting for resizing all frames:

  Figure 5_15: Resizing frames

  Other things you might want to do with a sprite, using GameMaker Studio 2’s built in editor. These are actions I use often in my game projects. Figure 5_16 below shows a sprite without any changes:

  Figure 5_16: Showing sprite without changes

  If you want an object moving in the opposite direction you can mirror:

  Figure 5_16: Showing sprite mirrored

  You may want to gray out a sprite, for example when an upgrade is not available:

  Figure 5_17: Sprite with gray scale

  Motion blur can create a cool effect:

  Figure 5_18: Showing a blur effect

  If you have multiple similar objects, you want to change some colours so the player can see the difference, as shown in Figure 5_19:

  Figure 5_19: Showing some colour changed

  Audio

  As with graphics, audio will sometimes need a bit of tweaking. For this chapter I have used audio from SoundImage.org and am using Audacity as the audio editor (see Chapter 3 for my thoughts on Audacity).

  Note: The wav file format should be used for sound effects, as it plays almost instantanious. MP3 of OGG format should be used for audio such as music, as it requires some extra processing.

  Sometimes when you get a sound asset there is a short bit of silence before the actual sound playing, as shown in Figure 5_20. If this was sound effect used in game, this short bit of silence would mean a delay, so would not sync with something else in you game, such as a sound effect.

  Figure 5_20: Showing silence before sound

  This can easily fixed by selecting the silent area, as shown in Figure 5_21:

  Figure 5_21: Selecting part of the audio

  Just hit delete and it is magically removed:

  Figure 5_22: Showing edited sound

  Figure 5_23 below shows some music audio:

  Figure 5_23: Showing an audio track

  Sometimes music may be too long, so can select and delete part of the track if you wish:

  Figure 5_24 shows the track clipped:

  Figure 5_24: Track with part removed

  This ending of this music will end quite apruptly. You can select part of the track, then fade out from the effects option, this is how the above would look after fading:

  Figure 5_25: Showing clipped track with fading

  Audacity has quite an assortment of effects you can apply to your music or audio. My personal favourites are echo and distortion

  Chapter 6 Beta Testing & Debugging

/>   Beta Testing

  I have decided to place this chapter before the programming one, even though you would obviously take on feedback after you have programmed an initial idea. The reason for this is that the programming section will include changes made after the debugging stage, so in chapter 7 you will see the finished project.

  You’re unikely to go error free on the first attempt. Beta testing allows you to find errors, issues and problems and act upton them. Usually your beta project will be sent to as many people as possible in order to get some feedback. You don’t need to act upon every suggestion – though you are likely to get many good ideas. Feedback could cover issues such as:

  Crashing

  Poor controls

  Graphic issues

  Playability suggestions

  Changing game difficulty

  When I do beta testing, I’m always amazed by some of the great ideas that beta testers provide, and help propel my game to the next level.

  There is a file in the download resources: Game_Base.zip which shows the game before feedback from the beta testers has been taken on board. You may find it of interest to compare this with the finished game project.

  Here is screen shot of the game room before changes have been made:

  Figure 6_1: Showing game before beta testing feedback

  This is a summary of the feedback I received from my Beta Testers:

  Graphics are too large

  Not responsive enough

  Too easy

  Player weapons are too slow

  HUD is not in keeping with the rest of the game

  Aspect ratio should be changed

  Collision masks are impresise

  GUI life and dots not in keeping with game style

  To visually show damage to player

  The following shows how I worked on and addressed the issues above. It’s not totally inclusive, but does show the process of working with the given feedback.

  Graphics are too large

  One piece of feedback was that sprites are too large. Let’s address that.

  Figure 6_2 below shows the main player sprite setting:

  Figure 6_2: Showing current player sprite

  The current size is 192x182. We’ll reduce the size by 50%. We can click Edit Image and Resize All Frames, as shown in Figure 6_3:

  Figure 6_3: Resize all frames

  Figure 6_4 shows the settings needed to reduce the size by 50%:

  Figure 6_4: Reducing size by 50%

  We will repeat the process with all the game level sprites.

  Because the sprites has changed size, we will also update the sprite origin of all sprites as we go.

  You should now test the game and ensure everything works as planned. You will probably find that a few tweaks are needed here and there, namely check that the collision masks cover the correct location and size, and that spawning of weapons takes into the reduced sizes.

  Figure 6_5 shows the game with all sprites reduced by 50%:

  Figure 6_5: Showing game with updated sprite sizes

  Not responsive enough

  Another piece of feedback was that player movement was a bit sluggish.

  The current movement code is shown below:

  //keep in screen

  y=clamp(y,80,room_height-80);

  //move

  //up down

  nokey=keyboard_check(ord("W"))+keyboard_check(ord("S"));

  if nokey==0

  {

  if y
  if y>flying_level y-=2;

  }

  //forward back

  if keyboard_check(ord("D"))

  {

  x+=4;

  }

  if keyboard_check(ord("A"))

  {

  x-=4;

  }

  x=clamp(x,xx-40,xx+180);

  nokey=keyboard_check(ord("A"))+keyboard_check(ord("D"));

  if nokey==0

  {

  if x
  if x>xx x-=2;

  }

  if keyboard_check(ord("W"))

  {

  y-=4;

  }

  if keyboard_check(ord("S"))

  {

  y+=4;

  }

  We’ll make it 50% more responsive by changing the code to that below. Code in red has been changed:

  //keep in screen

  y=clamp(y,80,room_height-80);

  //move

  //up down

  nokey=keyboard_check(ord("W"))+keyboard_check(ord("S"));

  if nokey==0

  {

  if y
  if y>flying_level y-=3;

  }

  //forward back

  if keyboard_check(ord("D"))

  {

  x+=6;

  }

  if keyboard_check(ord("A"))

  {

  x-=6;

  }

  x=clamp(x,xx-40,xx+180);

  nokey=keyboard_check(ord("A"))+keyboard_check(ord("D"));

  if nokey==0

  {

  if x
  if x>xx x-=3;

  }

  if keyboard_check(ord("W"))

  {

  y-=6;

  }

  if keyboard_check(ord("S"))

  {

  y+=6;

  }

  A quick test shows a marked improvement in player’s control.

  Too easy

  Other feedback was that the game was too easy. Let’s address the underlying reasons for that:

  Enemy hp too low

  Enemy projectiles too slow

  The original code for setting the ground enemy hp was:

  start_hp=global.level;

  Let’s change that to:

  start_hp=global.level*global.level;

  and change the code for the flying enemy to:

  start_hp=global.level*global.level*2;

  and for the boss enemy to:

  start_hp=global.level*global.level*5;

  We’ll make the enemy weapons move and fire faster.

  We’ll start with the flying enemy, the code in the Alarm 0 Event was:

  alarm[0]=room_speed*4;

  arrow=instance_create_layer(x,y,"Enemy_Missile",obj_enemy_arrow_1);

  ang=point_direction(x,y,obj_player.x,obj_player.y);

  arrow.direction=ang;

  arrow.image_angle=ang;

  arrow.speed=10;

  arrow.strength=global.level;

  We’ll change that to:

  alarm[0]=room_speed*3;

  arrow=instance_create_layer(x,y,"Enemy_Missile",obj_enemy_arrow_1);

  ang=point_direction(x,y,obj_player.x,obj_player.y);

  arrow.direction=ang;

  arrow.image_angle=ang;

  arrow.speed=12;

  arrow.strength=global.level;

  This is increase the shooting frequency and projectile speed.

  Similarly we’ll change the shooting code for the boss enemy from:

  alarm[0]=room_speed*3;

  ball=instance_create_layer(x,y,"Enemy_Ball",obj_ball);

  ball.direction=image_angle;

  ball.speed=8;

  to:

  alarm[0]=room_speed*2;

  ball=instance_create_layer(x,y,"Enemy_Ball",obj_ball);

  ball.direction=image_angle;

  ball.speed=12;

  A quick play through of a few levels, shows a marked increase in difficulty.

  Player weapons are too slow

  We can increase the shoot rate and projectile speed with just a few code changes.

  The current code for Global Mouse Left Pressed is:

  if can_shoot_1==false exit;

  var xx = x + lengthdir_x(64, image_angle);

  var yy = y + lengthdir_y(64, image_angle);

  missile=instance_create_layer(xx,yy,"Missiles",obj_player_rocket);

  missile.image_angle=image_angle;

  missile.direction=image_angle;

  missile.speed=4;

  can_shoot_1
=false;

  alarm[1]=room_speed*2;

  We’ll change that to:

  if can_shoot_1==false exit;

  var xx = x + lengthdir_x(64, image_angle);

  var yy = y + lengthdir_y(64, image_angle);

  missile=instance_create_layer(xx,yy,"Missiles",obj_player_rocket);

  missile.image_angle=image_angle;

  missile.direction=image_angle;

  missile.speed=6;

  can_shoot_1=false;

  alarm[1]=room_speed*1.5;

  And the code for Global Right Mouse Pressed from:

  if global.level<13 exit;

  if can_shoot_2==false exit;

  alarm[1]=room_speed;

  show_debug_message("Missile 2");

  var xx = x + lengthdir_x(64, image_angle);

  var yy = y + lengthdir_y(64, image_angle);

  missile=instance_create_layer(xx,yy,"Missiles",obj_player_missile);

  missile.image_angle=image_angle;

  missile.direction=image_angle;

  missile.speed=8;

  can_shoot_2=false;

  alarm[2]=room_speed*2;

  to:

 

‹ Prev