NL2 SCRIPT : Contrôles d'objets et constantes de temps.

yoyo212

Membre
27 Mai 2010
1 628
1
51
Suisse
www.dawaweb.ch
Un petit tuto pour  passer ce que j'ai un peu près compris...

Je crée un objet nommé Lampe01.nl2sco qui contient le chemin du Cube.3ds que j'agrandis à l’échelle (basescalex="10") en lui ajoutant une lightsource (spot) à 0.1f au dessus (position  y="0.1") de son point de pivot éclairant contre le bas (direction  y="-1").

Lampe01.nl2sco :
Code:
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <sceneobject>
  
    <model path="Cube.3ds"/>
    
    <param basescalex="10"/>
    <param basescaley="10"/>
    <param basescalez="10"/>
    
    <lightsource range="1" intensity="1" type="spot" spotcutoff="30" spotexponent="25">
      <direction x="0" y="-1" z="0"/>
      <upvector x="0" y="1" z="0"/>
      <name>Ampoule</name>
      <position x="0" y="0.1" z="0"/>
      <color r="1" g="1" b="1"/>
      <halo zoffset="1" intensity="1" size="1"/>
      <volume range="1" intensity="1" size="0.1"/>
    </lightsource>
    
  </sceneobject>
</root>

Resumons :
-Un parc vide
-Un objet 3ds (Cube.3ds)
-Une Lampe01.nl2sco avec source light (spot) nommée ''Ampoule''

Voici ce que j'obtiens, j'en place autant que je veux ... (ici 3)

Control02.jpg



A présent je crée un script que j'appelle ''LightTimeControle.nlvm''.
Code:
import com.nolimitscoaster.*;

public class LightTimeControle extends Script
{   
		
	//Lampe01
	private SceneObject Lampe01; 
	private SceneObjectLight spotLight;
   
   
   	public bool onInit()
		{                           
			// Cube_Lampe01
			Lampe01 	= sim.getSceneObject("Cube_Lampe01");
			spotLight = Lampe01.getLightForName("Ampoule");
		  
		 	return true;
		}
  
  
 	public void onNextFrame(float fTickTime)
		{
			
     	spotLight.setEnabled(false);

		}

}

Je reprend le fichier Lampe01.nl2sco que je copie et sauvegarde en Controle.nl2sco.
Je lui enlève la source light et je lui ajoute le script nommé ''LightTimeControle.nlvm''.  Qui suit l'exemple :

Code:
Controle.nl2sco : 
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <sceneobject>
  
    <model path="Cube.3ds"/>
    
    <param basescalex="10"/>
    <param basescaley="10"/>
    <param basescalez="10"/>
    
    [color=red][color=red]<script>
      <classpath></classpath>
      <class>LightTimeControle</class>
    </script>[/color][/color]
    
  </sceneobject>
</root>

Control03.jpg


A présent, je peux nommé mes lampes avec l'éditeur de propriétés d'objets :

Je les nommes ainsi :
Cube_Lampe01
Cube_Lampe02
Cube_Lampe03

Control04.jpg


Je les ajoutes à ''LightTimeControle.nlvm'' :
Code:
import com.nolimitscoaster.*;

public class LightTimeControle extends Script
{   
		
	//Lampe et spots
	private SceneObject Lampe01;[color=red]
	private SceneObject Lampe02;
	private SceneObject Lampe03;[/color]
	 
	private SceneObjectLight spotLight01;[color=red]
	private SceneObjectLight spotLight02;
	private SceneObjectLight spotLight03;[/color]
   
   
   	public bool onInit()
		{                           
			//Lampe et spots
			Lampe01 	= sim.getSceneObject("Cube_Lampe01");[color=red]
			Lampe02 	= sim.getSceneObject("Cube_Lampe02");
			Lampe03 	= sim.getSceneObject("Cube_Lampe03");[/color]
			
			spotLight01 = Lampe01.getLightForName("Ampoule");[color=red]
			spotLight02 = Lampe02.getLightForName("Ampoule");
			spotLight03 = Lampe03.getLightForName("Ampoule");[/color]
		  
		 	return true;
		}
  
  
 		public void onNextFrame(float fTickTime)
		{
			
     	spotLight01.setEnabled(false);[color=red]
     	spotLight02.setEnabled(false);
     	spotLight03.setEnabled(false);[/color]

		}

}

