Connexion

Récupérer mon mot de passe

Qui est en ligne ?
Il y a en tout 1 utilisateur en ligne :: 0 Enregistré, 0 Invisible et 1 Invité

Aucun

Le record du nombre d'utilisateurs en ligne est de 21 le Jeu 17 Oct 2013, 13:40
Derniers sujets
Flux RSS



Flag Counter
Partenaires

Technique de RayCasting

Voir le sujet précédent Voir le sujet suivant Aller en bas

Technique de RayCasting

Message par Dylan Gadacha le Ven 12 Sep 2014, 07:10

Salut !
Voici un code que j'ai trouvé sur le net et qui est tout juste incroyable pour ma part !
Je vous laisse voir par vous même:
Code:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <Misc.au3>

Opt("MustDeclareVars", 1)

Global _
    $bGameRunning = True

Global _
    $iWidth = 640, _
    $iHeight = 480, _
    $iTileSize = 64, _
    $iWallHeight = 64

;----------------------------------------------------
; GUI
;----------------------------------------------------
Global _
    $sTitle = "Ray casting", _
    $hGUI
;----------------------------------------------------

;----------------------------------------------------
; MATH CONSTANTS
;----------------------------------------------------
Global Const $MATH_PI = 3.14159265359
;----------------------------------------------------

;----------------------------------------------------
; ANGLES
;----------------------------------------------------
Global Const _
            $ANGLE_60 = $iWidth, _
            $ANGLE_30 = $ANGLE_60 / 2, _
            $ANGLE_15 = $ANGLE_30 / 2, _
            $ANGLE_90 = $ANGLE_30 * 3, _
            $ANGLE_180 = $ANGLE_90 * 2, _
            $ANGLE_270 = $ANGLE_90 * 3, _
            $ANGLE_360 = $ANGLE_60 * 6, _
            $ANGLE_0 = 0, _
            $ANGLE_5 = $ANGLE_30 / 6, _
            $ANGLE_10 = $ANGLE_5 * 2
;----------------------------------------------------

;----------------------------------------------------
; TRIGONOMETRIC TABLES
;----------------------------------------------------
Global _
        $aSinTable[$ANGLE_360 + 1], _
        $aISinTAble[$ANGLE_360 + 1], _
        $aCosTable[$ANGLE_360 + 1], _
        $aICosTable[$ANGLE_360 + 1], _
        $aTanTable[$ANGLE_360 + 1], _
        $aITanTable[$ANGLE_360 + 1], _
        $aFishTable[$ANGLE_60 + 1], _
        $aXStepTable[$ANGLE_360 + 1], _
        $aYStepTable[$ANGLE_360 + 1]
;----------------------------------------------------

Global _
    $aMap[12][12] = _
    [ _
    [1,1,1,1,1,1,1,1,1,1,1,1], _
    [1,0,0,0,0,0,0,0,0,0,0,1], _
    [1,1,1,1,1,0,0,1,0,0,0,1], _
    [1,0,0,0,0,1,0,0,0,0,0,1], _
    [1,0,0,0,1,1,1,0,0,0,0,1], _
    [1,0,0,0,1,0,1,0,0,0,0,1], _
    [1,0,0,0,0,0,0,0,0,0,0,1], _
    [1,0,0,0,0,1,0,0,0,0,0,1], _
    [1,0,0,0,0,0,0,0,0,0,0,1], _
    [1,0,0,0,0,0,0,0,0,0,0,1], _
    [1,0,0,0,0,0,0,0,0,0,0,1], _
    [1,1,1,1,1,1,1,1,1,1,1,1] _
    ], _
    $iMapWidth = 12, _
    $iMapHeight = 12

Global _
    $sMapIndex_Wall = "1", _
    $sMapIndex_Empty = "0"


;----------------------------------------------------
; PLAYER
;----------------------------------------------------

Global _
    $iPlayerArc = $ANGLE_0, _
    $iPlayerPosX = 100, _
    $iPlayerPosY = 90, _
    $iPlayerDistanceToTheProjectPlane = 277, _
    $iProjectionPlaneYCenter = $iHeight / 2, _
    $iProjectionPlaneYCenterMax = Int($iHeight / 1.2), _
    $iProjectionPlaneYCenterMin = $iHeight / 4, _
    $iProjectionPlaneYCenterDef = $iProjectionPlaneYCenter, _
    $iPlayerHeight = 32, _
    $iPlayerMovementSpeed = 16, _
    $iPlayerTurnSpeed = $ANGLE_5

    ;----------------------------------------------------
    ; PLAYER - ANIMATION
    ;----------------------------------------------------

    Global _
        $iPlayerAnimation_WalkIndex = 0

    ;----------------------------------------------------

;----------------------------------------------------

Global _
    $fPlayerDirX, _
    $fPlayerDirY

Global _
    $iTime = 0, _
    $iOldTime = 0

Global _
    $hGraphic, _
    $iFrameTime, _
    $aGraphic

Global $hSystemStartTimer

;----------------------------------------------------
; LOCAL
;----------------------------------------------------

;----------------------------------------------------
; _ENGINE_RENDER
;----------------------------------------------------

Global _
    $iGridVertical, $iGridHorizontal, _
    $iDistToNextVerticalGrid, $iDistToNextHorizontalGrid, _
    $fXIntersection, $fYIntersection, _
    $fDistToNextXIntersection, $fDistToNextYIntersection, _
    $iGridIndexX, $iGridIndexY, _
    $fDistToVerticalGridBeingHit, $fDistToHorizontalGridBeingHit, _
    $iCastArc, $iCastColumn, _
    $fScaleFactor, $fDist, _
    $iTopOfWall, $iBottomOfWall, _
    $iProjectedWallHeight

Global _
    $iXTemp, $iYTemp

;----------------------------------------------------

;----------------------------------------------------

$hGUI = GUICreate($sTitle, $iWidth, $iHeight, -1, -1)

GUICtrlSetColor(-1, 0xFF0000)

GUISetState()

Global $hLoopTimer = TimerInit()
Global $iNextTick = TimerDiff($hLoopTimer)

_Init()

While ($bGameRunning)
    _GUILoop()
    _KeysLoop()

    _Engine_Render()

    $iOldTime = $iTime
    $iTime = TimerDiff($hSystemStartTimer)

    $iFrameTime = ($iTime - $iOldTime) / 1000

    WinSetTitle($hGUI, "", $sTitle & " - FPS: " & Round(1 / $iFrameTime) & " X: " & $iPlayerPosX & " Y: " & $iPlayerPosY & " ARC: " & $iPlayerArc)
WEnd

_Shutdown()

Func _GUILoop()
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            _Shutdown()
    EndSwitch
EndFunc

Func _KeysLoop()
    If _IsPressed("25") Then
        $iPlayerArc -= $iPlayerTurnSpeed

        If $iPlayerArc < $ANGLE_0 Then
            $iPlayerArc += $ANGLE_360
        EndIf
    ElseIf _IsPressed("27") Then
        $iPlayerArc += $iPlayerTurnSpeed

        If $iPlayerArc >= $ANGLE_360 Then
            $iPlayerArc -= $ANGLE_360
        EndIf
    EndIf

    $fPlayerDirX = $aCosTable[$iPlayerArc]
    $fPlayerDirY = $aSinTable[$iPlayerArc]

    If _IsPressed("26") Then
        $iPlayerPosX += Int($fPlayerDirX * $iPlayerMovementSpeed)
        $iPlayerPosY += Int($fPlayerDirY * $iPlayerMovementSpeed)

        If $iPlayerAnimation_WalkIndex == 0 Then
            $iProjectionPlaneYCenter += 2

            If $iProjectionPlaneYCenter >= $iProjectionPlaneYCenterDef + 10 Then
                $iPlayerAnimation_WalkIndex = 1
            EndIf
        Else
            $iProjectionPlaneYCenter -= 2

            If $iProjectionPlaneYCenter <= $iProjectionPlaneYCenterDef - 10 Then
                $iPlayerAnimation_WalkIndex = 0
            EndIf
        EndIf

    ElseIf _IsPressed("28") Then
        $iPlayerPosX -= Int($fPlayerDirX * $iPlayerMovementSpeed / 2)
        $iPlayerPosY -= Int($fPlayerDirY * $iPlayerMovementSpeed / 2)

        If $iPlayerAnimation_WalkIndex == 0 Then
            $iProjectionPlaneYCenter += 1

            If $iProjectionPlaneYCenter >= $iProjectionPlaneYCenterDef + 10 Then
                $iPlayerAnimation_WalkIndex = 1
            EndIf
        Else
            $iProjectionPlaneYCenter -= 1

            If $iProjectionPlaneYCenter <= $iProjectionPlaneYCenterDef - 10 Then
                $iPlayerAnimation_WalkIndex = 0
            EndIf
        EndIf
    EndIf

    #cs
    If _IsPressed("57") Then
        If $iProjectionPlaneYCenter < $iProjectionPlaneYCenterMax Then
            $iProjectionPlaneYCenter += 10
        EndIf
    ElseIf _IsPressed("53") Then
        If $iProjectionPlaneYCenter > $iProjectionPlaneYCenterMin Then
            $iProjectionPlaneYCenter -= 10
        EndIf
    Else
        ;;If $iProjectionPlaneYCenter > $iProjectionPlaneYCenterDef Then
        ;;  $iProjectionPlaneYCenter = $iProjectionPlaneYCenterDef
        ;;Else
        ;;  $iProjectionPlaneYCenter = $iProjectionPlaneYCenterDef
        ;;EndIf
    EndIf
    #ce
EndFunc

Func _Init()
    Global $hGraphic, $aGraphic, $hPen, $hBitmap, $hBuffer

    $hSystemStartTimer = TimerInit()

    _GDIPlus_Startup()

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 0)

    $hPen = _GDIPlus_BrushCreateSolid()

    _GDIPlus_GraphicsClear($hBuffer, 0xFFFFFFFF)

    _CreateOptTables()
EndFunc

Func _Shutdown()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BrushDispose($hPen)
    _GDIPlus_Shutdown()

    Exit
EndFunc

;----------------------------------------------------
; HELPER
;----------------------------------------------------

Func _ArcToRad($iArcAngle)
    Return $iArcAngle * $MATH_PI / $ANGLE_180
EndFunc

Func _CreateOptTables()
    Local $i, $fRadian

    For $i = 0 To $ANGLE_360
        $fRadian = _ArcToRad($i) + 0.0001

        $aSinTable[$i] = Sin($fRadian)
        $aISinTable[$i] = 1 / $aSinTable[$i]
        $aCosTable[$i] = Cos($fRadian)
        $aICosTable[$i] = 1 / $aCosTable[$i]
        $aTanTable[$i] = Tan($fRadian)
        $aITanTable[$i] = 1 / $aTanTable[$i]

        If $i >= $ANGLE_90 And $i < $ANGLE_270 Then
            $aXStepTable[$i] = Round($iTileSize / $aTanTable[$i], 5)

            If $aXStepTable[$i] > 0 Then
                $aXStepTable[$i] = -$aXStepTable[$i]
            EndIf
        Else
            $aXStepTable[$i] = Round($iTileSize / $aTanTable[$i], 5)

            If $aXStepTable[$i] < 0 Then
                $aXStepTable[$i] = -$aXStepTable[$i]
            EndIf
        EndIf

        If $i >= $ANGLE_0 And $i < $ANGLE_180 Then
            $aYStepTable[$i] = Round($iTileSize * $aTanTable[$i], 5)

            If $aYStepTable[$i] < 0 Then
                $aYStepTable[$i] = -$aYStepTable[$i]
            EndIf
        Else
            $aYStepTable[$i] = Round($iTileSize * $aTanTable[$i], 5)

            If $aYStepTable[$i] > 0 Then
                $aYStepTable[$i] = -$aYStepTable[$i]
            EndIf
        EndIf
    Next

    For $i = -$ANGLE_30 To $ANGLE_30
        $fRadian = _ArcToRad($i)

        $aFishTable[$i + $ANGLE_30] = Round(1 / Cos($fRadian), 7)
    Next

EndFunc

;----------------------------------------------------

;----------------------------------------------------
; ENGINE
;----------------------------------------------------

;----------------------------------------------------
; ENGINE -> GRAPHIC
;----------------------------------------------------
Func _Engine_Graphic_DrawBackground()
    Local _
        $iC = 25, _
        $iR, $iF, _
        $iSkyLength = $iHeight - $iProjectionPlaneYCenter

    For $iR = 0 To $iSkyLength - 1 Step 10
        _GDIPlus_BrushSetSolidColor($hPen, "0xFF" & Hex($iC, 2) & Hex(125, 2) & Hex(225, 2))
        _GDIPlus_GraphicsFillRect($hBuffer, 0, $iR, $iWidth, 10, $hPen)

        $iC += 5
    Next

    $iC = 5

    For $iF = $iR To $iHeight - 1 Step 15
        _GDIPlus_BrushSetSolidColor($hPen, "0xFF" & Hex($iC, 2) & Hex(10, 2) & Hex(10, 2))
        _GDIPlus_GraphicsFillRect($hBuffer, 0, $iF, $iWidth, 15, $hPen)

        $iC += 5
    Next
EndFunc
;----------------------------------------------------

Func _Engine_Render()
    _GDIPlus_GraphicsClear($hBuffer, 0xFFFFFFFF)
    _Engine_Graphic_DrawBackground()

    $iCastArc = $iPlayerArc
    $iCastArc -= $ANGLE_30

    If $iCastArc < 0 Then
        $iCastArc = $ANGLE_360 + $iCastArc
    EndIf

    For $iCastColumn = 0 To $iWidth - 1 Step 5
        If $iCastArc > $ANGLE_0 And $iCastArc < $ANGLE_180 Then
            $iGridHorizontal = Int($iPlayerPosY / $iTileSize) * $iTileSize + $iTileSize

            $iDistToNextHorizontalGrid = $iTileSize

            $iXTemp = $aITanTable[$iCastArc] * ($iGridHorizontal - $iPlayerPosY)

            $fXIntersection = $iXTemp + $iPlayerPosX
        Else
            $iGridHorizontal = Int($iPlayerPosY / $iTileSize) * $iTileSize
            $iDistToNextHorizontalGrid = -$iTileSize

            $iXTemp = $aITanTable[$iCastArc] * ($iGridHorizontal - $iPlayerPosY)
            $fXIntersection = $iXTemp + $iPlayerPosX

            $iGridHorizontal -= 1
        EndIf

        If $iCastArc == $ANGLE_0 Or $iCastArc == $ANGLE_180 Then
            $fDistToHorizontalGridBeingHit = 9999999
        Else
            $fDistToNextXIntersection = $aXStepTable[$iCastArc]

            While True
                $iGridIndexX = Int($fXIntersection / $iTileSize)
                $iGridIndexY = Int($iGridHorizontal / $iTileSize)

                If $iGridIndexX >= $iMapWidth Or $iGridIndexY >= $iMapHeight Or $iGridIndexX < 0 Or $iGridIndexY < 0 Then
                    $fDistToHorizontalGridBeingHit = 9999999

                    ExitLoop
                ElseIf $aMap[$iGridIndexY][$iGridIndexX] <> $sMapIndex_Empty Then
                    $fDistToHorizontalGridBeingHit = ($fXIntersection - $iPlayerPosX) * $aICosTable[$iCastArc]

                    ExitLoop
                Else
                    $fXIntersection += $fDistToNextXIntersection
                    $iGridHorizontal += $iDistToNextHorizontalGrid
                EndIf
            WEnd
        EndIf

        If $iCastArc < $ANGLE_90 Or $iCastArc > $ANGLE_270 Then
            $iGridVertical = $iTileSize + Int($iPlayerPosX / $iTileSize) * $iTileSize
            $iDistToNextVerticalGrid = $iTileSize

            $iYTemp = $aTanTable[$iCastArc] * ($iGridVertical - $iPlayerPosX)
            $fYIntersection = $iYTemp + $iPlayerPosY
        Else
            $iGridVertical = Int($iPlayerPosX / $iTileSize) * $iTileSize
            $iDistToNextVerticalGrid = -$iTileSize

            $iYTemp = $aTanTable[$iCastArc] * ($iGridVertical - $iPlayerPosX)
            $fYIntersection = $iYTemp + $iPlayerPosY

            $iGridVertical -= 1
        EndIf

        If $iCastArc == $ANGLE_90 Or $iCastArc == $ANGLE_270 Then
            $fDistToVerticalGridBeingHit = 9999999
        Else
            $fDistToNextYIntersection = $aYStepTable[$iCastArc]

            While True
                $iGridIndexX = Int($iGridVertical / $iTileSize)
                $iGridIndexY = Int($fYIntersection / $iTileSize)

                If $iGridIndexX >= $iMapWidth Or $iGridIndexY >= $iMapHeight Or $iGridIndexX < 0 Or $iGridIndexY < 0 Then
                    $fDistToVerticalGridBeingHit = 9999999

                    ExitLoop
                ElseIf $aMap[$iGridIndexY][$iGridIndexX] <> $sMapIndex_Empty Then
                    $fDistToVerticalGridBeingHit = ($fYIntersection - $iPlayerPosY) * $aISinTable[$iCastArc]

                    ExitLoop
                Else
                    $fYIntersection += $fDistToNextYIntersection
                    $iGridVertical += $iDistToNextVerticalGrid
                EndIf
            WEnd
        EndIf

        If $fDistToHorizontalGridBeingHit < $fDistToVerticalGridBeingHit Then
            $fDist = $fDistToHorizontalGridBeingHit
            ;_GDIPlus_BrushSetSolidColor($hPen, 0xFF444444)
        Else
            $fDist = $fDistToVerticalGridBeingHit
            ;_GDIPlus_BrushSetSolidColor($hPen, 0xFF343434)
        EndIf

        $fDist /= $aFishTable[$iCastColumn]
        $iProjectedWallHeight = Int($iWallHeight * $iPlayerDistanceToTheProjectPlane / $fDist)
        $iBottomOfWall = $iProjectionPlaneYCenter + Int($iProjectedWallHeight * 0.5)
        $iTopOfWall = $iHeight - $iBottomOfWall

        If $iBottomOfWall >= $iHeight Then
            $iBottomOfWall = $iHeight - 1
        EndIf

        _GDIPlus_BrushSetSolidColor($hPen, "0xFF" & Hex(Int($iProjectedWallHeight / 4), 2) & Hex(Int($iProjectedWallHeight / 4), 2) & Hex(Int($iProjectedWallHeight / 4), 2))
        _GDIPlus_GraphicsFillRect($hBuffer, $iCastColumn, $iTopOfWall, 5, $iProjectedWallHeight, $hPen)

        $iCastArc += 5
        If $iCastArc >= $ANGLE_360 Then
            $iCastArc -= $ANGLE_360
        EndIf
    Next

    $iPlayerMovementSpeed = Round(1 / $iFrameTime) / 3
    $iPlayerTurnSpeed = Round(1 / $iFrameTime) * 2

    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
EndFunc

;----------------------------------------------------

_________________
[Vous devez être inscrit et connecté pour voir cette image]
avatar
Dylan Gadacha
EQUIPE BBAT
EQUIPE BBAT

Mensagens : 106
Data de inscrição : 24/10/2013
Idade : 18

Revenir en haut Aller en bas

Re: Technique de RayCasting

Message par Sachadee le Ven 12 Sep 2014, 10:51

Merci Dylan Very Happy

_________________
@SachaDee
avatar
Sachadee
Admin
Admin

Mensagens : 591
Data de inscrição : 04/06/2013

http://bbat.forumeiro.com

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum