Creation dynamique d'objets

[Résolu]
Signaler
Messages postés
21
Date d'inscription
samedi 13 novembre 2004
Statut
Membre
Dernière intervention
13 octobre 2006
-
Messages postés
21
Date d'inscription
samedi 13 novembre 2004
Statut
Membre
Dernière intervention
13 octobre 2006
-
Bonjour,
je suis entrain de realiser un petit raytracer et je me trouve en face d'un petit problème lors du chargement de la scène.
j'ai un fichier .ini qui contient les infos concernant la lumière, la caméra et surtout les différents objets qui se trouvent sur la scène.
j'aimerais que mon prog crée dynamiquement mes objets (sans savoir combien ils seront et de quels types).
je précise: j'aurai par exemple dans mon ini la description d'un cube , un plan, deux triangles et un sphère.
j'aimerais pouvoir créer un objet de chaque dans mon programme.
je ne veut que créer des objets dont les classes sont définies à l'avance.
j'ai pensé à un truc du genre:

for i=1 to nombredobjets
    if type=sphère then
       dim objet(i) as sphere
    elseif type=cube then
       dim objet(i) as cube
    elseif  ...
    end if
next

une fois ces ojets crées je n'aurai pas de blème pour les exploiter, mais c'est la création qui plante, il me dit qu'il attend une constante.
je suis sous vb 6.
quelque un aurait il une petite idée?

merci d'avance

amicalement
miro

9 réponses

Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,

Oui c'est possible avec un truc qui pourrait être du style:

Dim TabObjet(10) As Object 

For i = 1 To nombredobjets 
    If type_ = sphere Then 
       Set TabObjet(i) = New sphere  'sphere doit etre un module de classe
    ElseIf type_ = cube Then 
       Set TabObjet(i) = New cube  'cube doit etre un module de classe
    '....
    End If 
Next 
 

<small> Coloration syntaxique automatique [AFCK]</small>
       

Le seul truc est de savoir exactement a quel indice sont les cube et les sphere pour utiliser convenablement les différentes méthodes des objets respectifs.

Est ce que type (type_) est une variable de ton programme

Voila j'espère avoir été clair et avoir pu t'aider un peu

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

    Heeeeeee, tout dabort je tien à dire que je n'ai pas VB6 sous la main.
    Mais il me semble possible de crée des tableaux de taille dynamique avec des types de données personalisés (ce qui n'est pas possible en VBA). Donc si tu crée un type 'objet' (ou même un type 'cube', une type 'plan', ...). Prenons le cas d'un type de donnée identique pour tout les objets (type 'objet') dans le quel tu stoque le type d'obj, sa possition, ... Si tu à ce tableau tu peut re redimentioner avec des exprésion du type "redim <NomTableau> ('Mini' to 'Maxi')" (généralement le mini est '0' mais il est possible de mettre une autre valeur '159' par exemple). ATTENTION le 'redim' tout seul change la taille du tableau ET SUPPRIME LES DONNEES CONTENUE. Il faut donc ajouter dans la commande le mot reserver 'Preserve'. La commande au complet est donc "ReDim Preserve <NomTableau>('Mini' to 'Maxi')".
Il me semble qu'il est possible de crée des variable dynamiquement autrement en VB6 mais je ne sais plus command
    La déclaration d'un tableau dynamisue est "Dim <NomTableau> () as <TypeObjet>" Dans le cas d'un type 'objet' mais il n'est pas utilisable de suite il faut pour cela déja lui définir une plage (Exemple d'un bout de code :)

Public Objet() as ObjetType

Private Sub CréeObj ()
    Redim Objet(0 to 0)
    Objet(0).Type = "Plan"
    Objet(0)...
    Do While Compteur < NombreObjet
       Compteur = Compteur + 1
       Redim Preserve Objet (0 to Compteur)
       ...
    Loop
End Sub

Pour crée un type de donée (Exemple) :

Public Type Personne
    Nom As String
    Prénom As String
    NumSQ As String
    Adrs As String
    ...
End Type

Bon avec ça tu dois pouvoir t'en sortir.

Bon courage
D'oh! Nuts!
Mmmmm...
 DONUTS
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,

Est ce que c'est cette boucle qui est dans le programme?

Si j'ai bien compris:

Tu as un seul tableau "objet" pouvant contenir soit une sphere soit un cube.

Petit rappel:

 - Dim c'est pour la déclaration, Si tu veux l'affectation utilise Set.
- Je crois que la déclaration selon conditions n'est pas faisable.
- Tu ne peux pas utiliser type comme nom de variable remplace le par type_ par exemple.

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Heee, [auteurdetail.aspx?ID=89254 jrivet]c'est à moi ou à [auteurdetail.aspx?ID=379986 mi12ox] que tu t'adresse?
Temps que j'y pense il est plus simple de crée deux variable en long suplémentaire par tableau pour stoquer le numéro de la permierre et dernierre 'case' de ton tableau dynamique (même si tu peut les retrouver avee "Ubound (<NomTableau>)" et "LBound (<NomTableau>)" qui renvoie respectivement le dérnierre case et la premierre case du tableau passée en argument.)

D'oh! Nuts!
Mmmmm...
 DONUTS
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
SAlut,

C'était a mi12ox (ton post est arrive le temps de ma réponse)

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Messages postés
21
Date d'inscription
samedi 13 novembre 2004
Statut
Membre
Dernière intervention
13 octobre 2006

merci, mais y a un truc qui me traquace.
est-ce que c'est possible de créer un tableau de type Object et de au fur et à mesure des ajouts d'éléments, leur définir un type propre, par exemple sphère, cube, plan... et ainsi ils prenderaient directement les attributs de la classe définie?

désolé si j'ai pas tout compris et si vous m'avez en faite dit que c'était impossible:D

en tout cas merci

miro
Messages postés
21
Date d'inscription
samedi 13 novembre 2004
Statut
Membre
Dernière intervention
13 octobre 2006

oui type_ est la variable dans mon fichier .ini qui indique à quel type de forme on a à faire.
et si tout objet a une méthode qui porte le meme nom mais qui fonctionne internement différemment ça devrait jouer.
par exemple.
je lance un rayon et je veux savoir si il y a intersection avec chaque objet ( pas très optimisé, mais ça c'est pour plus tard).
si j'ai dans chaque classe(sphère,cube,...) il y a une fonction CalculIntersection( les paramètres de mon rayon) qui renvoie les coordonnées du point d'intersection et le paramètre t, je n'aurai théoriquement pas besoin de savoir à quel type j'ai à faire depuis l'exterieur.
sachant que chaque fonction CalculIntersectioin diffère de classe en classe.
et puis si je dois savoir à quel type j'ai affaire est-ce que je peux utiliser if TypeOf Objet(i) is Sphère... non?
merci je crois que je commence à y voir plus clair.

miro
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
58
Salut,

Tu as tout à fait raison.

Rien à redire à ton dernier post. si ce n'est que tu peux utiliser aussi le TypeName(Objet(i))
@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Messages postés
21
Date d'inscription
samedi 13 novembre 2004
Statut
Membre
Dernière intervention
13 octobre 2006

Merci ça joue tout bon je posterai le code quand il sera fini.

amicalement

miro