package ds.moteur;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import ds.ihm.clavier.ToucheClavier;
import ds.ihm.joystick.ConfigurationJoystick;
import ds.ihm.joystick.ValeursJoystick;
import ds.moteur.geometrie.Angle3D;
import ds.moteur.geometrie.Point;
import ds.moteur.route.Section;
import ds.moteur.route.cc.CourbeConduite;
import ds.moteur.voiture.Voiture;
import ds.moteur.voiture.VoiturePilotee;
public class Scene {
private Terrain terrain;
private VoiturePilotee voitureJoueur;
private List<Voiture> voitures;
private ConfigurationJoystick confJoystick;
public Scene(){
this.voitures = new ArrayList<Voiture>();
}
public void defaultInit(File fichierTerrain){
//Terrain terrain = new TerrainDefaut3();
Terrain terrain = new Terrain("Toto");
try {
FileInputStream fis = new FileInputStream(fichierTerrain);
DataInputStream dis = new DataInputStream(fis);
terrain.load(dis);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
VoiturePilotee voiture = new VoiturePilotee("Totinette", 3.7, 1.6);
Voiture voiture2 = new Voiture("Totinette2", 3.7, 1.6);
Voiture voiture3 = new Voiture("Totinette3", 3.7, 1.6);
voiture.init(terrain.getInsertions().get(0));
voiture2.init(terrain.getInsertions().get(1));
voiture3.init(terrain.getInsertions().get(2));
this.setTerrain(terrain);
this.setVoitureJoueur(voiture);
this.addVoiture(voiture2);
this.addVoiture(voiture3);
try {
confJoystick = ConfigurationJoystick.readConf();
} catch (IOException e) {
System.out.println("Impossible de lire la configuration joystick !");
e.printStackTrace();
}
}
public void defaultInit(){
Terrain terrain = new TerrainDefaut2();
VoiturePilotee voiture = new VoiturePilotee("Totinette", 3.7, 1.6);
Voiture voiture2 = new Voiture("Totinette2", 3.7, 1.6);
Voiture voiture3 = new Voiture("Totinette3", 3.7, 1.6);
voiture.init(terrain.getInsertions().get(0));
voiture2.init(terrain.getInsertions().get(1));
voiture3.init(terrain.getInsertions().get(2));
this.setTerrain(terrain);
this.setVoitureJoueur(voiture);
this.addVoiture(voiture2);
this.addVoiture(voiture3);
try {
confJoystick = ConfigurationJoystick.readConf();
} catch (IOException e) {
System.out.println("Impossible de lire la configuration joystick !");
e.printStackTrace();
}
}
public Terrain getTerrain() {
return terrain;
}
public void setTerrain(Terrain terrain) {
this.terrain = terrain;
}
public VoiturePilotee getVoitureJoueur() {
return voitureJoueur;
}
public void setVoitureJoueur(VoiturePilotee voiture) {
this.voitureJoueur = voiture;
}
public List<Voiture> getVoitures() {
return voitures;
}
public void addVoiture(Voiture voiture) {
this.voitures.add(voiture);
}
public void incrementer(long ms, boolean[] touches, ValeursJoystick valeursJoystick){
for (Voiture voiture : voitures){
double distance = 1000;
for (Voiture autreVoiture : voitures){
if (voiture != autreVoiture){
distance = Math.min(voiture.getDistance(autreVoiture), distance);
}
}
distance = Math.min(voiture.getDistance(voitureJoueur), distance);
if ((distance < 1.2*voiture.getMecanique().getDistanceArret())&&(distance !=-1)){
voiture.getMecanique().freiner(ms);
} else if(voiture.getMecanique().getVitesse()<3){
voiture.getMecanique().accelerer(ms);
}
}
float valeurAcc = 0;
if(confJoystick.isUtiliserJoystick()){
valeurAcc = valeursJoystick.getAction(confJoystick.getAccelerer(), true);
}
if(touches[ToucheClavier.HAUT.ordinal()]){
valeurAcc = 1;
}
double force = this.voitureJoueur.getForceMoteur();
if ((touches[ToucheClavier.HAUT.ordinal()])||valeurAcc>0.1){
this.voitureJoueur.getMecanique().appliquerForceMotrice(force*valeurAcc, ms);
}
float valeurFrein = 0;
if(confJoystick.isUtiliserJoystick()){
valeurFrein = valeursJoystick.getAction(confJoystick.getFreiner(), true);
}
if ((touches[ToucheClavier.BAS.ordinal()])||valeurFrein>0.1){
this.voitureJoueur.getMecanique().freiner(ms);
this.voitureJoueur.getMoteur().getForce(this.voitureJoueur.getMecanique().getVitesse());
}
float valeurVolant = 0;
if(confJoystick.isUtiliserJoystick()){
if (valeursJoystick.getFrontMontant(5)){
this.voitureJoueur.getMoteur().retrograder();
}
if (valeursJoystick.getFrontMontant(4)){
this.voitureJoueur.getMoteur().passerVitesse();
}
valeurVolant = valeursJoystick.getAction(confJoystick.getVolant(), false);
}
if(touches[ToucheClavier.DROIT.ordinal()]){
valeurVolant = 1;
}
if(touches[ToucheClavier.GAUCHE.ordinal()]){
valeurVolant = -1;
}
this.voitureJoueur.setRouesAvant(valeurVolant*Math.PI/5);
if ((touches[ToucheClavier.PLUS.ordinal()])||valeurFrein>0.1){
this.voitureJoueur.getMoteur().passerVitesse();
}
if ((touches[ToucheClavier.MOINS.ordinal()])||valeurFrein>0.1){
this.voitureJoueur.getMoteur().retrograder();
}
this.voitureJoueur.incrementer(ms);
for (Voiture voiture : voitures){
voiture.incrementer(ms);
}
this.voitureJoueur.getMecanique().appliquerForceFreinage(ms);
Point p = voitureJoueur.getPositionAvant();
for(Section s : terrain.getSections()){
if(s.getFrontiere().isInside(p)){
double distance = 1000;
double abscisse = 0;
CourbeConduite ccRetenue = null;
for(CourbeConduite cc : s.getCourbesConduites()){
double distanceCC = cc.getDistance(p)[0];
double abscisseCC = cc.getDistance(p)[1];
if(distanceCC<distance){
distance = distanceCC;
abscisse = abscisseCC;
ccRetenue = cc;
}
distance = Math.min(cc.getDistance(p)[0], distance);
}
//System.out.println(distance);
if(ccRetenue!=null){
Point projection = new Point();
//ccRetenue.recupererPosition(projection, new Angle3D(), abscisse);
voitureJoueur.setPositionProjetee(ccRetenue, abscisse);
//voitureJoueur.set
//ccRetenue.getAbonnes().add(voitureJoueur);
}
}
}
}
}