Si je lance le simulateur, les 3 spots sont éteints.

Control05.jpg


A présent j’ajoute une constante de temps avec un cycle qui va l'obliger a revenir à zéro toutes les 3sec. Pour vérifier, j’ajoute un message qui va lire cette constante à toutes les images.
Code:
import com.nolimitscoaster.*;

public class LightTimeControle extends Script
{   
		
	//Lampe et spots
	private SceneObject Lampe01;
	private SceneObject Lampe02;
	private SceneObject Lampe03;
	 
	private SceneObjectLight spotLight01;
	private SceneObjectLight spotLight02;
	private SceneObjectLight spotLight03;
   
  [color=red]private static float startTime  = 0.0f;[/color]
   
   	public bool onInit()
		{                           
			//Lampe et spots
			Lampe01 	= sim.getSceneObject("Cube_Lampe01");
			Lampe02 	= sim.getSceneObject("Cube_Lampe02");
			Lampe03 	= sim.getSceneObject("Cube_Lampe03");
			
			spotLight01 = Lampe01.getLightForName("Ampoule");
			spotLight02 = Lampe02.getLightForName("Ampoule");
			spotLight03 = Lampe03.getLightForName("Ampoule");
		  
		 	return true;
		}
  
  
 		public void onNextFrame(float fTickTime)
		{
			[color=red]float cycle = 6.0f;
			startTime  = fTickTime;
	    float t = startTime % cycle;
	    System.out.println(t);[/color]
	    	
     	spotLight01.setEnabled(false);
     	spotLight02.setEnabled(false);
     	spotLight03.setEnabled(false);

		}

}

Control06.jpg


Maintenant je peux donner des conditions pour que les lampes fassent ce que j'ai envie en fonction du temps.
Code:
import com.nolimitscoaster.*;

public class LightTimeControle extends Script
{   
		
	//Lampe et spots
	private SceneObject Lampe01;
	private SceneObject Lampe02;
	private SceneObject Lampe03;
	 
	private SceneObjectLight spotLight01;
	private SceneObjectLight spotLight02;
	private SceneObjectLight spotLight03;
   
  private static float startTime  = 0.0f;
   
   	public bool onInit()
		{                           
			//Lampe et spots
			Lampe01 	= sim.getSceneObject("Cube_Lampe01");
			Lampe02 	= sim.getSceneObject("Cube_Lampe02");
			Lampe03 	= sim.getSceneObject("Cube_Lampe03");
			
			spotLight01 = Lampe01.getLightForName("Ampoule");
			spotLight02 = Lampe02.getLightForName("Ampoule");
			spotLight03 = Lampe03.getLightForName("Ampoule");
		  
		 	return true;
		}
  
  
 		public void onNextFrame(float fTickTime)
		{
			float cycle = 6.0f;
			startTime  = fTickTime;
	    float t = startTime % cycle;
	    System.out.println(t);
	    	
     	spotLight01.setEnabled(false);
     	spotLight02.setEnabled(false);
     	spotLight03.setEnabled(false);
     	
     [color=red]	if (t >= 0)[/color]
	   		[color=red]{[/color]
	      	[color=red]if (t >= 1)[/color]spotLight01.setEnabled(true);
	     [color=red] }
	      {[/color]
	      	[color=red]if (t >= 3)[/color]spotLight02.setEnabled(true);
	      [color=red]}
	      {[/color]
	      	[color=red]if (t >= 5)[/color]spotLight03.setEnabled(true);
	      }

		}

}

Comme cela, elles vont s'allumer une après l'autre et s'éteindre toutes au bout de 6 sec.

On peut faire un chenillard sur 3 secondes:
import com.nolimitscoaster.*;
Code:
public class LightTimeControle extends Script
{   
		
	//Lampe et spots
	private SceneObject Lampe01;
	private SceneObject Lampe02;
	private SceneObject Lampe03;
	 
	private SceneObjectLight spotLight01;
	private SceneObjectLight spotLight02;
	private SceneObjectLight spotLight03;
   
  private static float startTime  = 0.0f;
   
   	public bool onInit()
		{                           
			//Lampe et spots
			Lampe01 	= sim.getSceneObject("Cube_Lampe01");
			Lampe02 	= sim.getSceneObject("Cube_Lampe02");
			Lampe03 	= sim.getSceneObject("Cube_Lampe03");
			
			spotLight01 = Lampe01.getLightForName("Ampoule");
			spotLight02 = Lampe02.getLightForName("Ampoule");
			spotLight03 = Lampe03.getLightForName("Ampoule");
		  
		 	return true;
		}
  
  
 		public void onNextFrame(float fTickTime)
		{
			float cycle = [color=red][color=blue]3.0f;[/color][/color]
			startTime  = fTickTime;
	    float t = startTime % cycle;
	    System.out.println(t);
	    
	    spotLight01.setEnabled(false);
     	spotLight02.setEnabled(false);
     	spotLight03.setEnabled(false);	
     	
     	if (t >= 0 && t <= 1) 
	   		{
	      	spotLight01.setEnabled(true);
	      }
	    
	    if (t >= 1 && t <= 2) 
	   		{
     			spotLight02.setEnabled(true);
	      }
	    if (t >= 2 && t <= 3) 
	   		{
     			spotLight03.setEnabled(true);
	      } 

		}

}
Ce qu'il faut comprendre c'est qu'il suffit de lancer une constante de temps depuis n'importe quel action. Un trigger, un contact, une vue caméra, ... et on peut aussi leur attribuer des mouvements.

LE PARC http://dawaweb.ch/NoLimits2/Light_time/Light_time.zip
 
Intamin Fan a dit:
Tu es un fou ^^. C'est vraiment cool de ta part de partager tout ça.
J'espère juste que ce soit compréhensible...  :mrgreen:


ttfun13 a dit:
C'est qui écrit les lignes de code ?  :?

Je vais sur le talus derrière chez moi et je poses le portable au sol. Là je crie très fort: - Pourquoi ?
De grands éclaires jaillissent d'entre les nuages pour aller frapper le clavier dans un tumulte assourdissant.
Une fois la fumée dissipée, ... miracle ! Le portable est intact ! Mieux, les lignes de code sont carrément sauvegardées !  :-D
 
Je vais sur le talus derrière chez moi et je poses le portable au sol. Là je crie très fort: - Pourquoi ?
De grands éclaires jaillissent d'entre les nuages pour aller frapper le clavier dans un tumulte assourdissant.
Une fois la fumée dissipée, ... miracle ! Le portable est intact ! Mieux, les lignes de code sont carrément sauvegardées !  :-D

J'en conclut que oui  :mdr:
 
yoyo212 a dit:
Je vais sur le talus derrière chez moi et je poses le portable au sol. Là je crie très fort: - Pourquoi ?
De grands éclaires jaillissent d'entre les nuages pour aller frapper le clavier dans un tumulte assourdissant.
Une fois la fumée dissipée, ... miracle ! Le portable est intact ! Mieux, les lignes de code sont carrément sauvegardées ! 

Moi qui pensais que c'était toi qui avait écrit ces codes que je suis bête !
 
Intamin Fan a dit:
Moi qui pensais que c'était toi qui avait écrit ces codes que je suis bête !

Écrire est un bien grand mot, c'est le résultat de pleins d'assemblage que j'ai essayé depuis la sortie, Pour moi, j'ai toujours l'impression que c'est du bidouillage ... Mais du moment que ça fonctionne, c'est l'essentiel.