procedure TfMain.tGameloopTimer(Sender: TObject);
begin
  if not(enPause) then jeuEnCours;
end;

procedure TfMain.jeuEnCours;
begin
  layZoneJeu.BeginUpdate;
 
  if layMeteo.Visible then gererMeteo;
  if recNuit.Visible then positionnerRecNuit;
 
  gererAnimations;
  gererPlateformeTombe;
 
  gererAffichageChrono;
  lblNbPoints.Text := nbPoints.ToString;
  lblNbVie.Text := nbVie.toString;
  lblNbBonus.Text := nbBonus.toString;
 
  bouclerMusique;
 
  oldPosY := joueur.Position.y;
  if vitesseY < vitesseYMax then vitesseY := vitesseY + gravite;
  joueur.Position.y := joueur.Position.y + vitesseY;
 
  if sautEnCours then orienterSaut;
  gererTouches;
 
  layZoneJeu.EndUpdate;
 
  if estFinDeJeu then gererFinDeJeu
  else gererBornage;
end;

procedure TfMain.deplacerScrollings(axe: TAxes; vitesseX: Single = 0; vitesseYScolling: Single = 0; deplacementPlateforme: boolean = false);
begin
  layZoneJeu.BeginUpdate;
  for var scrolling in listeScrollings do begin
    if scrolling.vitesse <> 0 then begin
      if (axe = x) or (axe = all) then begin
        scrolling.Position.x := scrolling.Position.x + (vitesseX * scrolling.vitesse);
        if scrolling.Position.x <= -scrolling.rectangle.Fill.Bitmap.Bitmap.Width then scrolling.Position.x := 0
        else begin
          if not(deplacementPlateforme) then begin
            if scrolling.Position.x >= 0 then scrolling.Position.x := -scrolling.rectangle.Fill.Bitmap.Bitmap.Width;
          end;
        end;
      end;
      if scrolling.continueY then begin
        if (axe = y) or (axe = all) then begin
          scrolling.Position.y := scrolling.Position.y + (vitesseYScolling * scrolling.vitesse);
          if scrolling.Position.y <= -scrolling.rectangle.Fill.Bitmap.Bitmap.Height then scrolling.Position.y := 0
          else if scrolling.Position.y >= 0 then scrolling.Position.y := -scrolling.rectangle.Fill.Bitmap.Bitmap.Height;
        end;
      end;
    end;
  end;
  layZoneJeu.EndUpdate;
end;

 
 
·       procedure TfMain.gererTouches;
·       begin
·         if not(attaqueEncours) then begin
·           if toucheHaut then begin
·             if not(sautEnCours) then begin
·               if Niveau2Possible then begin
·                 if layNiveau.Opacity = 1 then begin
·                   TAnimator.AnimateFloat(layNiveau, 'opacity', opacity, 0.2);
·                   TAnimator.AnimateFloat(layDecorDevant, 'opacity', opacity, 0.2);
·                 end;
·               end;
·             end;
·             haut;
·             vitesseX := 0;
·           end else begin
·             if not(estSurPlan2) then begin
·               layNiveau.Opacity := 1;
·               layDecorDevant.Opacity := 1;
·             end;
·           end;
·           if toucheBas then begin
·             bas;
·             vitesseX := 0;
·             if sautEnCours then vitesseY := vitesseYMax;
·           end;
·        
·           if toucheSauter then sauter;
·           if toucheDroite then avancer;
·           if toucheGauche then reculer;
·           if toucheAction then actionner;
·         end;
·      end;

 
procedure TfMain.sauter;
begin
  if not(attaqueEncours) then begin
    if enCollisionAvecPlateforme then begin
      surPlateformeDescendante := false;
      surPlateformeMontante := false;
      if toucheHaut then begin
        if estSurPlan2 then passerSurPlan1
        else passerSurPlan2;
      end else begin
        sautEnCours := true;
        if sons then PlaySound(MediaSaut, VOLUME_SON);
        JouerPoussiere;
        orienterSaut;
        if joueurCourt then vitesseY := -puissanceSautCourt
        else vitesseY := -puissanceSaut;
      end;
    end;
  end;
end;

procedure TfMain.avancer;
begin
  if not(attaqueEncours) then begin
    if surPlateformeMontante then vitesseX := -vitesseXMaxEnMontee
    else vitesseX := -vitesseXMax;
    direction := TDirection.droite;
    oldDirection := direction;
    if not(sautEnCours) then begin
      if peutCourirDroite then begin
        joueurCourt := true;
        tCourt.Enabled := true;
        if surPlateformeMontante then vitesseX := -vitesseXMaxEnMonteeCourt
        else vitesseX := -vitesseXMaxCourt;
        oldAnimation := TAnimationJoueur.courtDroite;
        aniPlayer.AnimationBitmap := playerRun;
        aniPlayer.AnimationCount := 8;
      end else begin
        oldAnimation := TAnimationJoueur.marcheDroite;
        aniPlayer.AnimationBitmap := playerWalk;
        aniPlayer.AnimationCount := 8;
      end;
    end else orienterSaut;
  end;
end;

function TRect.IntersectsWith(const R: TRect): Boolean;
begin
  Result := (Self.Left < R.Right)
        and (Self.Right > R.Left)
        and (Self.Top < R.Bottom)
        and (Self.Bottom > R.Top);
end;
 
function gererCollisionsPlateformes(positionJoueur : TPoint; joueurHitBox : TRect; unRectangle : TLayout):TCollision;
begin
  result.enCollision := false;
  if unRectangle.ChildrenCount > 0 then begin
    for var recChild in unRectangle.Children do begin
      if recChild is TImage then begin
        var unEnfant : TImage := recChild as TImage;
        var resultat := gererCollisionsJoueurAvecUnePlateforme(positionJoueur, joueurHitBox, unEnfant);
        if resultat.enCollision then begin
           result.enCollision := true;
           result.objet := unEnfant;
           result.objet.TagFloat := resultat.value;
           break;
        end;
      end;
    end;
  end;
end;
 
TCollisionPlateforme = record
public
  enCollision : boolean;
  value : integer;
end;
 
function gererCollisions(position : TPoint; joueurHitBox : TRect; unRectangle : TLayout; detruireObjetTouche: boolean):TCollision;
begin
  var enCollision := false;
  if unRectangle.ChildrenCount > 0 then begin
    for var recChild in unRectangle.Children do begin
      var unEnfant := recChild as TImage;
 
        var rectJoueur := TRect.Create(TPoint.Create(Round(joueurHitBox.left)+position.X, Round(joueurHitBox.top)+position.Y), Round(joueurHitBox.Width), Round(joueurHitBox.Height));
 
        var recObjet : TRect;
        if unEnfant.Hint.IsEmpty or (pos(':', unEnfant.Hint) = 0)
          recObjet := TRect.Create(TPoint.Create(Round(unEnfant.position.X), Round(unEnfant.position.Y)), Round(unEnfant.Width), Round(unEnfant.Height))
        else begin
            var posX := Round(unEnfant.position.X + strtointdef(unEnfant.Hint.Split([':'])[0],0));
            var posY := Round(unEnfant.position.Y + strtointdef(unEnfant.Hint.Split([':'])[1],0));
            var width := Round(strtointdef(unEnfant.Hint.Split([':'])[2],0));
            var height := Round(strtointdef(unEnfant.Hint.Split([':'])[3],0));
            recObjet := TRect.Create(TPoint.Create(posX, posY), width, height);
        end;
        if rectJoueur.IntersectsWith(recObjet) then begin
          enCollision := true;
          result.objet := unEnfant;
          if detruireObjetTouche then begin
            if unEnfant.ChildrenCount > 0 then begin
              if unEnfant.Children[0] is TAnimation then (unEnfant.Children[0] as TAnimation).StopAtCurrent;
            end;
          end;
          break;
        end;
    end;
  end;
  result.enCollision := enCollision;
end;
 
TCollision = record
public
  enCollision : boolean;
  objet : TImage;
end;