RILASCIATO ORBITER 2016!!! CLICCA QUI PER SCARICARLO
 
IndiceIndice  FAQFAQ  LinkLink  CercaCerca  RegistrarsiRegistrarsi  Accedi  
Accedi
Nome utente:
Parola d'ordine:
Connessione automatica: 
:: Recuperare la parola d'ordine
FOI sui social networks
Argomenti simili
Siti Amici
Astronautica Ultima Speranza

AstronautiNEWS

Orbiter Forum

Tuttovola.org

Contatore Visite
Ultimi argomenti
» Concetto "Red Antares"
Da Andrew Oggi a 10:38

» Mars One, la "colonizzazione di Marte" slitta di 4 anni...
Da Andrew Oggi a 10:24

» MARS - National Geographic Channel
Da Andrew Oggi a 10:13

» Accordo Altec - Virgin Galactic
Da Diabolos Oggi a 9:02

» Ancora un fallimento per il Progress
Da Ripley Ieri a 23:39

» Propulsione Spaziale
Da m.a.s Ieri a 23:29

» "Starlab" space station
Da Fausto Ieri a 22:09

» R.I.P. John Glenn
Da Fausto Ieri a 21:53

» Sviluppo di una base italiana - Sede ASVI
Da Fausto Ieri a 21:36

» Problema installazione D3D9
Da DDD Ieri a 18:34

» Shuttle Fleet R.I.P.
Da wolf Gio 8 Dic 2016 - 14:46

» Rilasciato Space Shuttle Ultra 4.0 (per O2010)
Da wolf Mer 7 Dic 2016 - 20:15

» L'uomo su Mercurio
Da Andrew Mar 6 Dic 2016 - 19:05

» Stephen Hawking ricoverato per problemi respiratori
Da Fausto Sab 3 Dic 2016 - 19:42

» Avete bisogno di un un razzo vettore?
Da Matt44 Sab 3 Dic 2016 - 16:57

» Sospensioni motore DGIV da tastiera
Da Ripley Mer 30 Nov 2016 - 11:39

» Saluti!
Da Fausto Mer 30 Nov 2016 - 8:13

» Ma che Luna o Marte.. colonizziamo Titano!
Da Andrew Dom 27 Nov 2016 - 11:27

» Serie TV -The Expanse
Da m.a.s Sab 26 Nov 2016 - 11:27

» Paolo Nespoli di nuovo sulla ISS con la missione VITA
Da Dany Sab 26 Nov 2016 - 8:09


Condividere | 
 

 [C++] Multistage2 bug carburante

Vedere l'argomento precedente Vedere l'argomento seguente Andare in basso 
AutoreMessaggio
ndudi
Add-on Developer
Add-on Developer


Numero di messaggi : 450
Età : 33
Località : como
Data d'iscrizione : 13.06.11

MessaggioOggetto: [C++] Multistage2 bug carburante   Gio 14 Feb 2013 - 19:27

Da qualche tempo sto provando ad addentrarmi nel mondo dell'add-on developping in c++, e mi sto entusiasmando molto. Come molti principianti del genere sto familiarizzando con la nuova lingua partendo dalle sorgenti create con il comodo traduttore di artlav sc3->.dll.Come è noto questo convertitore presenta un fastidioso bug: i vascelli con esso creati, se lanciati con un vettore multistage (o jettisonati da una nave spacecraft), compaiono con i serbatoi vuoti.
Ho cercato su OF e ci sono varie risposte, ma tutte un pò vaghe, o comunque incomprensibili per un novellino del c++ come me, oltretutto un pò imbranato in inglese.
Tempo fà lessi in qualche post che qualcuno (forse il buon fred?) aveva trovato una semplice soluzione al problema, ovviamente in c++.
Mi chiedevo se qualcuno in grado di risolvere il baco volesse aiutare i meno esperti, magari condividendo le righe di codice che permettono di aggirarlo happy face
Grazie infinite in anticipo!
Tornare in alto Andare in basso
Vedere il profilo dell'utente
fred18
Add-on Developer
Add-on Developer


Numero di messaggi : 923
Età : 33
Località : La Spezia
Data d'iscrizione : 04.01.12

MessaggioOggetto: Re: [C++] Multistage2 bug carburante   Gio 14 Feb 2013 - 22:56

Ciao ndudi,

allora la funzione che ti può essere utile in questo caso è clbkPostCreation

quindi devi dichiararla nell'header (il file .h) (void nomedelvessel::clbkPostCreation()) che fare il rispettivo overload nel file .cpp.

ti consiglio di mettere all'inizio del file .cpp una riga di definizione per la massa di carburante. Ad esempio se la massa di carburante è 10 all'inizio del file .cpp (dopo #include "orbitersdk.h" per intenderci) scriverai:

#define FUELMASS 10

a questo punto nella funzione clbkSetClassCaps metterai (col nome di default del convertitore di artlav):

ph_h[0]=CreatePropellantResource(FUELMASS);

e poi quasi alla fine del file .cpp, prima della riga

DLLCLBK void InitModule(HINSTANCE hModule){}

metterai la funzione

void nomedelvessel::clbkPostCreation (){
SetFuelMass(FUELMASS);
}



Ecco questo metodo funziona sicuramente se il vessel è creato rilasciandolo dal multistage, l'unica cosa che mi pare non vada bene è che ogni volta che carichi lo scenario il tuo veicolo inizierà sempre lo scenario con il pieno di carburante.

non sono sicuro di questo, non mi ricordo più sorry bisogna provare.

Comunque nell'MT4 ho messo una variabile globale che cambia valore a seconda che la navetta sia appena stata creata o se la si stia caricando da un file di scenario. Però ora non ricordo più bene come funzionasse, domani ci dò un'occhiata e ti scrivo come ho fatto di preciso anche riguardo a questo!

spero di esserti stato d'aiuto! a domani

Tornare in alto Andare in basso
Vedere il profilo dell'utente
fred18
Add-on Developer
Add-on Developer


Numero di messaggi : 923
Età : 33
Località : La Spezia
Data d'iscrizione : 04.01.12

MessaggioOggetto: Re: [C++] Multistage2 bug carburante   Ven 15 Feb 2013 - 14:08

Allora ho dato un'occhiata al codice che avevo usato e come avevo fatto, direi che ci sono due modi che però utilizzano lo stesso identico sistema per risolvere l'ultima questione.

Riassumendo con calma:

- nel post precedente abbiamo impostato l'overload della funzione clbkPostCreation per far sì che alla creazione del veicolo nella simulazione esso abbia il pieno di carburante.

- rimane il problema che se carico uno scenario in cui il veicolo esiste già ed ha un certo quantitativo di carburante, la funzione precedente bypassa tutto quanto e riempie di nuovo completamente i serbatoi, cosa che probabilmente non ci va bene

quindi dobbiamo trovare un sistema per far sì che quando carico il veicolo, il programma "capisca" se lo sto creando ex-novo (quindi se lo rilascio dal multistage o da qualsiasi altro veicolo) o se lo sto caricando da uno scenario.

per fare ciò la cosa più intuitiva da fare è far cercare al modulo del veicolo qualcosa nel file scenario da cui viene eventualmente caricato, in modo che se lo trovasse saprà che è stato caricato appunto da un file scenario e dovrà lasciare i serbatoi pieni come questo indicava, se invece non trovasse nulla vorrà dire che il modulo è stato caricato durante la simulazione e quindi dovrà riempire i serbatoi.

come si fa? confused 2

Anzitutto per far cercare al modulo qualcosa nel file scenario bisogna che il modulo stesso al momento del salvataggio dello scenario vi lasci un traccia, una specie di briciola di pollicino, che poi potrà ritrovare.

il modo più "elegante" e formalmente corretto è quello che lasci una traccia apposita, immagino una voce nel file scenario che si chiama

LOADED 1

Per far sì che il modulo lo scriva nel file scenario dovremo impostare l'overload della funzione clbkSaveState, che diventerà quindi:

Codice:

void nomedelvessel::clbkSaveState(FILEHANDLE scn)
{
 SaveDefaultState(scn);
 
 char loadedtxt[256];


 sprintf(loadedtxt,"LOADED");
 oapiWriteScenario_int(scn,loadedtxt,1);
}


A questo punto bisogna impostare quello che deve succedere al momento della creazione del nostro vessel.

Imposteremo nel file .h una nuova variabile pubblica intera loaded, quindi scriveremo appunto nel file .h tra le variabili pubbliche int loaded; .

ora nel file .cpp dovremo modificare la funzione clbkLoadStateEx in modo che quando il modulo viene caricato assegni alla variabile intera loaded il valore che trova nel file scenario alla riga che dice appunto LOADED

per farlo scriveremo

Codice:

void nomedelvessel::clbkLoadStateEx(FILEHANDLE scn,void *vs)
{
 char *line;
 int i,n;
 
 while(oapiReadScenario_nextline(scn,line)){
if(!strnicmp(line,"LOADED",6)){
sscanf(line+6,"%i",&loaded);
}else{
  ParseScenarioLineEx(line,vs);
  }

ovviamente se ho altre variabili da caricare bisogna impostare correttamente gli if e gli else if.

A questo punto il modulo ha la variabile intera loaded che assume il valore 1 se il modulo è caricato da un file scenario (precedentemente salvato, se si crea a mano bisogna ricordarsi di aggiungere la riga LOADED 1), assume invece un altro valore che ora non ci interessa in caso il modulo venga creato durante la simulazione, quindi per esempio il caso di rilascio da multistage.

A questo punto bisogna aggiungere nella funzione clbkPostCreation il riferimento alla variabile loaded e cioè dire che se la variabile loaded non è 1 allora bisogna riempire al massimo i serbatoi

Codice:

void nomedelvessel::clbkPostCreation (){
if(loaded!=1){
SetFuelMass(FUELMASS);
  }
}


Penso che questo post possa essere d'aiuto sia a te per quanto riguarda il workaround del bug, sia a tutti gli altri per quanto riguarda caricare e salvare variabili nei file scenario.

Spero di essere stato comprensibile sweat drop

ciaoooo
Tornare in alto Andare in basso
Vedere il profilo dell'utente
ndudi
Add-on Developer
Add-on Developer


Numero di messaggi : 450
Età : 33
Località : como
Data d'iscrizione : 13.06.11

MessaggioOggetto: Re: [C++] Multistage2 bug carburante   Ven 15 Feb 2013 - 16:53

Grazie mille Fred per la tua disponibilità!!Sei stato chiarissimo e concettualmente ho capito tutto! Ora vedremo se sarò in grado di applicare i tuoi suggerimenti, ti farò sapere!Grazie ancora!
Tornare in alto Andare in basso
Vedere il profilo dell'utente
fred18
Add-on Developer
Add-on Developer


Numero di messaggi : 923
Età : 33
Località : La Spezia
Data d'iscrizione : 04.01.12

MessaggioOggetto: Re: [C++] Multistage2 bug carburante   Ven 15 Feb 2013 - 16:59

figurati, mi fa piacere aiutare! happy face

attendo presto news sul risultato! Laugh
Tornare in alto Andare in basso
Vedere il profilo dell'utente
ndudi
Add-on Developer
Add-on Developer


Numero di messaggi : 450
Età : 33
Località : como
Data d'iscrizione : 13.06.11

MessaggioOggetto: Re: [C++] Multistage2 bug carburante   Ven 15 Feb 2013 - 17:59

Tutto perfettamente funzionante come previsto!!!E' stato relativamente semplice grazie all'ottima spiegazione passo passo!Come hai detto tu questa procedura è utilissima per salvare e caricare qualsiasi tipo di variabile, grazie ancora!!! Forza Forza
Tornare in alto Andare in basso
Vedere il profilo dell'utente
fred18
Add-on Developer
Add-on Developer


Numero di messaggi : 923
Età : 33
Località : La Spezia
Data d'iscrizione : 04.01.12

MessaggioOggetto: Re: [C++] Multistage2 bug carburante   Ven 15 Feb 2013 - 18:23

grande!!! Thumb Up
Tornare in alto Andare in basso
Vedere il profilo dell'utente
Contenuto sponsorizzato




MessaggioOggetto: Re: [C++] Multistage2 bug carburante   Oggi a 10:47

Tornare in alto Andare in basso
 
[C++] Multistage2 bug carburante
Vedere l'argomento precedente Vedere l'argomento seguente Tornare in alto 
Pagina 1 di 1
 Argomenti simili
-
» registri carico e scarico rifiuti: distributori carburanti e farmacie
» [Vinka] Installazione Spacecraft 3

Permesso di questo forum:Non puoi rispondere agli argomenti in questo forum
Forum Orbiter Italia :: Orbiter Space Flight Simulator :: Sviluppo Add-on :: Orbiter SDK-
Andare verso: