Author: aurelien B.

Tutoriels

Tutoriel comment exporter un modèle blender vers un jeu…

Ce tutoriel va vous apprendre comment importer des modèles 3D depuis Blender, vers un jeu source.

Présentation du logiciel et des jeux

Avant de commencer ce tutoriel, définissons ce qu’est Blender et un jeu source.

Blender est un logiciel libre de modélisation, d’animation par ordinateur et de rendu en 3D. Il à était créer en 1998 et développé par la Fondation Blender. Depuis 2019, le logiciel Blender est de plus en plus reconnu par les entreprises de secteur de l’animation 3D, comme Epic Games, Ubisoft et NVIDIA. (wikipédia).

Source est un moteur de jeu 3D développé par Valve en 2004 avec la publication de Counter-Strike: Source et Half-Life 2. Il est de nos jours utilisé pour un logiciel d’animation nommé Source Filmmaker et de nombreux jeux comme Garry’s mod ou Team Fortress 2.

Logiciels nécessaires

Pour ce tutoriel, vous auriez besoin de divers logiciels:

Tutoriel

  • Ouvrez Blender
  • Allez dans Edit puis dans Preferences
  • Une fenêtre s’ouvrira puis allez dans Install et importez le Blender Source Tools
  • Quand L’addon est importé, n’oubliez pas de l’activer en cliquant sur la case avant de fermer la fenêtre
  • Fermez la fenêtre et importez ou créez un modèle 3D sur le logiciel

  • Allez dans Scene Properties
  • Cliquez sur > Source Engine Export et un menu s’ouvrira
  • Sélectionnez un dossier où le modèle sera exporté et cliquez sur SMD. Ensuite appuyez sur Export et cliquez sur « le nom du modèle ».smd

  • Une fois que cela sera fait, vous aurez votre modèle en forma .smd dans le dossier que vous avez choisi.
  • Maintenant ouvrez Notepad ++ et créez un nouveau document
  • Nous allons maintenant configurer le modèle. Tout d’abord le nom du modèle ainsi que le dossier où il sera placé.
$modelname ""Nom de votre speudo"\"nom du modèle".mdl"
  • Ensuite nous devons importer le .smd
$bodygroup "Body"
{
	studio ""nom du modèle"".smd"
}
  • Puis quelques particularités pour que le modèle fonctionne correctement dans le jeu
$surfaceprop "default"

$contents "solid"
  • Il faut aussi noter l’emplacement du dossier où les textures du modèles seront placées.
