Prototypons un jeu Trainpunk

Créer des prototypes de jeux rapides et simples est un excellent moyen de tester rapidement de nouvelles idées de jeu, sans s’engager à créer un jeu complet. J'aime utiliser Game Maker pour cela, et dans cet article, je vais partager un de ces jeux avec vous: Trainpunk, un jeu de stratégie basé sur le train..

Note de l'éditeur: Ceci est un nouveau type de message que nous n’avons jamais essayé. S'il vous plaît laissez-nous savoir ce que vous pensez, et si vous souhaitez voir des messages similaires à l'avenir!


Démo Concept et Gameplay

Voici une vidéo de moi décrivant le concept original du jeu, puis de moi jouant du jeu prototype lui-même:

Je me montrerais aussi en train de dessiner, mais c’est tellement simple qu’il n’ya aucune raison de le faire..

Lors du dernier match, deux équipes de trains tentent d’attaquer la base ennemie en se faisant tirer dessus par des tourelles. Vous jouez en appliquant des mises à jour à l'aide des boutons en bas.

Téléchargez le jeu final (plus le code source et les sprites) et modifiez le gameplay autant que vous le souhaitez! Vous aurez besoin d'une copie de Game Maker 8.


Construire le jeu

Voici un aperçu des étapes que j'ai effectuées pour créer le jeu. Vous pouvez suivre depuis le début ou utiliser ceci pour mieux comprendre la source complète.

Étape 1

Téléchargez Game Maker 8 et ouvrez-le.

Étape 2

Créer un nouveau JEU objet, avec ces propriétés:

  • Lutin: "Pas de sprite"
  • Solide: faux
  • Visible: vrai
  • Profondeur: -999
  • Persistant: vrai
  • Parent: (pas de parent)
  • Masque: (identique au sprite)

Donnez-lui ces événements:

 #Create Event: exécuter le code: alarm [0] = 150; #Alarm Event for alarm 0: code d'exécution: alarm [0] = 150; global.points + = 1; global.pointsB + = 1,25; #Etape: code d'exécution: if! Instance_exists (oUpgradeHP) if! Global.points = 0 global.points - = 1; instance_activate_object (oUpgradeHP); instance_activate_object (oUpgradeRA); instance_activate_object (oUpgradeSS); instance_activate_object (oUpgradeAS);  if! global.pointsB = 0 ID = choisir (1,2,3,4); // si ID = 1 global.hp2 + = 1; si ID = 2 global.ra2 + = 4; si ID = 3 global.ss2 + = 1; si ID = 4 global.as2 = global.as2 / 1.1; // global.pointsB - = 1;  if! instance_exists (oTurretA) instance_deactivate_all (true); dormir (500); game_restart ();  if! instance_exists (oTurretB) instance_deactivate_all (true); dormir (500); game_restart ();  #Other Event: Début du jeu: code d'exécution: // Entraîner l'équipe A global.hp1 = 5; // Points de santé global.ra1 = 64; // Range global.ss1 = 6; // Vitesse de tir globale.as1 = 30; // Vitesse d'attaque // Entraîner l'équipe B global.hp2 = 5; // Points de santé global.ra2 = 64; // Range global.ss2 = 6; // Vitesse de tir globale.as2 = 30; // Vitesse d'attaque global.points = 1; global.pointsB = 1; room_goto_next (); #Draw Event: code d'exécution: draw_set_color (c_black); draw_set_font (font0); // draw_text (x + 4, y + 4, "TEAM [PLAYER] - HP =" + chaîne (global.hp1) + "- RA =" + chaîne (global.ra1) + "- SS =" + chaîne ( global.ss1) + "- AS =" + string (global.as1)); draw_text (x + 4, y + 18, "TEAM [ENEMY_] - HP =" + chaîne (global.hp2) + "- RA =" + chaîne (global.ra2) + "- SS =" + chaîne (global. ss2) + "- AS =" + string (global.as2));

Étape 3

Créer un autre nouvel objet, _Bloc, et le rendre solide. C'est juste pour les regards - ça ne fait pas grand chose.

Étape 4

