Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| FPS 3D : La suite ! | |
| | |
Auteur | Message |
---|
The Gamer
Nombre de messages : 110 Age : 30 Localisation : Toulouse (31) Date d'inscription : 11/05/2010
| Sujet: FPS 3D : La suite ! Jeu 23 Avr 2015 - 12:36 | |
| Allez je m'emballe, voici une version améliorée du programme précédent: maintenant il y a une forêt, une gestion des collisions avec l'environnement et un ciel. Maintenant il faut à tout prix que je me mette a bosser mes partiels pour la rentrée, je vais devoir faire une pause Panoramic (Même si ces premiers résultats sont hyper encourageants pour moi ) Le programme est beaucoup plus lourd, si vous avez des problèmes de fluidité ajustez l'intervalle timer ou les variables suivantes: • vit_depl (vitesse de déplacement de la caméra) • sensi (sensibilité de la souris) Les graphismes sont un peu nul mais il y a une bonne base. La prochaine étape sera de mettre en place les sauts et la gravité. Enfin, je pourrais commencer à envisager un système de tir sur cible (la forêt est pas mon objectif final, je voudrais plutôt partir sur un environnement futuriste composé de cubes (pour le décors) et de sphères qu'il faudrait dégomer ) Le code: - Code:
-
' ======= Déclaration des label ======= ' Positionnnement de la souris label Programme_principal
' ======= Déclaration des variables =======
' Comportement de la souris dim souris_x_init dim souris_x_comp dim souris_y_init dim souris_y_comp
' Repère sphérique et cartésiens pour le pointage caméra dim sph_point_teta dim sph_point_phi dim sph_point_R
dim cart_point_x dim cart_point_y dim cart_point_z
' Repère cartesien pour la position de la caméra dim cam_pos_x dim cam_pos_y
' Sensibilité de la souris dim sensi
' Vitesse de déplacement dim vit_depl
' Variable de détection de collision dim detec_col dim vit_col_front dim vit_col_back dim col_point
' ======= Initialisation des variables ======= sph_point_R = 0.9 sph_point_teta=0 sph_point_phi=0 sensi=-0.05 cam_pos_x = 0 cam_pos_y = 0 vit_depl = 0.3
' ======= Initialisation de l'affichage =======
' Création de la fenetre caption 0,"Test de caméra 3D" border_hide 0 full_space 0
' === Création de l'environnement 3D de déplacement de la caméra === ' Légende des couleur ' x: Rouge ' y: vert ' z: Bleu
scene3d 1 full_space 1 axes_show color 1,0,0,0 cursor_hide 1 light_y_position 5 light_x_position 10 light_z_position 5
3d_skybox 1 3d_load_texture_front 1,"Skybox coté.bmp" 3d_load_texture_back 1,"Skybox coté.bmp" 3d_load_texture_left 1,"Skybox coté.bmp" 3d_load_texture_right 1,"Skybox coté.bmp" 3d_load_texture_top 1,"Skybox haut.bmp"
3d_plane 2 3d_position 2,0,0,0 3d_load_texture 2,"terrain.bmp" 3d_x_rotate 2,90 3d_u_tile 2,100 3d_v_tile 2,100 3d_scale 2,100,100,100
3d_sphere 3,0.5 3d_collision_as_sphere 3 3d_y_position 3,1 3d_hide 3
3d_sphere 4,0.005 3d_color 4,255,0,0 3d_collision_as_cube 4
3d_sphere 5,0.1 3d_position 5,0,1,0 3d_hide 5 3d_collision_as_sphere 5
dim i dim arbre_x dim arbre_z i=6
while i<30
arbre_x=rnd(25) arbre_z=rnd(25)
3d_sphere i,1 3d_x_scale i,2.5 3d_y_scale i,2.5 3d_x_rotate i,270 3d_y_position i,3 3d_color i,0,25,0 3d_x_position i,arbre_x 3d_z_position i,arbre_z 3d_collision_as_ellipsoid i i=i+1
3d_cylinder i,5,0.5,1 3d_color i,85,67,12 3d_x_rotate i,180 3d_y_position i,0.5 3d_load_texture i,"Ecorce.jpg" 3d_x_position i,arbre_x 3d_z_position i,arbre_z 3d_collision_as_faces i i=i+1
end_while
while i<60
arbre_x=rnd(25)-25 arbre_z=rnd(25)
3d_sphere i,1 3d_x_scale i,2.5 3d_y_scale i,2.5 3d_x_rotate i,270 3d_y_position i,3 3d_color i,0,25,0 3d_x_position i,arbre_x 3d_z_position i,arbre_z 3d_collision_as_ellipsoid i i=i+1
3d_cylinder i,5,0.5,1 3d_color i,85,67,12 3d_x_rotate i,180 3d_y_position i,0.5 3d_load_texture i,"Ecorce.jpg" 3d_x_position i,arbre_x 3d_z_position i,arbre_z 3d_collision_as_cube i i=i+1
end_while
while i<90
arbre_x=rnd(25) arbre_z=rnd(25)-25
3d_sphere i,1 3d_x_scale i,2.5 3d_y_scale i,2.5 3d_x_rotate i,270 3d_y_position i,3 3d_color i,0,25,0 3d_x_position i,arbre_x 3d_z_position i,arbre_z 3d_collision_as_ellipsoid i i=i+1
3d_cylinder i,5,0.5,1 3d_color i,85,67,12 3d_x_rotate i,180 3d_y_position i,0.5 3d_load_texture i,"Ecorce.jpg" 3d_x_position i,arbre_x 3d_z_position i,arbre_z 3d_collision_as_cube i i=i+1
end_while
while i<120
arbre_x=rnd(25)-25 arbre_z=rnd(25)-25
3d_sphere i,1 3d_x_scale i,2.5 3d_y_scale i,2.5 3d_x_rotate i,270 3d_y_position i,3 3d_color i,0,25,0 3d_x_position i,arbre_x 3d_z_position i,arbre_z 3d_collision_as_ellipsoid i i=i+1
3d_cylinder i,5,0.5,1 3d_color i,85,67,12 3d_x_rotate i,180 3d_y_position i,0.5 3d_load_texture i,"Ecorce.jpg" 3d_x_position i,arbre_x 3d_z_position i,arbre_z 3d_collision_as_cube i i=i+1
end_while
' === FIN de la création de la map ===
' ======= PROGRAMME PRINCIPAL Création du timer de surveillance de la souris ======= timer 30 timer_interval 30,25 on_timer 30,Programme_principal
end
' ======= Ecriture des sous-programmes =======
' === Programme principal ===
Programme_principal: ' Test sur le comportement du pointeur ' Comportement horizontal if souris_x_init <> mouse_x_position(1) sph_point_phi = sph_point_phi-(mouse_x_position(1)-souris_x_init)*sensi end_if
' Comportement vertical if souris_y_init <> mouse_y_position(1) sph_point_teta=sph_point_teta+(mouse_y_position(1)-souris_y_init)*sensi if sph_point_teta > 24.8 sph_point_teta=24.8 end_if if sph_point_teta < 14.85 sph_point_teta=14.85 end_if end_if ' Detection des collisions detec_col = 0 col_point=0 for i=6 to 119 detec_col = detec_col + o3d_collision(5,i) col_point = col_point + o3d_collision(3,i) next i
vit_col_front = 0 vit_col_back = 0
' Calcul de la vitesse a opposer au mouvement dans le cas d'une collision if detec_col <> 0 if col_point <> 0 vit_col_front = vit_depl+0.001 vit_col_back = 0 else vit_col_back = vit_depl+0.001 vit_col_front = 0 end_if
end_if
' Test sur le comportement des touches du clavier if scancode=90 cam_pos_x = cam_pos_x + (vit_depl-vit_col_front)*(cart_point_x-cam_pos_x) cam_pos_y = cam_pos_y + (vit_depl-vit_col_front)*(cart_point_y-cam_pos_y) end_if
if scancode=83 cam_pos_x = cam_pos_x - (vit_depl-vit_col_back)*(cart_point_x-cam_pos_x) cam_pos_y = cam_pos_y - (vit_depl-vit_col_back)*(cart_point_y-cam_pos_y) end_if if scancode=27 timer_off_all terminate end_if ' Calcul des coordonnées du pointeur 3D cart_point_x = cam_pos_x + sph_point_R*cos(sph_point_teta/3.141592654)*cos(sph_point_phi/3.141592654) cart_point_y = cam_pos_y + sph_point_R*cos(sph_point_teta/3.141592654)*sin(sph_point_phi/3.141592654) cart_point_z = 1+sph_point_R*sin(sph_point_teta/3.141592654) ' Calcul des coordonnées de la caméra ' Actualisation affichage 3d_position 3,cart_point_x,cart_point_z,cart_point_y 3d_position 4,cart_point_x,cart_point_z,cart_point_y point_position cart_point_x,cart_point_z,cart_point_y cam_position cam_pos_x,1,cam_pos_y 3d_position 5,cam_pos_x,1,cam_pos_y light_position cam_pos_x,1,cam_pos_y
souris_x_init=mouse_x_position(1) souris_y_init=mouse_y_position(1)
return
Les textures et Cie: tecturesJ'espère que ça vous plaira ! Maintenant je cours à ma thermodynamique | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: FPS 3D : La suite ! Jeu 23 Avr 2015 - 12:51 | |
| Oui c'est excellent et c'est bien dommage que tu doives réviser tes partiels. Toutefois c'est en effet plus important. Bon courage et encore bravo, ça fonctionne très bien | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: FPS 3D : La suite ! Jeu 23 Avr 2015 - 15:42 | |
| Salut The Gamer Le Joueur. Un bon petit code où il y a des bonnes idées. Panoramic c’es bien, mais la thermodynamique c’est mieux ! Enfin, comme ça fini par ique (ic) ça doit être bon. Comme on est dans les inutilitaires, ça ne risque pas de trop polluer ce post, je m’adresse donc à jicehel : Hé jicehel, pourquoi dis-tu que c’est bien dommage que The Gamer Le joueur doive réviser ses partiels ? Surtout la thermodynamique. Hmmm, attends un peu : ça me rappelle quelque chose, mais quoi ? Ah oui, j’étais météorologue professionnel et la thermodynamique était mon plat de tous les jours. Ah, Jicehel si tu goûtes à la thermodynamique ! | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: FPS 3D : La suite ! Jeu 23 Avr 2015 - 16:15 | |
| Je préfère un muffin à la Nutella, mais bon, à chacun ses goûts ... ^^ | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: FPS 3D : La suite ! Jeu 23 Avr 2015 - 22:07 | |
| alors là bravo Le Gamer comme cela tu ne fais pas que jouer si tu veux , il est possible de créer une foret en un seul objet pour faciliter la gestion des collisions bon courage pour les partielles | |
| | | The Gamer
Nombre de messages : 110 Age : 30 Localisation : Toulouse (31) Date d'inscription : 11/05/2010
| Sujet: Re: FPS 3D : La suite ! Dim 26 Avr 2015 - 22:14 | |
| Grappillant sur mes révisions, mon programme se développe: Nouveau code avec un chargement animé du décor (qui est cubique maintenant), une simulation du mouvement lors des déplacement (je dois encore ajouter un léger mouvement latéral): - Code:
-
' Merci Silverman pour ton code sur la position de la souris
' ======= Chargement des librairies ============ dll_on "user32"
' ======= Déclaration des label ======= ' Positionnnement de la souris label Programme_principal
' ======= Déclaration des variables =======
' Paramètres de l'affichage dim demi_ecran_x% dim demi_ecran_y%
' Comportement de la souris dim souris_mouv_x dim souris_mouv_y dim init_pos_souris dim position_souris
' Repère sphérique et cartésiens pour le pointage caméra dim sph_point_teta dim sph_point_phi dim sph_point_R
dim cart_point_x dim cart_point_y dim cart_point_z
' Repère cartesien pour la position de la caméra dim cam_pos_x dim cam_pos_y dim cam_pos_z dim cam_ampli dim cam_osci dim cam_freq
' Repère sphérique + variables nécéssaire a la rotation de la caméra pendant le chargement dim cam_pos_phi
' Sensibilité de la souris dim sensi
' Vitesse de déplacement dim vit_depl
' Variable de détection de collision dim detec_col dim vit_col_front dim vit_col_back dim col_point
' Variables pour le tirage au sort permettant de créer la map dim taille_cube dim cube_x dim cube_z dim nombre_cube dim taille_map dim detec_col_cube dim num_cube_premier
' Compteurs pour boucle utilisés de multiples fois dim i dim j
' ======= Initialisation des variables =======
' Position/sensibilité du pointeur sph_point_R = 0.9 sph_point_teta=0 sph_point_phi=0 sensi=-0.5
' Position de la caméra cam_pos_x = 0 cam_pos_y = 0 cam_pos_phi = 0
' Déplacement vit_depl = 0.15
' Caractéristiques de la map taille_map = 40 nombre_cube=power(taille_map,2)*0.04 init_pos_souris = 1
' Caractéristiques de l'oscillation caméra cam_osci=0 cam_freq=vit_depl*170-2 cam_ampli=0.03 cam_pos_z = 1
' ======= Initialisation de l'affichage =======
' Création de la fenetre caption 0,"Test de caméra 3D" border_hide 0 ' width 0,screen_x ' height 0,screen_y full_space 0 hide 0
' Création de la scene 3d scene3d 1 color 1,0,0,0 full_space 1 cam_position taille_map,taille_map,taille_map light_position taille_map,taille_map,0
' Mesure de la dimension de la fenetre demi_ecran_x%=width(0)/2 demi_ecran_y%=height(0)/2
' Création de la fenetre de chargement show 0 form 2 border_hide 2 top 2,2*demi_ecran_y%-60 left 2,demi_ecran_x%-300 height 2,17 width 2,600 progress_bar 4 width 4,600 parent 4,2 min 4,0 max 4,nombre_cube-21 position 4,0
' === Création de l'environnement 3D de déplacement de la caméra === ' Légende des couleur ' x: Rouge ' y: vert ' z: Bleu
' Ciel 3d_skybox 1 3d_load_texture_front 1,"Skybox coté.bmp" 3d_load_texture_back 1,"Skybox coté.bmp" 3d_load_texture_left 1,"Skybox coté.bmp" 3d_load_texture_right 1,"Skybox coté.bmp" 3d_load_texture_top 1,"Skybox haut.bmp"
' Sol 3d_plane 2 3d_position 2,0,0,0 3d_load_texture 2,"terrain.bmp" 3d_x_rotate 2,90 3d_u_tile 2,taille_map*0.4 3d_v_tile 2,taille_map*0.4 3d_scale 2,taille_map*0.4,taille_map*0.4,taille_map*0.4
' Sphère modélisant l'avant (front) pour les collisions 3d_sphere 3,0.5 3d_collision_as_sphere 3 3d_y_position 3,1 3d_hide 3
' Sphère matérialisant le pointeur en rouge 3d_sphere 4,0.02 3d_color 4,255,0,255 3d_transparent 4,150
' Sphère englobant le joueur pour les collsions 3d_sphere 5,0.6 3d_position 5,0,1,0 3d_hide 5 3d_collision_as_sphere 5
' Création d'un cube central protégeant le départ du joueur 3d_cube 6,10 3d_hide 6 3d_collision_as_cube 6
position 4,6
' Sotckage du nombre du premier cube num_cube_premier=number_3d_objects+1
' Initialisation du compteur i=num_cube_premier
' Génération du décor cubique aléatoirement
while i=<num_cube_premier+nombre_cube ' Tirage au sort des attribut spatiaux du cube taille_cube=rnd(5)+1.2 cube_x=rnd(taille_map*2)-taille_map cube_z=rnd(taille_map*2)-taille_map detec_col_cube = 1 ' Création du cube 3d_cube i,taille_cube 3d_hide i 3d_color i,rnd(255),rnd(255),rnd(255) 3d_position i,cube_x,taille_cube/2,cube_z 3d_collision_as_cube i
' Optimisation de l'espace: aucun cube ne doit se chevaucher if i > num_cube_premier while detec_col_cube = 1 detec_col_cube = 0 j=num_cube_premier-2 while detec_col_cube = 0 and j=<i-1 j=j+1 if o3d_collision(j,i)=0 detec_col_cube = 0 else cube_x=rnd(taille_map*2)-taille_map cube_z=rnd(taille_map*2)-taille_map 3d_position i,cube_x,taille_cube/2,cube_z detec_col_cube = 1 end_if if scancode = 27 terminate end_if end_while end_while end_if 3d_show i ' incrémentation du compteur i=i+1 ' mouvement de la barre de chargement position 4,i ' mouvement de la caméra cam_pos_phi = cam_pos_phi + 1 cam_pos_x = (taille_map/2)*cos(cam_pos_phi*(3.141592654/180)) cam_pos_y = (taille_map/2)*sin(cam_pos_phi*(3.141592654/180)) cam_position cam_pos_x,taille_map/4,cam_pos_y end_while
wait 1000 hide 2
' === FIN de la création de la map ===
' === PROGRAMME PRINCIPAL : On demande a l'utilisateur de confirmer le début du jeu ====
wait 1000 if message_confirmation_ok("Le jeu va commencer!")=1 ' Activation du brouillard fog_on fog_color 100,100,100 fog_distance_min 10 fog_distance_max 30 ' Matérialisation des limites i=i+1 3d_line i,0-taille_map,1,0-taille_map 3d_line i,taille_map,1,0-taille_map 3d_line i,taille_map,1,taille_map 3d_line i,0-taille_map,1,taille_map 3d_line i,0-taille_map,1,0-taille_map 3d_line_width i,20 3d_color i,255,0,0 ' Initialisation position souris cursor_hide 1 init_pos_souris = 1 position_souris = dll_call2("SetCursorPos",demi_ecran_x%,demi_ecran_y%) ' Activation du timer de programme principal timer 30 timer_interval 30,5 on_timer 30,Programme_principal else ' On quite le jeu si l'utilisateur souhaite utiliser la touche échap terminate end_if
end
' ======= Ecriture des sous-programmes =======
' === Programme principal ===
Programme_principal:
' Détection des mouvements de souris if init_pos_souris=1 init_pos_souris=0 souris_mouv_x=mouse_x_position(1) souris_mouv_y=mouse_y_position(1) end_if
' Réinitialisation de la position curseur et calcul de son déplacement position_souris= dll_call2("SetCursorPos",demi_ecran_x%,demi_ecran_y%) sph_point_phi = sph_point_phi-(mouse_x_position(1)-souris_mouv_x)*sensi sph_point_teta=sph_point_teta+(mouse_y_position(1)-souris_mouv_y)*sensi
' Vérrouillage de l'axe vertical if sph_point_teta > 85 sph_point_teta=85 end_if if sph_point_teta < -85 sph_point_teta=-85 end_if ' ====== Etude du déplacement ====== ' Detection des collisions detec_col = 0 col_point=0 for i=num_cube_premier to num_cube_premier+nombre_cube detec_col = detec_col + o3d_collision(5,i) col_point = col_point + o3d_collision(3,i) next i
vit_col_front = 0 vit_col_back = 0
' Calcul de la vitesse a opposer au mouvement dans le cas d'une collision if detec_col <> 0 if col_point <> 0 vit_col_front = vit_depl else vit_col_back = vit_depl end_if end_if ' Limite de la map if cam_pos_x<=(0.9-taille_map) if cart_point_x <= 0.9-taille_map vit_col_front=vit_depl else vit_col_back=vit_depl end_if end_if
if cam_pos_y<=(0.9-taille_map) if cart_point_y <= 0.9-taille_map vit_col_front=vit_depl else vit_col_back=vit_depl end_if end_if if cam_pos_x>=(taille_map-0.9) if cart_point_x >= taille_map-0.9 vit_col_front=vit_depl else vit_col_back=vit_depl end_if end_if
if cam_pos_y>=(taille_map-0.9) if cart_point_y >= taille_map-0.9 vit_col_front=vit_depl else vit_col_back=vit_depl end_if end_if
' Réactions aux ordres lancé par le joueur au clavier if scancode=90 cam_pos_x = cam_pos_x + (vit_depl-vit_col_front)*(cart_point_x-cam_pos_x) cam_pos_y = cam_pos_y + (vit_depl-vit_col_front)*(cart_point_y-cam_pos_y) cam_osci = cam_osci + cam_freq end_if
if scancode=83 cam_pos_x = cam_pos_x - (vit_depl-vit_col_back)*(cart_point_x-cam_pos_x) cam_pos_y = cam_pos_y - (vit_depl-vit_col_back)*(cart_point_y-cam_pos_y) cam_osci = cam_osci + cam_freq end_if if scancode=27 timer_off_all terminate end_if ' Oscillation de la caméra du a la respiration cam_osci = cam_osci + 0.75
' Calcul des coordonnées du pointeur 3D cart_point_x = cam_pos_x + sph_point_R*cos(sph_point_teta*(3.141592654/180))*cos(sph_point_phi*(3.141592654/180)) cart_point_y = cam_pos_y + sph_point_R*cos(sph_point_teta*(3.141592654/180))*sin(sph_point_phi*(3.141592654/180)) cart_point_z = 1+sph_point_R*sin(sph_point_teta*(3.141592654/180)) + 0.3*cam_ampli*sin(cam_osci*(3.141592654/180)) cam_pos_z = 1 +cam_ampli*sin(cam_osci*(3.141592654/180)) ' Actualisation affichage 3d_position 3,cart_point_x,cart_point_z,cart_point_y 3d_position 4,cart_point_x,cart_point_z,cart_point_y point_position cart_point_x,cart_point_z,cart_point_y cam_position cam_pos_x,cam_pos_z,cam_pos_y 3d_position 5,cam_pos_x,cam_pos_z,cam_pos_y
return Ne vous y trompez pas ce n'est pas encore un jeu, juste le plaisir de se déplacer dans un monde virtuel Les commandes sont les mêmes: echap = quitter (marche aussi pendant le chargement) z = avancer s = reculer Si le déplacement manque en fluidité, réduisez la valeur de la variable taille_map Prochaine étape (en cours, pour la fin de la sem pro j'espère): chargement dynamique du décors (les cubes disparaitront lorsqu'il seront hors de vue, ca permettra de générer les "map" plus grandes) Vous pouvez utiliser les textures fournies ici (écorce inutile): texturesEDIT: Il existe un moyen de rentrer dans les cubes, le trouverez vous ? | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: FPS 3D : La suite ! Lun 27 Avr 2015 - 0:18 | |
| Désolé, chez moi, je peux bien bouger la vue mais avancer / reculer ne fonctionnent pas. Suis-je le seul qui ait ce problème ? | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 27 Avr 2015 - 11:52 | |
| C' est très prometteur ! ( mais je n' ai pas trouvé comment rentrer dans les cubes... ) | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: FPS 3D : La suite ! Lun 27 Avr 2015 - 12:00 | |
| Au bureau ça marche nickel (il faudra que je vois pourquoi je ne pouvais pas avancer chez moi). Je n'ais pas réussi à rentrer dans les cubes.
Bravo, c'est clair que c'est vraiment prometeur.
J'ai hate de voir la suite, c'est très bien parti et pour le moment, ça reste bien fluide
| |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: FPS 3D : La suite ! Lun 27 Avr 2015 - 18:22 | |
| super j'ai juste un problème pour voir l'herbe qui, chez moi, est grise le plus souvent. impossible de rentrer dans les cubes! | |
| | | jimx78
Nombre de messages : 241 Age : 33 Localisation : Yvelines Date d'inscription : 24/05/2010
| Sujet: Re: FPS 3D : La suite ! Lun 27 Avr 2015 - 18:23 | |
| Génial ton code ! Il est optimiser pour les collision, bien joué.
J'ai découvert une astuce pour afficher en pleine écran ton jeux (sans la barre du menu démarrer en dessous)
Il suffit de remplacer :
full_space 0
Par
width 0,screen_x height 0,screen_y
Merci bon courage ! | |
| | | The Gamer
Nombre de messages : 110 Age : 30 Localisation : Toulouse (31) Date d'inscription : 11/05/2010
| Sujet: Re: FPS 3D : La suite ! Lun 27 Avr 2015 - 21:18 | |
| Merci pour vos encouragements !! C'est très motivant . Si je reste actif un bout de temps sur le forum, vous verrez que mon plus gros défaut est de marcher à la reconnaissance... Je m’efforce de le combler, mais n'hésitez pas à me dire quand je deviens trop "relou" (si les plus vieux membres ont du mal a comprendre : "lourd" , je vous taquine ) | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: FPS 3D : La suite ! Mar 28 Avr 2015 - 0:38 | |
| Le vieux membre que je suis te dis que tu n’es pas "relou" : tu es "gélé", c’est-à-dire "léger". Alors sois comme tu es et n’aie aucune crainte. | |
| | | The Gamer
Nombre de messages : 110 Age : 30 Localisation : Toulouse (31) Date d'inscription : 11/05/2010
| Sujet: Re: FPS 3D : La suite ! Mer 29 Avr 2015 - 13:22 | |
| Je sais pas si il faut créer un nouveau sujet mais je poursuis dans celui ci ! Ma réussite au partiel de thermodynamique étant plus que médiocre, j'ai travaillé très tard sur ce programme hier soir. Le résultat est plus qu'encourageant pour moi ! Ce type de code permet de gérer un nombre d'objets considérable avec Panoramic. En effet, il ne charge que les objets présents dans l'environnement proche du joueur. Amélioration par rapport au code précédent: • Chargement/déchargement des cubes de façon dynamique • Possibilité d'augmenter taille_map jusqu'a 100 pour avoir une fluidité raisonable • Génération de la map plus rapide permettant de générer des maps plus grandes Bug connus: • Probleme d'acces violation: surement dus aux taille énormes de mes tableaux ==> Je vais essayer de gérer cette quantité de données dans un fichier texte • Ralentissement de l'éxécution lors de l'actualisation de l'affichage des cubes ==> Plutot que de décharger/recharger tout le décors proche a chaque fois, je vais programmer une gestion un peu plus intelligente Amélioration a venir: • Ajout d'un brouillard stable (j'ai des soucis pour l'instant) • Chargement du décors proche avant l'arrivé du personnage sur le plateau (vous verrez faut attendre 1000 ms quant on arrive) Code: - Code:
-
' Développement des cubes en cours.
' Merci Silverman pour ton code sur la position de la souris
' ======= Chargement des librairies ============ dll_on "user32"
' ======= Déclaration des label ======= ' Positionnnement de la souris label Programme_principal, Actualisation_chargement
' ======= Déclaration des variables =======
' Paramètres de l'affichage dim demi_ecran_x% dim demi_ecran_y%
' Comportement de la souris dim souris_mouv_x dim souris_mouv_y dim init_pos_souris dim position_souris
' Repère sphérique et cartésiens pour le pointage caméra dim sph_point_teta dim sph_point_phi dim sph_point_R
dim cart_point_x dim cart_point_y dim cart_point_z
' Repère cartesien pour la position de la caméra dim cam_pos_x dim cam_pos_y dim cam_pos_z dim cam_ampli dim cam_osci dim cam_freq
' Repère sphérique + variables nécéssaire a la rotation de la caméra pendant le chargement dim cam_pos_phi
' Sensibilité de la souris dim sensi
' Vitesse de déplacement dim vit_depl
' Variable de détection de collision dim detec_col dim vit_col_front dim vit_col_back dim col_point
' Variables pour le tirage au sort permettant de créer la map dim nombre_cube% dim taille_map dim detec_col_cube dim num_cube_premier dim tab_cube_taille(1000) dim tab_cube_x(1000) dim tab_cube_z(1000) dim tab_cube_col_R(1000) dim tab_cube_col_V(1000) dim tab_cube_col_B(1000)
' Variables utilisées pour l'apparition, disparition des cubes dim seuil_chargement dim past_cube_i(36) dim current_cube_i(36) dim maillage dim detec_past_cube
' Compteurs pour boucle utilisés de multiples fois dim i dim j dim k dim l dim n%
' ======= Initialisation des variables =======
' Position/sensibilité du pointeur sph_point_R = 0.9 sph_point_teta=0 sph_point_phi=0 sensi=-0.5
' Position de la caméra cam_pos_x = 0 cam_pos_y = 0 cam_pos_phi = 0
' Déplacement vit_depl = 0.15
' Caractéristiques de la map taille_map = 100 nombre_cube%=0 init_pos_souris = 1
' Caractéristiques de l'oscillation caméra cam_osci=0 cam_freq=vit_depl*170-2 cam_ampli=0.03 cam_pos_z = 1
' Chargement des cubes (seuil = nombre de cubes chargés autour du personnage) seuil_chargement = 36 maillage = 10
' ======= Initialisation de l'affichage =======
' Création de la fenetre border_hide 0 ' width 0,screen_x ' height 0,screen_y full_space 0 hide 0
' Création de la scene 3d scene3d 1 color 1,0,0,0 full_space 1 cam_position taille_map,taille_map,taille_map light_position taille_map,taille_map,0
' Mesure de la dimension de la fenetre demi_ecran_x%=width(0)/2 demi_ecran_y%=height(0)/2
' Création de la fenetre de chargement show 0 form 2 border_hide 2 top 2,2*demi_ecran_y%-60 left 2,demi_ecran_x%-300 height 2,17 width 2,600
' Barre de chargement progress_bar 4 width 4,600 parent 4,2 min 4,0 max 4,power(taille_map*2,2)/100 position 4,0
' === Création de l'environnement 3D de déplacement de la caméra === ' Légende des couleur ' x: Rouge ' y: vert ' z: Bleu
' Ciel 3d_skybox 1 3d_load_texture_front 1,"Skybox coté.bmp" 3d_load_texture_back 1,"Skybox coté.bmp" 3d_load_texture_left 1,"Skybox coté.bmp" 3d_load_texture_right 1,"Skybox coté.bmp" 3d_load_texture_top 1,"Skybox haut.bmp"
' Sol 3d_plane 2 3d_position 2,0,0,0 3d_load_texture 2,"terrain.bmp" 3d_x_rotate 2,90 3d_u_tile 2,taille_map*0.4 3d_v_tile 2,taille_map*0.4 3d_scale 2,taille_map*0.4,taille_map*0.4,taille_map*0.4
' Sphère modélisant l'avant (front) pour les collisions 3d_sphere 3,0.5 3d_collision_as_sphere 3 3d_y_position 3,1 3d_hide 3
' Sphère matérialisant le pointeur en rouge 3d_sphere 4,0.02 3d_color 4,255,0,255 3d_transparent 4,150
' Sphère englobant le joueur pour les collsions 3d_sphere 5,0.6 3d_position 5,0,1,0 3d_hide 5 3d_collision_as_sphere 5
' Création d'un cube central protégeant le départ du joueur 3d_cube 6,10 3d_hide 6 3d_collision_as_cube 6
position 4,6
' Sotckage du nombre du premier cube num_cube_premier=number_3d_objects+1
' Initialisation du compteur i=num_cube_premier k=0-taille_map-2*maillage j=0
' Génération du décor cubique aléatoirement while k=<taille_map+2*maillage for j=0-taille_map-2*maillage to taille_map+12 step maillage
' positonnement du cube + enregistrement de sa position dans un tableau tab_cube_taille(i) = 2+rnd(3) tab_cube_z(i) = j + rnd(10) tab_cube_x(i) = k + rnd(10) tab_cube_col_R(i) = rnd(255) tab_cube_col_V(i) = rnd(255) tab_cube_col_B(i) = rnd(255)
' création de l'objet pour le chargement visuel 3d_cube i,tab_cube_taille(i) 3d_position i,tab_cube_x(i),tab_cube_taille(i)/2,tab_cube_z(i) 3d_color i,tab_cube_col_R(i),tab_cube_col_V(i),tab_cube_col_B(i) ' mouvement de la barre de chargement position 4,i ' mouvement de la caméra cam_pos_phi = cam_pos_phi + 1 cam_pos_x = (taille_map/2)*cos(cam_pos_phi*(3.141592654/180)) cam_pos_y = (taille_map/2)*sin(cam_pos_phi*(3.141592654/180)) cam_position cam_pos_x,taille_map/4,cam_pos_y ' Sauvegarde du nombre de cube et incrémentation du compteur nombre_cube% = nombre_cube% + 1 i=i+1 ' Arrêt pour l'esthetique de l'affichage wait 5 next j k=k+maillage end_while
' Matérialisation des limites i=i+1 3d_line i,0-taille_map,1,0-taille_map 3d_line i,taille_map,1,0-taille_map 3d_line i,taille_map,1,taille_map 3d_line i,0-taille_map,1,taille_map 3d_line i,0-taille_map,1,0-taille_map 3d_line_width i,20 3d_color i,255,0,0
' Pause avant initialisation du jeu delete 2
' === FIN de la création de la map ===
' === PROGRAMME PRINCIPAL : On demande a l'utilisateur de confirmer le début du jeu ====
if message_confirmation_ok("Le jeu va commencer!")=1
' Initialisation position souris cursor_hide 1 init_pos_souris = 1 position_souris = dll_call2("SetCursorPos",demi_ecran_x%,demi_ecran_y%)
' Destruction des cubes pour la mise en place du chargement dynamique for i=num_cube_premier to num_cube_premier + nombre_cube%-2 3d_delete i next i
' Initialisation de la position caméra cam_pos_x = 0 cam_pos_y = 0
' Activation du timer de programme principal timer 30 timer_interval 30,15 on_timer 30,Programme_principal timer 31 timer_interval 31,1000 on_timer 31, Actualisation_chargement timer_on 30 timer_on 31
else ' On quite le jeu si l'utilisateur souhaite utiliser la touche échap terminate end_if
end
' ======= Ecriture des sous-programmes =======
Programme_principal:
' === Mouvement caméra ======
' Détection des mouvements de souris if init_pos_souris=1 init_pos_souris=0 souris_mouv_x=mouse_x_position(1) souris_mouv_y=mouse_y_position(1) end_if
' Réinitialisation de la position curseur et calcul de son déplacement position_souris= dll_call2("SetCursorPos",demi_ecran_x%,demi_ecran_y%) sph_point_phi = sph_point_phi-(mouse_x_position(1)-souris_mouv_x)*sensi sph_point_teta=sph_point_teta+(mouse_y_position(1)-souris_mouv_y)*sensi
' Vérrouillage de l'axe vertical if sph_point_teta > 85 sph_point_teta=85 end_if if sph_point_teta < -85 sph_point_teta=-85 end_if
' Réactions aux ordres lancé par le joueur au clavier if scancode=90 cam_pos_x = cam_pos_x + (vit_depl-vit_col_front)*(cart_point_x-cam_pos_x) cam_pos_y = cam_pos_y + (vit_depl-vit_col_front)*(cart_point_y-cam_pos_y) cam_osci = cam_osci + cam_freq end_if
if scancode=83 cam_pos_x = cam_pos_x - (vit_depl-vit_col_back)*(cart_point_x-cam_pos_x) cam_pos_y = cam_pos_y - (vit_depl-vit_col_back)*(cart_point_y-cam_pos_y) cam_osci = cam_osci + cam_freq end_if
if scancode=27 terminate end_if
' ====== Lois et comportements physiques ======
' Detection des collisions avec le décor detec_col = 0 col_point = 0 for i=1 to seuil_chargement j=current_cube_i(i) detec_col = detec_col + o3d_collision(5,j) col_point = col_point + o3d_collision(3,j) next i
vit_col_front = 0 vit_col_back = 0
' Calcul de la vitesse a opposer au mouvement dans le cas d'une collision if detec_col <> 0 if col_point <> 0 vit_col_front = vit_depl else vit_col_back = vit_depl end_if end_if
' Limite de la map if cam_pos_x<=(0.9-taille_map) if cart_point_x <= 0.9-taille_map vit_col_front=vit_depl else vit_col_back=vit_depl end_if end_if
if cam_pos_y<=(0.9-taille_map) if cart_point_y <= 0.9-taille_map vit_col_front=vit_depl else vit_col_back=vit_depl end_if end_if
if cam_pos_x>=(taille_map-0.9) if cart_point_x >= taille_map-0.9 vit_col_front=vit_depl else vit_col_back=vit_depl end_if end_if
if cam_pos_y>=(taille_map-0.9) if cart_point_y >= taille_map-0.9 vit_col_front=vit_depl else vit_col_back=vit_depl end_if end_if
' Oscillation de la caméra du a la respiration cam_osci = cam_osci + 0.75
' ======== Actualisation de la position et de l'affichage ======== ' Calcul des coordonnées du pointeur 3D cart_point_x = cam_pos_x + sph_point_R*cos(sph_point_teta*(3.141592654/180))*cos(sph_point_phi*(3.141592654/180)) cart_point_y = cam_pos_y + sph_point_R*cos(sph_point_teta*(3.141592654/180))*sin(sph_point_phi*(3.141592654/180)) cart_point_z = 1+sph_point_R*sin(sph_point_teta*(3.141592654/180)) + 0.3*cam_ampli*sin(cam_osci*(3.141592654/180)) cam_pos_z = 1 +cam_ampli*sin(cam_osci*(3.141592654/180))
' Actualisation affichage 3d_position 3,cart_point_x,cart_point_z,cart_point_y 3d_position 4,cart_point_x,cart_point_z,cart_point_y point_position cart_point_x,cart_point_z,cart_point_y cam_position cam_pos_x,cam_pos_z,cam_pos_y 3d_position 5,cam_pos_x,cam_pos_z,cam_pos_y
' Suivi pour le débug print_locate 0,0 print cam_pos_x print cam_pos_y
return
Actualisation_chargement: ' ======== Chargement dynamique du décors =========
' Calcul des numéro des cubes entourant le personnage ' Cube central n% = num_cube_premier + ((cam_pos_y+taille_map+2*maillage-mod(cam_pos_y+taille_map+2*maillage,maillage))/maillage)+((cam_pos_x+taille_map+2*maillage-mod(cam_pos_x+taille_map+2*maillage,maillage))/maillage)*(2*(taille_map+2*maillage-mod(taille_map+2*maillage,maillage))/maillage)
' Calcul des cubes entourant le cube central. k=1 for i = 0 to sqr(seuil_chargement)-1 for j = 0 to sqr(seuil_chargement)-1 current_cube_i(k) = n% + (i-int(sqr(seuil_chargement)/2))*2*(taille_map+2*maillage-mod(taille_map+2*maillage,maillage))/maillage + (j-int(sqr(seuil_chargement)/2)) k=k+1 next j next i
' Vérification des cubes présents dans l'environnement du personnage for i=1 to seuil_chargement 3d_delete past_cube_i(i) next i
for i=1 to seuil_chargement j = current_cube_i(i) if o3d_object_exists(current_cube_i(i)) = 0 3d_cube j,tab_cube_taille(j) 3d_position j,tab_cube_x(j),tab_cube_taille(j)/2,tab_cube_z(j) 3d_color j,tab_cube_col_R(j),tab_cube_col_V(j),tab_cube_col_B(j) 3d_collision_as_cube j end_if next i
for i=1 to seuil_chargement past_cube_i(i)=current_cube_i(i) next i return
Les textures sont ici: textures(seul terrain et les fichiers skybox sont utiles) Si vous rencontrez un probleme lors de l'éxécution: alt+ctrl+suppr ==> Gestionnaire des taches ==> Processus ==> Arretter le processus PANORAMIC.exe | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: FPS 3D : La suite ! Mer 29 Avr 2015 - 15:14 | |
| Bravo, c'est vraiment impressionnant et en effet ça reste fluide. Très interessant résultat. J'espère que ça va un peu reveiller notre Bignono car il avait bien avancé sur ces programmes et il pourra peut être t'aider dans l'optimisation ou les idées ou / et profiter de ton expérience avec ce moteur prometteur. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: FPS 3D : La suite ! Mer 29 Avr 2015 - 17:31 | |
| Félicitation pour ta réussite au partiel de thermodynamique et bravo pour ton code. Tu parles de problème d'access violation et tu croix que c'est du aux tailles énormes de tes tableaux. Je pense que le problème provient d'un TIMER_INTERVAL 30,15 trop court en ligne 282 Modifie cette ligne - Code:
-
timer_interval 30,150 Je croix qu'avec un TIMER_INTERVAL de 150, on ne violera plus l'accès : c'est à tester. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: FPS 3D : La suite ! Mer 29 Avr 2015 - 18:09 | |
| Tu peux aussi éviter le problème de sortie en gérant le On_close => Dans le traitement tu arrètes tous les timers, tu attends 200ms et tu faits un terminate
Sinon pour le timer, avec 150, je trouve que Papydall est un peu trop généreux et ça fait "saccader" les déplacement mais ça passe très bien avec un timer à 40. | |
| | | The Gamer
Nombre de messages : 110 Age : 30 Localisation : Toulouse (31) Date d'inscription : 11/05/2010
| Sujet: Re: FPS 3D : La suite ! Mer 29 Avr 2015 - 18:12 | |
| papydall , par "plus que médiocre" j'entends "plutot raté" :/ mais j'avais bien réussi l'exam précédent donc je verrais.
Baisser le timer à 150ms génère une image pas du tout fluide. J'ai l'impression que 25ms est plus stable et assez fluide.
J'ai aussi constaté un bug dans le chargement des objets en bordure de map. Mais je vais essayer d'arranger ca.
EDIT: Si vous baissez les fréquences des timer, il faut augmenter vit_depl pour garder un déplacement à vitesse acceptable. Merci Jicehel, pour ton conseil pour la fermeture. Je m'empresse d'ajouter ca ! | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: FPS 3D : La suite ! Mer 29 Avr 2015 - 18:33 | |
| Sino, tu peux passer le timer à 40 sans changer la vitesse. Tu verras, ça reste très fluide. Après c'est vrai que si tu montes le timer à plus, ça dégrade l'animation de manière peu plaisante. | |
| | | The Gamer
Nombre de messages : 110 Age : 30 Localisation : Toulouse (31) Date d'inscription : 11/05/2010
| Sujet: Re: FPS 3D : La suite ! Mer 29 Avr 2015 - 18:36 | |
| Je pense que ca dépend du processeur de chacun parce que moi a 40 ca ralentit vraiment l'action... J'ai un intel i3 2.6GHz environ (ordi portable) et une carte graphique qui vaut pas grand chose... | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: FPS 3D : La suite ! Mer 29 Avr 2015 - 19:01 | |
| salut The Gamer,
ça se présente bien, c'est très fluide. J'ai qq suggestions: -cache le scene 3d pendant la création de la map, je pense que tu devrais gagner un peu en rapidité(mais c'est pas sur) de création. -ajoute un déplacement latéral. -hide/show tes objets plutôt que les recréer en permanence(c'est plus rapide que de les créer/supprimer), car si c'est des objets stocké sur le hdd, ça va ralentir ton prog.
Pour le timer, tu peux calculer le nb d'image /seconde comme ça: FPS=1000/timer. Pour un timer réglé à 20 ms, ça fait 50 images/sec, ça reste très correct comme valeur. Ne dépasse pas les 30ms sinon ça va trop saccader et ça ne va pas être agréable. Ou bien tu laisse le choix à l'utilisateur comme ceci: FPS%=50 timer_interval 30,(1000/fps%) | |
| | | The Gamer
Nombre de messages : 110 Age : 30 Localisation : Toulouse (31) Date d'inscription : 11/05/2010
| Sujet: Re: FPS 3D : La suite ! Mer 29 Avr 2015 - 19:43 | |
| J'ai testé le hide/show. Le pb c'est qu'avec plus de 50 objets chargés en memoire ca commence a ralentir serieusement chez moi.
Pour le reste merci pour tes suggestions (le deplacement lateral est en prevision). Le chargement de la map est plus sympa en visuel mais tu as raison c'est surement plus rapide sans le mouvement. Je peux meme charger la map en memoire sans creer les objets mais ce ser moins sympa... | |
| | | jimx78
Nombre de messages : 241 Age : 33 Localisation : Yvelines Date d'inscription : 24/05/2010
| Sujet: Re: FPS 3D : La suite ! Mer 29 Avr 2015 - 20:16 | |
| Je viens de faire un test, c'est d'afficher un maximum de cube sur ma scene3D.
J'ai réussi a afficher jusqu'a 10 000 cubes (sans test de collision, tous afficher a l’écran) mais au dessus j'ai rapidement Out of memory
Avec autant de bloc, j'ai 5 fois moins de fps.
Si je place 5000 cubes, il n'y a pas de baisse de fps.
Conclusion : C'est peut être le code de l'anti-collision qui te fait perdre tout les fps je pense qu'il n'y a pas besoin de tester la collision de tout ce qui a dans la map, mais uniquement ce qui est très proche de toi ?
(peut t’être que je fail complètement, si tu y a penser, et que tu l'a déjà intégrer)
Dit moi tout, je suis ton code avec passion, et me remotive pas mal ! | |
| | | The Gamer
Nombre de messages : 110 Age : 30 Localisation : Toulouse (31) Date d'inscription : 11/05/2010
| Sujet: Re: FPS 3D : La suite ! Mer 29 Avr 2015 - 20:39 | |
| Pour les cubes, mon ordi baisse de fps au dessus de 200cubes avec gestion de collision (si je teste tout les cubes).
Dans la dernière version (bas de page 1), je ne charge que 40cubes (avec collisions) autour de moi sur une quantité énorme (coordonnées stockées dans un tableau). Donc ça reste fluide quelque soit la taille de la map (ou nombre de cube total). Le code ne teste les collisions que sur 40 cubes ce qui marche plutôt bien.
C'est sur qu'une optimisation voudrait que seuls les 9 cubes directement autour de la camera devraient etre testé. Je vais réfléchir pour savoir si c'est possible. | |
| | | mindstorm
Nombre de messages : 685 Age : 55 Localisation : charente Date d'inscription : 13/02/2013
| Sujet: Re: FPS 3D : La suite ! Mer 29 Avr 2015 - 20:56 | |
| étrange la camera baisse sans cesse pour le reste super a suivre | |
| | | Contenu sponsorisé
| Sujet: Re: FPS 3D : La suite ! | |
| |
| | | | FPS 3D : La suite ! | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |