Forum Liberty Basic France

Jeux » JEU 3D Allons plus loin ;)
Le 07/09/2022 à 11h44

Modérateur

Groupe: Modérateur

Inscrit le: 30/03/2011
Messages: 422
Salut salut !

Voici un exemple de code qui fait un jeu en 3D, assez simple a comprendre.

Une idée pour améliorer la boucle ? augmenter les perf ? Il est possible d'améliorer considérablement la qualité de l'image en augmentant fortement le nombre d'angles mais il faut ensuite mettre le déplacement en 1 par 1 ce qui fait un déplacement très très lent ^^. J'ai donc opté pour un équilibre entre la qualité et la "liberté de déplacement".

je précise que les case rouge font perdre la partie ^^

Voici le code pour les curieux :)

Code VB :
 
 
NOMAINWIN
 
DIM sintable(360)
DIM costable(360)
DIM map$(20)
DIM color$(10)
 
color$(1)="lightgray"
color$(2)="brown"
color$(3)="cyan"
color$(4)="darkred"
color$(5)="darkgray"
color$(6)="darkpink"
color$(7)="blue"
color$(8)="darkblue"
color$(9)="RED"
color$(10)="white"
 
map$(1)  = "111111111111111111111111111111111111"
map$(2)  = "100000000000000050000000000000000001"
map$(3)  = "100000011001100010005111100000000001"
map$(4)  = "101501550000510015000000100000900001"
map$(5)  = "105005000000000000000000100000000001"
map$(6)  = "101015000900511500000511500111510001"
map$(7)  = "100001500000005000000000000100000001"
map$(8)  = "155005100151005100000000005500050001"
map$(9)  = "155000000000000000000000001005550001"
map$(10) = "111511115111511115150000001001000001"
map$(11) = "111111111111111110055510010005005111"
map$(12) = "100000000000000000000000055100000001"
map$(13) = "100000050000000000009000005155005001"
map$(14) = "105505550000500000000000000000500001"
map$(15) = "105005000000000000005550000005550001"
map$(16) = "105055000900005000005000000000500001"
map$(17) = "100005500000005000005000000090000001"
map$(18) = "155005500050105000000000000000000001"
map$(19) = "155000000000100000000000000000000001"
map$(20) = "111111111111111111111111111111111111"
 
FOR i = 0 TO 360
    sintable(i) = (sin(i * 0.0174)) * 100
    NEXT i
FOR i = 0 TO 360
    costable(i) = (cos(i * 0.0174)) * 100
    NEXT i
 
WindowHeight = 500 : WindowWidth = 635 : UpperLeftX=int((DisplayWidth-WindowWidth)/2) : UpperLeftY=int((DisplayHeight-WindowHeight)/2)
global dy,dx
STATICTEXT #win.1, "use ZQSD/WASD or arrows for moove AND use ''escape'' for exit",150,465,500,30
GRAPHICBOX #win.g 5, 5, 624, 445
OPEN "fps" FOR window_popup AS #win
PRINT #win, "trapclose [quit]"
PRINT #win.g, "setfocus;fill blue"
print #win.1, "!font Times New Roman 9"
posx=32 : posy=32 : angle=0
 
[raycast]
dy = 0 : dx = 0
call readJStick 1
select case dx
    case 1
        angle = angle + 4
    case -1
        angle = (angle + 356) mod 360
    case 2
        goto [quit]
end select
select case dy
    case 1
        if (t-62)>0 then
        bx = posx - (sintable(((t-62) mod 360)) / 100)  ' la division augmente ou diminue la vitesse de marche
        by = posy - (costable(((t-62) mod 360)) / 100)
        k = ASC(MID$(map$(int(by/10)),int(bx/10),1))-48
        if k = 9 then notice "GAME OVER"
        IF k = 0 THEN
            posx = posx - (sintable(((t-62) mod 360)) / 100)
            posy = posy - (costable(((t-62) mod 360)) / 100)
        END IF
        end if
    case -1
        if (t-62)>0 then
        bx = posx + (sintable(((t-62) mod 360)) / 100)
        by = posy + (costable(((t-62) mod 360)) / 100)
        k = ASC(MID$(map$(int(by/10)),int(bx/10),1))-48
        if k = 9 then notice "GAME OVER"
        IF k = 0 THEN
            posx = posx + (sintable(((t-62) mod 360)) / 100)
            posy = posy + (costable(((t-62) mod 360)) / 100)
        END IF
        end if
end select
 
[raycast2]
FOR t = angle TO (angle + 124) step 1
    xb = sintable(t mod 360) / 360   'nombre angle (augmente résolution avec profondeur + hauteur)
    yb = costable(t mod 360) / 360
    bx = posx
    by = posy
    l = 0
 
    do
        bx = bx + xb
        by = by + yb
        l = l + 0.3    ' profondeur
        k = ASC(MID$(map$(int(by/10)),int(bx/10),1))-48
 
LOOP UNTIL (k > 0)
    x = (t - angle) * 5 : dd = (1000 / l)
    PRINT #win.g, "down"
    PRINT #win.g, "place ";x;" ";(100-dd)
    PRINT #win.g, "color ";color$(k);"; backcolor ";color$(k)
    PRINT #win.g, "boxfilled ";(x+5);" ";(100+dd)
 
    PRINT #win.g, "color ";color$(10);"; backcolor ";color$(10)
    PRINT #win.g, "boxfilled ";(x+5);" 0"
    PRINT #win.g, "place ";x;" ";(100+dd)
    PRINT #win.g, "boxfilled ";(x+5);" 445"
    PRINT #win.g, "place ";x;" ";(100-dd)
 
    PRINT #win.g, "color black"
    PRINT #win.g, "goto ";(x+5);" ";(100-dd)
    PRINT #win.g, "place ";x;" ";(100+dd)
    PRINT #win.g, "goto ";(x+5);" ";(100+dd)
    PRINT #win.g, "up"
NEXT t
 
goto [raycast]
 
    function GetAsyncKeyState(key)
        calldll #user32, "GetAsyncKeyState",key as long,GetAsyncKeyState as long
        if GetAsyncKeyState<>0 then GetAsyncKeyState=1
    end function
 
    sub readJStick n
        if GetAsyncKeyState(_VK_ESCAPE) then dx = 2
        if (GetAsyncKeyState(asc("Z")) or GetAsyncKeyState(_VK_UP)) AND (GetAsyncKeyState(asc("Q")) or GetAsyncKeyState(_VK_LEFT)) then dy = -1 : dx = -1 : goto [endPOINT]
        if (GetAsyncKeyState(asc("Z")) or GetAsyncKeyState(_VK_UP)) AND (GetAsyncKeyState(asc("D")) or GetAsyncKeyState(_VK_RIGHT)) then dy = -1 : dx = 1 : goto [endPOINT]
        if (GetAsyncKeyState(asc("S")) or GetAsyncKeyState(_VK_DOWN)) AND (GetAsyncKeyState(asc("Q")) or GetAsyncKeyState(_VK_LEFT)) then dy = 1 : dx = 1 : goto [endPOINT]
        if (GetAsyncKeyState(asc("S")) or GetAsyncKeyState(_VK_DOWN)) AND (GetAsyncKeyState(asc("D")) or GetAsyncKeyState(_VK_RIGHT)) then dy = 1 : dx = -1 : goto [endPOINT]
        if GetAsyncKeyState(asc("Z")) or GetAsyncKeyState(_VK_UP)     then dy = -1
        if GetAsyncKeyState(asc("W")) or GetAsyncKeyState(_VK_UP)     then dy = -1
        if GetAsyncKeyState(asc("S")) or GetAsyncKeyState(_VK_DOWN)   then dy =  1
        if GetAsyncKeyState(asc("Q")) or GetAsyncKeyState(_VK_LEFT)   then dx = -1
        if GetAsyncKeyState(asc("A")) or GetAsyncKeyState(_VK_LEFT)   then dx = -1
        if GetAsyncKeyState(asc("D")) or GetAsyncKeyState(_VK_RIGHT)  then dx =  1
        [endPOINT]
    end sub
 
[quit]
CONFIRM "Do you really want to quit?"; answer$
IF answer$="no" THEN GOTO [raycast]
CLOSE #win : END
 




Edité par atomose Le 07/09/2022 à 11h46
____________________
Yo !

MSN Web    
Jeux » JEU 3D Allons plus loin ;)  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie