Basic Univers
; Deformation Wave  Map isométrique
; Vague en 2D Isométrique (effet 3D)
; Par Cpl.Bator

#TailleMapX = 40
#TailleMapY = 40

#TailleTileX = 16
#TailleTileY = 8

Structure World
 X.f
 Y.f
 Z.f
 WaveHeight_A.f
 WaveHeight_B.f
 EndStructure

Global WaveSpeed.f : WaveSpeed = 10

Global Dim Map.World(#TailleMapX, #TailleMapY)

;-Initialisation des composants DirectX
If InitSprite()= 0 Or InitMouse()= 0 Or InitKeyboard()= 0
 MessageRequester("Erreur", "Impossible d'initialiser DirectX")
  End
   EndIf
   
OpenScreen(800 , 600, 32, "")


Declare UpdateMap()
Declare Initialisation_MapIso()


Initialisation_MapIso()

Repeat
 ExamineKeyboard() : ExamineMouse() : ClearScreen(RGB(0, 0, 0))
  UpdateMap()
    FlipBuffers()
     Until KeyboardPushed(#PB_Key_Escape)



Procedure UpdateMap()
StartDrawing(ScreenOutput())
DrawingMode(4|1)
FrontColor(RGB(255, 255, 255))



WaveSpeed + 0.1
For Y = 1 To #TailleMapY
For X = 1 To #TailleMapX


; Calcul des vagues, puis affectation à la hauteur (Z).
   Map(x, y)\WaveHeight_A = x*Cos((x*20*2*0.144)+ WaveSpeed)
   Map(y, x)\WaveHeight_B = x*Cos((x*20*2*0.144)+ WaveSpeed)
   Map(X, Y)\Z =(Map(x, y)\WaveHeight_A + Map(x, y)\WaveHeight_B)/2



; Affichage des segments
If x =>1 And x<#TailleMapX And y =>1 And y<#TailleMapY
LineXY(352 + Map(X, Y)\X , 150 + Map(X, Y)\Y - Map(X, Y)\Z , 352 + Map(X + 1, Y)\X , 150 + Map(X + 1, Y)\Y - Map(X + 1, Y)\Z)
LineXY(352 + Map(X, Y)\X , 150 + Map(X, Y)\Y - Map(X, Y)\Z , 352 + Map(X, Y + 1)\X , 150 + Map(X, Y + 1)\Y - Map(X, Y + 1)\Z)
EndIf
Next : Next

StopDrawing()
EndProcedure


Procedure Initialisation_MapIso()
Shared DecalageX.l, DecalageY.l, Offset.l


 For Y = 1 To #TailleMapY
 For X = 1 To #TailleMapX

 DecalageX = DecalageX +(#TailleTileX/2)
 DecalageY = DecalageY +(#TailleTileY/2)
 
 Map(X, Y)\X    = DecalageX
 Map(X, Y)\Y    = DecalageY


Next X
   Offset + 1
   DecalageX = -(Offset*(#TailleTileX/2))
   DecalageY =(#TailleTileY/2)*Offset
Next Y

EndProcedure