[DBP] source fps

corwin Message lu Posté le 31 Mai 2009 à 11:35 Bulle
Avatar de corwin
Membre Confirmé

Messages : 459
GCPoints : 63647
Sa faisait longtemps que j'avais pas toucher a DBP alors je mi suis remis pour concocter les base pour faire un fps.

fait :
-mouvement personnage
--courire
--marcher
--accroupi
-mouvement camera respiration
-collision glissante
-mouvement arme déplacement
-tir
-impact
-réticule suivant l'endroit approximative de l'impact et non de la camera
-blur
-gravitée
-amélioration de la gravité
-rectification du problème de visé
-vie
-déplacer objet en le poussant
-feu

a faire :
-choix arme
-cadence de tir
-munition
-prendre objet
-sauter

Et tous sa sans média pour n'avoir rien a télécharger.

Source :
Code :
SYNC ON
SYNC RATE 60
SET DISPLAY MODE 1280,1024,32
HIDE MOUSE

rem valeur
null = make vector3(1)
null = make vector3(2)
null = make matrix4(3) : projection matrix4 3
null = make matrix4(4) : view matrix4 4
null = make matrix4(5) : world matrix4 5
gunOffsetX AS FLOAT = 15.0
gunOffsetY AS FLOAT = -20.0
gunOffsetZ AS FLOAT = 20.0
xPos AS FLOAT
zPos AS FLOAT
speed AS FLOAT = 10.0
xLook AS FLOAT
yAng AS FLOAT
lookSpeed AS FLOAT = 0.2
gunBobSpeed AS FLOAT = 6.0
gunBobMove AS FLOAT = 3.0
gunBobHeight AS FLOAT = 1.5
gunBobAng AS FLOAT
gunTurnAng AS FLOAT
gunLookAng AS FLOAT
mouseMovementX AS FLOAT
mouseMovementY AS FLOAT
v=2
val#=timer()
y#=100
r=100
bounce = 6
Angle  = 0
Angle2 = 0
Angle3 = 0
add = 5
line#=100000.0
vie#=100
blur=100

rem fog et fond noir
fog on
color backdrop RGB(0,0,0)

rem création du personnage
MAKE OBJECT box 1,50,125,50
position object 1,0,62.5,0
HIDE OBJECT 1

MAKE MESH FROM OBJECT 1,1
ADD LIMB 1,1,1
DELETE MESH 1

rem création de l'arme
MAKE OBJECT BOX 2,10,10,100
GLUE OBJECT TO LIMB 2,1,1
disable object zdepth 2

rem création de l'object pour l'impact
make object sphere 3,10
color object 3,rgb(255,0,0)
hide object 3

rem création du sol
make object plain 6,10000,10000
rotate object 6,-90,0,0
position object 6,5000,0,5000
color object 6,RGB(0,255,0)
ghost object on 6

rem création des careaux du sol
MAKE MATRIX 1,10000,10000,100,100

make object cube 500,100
position object 500,500,50,500
color object 500,RGB(0,64,128)
GoSub _FlameSetup
rem début boucle
DO
GoSub _FlameLoop
rem déplacer objet bleu
if object collision(500,1)<>0
CollideObjects(object collision(500,1),500)
endif

rem blur
set camera to image 0,1,1024,1024
sprite 1,0,0,1
set sprite 1,0,1
size sprite 1,screen width(),screen height()
set sprite alpha 1,blur

rem création des obstacles
for g=200 to 400
if object exist(g)
else
make object cube g,100
position object g,rnd(10000),50,rnd(10000)
color object g,RGB(255,0,0)
endif
next

rem valeur 3d en 2d pour le réticule
project3dTo2d(1,object position x(3),object position y(3),object position z(3))

rem calculer la distance entre l'objet et le personnage
view matrix4 4
project vector3 1,2,3,4,5
cxa#=cxa#+(mousemovey()/10.0)

if cxa#<-90.0 then cxa#=-90.0
if cxa#>90.0 then cxa#=90.0

   a2#=wrapvalue(a2#+(mousemovex()))
   d# = cos(cxa#) * line#
   x2#=object position x(1)
   z2#=object position z(1)
   ty# = y2# - sin(cxa#) * line#
   tx# = newxvalue(x2#,a2#,d#)
   tz# = newzvalue(z2#,a2#,d#)



   olddist# = line#
   for obj=200 to 400
   if object exist(obj)
      dist# = intersect object(obj, x2#,y2#,z2#,tx#,ty#,tz#)
      if dist# < olddist# and dist# > 0
         olddist# = dist#
      endif
      endif
   next obj

   dist# = olddist#

   if dist# = 0 then dist# = line#

   gdist# = cos(cxa#)*dist#
   tx# = newxvalue(x2#, a2#, gdist#)
   ty# = y2# - sin(cxa#)*dist#
   tz# = newzvalue(z2#, a2#, gdist#)

rem positionne la sphere a l'endroit de l'impact présumé
   position object 3,tx#,ty#,tz#


rem tir
if mouseclick()=1

   for bullet=100 to 100
      if object exist(bullet)
         delete object bullet
         make object cube bullet,10
         position object bullet,object position x(3),object position y(3),object position z(3)
      else
         make object cube bullet,10
         position object bullet,object position x(3),object position y(3),object position z(3)
      endif
   next

endif


   mouseMovementX = MOUSEMOVEX()
   mouseMovementY = MOUSEMOVEY()

text x vector3(1),y vector3(1),"+"
text 0,10,"FPS : "+str$(screen fps())
text 0,20,"VIE : "+str$(vie#)

rem valeur pour collision glissante
    oldx4 = object position x(1)
    oldy4 = object position y(1)
    oldz4 = object position z(1)
    oldangle4 = object angle y(1)

rem courire
if keystate(42)=1
   r=100
   y2#=r-30
   u=10
endif

rem accroupi
if keystate(46)=1
   r=50
   y2#=r-30
   u=2
endif

rem marcher
if keystate(42)=0 and keystate(46)=0
   r=100
   y2#=r-30
   u=5
endif
   y2#=r-30
rem mouvement
IF keystate(17)+keystate(31)+keystate(30)+keystate(32) > 0
rem avancer
   if keystate(17)=1
      move object 1,u
      bounce = 1
      add = 5
   else
      add = 0
      bounce = 6
   ENDIF

rem reculer
   if keystate(31)=1
      move object 1,-u
   ENDIF

rem pas à gauche
   if keystate(30)=1
      if object angle z(1)=0
         yrotate object 1,object angle y(1)-90
         move object 1,u
         yrotate object 1,object angle y(1)+90
      else
         yrotate object 1,object angle y(1)+90
         move object 1,u
         yrotate object 1,object angle y(1)-90
      endif
   ENDIF

rem pas à droite
   if keystate(32)=1
      if object angle z(1)=0
         yrotate object 1,object angle y(1)+90
         move object 1,u
         yrotate object 1,object angle y(1)-90
      else
         yrotate object 1,object angle y(1)-90
         move object 1,u
         yrotate object 1,object angle y(1)+90
      endif
   ENDIF


rem valeur pour collision glissante
    x4 = object position x(1)
    y4 = object position y(1)
    z4 = object position z(1)
    angle4 = object angle y(1)

rem collision glissante
    for o=200 to 400
    if object exist(o)
 if object collision(1, o)>0
    position object 1, oldx4, y4, z4
    if object collision(1, o)>0
       position object 1, x4, y4, oldz4
       if object collision(1, o)>0
          position object 1, oldx4, y4, oldz4
       endif
    endif
 endif
 endif
 next o

rem mouvement respiratoire
y# = r+sin(angle)/bounce

      gunBobAng = WRAPVALUE(gunBobAng+gunBobSpeed)
   ELSE

      gunBobAng = CURVEANGLE(0,gunBobAng,10)
ENDIF


   gunTurnAng = CURVEANGLE(WRAPVALUE(mouseMovementX),gunTurnAng,10)
   gunLookAng = CURVEANGLE(WRAPVALUE(mouseMovementY),gunLookAng,10)


   OFFSET LIMB 1,1,gunOffsetX+SIN(gunBobAng)*gunBobMove,gunOffsetY+ABS(COS(gunBobAng))*gunBobHeight,gunOffsetZ
   ROTATE LIMB 1,1,gunLookAng,gunTurnAng,0


   yAng = WRAPVALUE(yAng + mouseMovementX*lookSpeed)
   xLook = WRAPVALUE(xLook + mouseMovementY*lookSpeed)

rem gravité
if object collision(1,6)
l2#=0
else
l2#=l2#+0.3
l#=l#+l2#
endif

rem vie
for tiren=20000 to 30000
if object exist(tiren)
if object collision (1,tiren)
delete object tiren
vie#=vie#-0.1
endif
endif
next tiren

rem mouvement camera celon object et mouvement respiratoire
position object 1,object position x(1),r-l#,object position z(1)
    Inc Angle , 5
    Inc Angle2, rnd(add)
    Inc Angle3, rnd(add)
   ROTATE OBJECT 1,0+wrapvalue(cxa#),yAng+a2#,0
   PITCH OBJECT DOWN 1,xLook
   POSITION CAMERA object position x(1),object position y(1),object position z(1)
   ROTATE CAMERA xLook+wrapvalue(cxa#),yAng+sin(Angle2)+a2#,0-sin(Angle3)
   SYNC
rem fin de boucle
LOOP

_FlameSetup:

FlameCount = 1200
FlameID = 50
ImageID = 50
FlameSize# = 12
FlameRadius# = 25
FlameHeight# = 50
FlameSpeed# = 1
FlameTapper# = 0.97
FlameDim# = 3
FlameShrink# = 1.25

Type Flame
   ID
   Radius#
   Degree
   Depth#
   Size#
   Fade#
EndType

Make object cube FlameID,1
hide object FlameID

   create bitmap ImageID,50,50
   ink rgb(200,130,30),0
   for x=1 to 1000
      ang=rnd(360)
      rad=rnd(20)
      dot 25+sin(ang)*rad,25+cos(ang)*rad
   next x
   `Blur fire image
   blur bitmap ImageID,3
   get image ImageID,0,0,50,50
   delete bitmap ImageID


Dim Flame(FlameCount) as Flame

for i = 1000 to FlameCount
   Flame(i).Radius# = rnd(flameRadius# * 100)
      Flame(i).Radius# = Flame(i).Radius# / 100
   Flame(i).Degree = rnd(359)
   Flame(i).Depth# = rnd(FlameHeight#)
   Flame(i).ID = FlameID + i

   make object plain Flame(i).ID, FlameSize#, FlameSize#
   position object Flame(i).ID,100,0,100
   texture object Flame(i).ID,ImageID
   set object ambient Flame(i).ID,0
   set object transparency Flame(i).ID,1
   Ghost Object on Flame(i).ID
Next i
Return

_FlameLoop:

for i = 1000 to FlameCount
   If Flame(i).Depth# > FlameHeight#
      Flame(i).Radius# = rnd(flameRadius# * 100)
         Flame(i).Radius# = Flame(i).Radius# / 100
      Flame(i).Degree = rnd(359)
      Flame(i).Depth# = 0
      Flame(i).Fade# = 200
      Flame(i).Size# = 100
   endif


      Flame(i).Depth# = Flame(i).Depth# + FlameSpeed#

      Flame(i).Fade# = Flame(i).Fade# - FlameDim#

      Flame(i).Radius# = Flame(i).Radius# * FlameTapper#

      Flame(i).Size# = Flame(i).Size# - FlameShrink#

if object collision(Flame(i).ID,1) then vie#=vie#-0.01

      Position Object Flame(i).ID, object position x(FlameID)+300,object position y(flameID),object position Z(FlameID)+300
         Set object to object orientation Flame(i).ID, FlameID
         Move object Right Flame(i).ID, cos(Flame(i).Degree) * Flame(i).Radius#
         Move Object UP Flame(i).ID,    Flame(i).Depth#
         Move Object Flame(i).ID,       Sin(Flame(i).Degree) * Flame(i).Radius#

      scale object Flame(i).ID,flame(i).size#,Flame(i).size#,100

      fade object Flame(i).ID,Flame(i).Fade#

      set object to camera orientation Flame(i).ID
   next i

Return

function project3dTo2d(result as integer,x as float, y as float, z as float)
   set vector3 2,x,y,z
   view matrix4 4
   project vector3 1,2,3,4,5
endfunction

function CollideObjects(Pl,Df)
   Dfx#=object position x(Df)
   Dfz#=object position z(Df)
   Dfsx#=object size x(Df)/2
   Dfsz#=object size z(Df)/2
   left#=intersect object(Pl,Dfx#-Dfsx#,0,Dfz#-Dfsz#,Dfx#-Dfsx#,0,Dfz#+Dfsz#)
   top#=intersect object(Pl,Dfx#-Dfsx#,0,Dfz#+Dfsz#,Dfx#+Dfsx#,0,Dfz#+Dfsx#)
   right#=intersect object(Pl,Dfx#+Dfsx#,0,Dfz#+Dfsz#,Dfx#+Dfsx#,0,Dfz#-Dfsz#)
   bottom#=intersect object(Pl,Dfx#-Dfsx#,0,Dfz#-Dfsz#,Dfx#+Dfsx#,0,Dfz#-Dfsz#)
   if left# > 0 then move object right Df,10
   if top# > 0 then move object Df,-10
   if right# > 0 then move object left Df,10
   if bottom# > 0 then move object Df,10
endfunction
Dernière édition le 01 Juin 2009 à 14:08
Mod Message lu Posté le 31 Mai 2009 à 13:34 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Simple et efficace, une bien jolie base que voilà.

Merci pour ce code :).
corwin Message lu Posté le 31 Mai 2009 à 19:34 Bulle
Avatar de corwin
Membre Confirmé

Messages : 459
GCPoints : 63647
De rien :absurd: c'est mon devoir de gamecorpien :want:
Darktib Message lu Posté le 31 Mai 2009 à 20:25 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
Merci pour ce code.
Le déplacement est vraiment très bien fait, le flou est impressionnant (surtout sans shaders !), par contre le point d'impact est un petit peu hs, vu que normalement ca devrait etre en face du pisto et que c'est pas du tout en face dudit pistolet^^
corwin Message lu Posté le 01 Juin 2009 à 10:43 Bulle
Avatar de corwin
Membre Confirmé

Messages : 459
GCPoints : 63647
merci. Oui c'est le problème que je rencontre j'ai pas encore essayer de chercher vraiment pour pouvoir le rectifier. Je pense que c'est a chaque fois que la sphere rencontre un obstacle alors le temps qu'il fasse sont calcule la sphère se décale. Mais pour l'instant je vais rajouter quelque truck :

-amélioration de la gravité
-vie
-choix arme
-cadence de tir
-munition
-déplacer objet en le poussant
-prendre objet
-sauter

si vous avez d'autre suggestion dite le moi :wink:
Dernière édition le 01 Juin 2009 à 10:55
Darktib Message lu Posté le 01 Juin 2009 à 11:04 Bulle
Avatar de Darktib
Membre Ultime

Messages : 4017
GCPoints : 347288
Il faut utiliser le picking ici. Tu récupère le point d'impact grace au picking; bebou007 à crée une fonction qui fait exactement ce que j'ai dit, elle doit aussi etre dans cette section, sinon je te la donnerais
corwin Message lu Posté le 01 Juin 2009 à 11:14 Bulle
Avatar de corwin
Membre Confirmé

Messages : 459
GCPoints : 63647
C'est bon le problème est rectifier. merci quand même. Mais avec picking je pourrai dire qu'une valeur fixe que moi je ne voulait pas qu'elle soit par rapport a la camera mais par rapport au personnage comme sa le curseur bouge se qui donne un nouvelle horizon sur un nouveau gameplay :absurd:
Hell_666 Message lu Posté le 13 Sep 2009 à 10:25 Bulle
Avatar de Hell_666
Nouveau Membre

Messages : 16
GCPoints : 6623
Ouah le motion blur est extra :heartbeat: , mais je ne comprend pas comment tu as procédé avec les sprites pour le blur, pourrais tu m'expliquer un peu j'aimerais inclure le blur dans mon mod fpsc mais hélas je ne sais pas comment cela fonctionne :cute:


En tout cas bonne chance pour la suite :tongue:
Eternal suffering
corwin Message lu Posté le 13 Sep 2009 à 12:16 Bulle
Avatar de corwin
Membre Confirmé

Messages : 459
GCPoints : 63647
[vode]set camera to image 0,1,1024,1024
sprite 1,0,0,1
set sprite 1,0,1
size sprite 1,screen width(),screen height()
set sprite alpha 1,blur
[/code]
aufaite c'est tout simple :

-tu récupère les images de la camera :
Code :
set camera to image 0,1,1024,1024


-tu les convertit en sprite :
Code :
sprite 1,0,0,1


-tu applique une transparence :
Code :
set sprite 1,0,1


-tu redimensionne le sprite a la taille de l'écran :
Code :
size sprite 1,screen width(),screen height()


-tu lui applique un alpha pour que le sprite soit plus ou moins visible :
Code :
set sprite alpha 1,blur


normalement le sprite aura un petit décalage avec l'écran donc un effet de blur :wink:
Hell_666 Message lu Posté le 13 Sep 2009 à 12:26 Bulle
Avatar de Hell_666
Nouveau Membre

Messages : 16
GCPoints : 6623
Ah ok, astucieux, merci bien, je te tiendrais au courant de ma progression :proud:

Donc la variable blur permet de régler ce décalage alors ? Bon bien je vais donc voir où je peut faire ceci dans le code source de fpsc, merci :wink:

EDIT : Owi j'ai réussi à implanter le code, reste plus qu'à le retoucher un peu, je suis en 1024 X 768 ^^
Dernière édition le 13 Sep 2009 à 12:51
Eternal suffering
corwin Message lu Posté le 13 Sep 2009 à 13:44 Bulle
Avatar de corwin
Membre Confirmé

Messages : 459
GCPoints : 63647
de rien :wink: plus blur l'alpha est élever plus le blur aussi. autrement tu peut metre 800*600 pour "set camera to image" vu qu'après on redimensionne le sprite :wink:
Dernière édition le 13 Sep 2009 à 13:44
Hell_666 Message lu Posté le 13 Sep 2009 à 13:51 Bulle
Avatar de Hell_666
Nouveau Membre

Messages : 16
GCPoints : 6623
Si je récupère l'image affiché à la caméra en 800*600 j'ai donc un gain de performances ? Mais alors dans ce cas le blur sera moins beau si on redimensionne le sprite à une résolution plus élevée non ?

Je vais faire un screen quand j'aurais la valeur de blur parfaite à mon utilisation :tongue:
Eternal suffering
corwin Message lu Posté le 13 Sep 2009 à 13:57 Bulle
Avatar de corwin
Membre Confirmé

Messages : 459
GCPoints : 63647
oui une augmentation de performance mais une diminution de qualité. Autrement avec un anti-aliasing sa pourrai faire l'affaire mais la une grosse perte de performance sera a prévoir :wink:
Hell_666 Message lu Posté le 13 Sep 2009 à 14:11 Bulle
Avatar de Hell_666
Nouveau Membre

Messages : 16
GCPoints : 6623
Avec blur = 200 la perte de qualité sera suremment peu visible, je ferais des test :proud:

Je compte mettre blur=200 et quand le joueur à une santé critique je baisse la valeur pour faire plus de flou ca sera trop bien, j'éspère que ton code + cette idée fera ravir les fps maker :proud:
Eternal suffering
corwin Message lu Posté le 13 Sep 2009 à 14:23 Bulle
Avatar de corwin
Membre Confirmé

Messages : 459
GCPoints : 63647
A 200 le blur n'est pas visible est si tu diminue sa commencera décent le pas trop parce que apres on comprendra plus rien :wink: Autrement bonne chance :grin:
Hell_666 Message lu Posté le 13 Sep 2009 à 14:28 Bulle
Avatar de Hell_666
Nouveau Membre

Messages : 16
GCPoints : 6623
Merci, sur fpsc si c'est visible t'inquiète pas, par contre dans ton code en effet c'est pas visible, surement parce que les textures sont uniformes :strange:

Bref je fais des test pour trouver les bonne valeurs ^^

"si tu diminue sa commencera décent le pas trop parce que apres on comprendra plus rien :wink:"

J'ai remarquer en mettant blur=10 :lol:

Je ferais part des ma progression prochainement :proud:
Eternal suffering
corwin Message lu Posté le 13 Sep 2009 à 14:31 Bulle
Avatar de corwin
Membre Confirmé

Messages : 459
GCPoints : 63647
ok pas de souci :grin:
Hell_666 Message lu Posté le 13 Sep 2009 à 14:40 Bulle
Avatar de Hell_666
Nouveau Membre

Messages : 16
GCPoints : 6623
Seul bémol : les hud sont détraqués :lol:

Le hud de la vie et tout c'est bon il est juste plus foncé et plus transparent mais reste visible, par contre quand un hud apparait ca entre en conflit :hurt: . J'ai le sprite qui s'affiche par dessus :lol:

Je vais essayer de régler ca plus tard, je fini d'abord de modifier le code source ^^
Eternal suffering
corwin Message lu Posté le 13 Sep 2009 à 14:49 Bulle
Avatar de corwin
Membre Confirmé

Messages : 459
GCPoints : 63647
Oui c'est logique mais j'avais pas chercher plus loin comment le rectifier. aufaite c'est simple. Vu que le blur est un sprite et que le HUD aussi il a juste a dire que le HUD soit devant. Je crois qu'il y a une commande pour dire l'emplacement d'un sprite.
Hell_666 Message lu Posté le 13 Sep 2009 à 14:54 Bulle
Avatar de Hell_666
Nouveau Membre

Messages : 16
GCPoints : 6623
En effet, je chercherais un peu plus tard je suis en train d'ajuster les valeurs de la vie pour laquelle le joueur voit flou :proud:

Ca marche au poil, si le joueur reprend de la vie quand il est en dessous du seuil le blur est plus élevé donc écran moins flou et ca marche dans l'autre sens parfait :D

Reste plus qu'à trouver un seuil correct :wink:

EDIT : :arrow: Voici une vidéo pour montrer un peu ce que cela donne sous fpsc, notez que si la vie du joueur est inférieur ou égal à 15 la caméra est plus floue :proud: . Vidéo : http://www.youtube.com/watch?v=xwOdweguwyk
Dernière édition le 13 Sep 2009 à 18:05
Eternal suffering
Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.0638 secondes