See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: Orbiter aux pruneaux !!!  (Read 6019 times)

0 Members and 1 Guest are viewing this topic.

Offline korben62

  • Hero Member
  • *****
  • Posts: 561
  • Karma: 0
01 March 2007, 02:12:45


Orbiter aime t il les pruneaux ?:lol:
oui , v'la un ptit dll et qq lignes de code a integrer dans vos prog
 pour gouter la recette de ... "l' Orbiter aux pruneaux".......... façon Korben62....
à l'usage des programmeur en vc++

http://momupload.com/files/23414/Bullet.rar.html]Bullet.rar


je met pas encore le code du dll, car il est encore en version "gros beta"




Offline Schimz

  • Legend
  • ******
  • Posts: 1598
  • Karma: 1
Reply #1 - 01 March 2007, 10:47:39
Ton lien est foireux sur la fin.
Et en fait, ça n'a pas l'air de marcher. Après avoir rentré le code antibot, rien ne se passe (IE & Firefox, pareil)



Message modifié ( 01-03-2007 10:51 )


Offline korben62

  • Hero Member
  • *****
  • Posts: 561
  • Karma: 0
Reply #2 - 01 March 2007, 11:22:29



Offline Profil supprimé

  • Newbie
  • *
  • Posts: 1
  • Karma: 0
Reply #3 - 01 March 2007, 18:00:31
Moi j'ai rien compris à ton message. C'est quoi au juste ?



Message modifié ( 01-03-2007 18:00 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #4 - 01 March 2007, 18:19:45
J'imagine que korben a concocté une petite dll de son cru qui permet de balancer des
pruneaux sur son prochain en lui occasionnant quelques dégâts au passage. ;)

Au passage, le lien ( le second ) ne fonctionne toujours pas chez moi :sick:


Pic

Offline Schimz

  • Legend
  • ******
  • Posts: 1598
  • Karma: 1
Reply #5 - 01 March 2007, 19:40:49
Oui l'est bizarre ce site :)
Bon, je l'ai, mais pas essayé. On peut faire de jolis lasers vu que c'est un simple msh :)

ed : faut gérer les dégats, modifier les propriétés du vessel impacté :)

re-ed : korby chéri, pourrais-tu STP faire le txt un peu plus propre ? :) (enfin le code surtout, avec des commentaires en peu plus toufus (pourquoi un char[256] par ex) :))



Message modifié ( 01-03-2007 19:46 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #6 - 02 March 2007, 00:08:34
En fait ça marche, il faut juste faire gaffe au petit lien de
download qui apparait après avoir entré le code.

Ca fonctionnerait pour celui là ?
4200 coups par minute ...  :pfff:






Message modifié ( 02-03-2007 00:11 )

Pic

Offline Apofis

  • Sr. Member
  • ****
  • Posts: 349
  • Karma: 0
Reply #7 - 02 March 2007, 00:45:38
Quote
picto a écrit:
En fait ça marche, il faut juste faire gaffe au petit lien de
download qui apparait après avoir entré le code.

Ca fonctionnerait pour celui là ?
4200 coups par minute ...  :pfff:



ha le canon du A-10 :love: je suis fou de cet appareil :love:

un vrai tank volant :lol:


"Oups c quoi se bruit" Fred Haise, apollo 13 :P

Offline korben62

  • Hero Member
  • *****
  • Posts: 561
  • Karma: 0
Reply #8 - 02 March 2007, 01:13:00
Ben pour l'instant il n'y a pas de gestion de degats du vaisseaux cible, mais le DLL bullet intégre (méme si il ne
l'utilise pas encore) la possibilité de savoir quel vaisseau a été touché et combien de fois, puis de detruire celui ci.

chaque projectile est compté a laide nbr, à vos chargeurs !!!!!
Pour ne pas surcharger chaque projectile perdu est detruit quand il arrive à bout de carburant, et explose
sur et a proximité de tout autre vaisseau; à l'exeption du vaisseau tirreur et d'un autre projectile emis par le méme
vaisseau (2 projectiles tirés de 2 vaisseaux distinct peuvent s'autodetruire).
Pour l'instant le DLL bullet est en version "beta" mais il marche; il utilise une partie du code de rcontrol
oapiGetVesselCount(), oapiGetSize, oapiGetRelativePos, et un simple calcul de trigo - distance = rcarrée(x2 +y2 +z2)


void monvaisseau::firebullet (void)
{
   //preparation de paramétres des projectiles voir code SRB Atlantis et la doc du SDK
                pour la création des parametre vs de VESSELSTATUS2
   VESSELSTATUS2 vs;
   VESSELSTATUS2::FUELSPEC fuel;
   VESSELSTATUS2::THRUSTSPEC thrust;
   memset (&vs, 0, sizeof(vs));
   vs.version = 2;
   GetStatusEx (&vs);
   vs.flag = VS_FUELLIST | VS_THRUSTLIST;
   //position locale de la bouche du 1er canon x y z, c'est un vecteur
   VECTOR3 ofs = { 1.5, 1.3,6.7};;
   //position locale de la bouche du 2éme canon x y z
   VECTOR3 ofs2 = {-1.5, 1.3,6.7};; //warning il y a rotation a 180°
   VECTOR3 rofs, rvel = {vs.rvel.x, vs.rvel.y, vs.rvel.z};
   VECTOR3 vel = {0,-1,0};
   Local2Rel (ofs, vs.rpos);
   GlobalRot (vel, rofs);
   vs.rvel.x = rvel.x+rofs.x;
   vs.rvel.y = rvel.y+rofs.y;
   vs.rvel.z = rvel.z+rofs.z;
   vs.vrot.x = 0.0;
   vs.status = 0;
   //reserve l'espace memoire pour le nom du projectile 1
   char name[256];
   //reserve pour le nom du projectile 2
   char name2[256];
   //reserve pour le mot "bullet"
   char cbuf[256];
   //incrémente le compteur de projectiles
   nbr = nbr +1;
   //crée le nom du 1er vaisseaux projectile
   sprintf(cbuf, "%d", nbr); //stocke dans cbuf le n°
   strcat (cbuf,  "bullet"); //concaténe le n° et "bullet"dans la méme chaine cbuf
   strcpy (name, GetName());
                strcat (name,  cbuf);
                //concaténe le n° nom du vaisseaux tirreur et cbuf
   //le nom "name" du premier projectile sera monvaisseauXbullet
   oapiCreateVesselEx (name, "bullet", &vs); //utilise le Dll "bullet" pour créer le projectile
   OBJHANDLE hV = oapiGetVesselByName (name); // handle hv du projectile
   VESSEL *v = oapiGetVesselInterface (hV); // capture  l'interface du projectile créé
   v->SetThrusterGroupLevel (THGROUP_MAIN, 1.0); //télécommande l'allumage du 1er projectile

   //rotation de 180° pour que le second ne parte pas en marche arriére
   Local2Rel (ofs2, vs.rpos);
   vs.arot.z -= 2*PI;
   //incrémente le compteur de projectiles
   nbr = nbr +1;
   sprintf(cbuf, "%d", nbr);
   strcat (cbuf,  "bullet");
   strcpy (name2, GetName()); strcat (name2,  cbuf);
   //le nom "name2" du 2éme projectile sera monvaisseauX+1bullet
   oapiCreateVesselEx (name2, "bullet", &vs);
   OBJHANDLE hV2 = oapiGetVesselByName (name2);
   VESSEL *v2 = oapiGetVesselInterface (hV2);
   v2->SetThrusterGroupLevel (THGROUP_MAIN, 1.0); //télécommande l'allumage du 2éme projectile
}

C'est plus clair ?




Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #9 - 02 March 2007, 01:21:45
Quote
mais le DLL bullet intégre (méme si il ne l'utilise pas encore) la possibilité de savoir quel vaisseau a été touché
et combien de fois, puis de detruire celui ci.
Fallait y penser, bravo!
En ce moment, je m'inspire largement du code des animations du XB982, je profite de ce fil pour te remercier ;)


------------

no matter.

Offline korben62

  • Hero Member
  • *****
  • Posts: 561
  • Karma: 0
Reply #10 - 02 March 2007, 01:32:58
Quote
Ca fonctionnerait pour celui là ?
4200 coups par minute ...


Oh le beau Gattling

Quote
ed : faut gérer les dégats, modifier les propriétés du vessel impacté

Oui c'est une possibilité, bien que bullet dll permettrais de detuire un vaisseaux, il ne pourrais pas gerer ses degats.
par contre integrer la destruction à bullet permettrais de detruire n'importe quel vaisseau méme celui qui
fontionnerais avec spacecraft3
De méme en poussant un peu plus loin, en obtenant l'angle et  la vitesse relative d'impact (oapiGetRelativeVel
oapiGetRelativePos) calculer un vecteur et une vitesse de rebond d'un vessel sur un autre proportionel à cette
vitesse.
Un vaisseaux utilisant le code du dll bullet rebondirais sur n'importe quel vaisseau. Ce ne serais pas aussi precis que
meshland mais plus simple




Offline Schimz

  • Legend
  • ******
  • Posts: 1598
  • Karma: 1
Reply #11 - 02 March 2007, 03:05:13
comment peut-on customiser sa bullet ? Par exemple si 2 vessels sont supposés avoir des armement differents ?



Offline korben62

  • Hero Member
  • *****
  • Posts: 561
  • Karma: 0
Reply #12 - 02 March 2007, 22:00:21
Quote
comment peut-on customiser sa bullet ? Par exemple si 2 vessels sont supposés avoir des armement
differents ?

BON pisque t'insiste vla le code du bullet



//Chtitte curiosité basée sur un petit calcul de trigo
#define STRICT
#define ORBITER_MODULE
#include "orbitersdk.h"
#include "stdio.h"
// ==============================================================
// Parametres
// ==============================================================

const double bullet_FUELMASS = 30.0;
const double bullet_ISP = 4e5;
const double bullet_MAXMAINTH = 3e5;
const double bullet_MAXHOVERTH = 1.5e5;
const double bullet_MAXRCSTH = 2e2;
const double EXPLODING_SPEED= 0.90; // vitesse de resorbsion d'explosion


//  lift coefficient
double LiftCoeff (double aoa)
{
   const int nlift = 9;
   static const double AOA[nlift] = {-180*RAD,-60*RAD,-30*RAD,-
1*RAD,15*RAD,20*RAD,25*RAD,60*RAD,180*RAD};
   static const double CL[nlift]  = {       0,      0,   -0.1,     0,   0.2,  0.25,   0.2,     0,      0};
   static const double SCL[nlift] = {(CL[1]-CL[0])/(AOA[1]-AOA[0]), (CL[2]-CL[1])/(AOA[2]-AOA[1]),
                                    (CL[3]-CL[2])/(AOA[3]-AOA[2]), (CL[4]-CL[3])/(AOA[4]-AOA[3]),
                             (CL[5]-CL[4])/(AOA[5]-
AOA[4]), (CL[6]-CL[5])/(AOA[6]-AOA[5]),
                             (CL[7]-CL[6])/(AOA[7]-
AOA[6]), (CL[8]-CL[7])/(AOA[8]-AOA[7])};
   for (int i = 0; i < nlift-1 && AOA[i+1] < aoa; i++);
   return CL + (aoa-AOA)*SCL;
}


// ==============================================================
// bullet class
// ==============================================================

class bullet: public VESSEL2 {
public:
   bullet (OBJHANDLE hVessel, int flightmodel)
      : VESSEL2 (hVessel, flightmodel) {}
   
   void clbkSetClassCaps (FILEHANDLE cfg);
   void clbkPostStep (double simt, double simdt, double mjd);
   void clbkPreStep  (double simt, double simdt, double mjd);;
   void Timestep (double simt);
    void Explode (void);
   OBJHANDLE targetHandle;
    THRUSTER_HANDLE th_main, th_hover;
   

   // Detection de collision      
   void DetectCollision();
   void DureeProximiteVaisseau();
   double VarDureeProxiVaisseau;
   double dPrevStep;
   double DeltaTaille;
   double DistanceMiniVaisseau(OBJHANDLE *vHandle);
   protected:
   double explode_proc;   
};


// --------------------------------------------------------------
// carractéristiques du projectile
// --------------------------------------------------------------
void bullet::clbkSetClassCaps (FILEHANDLE cfg)
{
   SetSize (0.5); // taille du projectile
   SetEmptyMass (50.0); // masse a vide
   SetCW (0.3, 0.3, 0.6, 0.9); // etc etc .......
   SetWingAspect (0.7);
   SetWingEffectiveness (2.5);
   SetAlbedoRGB (_V(0.77,0.20,0.13));
   SetCrossSections (_V(10.5,15.0,5.8 ) );
   SetRotDrag (_V(3.6,3.6,3.35));
   SetPMI (_V(2.28,2.31,0.79));
   SetTrimScale (0.05);
   SetCameraOffset (_V(0,0.8,0));
   SetLiftCoeffFunc (LiftCoeff);
   SetTouchdownPoints (_V(0,-1.5,2), _V(-1,-1.5,-1.5), _V(1,-1.5,-1.5));

   // declaration du reservoir
   PROPELLANT_HANDLE hpr = CreatePropellantResource (bullet_FUELMASS);


   // ***************** definition des propulseurs*******************

   th_main = CreateThruster (_V(0,0,-0.5), _V(0,0,1), bullet_MAXMAINTH, hpr, bullet_ISP);
   CreateThrusterGroup (&th_main, 1, THGROUP_MAIN);
   SURFHANDLE tex = oapiRegisterExhaustTexture ("SANFIRE" ) ;//nom de la texture utilisée pour le
propulseur
principal
   AddExhaust (th_main, 6, 3, _V(0,0.0,0.0), _V(0,0,-1), tex);

   th_hover = CreateThruster (_V(0,0,-0.5), _V(0,0,0), bullet_MAXMAINTH, hpr, bullet_ISP);
   CreateThrusterGroup (&th_hover, 1, THGROUP_HOVER);
   SURFHANDLE tex4 = oapiRegisterExhaustTexture ("SANBOOM" ) ;//nom de la texture utilisée pour
l'explosion
   AddExhaust (th_hover,  6, 6, _V(0.0,0.0,0.0), _V(0,0,1), tex4);
   
   //chargement du mesh
   AddMesh ("bullet" );
}
void bullet::DetectCollision()
{
   double DMin, TailleVaisseau; // declare les variables
   OBJHANDLE VaissADminiHandle; // declare le handle du vaisseau A Distance minimale
   char minh[128]; //declare la variable pour stoker le nom du vaisseau
   DeltaTaille = GetSize(); //recupére la valeur du setsize
   DMin = DistanceMiniVaisseau(&VaissADminiHandle); //lance le calcule de proximité
   oapiGetObjectName (VaissADminiHandle, minh, 128 ); // recupére le nom du fameux vaisseau
   if (VaissADminiHandle == NULL) //evidement si y'en a pas
      return; //pas la peine de faire le reste

   TailleVaisseau = oapiGetSize(VaissADminiHandle); // si y'a on lui demande sa taille la prochaine fois
j'utiliserais

                  //aussi la crossection pour étre plus precis
   if (DMin < ((TailleVaisseau+DeltaTaille)/2)) // je l'ai ou je l'ai pas
   {
      SetThrusterGroupLevel (THGROUP_MAIN, 0.0); // YEP ! je l'ai STOOOOOOOOOOP!
   }
}

//calcul et recherche de la distance mini
double bullet::DistanceMiniVaisseau(OBJHANDLE *vHandle)
{
   char monmien[256];
   char monautre[256];
    strcpy (monmien, GetName()); //nom du projectile courrant
    OBJHANDLE myHandle = oapiGetVesselByName (monmien);
   VECTOR3 relativeXYZ;
   double Distance, distancecalcul;
   int VCount;
   Distance = -1; // initialise la distance
   *vHandle = NULL;

   VCount = oapiGetVesselCount(); //retourne le nombre de vaisseaux presents
   for (int i=0; i<VCount; i++) //pour le vaisseaux n
   {
      targetHandle = oapiGetVesselByIndex(i); //donne le handle du vaisseaux n
      oapiGetObjectName (targetHandle, monautre, 128 ); //recupére le nom du vaisseaux n
        int result = strncmp (monmien, monautre, 6);
      // compare sur les 6 premier carractéres ; les nom des vaisseaux "bullet" sont une
concaténation,
      // du nom du vaisseaux tireur, du numero de projectile et du mot bullet.
      // si les 6 premier carractéres sont egaux strncmp retourne 0, il est inutile de tester la collision

      if (result != 0)
      {
      if (myHandle != targetHandle) // vas pas tester la distance entre moi et moi, quand méme

      {
      try //bon on tente le coup avec celui la try introduit un bloc de code
          //susceptiblede générer des exceptions auquelles le programme doit réagir
      {
      oapiGetRelativePos(myHandle, targetHandle, &relativeXYZ); // retourne la position relative
entre moi et l'autre
      
                                distancecalcul = sqrt(relativeXYZ.x*relativeXYZ.x + relativeXYZ.y*relativeXYZ.y +
relativeXYZ.z*relativeXYZ.z); //la trigo ya que ça de vrai
                 //la condition if suivante compare la distance calculée du vaisseaux n à celle du vaisseaux n-1
      //c'est un filtre qui ne conserve que le handle et la distance du vaisseaux le plus proche
      if ((distancecalcul < Distance) || (Distance < 0))
      {
      Distance = distancecalcul;
      *vHandle = targetHandle;
      }
      }
      catch (...) // viens tout de suite aprés "try"
      {
         //traite les exeptions au cas ou yen aurais
      }
      }
      }
   }

   return Distance; //retourne la disdance mini
}

// --------------------------------------------------------------
// mise a jour graphique
// --------------------------------------------------------------
void bullet::clbkPreStep  (double simt, double simdt, double mjd)
{
DetectCollision(); // y a quelqu'un au bout du fil ??? autant le faire avant la mise à jour
}
void bullet::clbkPostStep (double simt, double simdt, double mjd)
{
char name[256];   // prepare la variable
strcpy (name, GetName()); //je m'appelle comment deja ?
OBJHANDLE hV = oapiGetVesselByName (name); //et mon handle c'etais comment ?
if (GetFuelMass() == 0)  //t'as raté et ya pu de jus
{   
oapiDeleteVessel(hV); // bye bye !!!
}
if (GetThrusterGroupLevel (THGROUP_MAIN) < 1.0 ) //si stooop on l'a eu
{
double LF = simdt * EXPLODING_SPEED; //ben boom !!!!!
SetThrusterGroupLevel(THGROUP_HOVER,(explode_proc = max (0.0, explode_proc-LF)));
}else explode_proc = 1.0;
if (explode_proc == 0.0)
{   
oapiDeleteVessel(hV); //puis bye bye !!!!
}

}

// les grands classiques
// --------------------------------------------------------------
// Vessel initialisation
// --------------------------------------------------------------
DLLCLBK VESSEL *ovcInit (OBJHANDLE hvessel, int flightmodel)
{
   return new bullet (hvessel, flightmodel);
}

// --------------------------------------------------------------
// Vessel cleanup
// --------------------------------------------------------------
DLLCLBK void ovcExit (VESSEL *vessel)
{
   if (vessel) delete (bullet*)vessel;
}



pour linstant on peut customiser les textures , le mesh



on pourrais pte't aussi le faire rebondir j'ai une p'tit ideé la dessus

avec un
oapiGetRelativeVel
Returns the velocity difference vector of hObj relative to hRef in the ecliptic reference
frame.
     Synopsis:
     void oapiGetRelativeVel (
     OBJHANDLE hObj,
     OBJHANDLE hRef,
     VECTOR3 *vel)

et le méme calcul de trigo que pour la position de maniére a obtenir la vitesse relative d'impact

ça donne des idées non !:prof:
par exemple un vaisseaux fuyant, subits des degats moins important car meme si la vitesse du projectile augmente
celle du vaisseaux aussi et de plus la distance augmentant le dis projectile contient de moins en moins de carburant
,diminuant son pouvoir detonnant,

Ou encore toujours en plongeant dans le SDK   DefSetState,  VESSELSTATUS ou mieux DefSetStateEX qui permet
d'imposer les modifications effectuées a un VESSELSTATUS2 comme:
 les  positions relatives xyz
 les vitesse relatives suivant xyz
 les torseurs relatifs, rotations suivant x y z
 faire rebondir le projectile sur le vaisseaux cible

ou avec les mémes fonctions faire du vector thrusting  pour un "homing missile"

a vos claviers  !!!!:hot:




Offline korben62

  • Hero Member
  • *****
  • Posts: 561
  • Karma: 0
Reply #13 - 02 March 2007, 22:02:24
Ah oui j'ai viré la possibilité de destruction et le compteur qui pour l'instant bug a mort




Offline Momo

  • Legend
  • ******
  • Posts: 2682
  • Karma: 1
Reply #14 - 02 March 2007, 23:09:09
... pt1... on peut tous faire sur Orbiter... c'est magnifique tous sa même si je pige rien...

en tous cas bravo :wor:


Offline brainstorm

  • Legend
  • ******
  • Posts: 2694
  • Karma: 0
Reply #15 - 03 March 2007, 01:37:34
Y'aura des pruneaux comme ça dans EV NOVA ! ;) J'avais un peu bossé là dessus quand j'ai commencé ;)



Offline Extincteur

  • Legend
  • ******
  • Posts: 1170
  • Karma: 0
Reply #16 - 03 March 2007, 12:39:17
il n'ya pas unetouche pour tirer simplement :) ? sinon bravo!



Message modifié ( 03-03-2007 12:46 )


Offline Schimz

  • Legend
  • ******
  • Posts: 1598
  • Karma: 1
Reply #17 - 03 March 2007, 13:17:30
Quote
korben62 a écrit:
BON pisque t'insiste vla le code du bullet
:badsmile:

:wor:


Hum... on peut faire un addon Jules Verne - De la Terre à la Lune avec une GROSSE bullet ?



Offline korben62

  • Hero Member
  • *****
  • Posts: 561
  • Karma: 0
Reply #18 - 04 March 2007, 11:25:09
Pourquoi pas

avec :
GetSurfaceRef
Returns a handle to the closest planet or moon. This is the object to which all surfacerelative
parameters refer.
Synopsis:
const OBJHANDLE GetSurfaceRef () const;
Return value:
Handle to surface reference object (planet or moon) recuperer le handle de la planete ou lune la plus proche

puis :

GetElements (2) de la lune recuperer le ORBITPARAM *prm = 0,

et stopper les moteurs a une altitude donnée




Offline brainstorm

  • Legend
  • ******
  • Posts: 2694
  • Karma: 0
Reply #19 - 04 March 2007, 18:17:59
L'invénient que j'avais, c t en vol atmo, si le vaisseaux vole vite, les pruneaux ralentissent !! lol
Donc trouver le moyen qu'ils n'aient pas de masse .... ;)


« Last Edit: 04 March 2007, 18:17:59 by brainstorm »