Créez encore un autre nouvel objet, appelé _BaseA, avec ces propriétés:

  • Lutin: _BaseA
  • Solide: vrai
  • Visible: vrai
  • Profondeur: -1
  • Persistant: faux
  • Parent: (aucun)
  • Masque: (aucun)
  • Le sprite est juste un bloc 16x16. Maintenant, donnez-lui ces événements:

     #Create Event: exécuter le code: hp = 100; #Etape Evénement: code d'exécution: si hp < 0.9 instance_destroy();

    Étape 5

    Voici une image du jeu final, pour référence:

    Cette fois, créez un nouvel objet pour représenter l'un des trains du joueur (un rectangle blanc sur la piste). Appeler _TrainA et lui donner ces propriétés:

    • Lutin: _TrainA
    • Solide: faux
    • Visible: vrai
    • Profondeur: 0
    • Persistant: faux
    • Parent: Faites-en le parent de _BaseA
    • Masque: (aucun)

    Le sprite doit être un train 16x16, tourné à droite. Donnez à l'objet ces événements:

     #Create Event: exécuter le code: // Former l'équipe A // Définit les statistiques en variables globales décidées par les mises à niveau. hp = global.hp1; // Points de santé ra = global.ra1; // Range ss = global.ss1; // Vitesse de tir as = global.as1; // Vitesse d'attaque direction = 360; vitesse = 2; #Alarm Evénement pour l'alarme 0: quitte cet événement #Step Evénement: code d'exécution: n = instance_nearest (x, y, oBaseB); si distance_à_point (n.x, n.y) < ra  if alarm[0] < 1  i=instance_create(x,y,oBulletA); i.speed = ss; alarm[0] = as; speed = 0;   else speed = 2; if hp < 0.9 instance_destroy(); /* hp = global.hp1; // Health Points ra = global.ra1; // Range ss = global.ss1; // Shoot Speed as = global.as1; // Attack Speed */

    Étape 6

    Nous allons faire les tourelles du joueur maintenant. Créez un nouvel objet appelé Tourelle, et lui donner ces propriétés:

    • Lutin: _TrainA
    • Solide: faux
    • Visible: vrai
    • Profondeur: 0
    • Persistant: faux
    • Parent: oBaseA
    • Masque: (aucun)

    J'ai utilisé le même sprite que pour le train du joueur, ici, mais n'hésitez pas à le changer pour une tourelle réelle. Il devrait être 16x16px. Ajouter les événements:

     #Create Event: exécuter le code: hp = 25; // Points de santé ra = 128; // plage ss = 15; // Vitesse de tir as = 20; // Vitesse d'attaque #Evénement d'alarme pour l'alarme 0: quitter cet événement #Evénement Étape: exécuter le code: n = instance_nearest (x, y, oBaseB); si distance_à_point (n.x, n.y) < ra  if alarm[0] < 1  i=instance_create(x,y,oBulletA); i.speed = ss; alarm[0] = as;   if hp < 0.9 instance_destroy();

    Étape 7

    Les tourelles doivent tirer des balles, alors créez un nouvel objet pour les représenter. Appeler oBulletA, et lui donner ces propriétés:

  • Lutin: _BulletA // Un mince
  • Solide: faux
  • Visible: vrai
  • Profondeur: 1
  • Persistant: faux
  • Parent: (pas de parent)
  • Masque: (identique au sprite)
  • Le sprite doit être une balle fine (1px de haut par 16px de large, dans un carré transparent de 16x16px), tournée vers la droite. Voici ses événements:

     #Create Event: code d'exécution: n = instance_nearest (x, y, oBaseB); direction = point_direction (x, y, n.x, n.y); #Etape Evénement: code d'exécution: image_angle = direction; #Collision Event avec l'objet o_Block: détruit l'instance #Collision Event avec l'objet oBaseB: exécuter le code: #instance_destroy (); autre.hp - = 1;  

    8. Créer un nouvel objet (oSpawnerA)
    Informations sur l'objet: oSpawnerA Sprite: _TrainA // Utilise toujours le train sprite solide: false Visible: false Profondeur: 0 Persistant: false Parent: Masque: Créer un événement: exécuter le code: alarm [0] = 180; instance_create (x, y, oTrainA); Evénement d'alarme pour l'alarme 0: code d'exécution: alarme [0] = 180; instance_create (x, y, oTrainA);

    Étape 9

    Lorsque le joueur peut mettre à jour son HP, le bouton correspondant s’allume:

    Nous allons créer ce bouton maintenant. Créez un nouvel objet appelé oUpgradeHP, et lui donner ces propriétés:

    • Lutin: _UpgradeHP
    • Solide: faux
    • Visible: vrai
    • Profondeur: -99
    • Persistant: faux
    • Parent: (pas de parent)
    • Masque: (identique au sprite)

    Donnez-lui ces événements aussi:

     #Create Event: code d'exécution: image_alpha = 0.5; Evénement de souris pour gauche relâché: code d'exécution: global.hp1 + = 1; instance_deactivate_object (oUpgradeHP); instance_deactivate_object (oUpgradeRA); instance_deactivate_object (oUpgradeSS); instance_deactivate_object (oUpgradeAS); Evénement de souris pour la souris Entrée: code d'exécution: image_alpha = 1; Evénement Mouse for Mouse Leave: code d'exécution: image_alpha = 0.5;

    Étape 10

    Dupliquer oUpgradeHP trois fois pour que vous ayez quatre objets - un bouton pour mettre à niveau HP, RA, SS et AS. (oUpgradeHP, oUpgradeRA, oUpgradeSS, oUpgradeAS).

    Changer la Gauche libéré code de l'événement pour chacun:

     oUpgradeHP -> global.hp1 + = 1; oUpgradeRA -> global.ra1 + = 4; oUpgradeSS -> global.ss1 + = 1; oUpgradeAS -> global.as1 = global.as1 / 1.1;

    Étape 11

    Dupliquer oBaseA, oTrainA, Tourelle, oSpawnerA et oBulletA créer oBaseB, oTrainB, TourelleB, oSpawnerB et oBulletB.

    Changer leurs parents (de "A" à "B") et changer tout leur code de:

     n = instance_nearest (x, y, oBaseB);

    … à:

     n = instance_nearest (x, y, oBaseA);

    … comme demandé.

    Définissez également oTrainB pour avoir direction = 180; dans l'événement create, au lieu de direction = 360;. Enfin, choisissez des sprites tournés vers la gauche pour chacun, le cas échéant.

    Étape 12

    Ajoutez tous vos tilesets, sprites, œuvres d'art, etc. et créez deux nouvelles salles: l'une est rm_intro, où vous ne devriez mettre que le obj_Game, et l'autre est la pièce principale (rm_main).

    Construisez votre rm_main ainsi:

    1. Placez les bases de chaque côté.
    2. Placez les voies ferrées partant des bases (vous pouvez utiliser le tileset dans le téléchargement source).
    3. Placez des tourelles pour défendre; quand toutes les tourelles sont mortes, l'autre équipe gagne.
    4. Placez les géniteurs, qui génèrent de nouveaux trains à intervalles réguliers.
    5. Placez les quatre boutons de mise à niveau.

    Vous pouvez essayer de rendre la pièce symétrique pour qu'elle soit un peu juste, ou de placer plus de tourelles du côté Ennemi pour un gameplay plus difficile. C'est à vous de décider - le but d'un prototype est de tester des choses!

    Maintenant, jouez le jeu. Pendant que vous jouez, réfléchissez à ce qui doit changer. Les trains devraient-ils être plus rapides ou plus lents? Les mises à jour devraient-elles venir plus souvent? L'ordinateur devrait-il avoir un avantage injuste? Le joueur doit-il avoir plus d’intrants que d’appliquer des mises à niveau? Tweak loin!

    J'espère que vous avez appris un peu quelque chose sur la création de jeux - mais plus important encore, j'espère que vous avez appris comment toute idée peut être rapidement transformée en un prototype..

    Note de l'éditeur: Ceci est un nouveau type de message que nous n’avons jamais essayé. S'il vous plaît laissez-nous savoir ce que vous pensez! Y a-t-il quelque chose que vous voudriez nous voir faire différemment avec le format à l'avenir? Souhaitez-vous plus de détails dans la vidéo ou un ensemble plus complet d'instructions pour créer le jeu??