$cdmaterials "models\"Nom de votre speudo"\"nom du model"\"
  • Il faut impérativement informer si le modèle possède une animation où non. (ici nous avons pas d’animation donc nous utiliserons le seul .smd que nous aurons
$sequence "idle" {
	""nom du modèle".smd"
	fadein 0.2
	fadeout 0.2
	fps 30
}
  • Ce n’est pas nécessaire mais vous pouvez appliquer des collisions au modèle
$collisionmodel ""nom du modèle".smd"
{
	$mass 100
	$inertia 1
	$damping 0
	$rotdamping 0
	$rootbone " "
	$concave
	$maxconvexpieces 57

}
  • Voici à quoi ressemble mon fichier
  • Quand tout cela est terminé. Enregistrez le document en .qc et ouvrez Crowbar.
  • Avant de continuer avec Crowbar, assurez-vous de le paramétrer le logiciel en fonction du jeu que vous souhaitez utiliser!
  • Vous irez ensuite dans Compile et vous sélectionnerez le .qc pour QC input et le répertoire du jeu pour Output to. (j’utilise personnellement le jeu « Team Fortress 2 »)
  • Cliquez ensuite sur Compile
  • Attendez que le modèle finisse de se compiler et regardez si il n’y a aucune erreurs.
  • Quand le modèle est enfin compilé ouvrez le logiciel Hammer qui se trouve dans la répertoire bin de votre jeu \Steam\steamapps\common\« le jeu« \bin
  • Ouvrez ou créez une map
  • Quand vous avez ouvert la map, placé un Entity Tool
  • Une fois placé, cliquez deux fois dessus. Une fenêtre s’ouvrira et changez le info_player_teamspawn en prop_static ou prop_dynamic. Appliquez et changer le modèle en cliquant sur World Model et Browse.
  • Une fenêtre s’ouvrira
  • Cherchez le nom de votre modèles et quand vous l’avez trouvé, cliquez sur ok.
  • Votre modèle est enfin importé dans le jeu mais il n’est pas texturé
  • Pour importer les textures, glissez les textures qui sont généralement en .png dans le logiciel VTFEdit
  • Une fenêtre s’ouvrira, cliquez sur ok
  • Maintenant la texture sélectionnez sera affiché sur le logiciel.
  • Enregistrez le fichier sous en forma .vtf avec le nom que vous avez utilisez sur blender
  • Quand vous avez exporté le .vtf retournez dans file est créez un nouveau fichier. Ceci apparaitra et maintenant nous allons paramétrer la texture
"VertexlitGeneric"
{
	"$basetexture" "models\"Nom de votre speudo"\"nom du model"\"nom de la texture"
}
  • Il faudra écrire ceci et assurez-vous que le chemin du dossier pour la $basetexture corresponde à celui que vous avez rentré dans le .qc pour le $cdmaterials. Voici ce que ça donne pour mon modèle.
  • Quand tout cela est fait. Enregistrez le en forma .VMT
  • Vous avez maintenant vos des fichiers .VTF et .VMT
  • Vous devez maintenant les déplacer dans la destinations de fichier que vous avez écris dans le .VMT et .QC. Pour ça, allez d’abord dans les fichiers du jeu et dans le dossier materials \Steam\steamapps\common\« le jeu« \« nom du jeu raccourcis« \materials
  • Dans ce dossier materials, vous trouverez un dossier models. Ouvrez le et maintenant créez un dossier qui devra comportez le nom de votre speudo que vous avez écris dans le .QC et le .VMT
  • Ouvrez ce dossier et créez un autre dossier qui aura le nom du modèle que vous avez aussi écris dans le .QC et le .VMT
  • Quand tout cela est fait, glissez les fichiers .VTF et .VMT dedans
  • Voici le résultat pour mon modèle
  • Votre modèle sera désormais texturé (n’oubliez pas de relancer votre hammer pour être sûre que le la texture s’applique bien au modèle)
  • Mon modèle ici est à moitié texturé car il comportait à la base 2 textures. On voit bien qu’il n’est pas texturé au niveau des yeux
Projets

Une machine à sous en Python

Jouez à une machine à sous et jeu du nombre inconnu sur python avec de l’argent virtuel ! Obtenez 2 ou 3 fois le même signe et trouvez le nombre inconnu ! Moins de chance de se ruiner !

Présentation du projet

Projet réalisé sur Thonny en Python par COULIBALY Rayan, GARCIA Florian et BRYCKAERT Aurélien de la classe de première 2021-2022 en spécialité NSI.

Nous avons eu l’idée de reconstituer une machine à sous où le but est d’obtenir 2 ou 3 fois le même signe pour ainsi recevoir une somme d’argent variante selon l’argent misé. Nous n’avons mis que 4 symboles différents dans la machine, contrairement à une vraie machine à sous qui en comporte 16 en moyenne.

Nous avons aussi décidé de crée un deuxième mini-jeu : le nombre inconnu. Ce jeu est également connecté au même système d’argent virtuel. Le but est de trouver un nombre caché entre 1 et 1000, la limite est de 10 tentatives mais il faut juste un peu de réflexion pour gagner. L’argent misé sera multiplié par deux et pourra être utilisé dans le jeu de la machine à sous ou dans la boutique.

Style

Pour ce projet, nous avons décidé de créer une machine à sous en style art ASCII. Ce dernier consiste à réaliser une image avec tout type de lettres et de caractères spéciaux. Ceci est totalement esthétique et ne change pas vraiment l’expérience du jeu. Pour le jeu du nombre inconnu, nous n’avons pas pu faire créer un objet en ASCII car il n’y a pas vraiment de moyen pour représenter ce jeu autrement qu’avec du texte. Pour le menu et la boutique, nous avons décidé de faire quelque chose de classique, facile à comprendre. Pour les articles du shop, nous avons décidé de les montrer en art ASCII uniquement quand ils sont achetés par le joueur. C’est comme une récompense pour celui-ci pour d’avoir joué et gagné à nos jeux. Nous n’avons pas fait ces 3 objets en ASCII nous même, voici le lien du site où nous les avions trouvé https://www.asciiart.eu/.

Capture d’écrans

Évolution

La création du projet à commencé en plusieurs parties :

Le design de la machine à sous (visuellement) :

Le groupe à d’abord pensé à comment la machine sera construite, les différents symboles que la machine possèdera ainsi que le nombre de cases qu’elle comportera. Un modèle d’une machine à 6 cases, comportant 7 symboles différents.

Finalement, ça sera un modèle d’une machine à sous contenant 3 cases ainsi que 4 symboles diffèrent qui sera choisie.

                         .-------.
                         |Jackpot|
                  _______|_______|_______
                 |        _       _      |
                 |       | |     | |     |
                 |    ___| | ___ | |_    |
                 |   / __| |/ _ \| __|   | ___
                 |   \__ \ | (_) | |_    |(   )
                 |   |___/_|\___/ \__|   | | |
                 |    ___   ___   ___    | | |
                 | ===___===___===___=== | | |
                 | |*|   |*|   |*|   |*| | | |
                 | |*|   |*|   |*|   |*| |_| |
                 | |*|___|*|___|*|___|*| |___|
                 | ===* *===* *===* *=== |
                 |    /_____________\    |
                 |     |           |     |
                _|     \___________/     |_
               (___________________________)

Symbole: ♥, ♠, 7, ♣

La programmation de la machine à sous :

Nous devions pour la réalisation du fonctionnement de la machine à sous, créer un script qui prendrait 3 valeurs choisissant aléatoirement un des quatre symboles. Pour que l’aléatoire fonctionne, nous devions importer la fonction random au script (Random signifiant aléatoire en anglais). Nous avions ensuite créé trois valeurs, qui correspondent aux trois symboles qui seront dans les cases de la machine à sous.

import random
signe1 = ("♥", "♠", "7", "♣")
num1 = random.randrange(0,4)
signe2 = ("♥", "♠", "7", "♣")
num2 = random.randrange(0,4)
signe3 = ("♥", "♠", "7", "♣")
num3 = random.randrange(0,4)

Le système d’argent est aussi nécessaire à la réalisation d’une machine à sous. Nous avions décidé que le joueur aurait en début de jeu, une somme de 5000€. Nous avons aussi décidé que le joueur ne pourrait pas miser une somme inférieure ou égale à 10€ dans la machine.

money = [5000]

mise = int(input("Combien veux tu miser ? "))
        if mise > money[0]:
            print("tu n'as pas assez d'argent pour miser cette somme")
            slot()           
        if mise >= 10:
            money[0] = money[0] - mise
            print("")
            print("          -",mise,"€")

Nous avons ensuite créé les scritps qui récompensent ou non le joueur lorsqu’il gagne ou perd. La mise est multipliée par 5 puis mise au carré lorsque le joueur obtient 3 symboles identiques, et par 4 lorsqu’il obtient 2 symboles identiques et rien si il obtient aucun symboles identiques.

if signe1[num1] == signe2[num2] == signe3[num3]:
	gagne = 5*mise**2 
	money[0] = money[0] + gagne
	print("Bravo! tu as gagné ",gagne,"€")
elif signe1[num1] == signe2[num2]:
	gagne2 = mise * 4
	money[0] = money[0] + gagne2
	print("Bravo! tu as gagné ",gagne2,"€")
elif signe2[num2] == signe3[num3]:
	gagne3 = mise * 4
	money[0] = money[0] + gagne3
	print("Bravo! tu as gagné ",gagne3,"€")
elif signe1[num1] == signe3[num3]:
	gagne4 = mise * 4
	money[0] = money[0] + gagne4
	print("Bravo! tu as gagné ",gagne4,"€")
elif signe1[num1] != signe2[num2] != signe3[num3]:
	perd = mise*0
	money[0] = money[0] + perd
	print("Dommage tu as perdu cette fois-ci !")

La programmation du jeu du nombre inconnu :

Pour ce deuxième mini-jeu, nous avions aussi eu besoin de l’aléatoire, en effet le nombre que le joueur doit trouver est compris en 1 et 1000. Nous devions aussi faire en sorte que le joueur possède 10 essais pour trouver le nombre inconnu. Pour faire cela nous avions entré une valeur nommé « nb_coup » égale à 10 qui correspond donc aux nombres d’essais restants du joueur. A chaque réponse, « nb_coup » sera soustraite de 1 et quand cette valeur sera à 0, le joueur aura perdu. La valeur « nb_test » est la nombre écrit par le joueur, cette valeur sera utilisée pour annoncer si le nombre inconnu est supérieur ou inférieur au nombre choisi ou si elle correspond au nombre inconnu.

mise2 = int(input("Combien d'argent jouez vous ?\t"))
        if mise2 > money[0]:
            print("Tu n'as pas assez d'argent pour miser cette somme")
            le_nombre_inconnu()
        nb_inconnu = random.randint(1,1000)
        nb_coup=10
        while nb_coup>0:
            print("\n")
            nb_test = input("Entrez un nombre : ")
            nb_coup = nb_coup - 1
            nb_test = int(nb_test)
            if nb_test < nb_inconnu :
                print("\n")
                print(nb_test, ": Plus haut\n")
                print("Il te reste", nb_coup, "essai(s)\n")
            if nb_test > nb_inconnu :
                print("\n")
                print(nb_test, ": Plus bas\n")
                print("Il te reste", nb_coup, "essai(s)\n")
            if nb_test == nb_inconnu :
                print(nb_test, ": Trop fort\n")
            	money[0] = money[0] - mise2
                mise2 = mise2 + mise2
                mise3 = mise2 + money[0]
                print("Bravo, tu as maintenant", mise3," € \n")

La programmation du menu :

Un menu était nécessaire pour choisir à quel jeu le joueur veut-il jouer, soit la machine à sous, soit le jeu du nombre inconnu. C’est un script assez simple à réaliser et est majoritairement composé de « print ». Dans ce menu nous avons 3 choix. Tout d’abord, le choix des deux jeux (machine à sous et nombre inconnu) et le choix pour la boutique. La boutique étant du contenue ajouté en dernier. slot() correspond au script de la machine à sous, le_nombre_inconnu() correspond au jeu du nombre inconnu et shop() correspond à la boutique.

    time.sleep(1)
    print("\n")
    print("|------------------------------------|")
    print("|---------- MENU PRINCIPAL ----------|")
    print("|------------------------------------|\n")
    print("Tu as",money[0],"€\n")
    print("|-- A quel jeu voulez vous jouer ? --|\t")
    print("\n")
    print("1. Machine à sous\n")
    print("2. Le nombre inconnu\n")
    print("|------------------------------------|\n")
    print("3. Shop\n")
    choix=int(input("Veuillez selectionner votre choix:\t"))
    print("\n")
    if choix==1:
        slot()
    if choix==2:
        le_nombre_inconnu()
    elif choix==3:
        shop()
    else:
        print("Choix non valide\n")

Pour retourner au menu depuis les jeux, nous avons créé un script proposant au joueur un choix, s’il veut retourner au menu ou continuer à jouer. game() correspond au script du menu, et slot() correspond au script de la machine à sous, comme dit précédemment.

def continuer():
    print("Voulez-vous continuer?\n")
    print("1.Oui\n")
    print("2.Non (retour au menu)\n")
    choix2=int(input("Veuillez selectionner votre choix:\t"))
    if choix2==1:
        slot()
    elif choix2==2:
        game()
    else:
        print("Choix non valide\n")

La programmation de la boutique :

L’ajout d’une boutique sert à donné une sorte de but dans notre programme. Les jeux nous faisant gagner ou perdre de l’argent sans réel but n’ont pas vraiment d’intérêts à être joué. La programmation de la boutique est très similaire à celle du menu, en effet plusieurs choix nous sont proposés, comme au menu. Ce script est divisé en deux car on ne voulait pas que la phrase d’accueil de la boutique se répète à chaque fois.

def shop():
    print("   _____ _                 ")
    print("  / ____| |                ")
    print(" | (___ | |__   ___  _ __  ")
    print("  \___ \| '_ \ / _ \| '_ \ ")
    print("  ____) | | | | (_) | |_) |")
    print(" |_____/|_| |_|\___/| .__/ ")
    print("                    | |    ")
    print("                    |_| ")
    time.sleep(1)
    print("\n")
    print("Bienvenue dans la boutique!\n")
    shop2()
    
def shop2():
    print("Tu as",money[0],"€\n")
    time.sleep(0.5)
    print("|------------------------------------|\n")
    time.sleep(0.5)
    print("1.Bouteille d'eau (5001€)\n")
    time.sleep(0.5)
    print("2.Peluche ours (6000€)\n")
    time.sleep(0.5)
    print("3.Voiture neuve (10000€)\n")
    time.sleep(0.5)
    print("|------------------------------------|\n")
    time.sleep(0.5)
    print("4.retour au menu\n")
    time.sleep(0.5)
    choix3=int(input("Que souhaitez vous acheter ?:\t"))

L’importation du temps et du son :

Pour rendre le script plus sympathique et moins agressif, nous avions importer des son de victoire ou de défaite ainsi que durant les apparitions de texte, du temps entre chaque texte pour ne pas rendre le joueur confus à cause d’une surabondance de texte.

import winsound
import time

winsound.PlaySound("", winsound.SND_ASYNC)
time.sleep()

Problèmes rencontrés

Nous n’avons pas vraiment rencontré beaucoup de problèmes durant ce projet, le seul problème était de rassembler tout les scripts dans un seul et même script. Nous avions commencé à programmer chacun dans notre coin en tapant des valeurs se nommant différemment alors qu’elles sont les même.

Heureusement nous avons réussi à tout rassembler, sinon nous n’aurions aurait pas pu finir le projet!

Conclusion

Ainsi, ce projet était vraiment intéressant, nous avions pris plaisir à y travailler dessus. Cela fut enrichissant, car par la pratique, nous avions beaucoup appris !

Voici notre script :