IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Projets Discussion :

Back to roots


Sujet :

Projets

  1. #221
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par pierreyoda Voir le message
    Je vois qu'on parle de Lua

    Avec luabind on peut très facilement exporter ses classes, les wrappers étant nécessaires uniquement en cas d'héritage d'une classe C++ par une classe Lua.

    Bon après c'est souvent du tâtonnement, on lutte contre les bugs... Mais ça reste globalement robuste.
    Cela ne m'intéresse pas beaucoup car, en fait, je ne veux pas rajouter une dépendance à une librairie qui fait du binding.

    Moi je veux simplement que Lua connaisse l'existence d'un objet de type A et puisse appeler ces fonctions, mais cela ne me semble pas évident par Lua de base.

    Jc

  2. #222
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Après un peu de travail, j'ai commencé l'intégration de LUA et C++, cela se passe bien et j'aurai bientôt le vrai premier scénario pour ma tech demo.

    Par contre, je suis passé sur Git, qui est nettement mieux que SVN :-)

  3. #223
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ayé Ayé, je viens de finir un sacré milestone!

    Lua comme interaction, c'est pas mal du tout et bien que dans ce post je vais donner quelques informations sur comment j'ai fait, je ne suis pas forcément persuadé que cela est la meilleure solution. Comme je l'ai déjà dit, Lua est parfaitement intégré avec le C. Par contre, en C++, il existe une pléthore de solutions et j'ai choisi de limiter l'intéraction entre les deux et donc l'exposition de mes classes C++ avec la couche Lua.

    Cela se fait facilement en utilisant ce que certains qualifieront de méthode naïve : j'utilise des fonctions globales qui prennent en argument l'instance de la classe et ensuite j'appelle la fonction associée.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
        static int LuaInterface_AnimatedObjectSetTrip (lua_State *s)
        {
            bool res = false;
            int argc = lua_gettop (s);
            assert (argc == 5);
     
            AnimatedObject *ao = (AnimatedObject *) (lua_topointer (s, 1));
     
            if (ao != 0)
            {
                MapHandler *handler = (MapHandler *) (lua_topointer (s, 2));
                int destX = lua_tonumber (s, 3);
                int destY = lua_tonumber (s, 4);
                int destZ = lua_tonumber (s, 5);
     
                res = ao->setPath (handler, destY, destX, destZ);
            }
     
            //Return res
            lua_pushboolean (s, res);
            return 1;
        }
    permet d'appeler la fonction setPath entre les deux langages. Comme on le voit, le passage entre LUA et un autre langage se fait avec une pile. Par contre, cela explique comment on lie LUA avec mon C++, mais quand est-ce que je fais l'inverse ?

    Et bien cela se fait à plusieurs moment, j'utilise un système de call-back. Pour le moment, les scripts lua existent que pour les Npcs et leur système de conversation. Donc, au début de la conversation et, à chaque réponse, un appel vers Lua se fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        //If we have a state, let's do it
        if (state != 0)
        {
            //Call init function
            lua_getglobal (state, "npcConversationInit");
            lua_call (state, 0, 0);
        }
    où state est en fait la présence ou non d'un script Lua chargé correctement.

    Enfin, que pouvons nous faire ? J'ai fait la démo de la première quête, nous avons :

    - Une réponse dépendante du contenu des objets du groupe
    - Une création de monstre dans une autre map
    - Une vérification des monstres tués
    - Bouger un Npc

    Voici d'abord le script qui gére Annon, le personnage qui bloque l'entrée de la ville jusqu'à ce que nous ayons la cloche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    function npcConversationCommit (npc, handler, group, question)
        if (question == "move") then
            howMuch = LuaInterface_GroupGetObjects (group, "Bell");
     
            if (howMuch == 0) then
                return "I apologize, you cannot pass without the bell", 1, true
            else
                -- Set the trip so that the npc moves
                LuaInterface_AnimatedObjectSetTrip (npc, handler, 15, 23, 0)
                -- Set all schedules so that the Npc stays there
                LuaInterface_NpcChaptersSetAllSchedules (npc, 15, 23, 0)
     
                return "I see you have the bell, you may pass", 1, true
            end
        else
            if (question == "bell" or question == "help") then
                local hasBell = LuaInterface_GroupGetObjects (group, "Bell");
     
                if (hasBell > 0) then
                    return "You have the bell! I can move to let you enter if you wish!", 1, true;
                else
                    return "You need the bell to enter here, ask Camile from North Britanny", 1, true;
                end
            end
        end
        return "", 0, false
    end
    On voit que cela est relativement facile. Le deuxième script est pour le personnage qui crée les monstres et donne la position de la cloche (qu'elle ajoute une fois les monstres tués).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    function npcConversationCommit (npc, handler, group, question)
        if (question == "bell") then
            --Check if we have it already
            local hasBell = LuaInterface_GroupGetObjects (group, "Bell");   
     
            if (hasBell > 0) then
                return "You already have it! Go see Annon now", 1, true;
            end
     
            -- Local variables
            local maxMonsters = 15;
            local key = "getBell";
     
            -- First check if we have already asked for the bell
            local hasKilled = LuaInterface_GroupGetKeyValue (group, "getBell");
     
            -- Load up the castle 2 map
            local handler = LuaInterface_MapHandlerLoadMap ("../ULTIMA5/CASTLE.DAT 2", group);
     
            if (hasKilled == 0) then
                -- Add one so we know
                LuaInterface_GroupIncrementKeyValue (group, key, 1);
     
                -- Add monsters to map
                luaAddMonsters (handler, "getBell", maxMonsters);
     
                return "To get the bell, kill the monsters in West Brittany and come see me", 1, true
            else
                -- It's not 0 so we should have a number of monsters still to kill
                hasKilled = hasKilled - 1;
                local shouldKill = maxMonsters - hasKilled;
     
                if (shouldKill ~= 0) then
                    -- How many are left in the map?
                    local stillHave = LuaInterface_MapHandlerCountAnimatedObjectKeys (handler, "getBell");
     
                    if (stillHave < shouldKill) then
                        luaAddMonsters (handler, key, shouldKill - stillHave);
                    end
     
                    return "To get the bell, you still need to kill "..shouldKill.." monsters", 1, true
                else
                    -- Add the object to the map
                    local object = LuaInterface_ObjectFactoryGetObject ("Bell");
                    -- Now add object
                    LuaInterface_MapHandlerAddHiddenObject (handler, object, 1, 2, 0);
                    return "The monsters are gone, you can find the bell under the top left grave", 1, true
                end
            end
        end
        return "", 0, false
    end
    Au final, nous obtenons la video suivante:


    Jc

  4. #224
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    En continuant à peupler les villages autour du chateau, j'ai rajouté le dernier point important: un guérisseur !

    Nous avons donc un guérisseur entièrement défini en Lua et bien que cela pourrait sûrement être mieux coder, cela tourne en une 100aine de ligne de code.

    Regardez un peu la video: [ame="http://www.youtube.com/watch?v=AO09qyjI6qQ"]YouTube - &#x202a;test 0000&#x202c;&rlm;[/ame]

    Jc

  5. #225
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bonsoir tous,

    Hier, le site Ultimaaiera a émis un article sur le fait que le projet XU4 avait un nouveau "tileset" pour leur port d'Ultima 4. Vu que le projet est Open-Source, j'ai pu regarder leur fichier graphique et jouer avec ce fichier.

    Après un peu de travail pour transformer leur fichier de tuiles en un format 16 * 16 pour mon projet, j'ai réussi à faire une video montrant le passage entre 4 tuiles différentes : la version du jeu de base, la version EGA améliorée, la version VGA nettement meilleure et la nouvelle version de tuiles de XU4 :-)

    Comme je l'avais dit il y a longtemps, un simple appui de F11 permet de passer entre chaque style graphique :

    [ame="http://www.youtube.com/watch?v=XoixsX1in1w"]&#x202a;test 0000&#x202c;&rlm; - YouTube[/ame]
    Jc

  6. #226
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Introduction

    Bon, en un mois, pas grand chose à changer au projet. Beaucoup de travail et des voyages oblige que le projet ait un peu ralenti. Mais au final, cela m'a donné le temps de réfléchir un peu à comment faire les choses.

    Du coup, je me suis attaqué aux bateaux et comment les gérer correctement dans le jeu. C'est à ces moments là qu'on se retrouve un peu seul à se dire : "Hmmm, j'aurai dû penser à cela avant". Comme tout, on ne peut pas tout faire du premier coup, donc j'ai eu quelques soucis avec l'implémentation courante du jeu.

    Le calcul du coût de passage

    Souvenez-vous que mes tuiles ont une association entre la valeur des jeux de base et ma représentation et qu'une ligne par exemple est:

    #Convention: Name (B,G,R) (Type) (i,j) (passage) (visibility) (light) (counter)
    228
    Ouch 0 0 0 0 0 0 0 1 0 0
    Deep 1 0 0 1 u4/water_deep.txt 0 1 0 0
    Water 2 0 0 1 u4/water.txt 0 1 0 0
    Water 3 0 0 1 u4/water_shallow.txt 0 1 0 0
    Dans cette discussion, c'est la colonne (passage) qui nous intéresse. Pour signifier qu'on ne peut pas avancer dessus, j'avais mis des 0. Le souci c'est que maintenant, cela dépend de s'il y a un bateau ou non, si on est sur un bateau ou non.

    Aussi, lorsqu'on est sur un bateau, on ne peut plus aller sur terre. Pour compliquer encore un peu le système, on a aussi des chevaux et des tapis magiques :-).

    Ainsi, pour avoir une solution correcte et facile d'utilisation: la classe Transportation que le groupe contient une instance.

    Maintenant, lorsqu'un AnimatedObject (n'importe quel objet "vivant" du jeu) veut aller quelque part, on récupére le passage de la tuile mais on demande à l'AnimatedObject s'il a envie de changer cette valeur. Cela permettra aux fantômes de passer via des murs mais aussi au groupe de demander à sa transportation s'il peut passer sur cette tuile.

    Comment cela se fait?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int Group::handlePassage (int passage, int cellType)
    {
        //If we have a transport, it decides if we can go
        if (transport != 0)
        {
            passage = transport->handlePassage (passage, cellType);
     
            return passage;
        }
     
        //Otherwise we use the generic one
        return AnimatedObject::handlePassage (passage, cellType);
    }
    Comme on le voit, c'est très très facile avec un transport qui gére le handlePassage lui-même.

    Les différents transports

    Maintenant le souci est que nous avons 4 transports différents : des chevaux, un bateau pour les côtes, un bateau pour l'haute mer et un tapis volant. Je ne voulais pas devoir programmer chaque type de transport séparément dans le moteur et donc, vu que j'ai à présent une interface avec LUA, nous avons un script par type de transportation.

    Donc, dans notre cas, la classe transport appelle une fonction LUA pour déterminer si on peut aller sur la tuile et une autre détermine quel est le coût. Cela permet déjà de distinguer les deux bateaux.

    Ensuite, en sortant du bateau pour l'haute mer, on a en fait le plus petit bateau qui devient notre transport. Ce qui permet d'arriver jusqu'au rivage. Ceci forcément complique un peu la donne, mais n'est pas encore un grand souci. A l'inverse, le petit bateau, s'il est en haute mer, fait perdre de la vie à notre groupe.

    Je vous présente donc la video qui montre comment cela fonctionne:



    Il me reste encore certains éléments avant de cloturer ces transports:

    - Pouvoir tirer du grand bateau vers un monstre
    - Gérer un combat du bateau et vers un bateau

    Si vous avez des questions, n'hésitez pas,
    Jc

  7. #227
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    En avancant un peu, j'ai ajouté le fait que les scénes de combat sont correctement choisi, surtout lorsqu'on attaque d'un bateau. Du coup, dépendant de la position du monstre et du joueur, une map différente est utilisée.

    Une petite video pour montrer tout cela :-)



    Tout cela est codé directement dans la partie U5 vu que mes techs demos se basent sur ce monde là. Le prochain tech demo, je le ferai dans le monde de U4 histoire de montrer la facilité de passer de l'un à l'autre.

    En espérant que cela vous plaise bien,
    Jc

  8. #228
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Histoire de continuer de tester le moteur dans la nouvelle ville, j'ai ajouté deux videos pour les 3 nouveaux caractères : le guérisseur, le vendeur d'ingrédients et l'aubergiste :-)

    On va bientôt attaquer des quêtes spécifiques pour cette deuxième démo technique donc cela va se retrouver bientôt dans le jeu :-)

    Bonne visualisation:





    Histoire de montrer un peu de code, l'aubergiste est entièrement gérer par un fichier xml pour la ville et un fichier lua pour définir le comportement spécifique.

    Comme avant, le code xml est relativement compréhensible tel quel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
        <npc>
            <schedule>
                <position x="23" y="5" z="0" behavior="1" time="8"/>
                <position x="23" y="5" z="0" behavior="0" time="18"/>
                <position x="25" y="9" z="0" behavior="0" time="22"/>
                <last_time value="11"/>
            </schedule>
     
            <name value="Rogi"/>
     
            <description value="You see an innkeeper"/>
     
            <conversation key="job" value="I handle the affairs of The Haunting"/>
            <conversation key="affair" value="Not much since the pirates have arrived"/>
            <complex_conversation>
                <key value="pirate"/>
                <key value="pirates"/>
                <answer value="(GOTO LABEL 1)"/>
            </complex_conversation>
     
            <label value="1">
                <question value="Are you willing to pursue the pirates away from Skara Brae?"/>
     
                <default value="I thought you would not"/>
     
                <complex_conversation>
                    <key value="y"/>
                    <key value="yes"/>
                    <answer value="Then you should talk to Fairun"/>
                </complex_conversation>
            </label>
     
            <conversation key="fairun" value="You can find him in the tower"/>
     
     
            <sprite value="seller.txt"/>
     
            <lua_script value="rogi.lua"/>
        </npc>
    Chose importante à voir est que le script lua gére la gestion de l'auberge et l'envoi du joueur pour qu'il dorme. Pour donner une idée de comment cela marche, chaque Npc se retrouve avec une fonction d'initialisation lors d'un départ de conversation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function npcConversationInit (npc, group)
        -- Reset the state
        rogiState = 0;
        rogiCost = 10;
        rogiX = 24;
        rogiY = 9;
        rogiZ = 1;
        sentAsleep = false;
    end
    Cela permet de mettre des variables à jour. Dans ce cas, l'état interne de la conversation, le coût de la chambre et la position du lit.

    Ensuite, nous avons des fonctions pour chaque particularité, par exemple, lorsque la conversation se termine:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function npcConversationClose ()
        -- Reset all globals
        rogiCost = nil;
        rogiState = nil;
        rogiX = nil;
        rogiY = nil;
        rogiZ = nil;
        sentAsleep = nil;
    end
    Où lorsque le joueur demande quelque chose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    function npcConversationCommit (npc, handler, group, question)
        -- In case, we quit, we don't stop it
        if (question == "last_text") then
            return "", 0, false
        end
     
        -- Handle state first: are we init ?
        if (rogiState == 0) then
            if (question == "rest") then
                -- Set to state 1
                rogiState = 1;
                return "Are you in need of lodging?", 1,true;
            end
        else
            -- Waiting for yes or whatever
            if (rogiState == 1) then
                if (question ~= "yes" and question ~= "y") then
                    -- Then we reset the state 
                    rogiState = 0;
                    return "Ok then!", 1, true;
                else
                    -- If we did ask for something
                    if (rogiCost > 0) then
                        rogiState = 2;
                        return "It will cost you " .. rogiCost .. " gold, is that ok?", 1, true;
                    end
                end
            else
                -- Ok do we accept the cost?
                if (rogiState == 2) then
                    if (question == "y" or question == "yes") then
                        local nbr = LuaInterface_GroupGetObjects (group, "Gold");
     
                        if (nbr >= rogiCost) then
                            -- Reset State
                            rogiState = 0;
     
                            LuaInterface_GroupRemoveItem (group, "Gold", rogiCost);
     
                            LuaInterface_GroupMove (group, handler, rogiX, rogiY, rogiZ);
     
                            -- Set sent asleep
                            sentAsleep = true;
     
                            return "Done! Rest well!", 0, true;
                        else
                            -- Reset State
                            rogiState = 0;
                            return "I apologize you do not have enough gold!", 1, true;
                        end
                    end
                end
            end
        end
     
        return "", 0, false
    end
    Un code un peu long mais en fait super simple. Dépendant de l'état interne, on pose une autre question et on fait évoluer l'état. Dans le cas où le joueur prend la chambre, on demande de bouger le joueur et de l'endormir.


    Enfin, lorsqu'on termine la conversation dans quel état se retrouve le système. Dans ce cas, si on a pris une chambre, on est en mode "On a pris une chambre, guérit nous quand on se réveille".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function npcEndState ()
        if (sentAsleep == true) then
            return 13 -- 13 is GS_INN_SLEEPING_STATE
        end
        return 1
    end
    Espérant que cela vous montre des choses intéressantes,
    Jc

  9. #229
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2008
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2008
    Messages : 86
    Points : 355
    Points
    355
    Par défaut
    Vraiment intéressant ton système!

    Mais deux petites remarques pour t'embêter (il faut bien ) :

    1) "par convention", on utilise pas de parenthèses en Lua pour les conditions, moi aussi j'en mettais au début et finalement ne pas en mettre éclaircit le code je trouve
    De plus pour les booléens tu n'est pas obligé de précisé "== true/false", un simple "if [not] condition then" suffit, comme en C++ (ou peut-être est-ce un choix volontaire?)

    2) pourquoi t'embêter avec de l'XML maintenant?
    Tu pourrais faire exactement pareil en Lua, et de façon plus "élégante", le fin du fin étant de dériver en Lua tes classes d’entités!
    De même, rien n'empêche de directement définir l'apparence du NPC depuis Lua, en lieu et place du fichier "seller.txt", via appel de fonctions C++ ou définition de "tables" du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rogi_img = { "rogi.png", { Frame(...), Frame(...) } }
    (plus sûr de la syntaxe, je suis passé au scripting Python depuis )

  10. #230
    Membre chevronné
    Avatar de lagwag
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 693
    Points : 1 891
    Points
    1 891
    Par défaut
    Citation Envoyé par pierreyoda Voir le message
    De plus pour les booléens tu n'est pas obligé de précisé "== true/false", un simple "if [not] condition then" suffit, comme en C++ (ou peut-être est-ce un choix volontaire?)
    ah non c'est une horreur les NOT dans les conditions... vaut mieux utiliser ==false

  11. #231
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par pierreyoda Voir le message
    Vraiment intéressant ton système!
    Merci :-)

    1) "par convention", on utilise pas de parenthèses en Lua pour les conditions, moi aussi j'en mettais au début et finalement ne pas en mettre éclaircit le code je trouve
    Question d'habitude. Je vais tenter de me souvenir de cela.

    De plus pour les booléens tu n'est pas obligé de précisé "== true/false", un simple "if [not] condition then" suffit, comme en C++ (ou peut-être est-ce un choix volontaire?)
    En C/C++ aussi mais je trouve le code moins lisible à ce moment là.

    2) pourquoi t'embêter avec de l'XML maintenant?
    Tu pourrais faire exactement pareil en Lua, et de façon plus "élégante", le fin du fin étant de dériver en Lua tes classes d’entités!
    De même, rien n'empêche de directement définir l'apparence du NPC depuis Lua, en lieu et place du fichier "seller.txt", via appel de fonctions C++ ou définition de "tables" du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rogi_img = { "rogi.png", { Frame(...), Frame(...) } }
    (plus sûr de la syntaxe, je suis passé au scripting Python depuis )
    En fait, j'aime cette double solution puisque pour les Npcs de base, j'ai juste besoin de mes fichiers xml. C'est seulement pour les plus compliqués que j'ai besoin d'un fichier lua.

    Jc

  12. #232
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2008
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2008
    Messages : 86
    Points : 355
    Points
    355
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    En fait, j'aime cette double solution puisque pour les Npcs de base, j'ai juste besoin de mes fichiers xml. C'est seulement pour les plus compliqués que j'ai besoin d'un fichier lua

    Ah oui exact j'avais pas pensé à ça, très malin

  13. #233
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bonsoir à tous,

    Petite mise-à-jour de mon jeu:

    [ame="http://www.youtube.com/watch?v=8uYPBD6E3_U"]Transportation almost done - YouTube[/ame]

    On voit qu'on a maintenant la possibilité de tirer du bateau et de tuer les monstres à distance. Si on les tue comme cela, leur mort reste visible pendant 2 secondes.

    Ceci est possible par le concept d'over et underlays, qui sont des images graphiques qui s'attache à une cellule, elle peuvent bouger, faire des dégâts, etc.

    Une deuxième video montre le fait qu'un seul flag dans le fichier d'entrée du moteur permet aussi de laisser la possibilité de tirer plusieurs cannons:

    [ame="http://www.youtube.com/watch?v=xKssO6QfjXY"]Transportation: extended - YouTube[/ame]

    Je montre aussi la possibilité de lever et baisser les voiles.

    Il me reste la gestion du vent pour faire bouger automatiquement le bateau lorsque les voiles sont levées et de gérer les dommages du bateau lui-même.

    Jc

  14. #234
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ok, j'avais mis un système pour économiser la mémoire : les objets se partagent leur entité. Donc si vous avez plusieurs objets, en fait un seul est créé et vous voyez juste le même qui s'affiche à différents endroits.

    Par contre, avec l'arrivée des transports qui peuvent avoir des dégâts différents, cela n'est plus possible. Donc cela vient tout juste d'être résolu en faisant une copie des transports à leur création :

    [ame="http://www.youtube.com/watch?v=myy_HBYw5CM"]Transports and hull damage - YouTube[/ame]

    Profitez-en bien,
    Jc

  15. #235
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bon, j'avoue que je n'ai pas de video pour ce soir. Et pour cause : la video ressemblerait à celles d'avant et vous ne verrez pas les progrès. Mais il sont là : on peut maintenant demander au système de lever les voiles et le vent est pris en compte pour automatiquement bouger le groupe.

    On peut aussi tirer sur un transport pour le détruire. Il est donc maintenant temps que je m'attaque au contenu de cette deuxième tech demo,
    Jc

  16. #236
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bien le bonsoir à tous,

    J'ai terminé la première version de la gestion des transports. Nous avons donc la gestion du combat dépendant qui attaque, la gestion de pirates (qui ont un bateau aussi), la gestion de leur bateau de facon transparente par rapport à comment le groupe gére le bateau.

    La gestion totale du canon et quelques améliorations. Je vais passer la semaine à regarder si je trouve des minis-bugs vu que beaucoup de code a été modifié pour cette version. Et ensuite, je vais me concentrer à ajouter une histoire et des quêtes pour ce deuxième volet de mes demos techniques.

    Voici une petite video de tout cela:

    [ame="http://www.youtube.com/watch?v=7BMBH2xRAXw"]Transportation done - YouTube[/ame]

    Jc

  17. #237
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bravo

    Citation Envoyé par fearyourself Voir le message
    Je vais passer la semaine à regarder si je trouve des minis-bugs vu que beaucoup de code a été modifié pour cette version.
    Si je comprends bien, vous allez juste jouer à votre jeu
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  18. #238
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Si je comprends bien, vous allez juste jouer à votre jeu
    C'est clairement juste cela que je vais faire ;-). Il faut bien le faire de temps en temps!

    Jc

  19. #239
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    J'ai voulu le tester , bon ça compile sans problème sauf que je peux pas y jouer,donc il manque sûrement les ressource ,donc j'ai fait ce qui était demandé "Si vous ajoutez ce fichier dans data sous le nom de data/sprites.bmp et que vous l'agrandissez les Y à 1024 (sans changer la taille des sprites, juste l'image), vous devriez avoir un programme qui tourne."
    Mais ça marche toujours pas =/

  20. #240
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Deux choses :

    - En principe tu as eu un fichier Log.txt, est-ce que tu peux l'ajouter ici ?

    - Je ne sais pas si tu as regardé ici : http://backtoroots.gamengine.net/wik...ation#Download

    Mais en principe, tu devrais avoir toutes les informations. Si cela compile, il doit te manquer les fichiers de données des jeux de base (U4 / U5).

    Tiens moi au courant,
    Jc

Discussions similaires

  1. [phpMyAdmin] [phpMyAdmin] Problème mot de passe Root !
    Par StouffR dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 26/09/2014, 11h59
  2. IDE vs programmation "roots" ?
    Par yoloosis dans le forum Débats sur le développement - Le Best Of
    Réponses: 44
    Dernier message: 27/01/2005, 00h37
  3. Comment change l'utilisateur root de mysql?
    Par silvermoon dans le forum Installation
    Réponses: 3
    Dernier message: 29/10/2003, 11h25
  4. probleme identification et mot de passe root
    Par freums dans le forum Débuter
    Réponses: 5
    Dernier message: 19/09/2003, 17h09
  5. Password root perdu !!
    Par Va(l)ve dans le forum Administration système
    Réponses: 8
    Dernier message: 18/08/2003, 22h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo