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 |
|
|
| Début d'un nouveau système de 2D et Sprites | |
| | |
Auteur | Message |
---|
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Début d'un nouveau système de 2D et Sprites Sam 21 Mai 2016 - 12:27 | |
| Bonjour à tous, @Klaus, Il y a une erreur dans la doc.chm (au minimum sur celle en ligne, je n'ai pas vérifier les autres) Il s'agit du tableau d'information pour le scene2D (ci-dessous) - Citation :
- ' 0 = taille du tableau (doit être chargé avant d'établir le lien)
' 1 = nombre de sprites ' 2 = ID du sprite sélectionné ' 3 = x (position horizontale du coin en haut à gauche du sprite) ' 4 = y (position verticale du coin en haut à gauche du sprite) ' 5 = w (largeur du sprite) ' 6 = h (hauteur du sprite) ' 7 = flag "utilisation du viewport" ' 8 = flag "déplacement du viewport par la souris est autorisé" ' 9 = coordonnée x du viewport ' 10 = coordonnée y du viewport
les coordonnées x,y,w,h ne sont pas celles du sprite sélectionnée. Je pense que c'est plutôt le viewport. A+ | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Début d'un nouveau système de 2D et Sprites Dim 22 Mai 2016 - 9:17 | |
| Mince, ça marchait plutôt bien mais j'avais une erreur de pointeur. J'ai essayé de triturer un peu les timers et les événements mais j'ai toujours des problèmes de pointeurs. J'en appelle donc à vous et je pense surtout à Klaus pour m'expliquer ce qui peut planter dans les pointeurs par ce que je ne vois pas. Je ne dis pas que le problème vient des nouvelles fonctions. C'est sans doute mon utilisation qui ne tient pas compte de quelque chose mais je ne vois pas quoi, peut être que ça sautera aux yeux de quelqu'un d'exterieur. Le problème est plus ou moins aléatoire, c'est pouruoi j'ai essayé de couper les événements et les timers le temps des traitements. A priori, je n'en aurais pas besoin car ça marchait plutôt bien avant jusqu'au changement de niveau. Je vous remets le code actuel ici: - Code:
-
' Panorabrique V3 par Jicehel ' ' Version utilisant les objets sprites et scene2D de KGF
label event,t1, t2, boucle
dim sversion$, iversion%: sversion$ = string$(255," ") dim res%, SC2D%, SC2D_PS%, dx%, dy%, hnd%, MP% , titre$ : titre$ = "PANORABRIQUE - V3.0" dim h,l : h=700: l=1000 dim hauteur_b, largeur_b : hauteur_b = 30 : largeur_b=60 dim c, xb, yb, i, j, r , N dim Nb_b_ligne : Nb_b_ligne = int((l - 80)/(largeur_b+3)) dim Nb_lignes, Sprites_briques, Nb_points_brique$ : Nb_lignes = 7 dim x_r , y_r, hauteur_r, largeur_r, num_spr_raquette, v_raquette : hauteur_r = 30 : largeur_r=120 : y_r = h-30-hauteur_r : v_raquette = 25 dim vies : vies = 3 dim x_balle,y_balle, n_balle, num_spr_balle dim v_x_balle%, v_y_balle% : v_x_balle% = 10 : v_y_balle% = 10 : ' Vitese de déplassement de la balle dim score : score = 0 dim Nb_couleur%: Nb_couleur% = 6 dim num_bord_gauche%,num_bord_haut%, num_bord_droit%, largeur_bord% : largeur_bord% = 40 dim Boucle% : Boucle% = 6
' ***************************** COMMANDES CLAVIER ************************* dim esc,cesc : cesc=27 : ' * TOUCHE "ESC" ==> MET FIN AU PROGRAMME:.. 27 * dim tfg,ctfg : ctfg=37 : ' * FLÈCHE GAUCHE ==> ALLER À GAUCHE:....... 37 * dim tfd,ctfd : ctfd=39 : ' * FLÈCHE DROITE ==> ALLER À DROITE:....... 39 *
dim son_perdu : son_perdu = 20 : sound son_perdu : file_load son_perdu,"Perte_balle.wav" dim son_gameover : son_gameover = 21 : sound son_gameover : file_load son_gameover,"Perdu.wav" dim son_nouvelleballe : son_nouvelleballe = 22 : sound son_nouvelleballe : file_load son_nouvelleballe,"Nouvelle_balle.wav" dim son_rebondmetal : son_rebondmetal = 23 : sound son_rebondmetal : file_load son_rebondmetal, "Rebond_bord_metal.mp3" dim son_rebondraquette : son_rebondraquette = 24 : sound son_rebondraquette : file_load son_rebondraquette, "Rebond_raquette.mp3" dim son_cassebrique : son_cassebrique = 25 : sound son_cassebrique : file_load son_cassebrique, "Brique_cassee.wav" dim son_musique$ : son_musique$ = "Musique1.wav"
height 0, h+62: width 0,l+37 : border_small 0
dll_on "KGF.dll"
dim brique1$ : brique1$ = "b01_2.bmp" dim brique2$ : brique2$ = "b02_2.bmp" dim brique3$ : brique3$ = "b03_2.bmp" dim brique4$ : brique4$ = "b04_2.bmp" dim brique5$ : brique5$ = "b05_2.bmp" dim brique6$ : brique6$ = "b06_2.bmp" dim brique7$ : brique7$ = "b07_2.bmp" dim raquette$ : raquette$ = "raquette_2.bmp" dim balle$ : balle$ = "balle2.bmp" dim barre_haut$ : barre_haut$ = "barre_haut.bmp" dim barre_cote$ : barre_cote$ = "barre_cote.bmp" dim fond$ : fond$ = "fond01.jpg"
' res% = dll_call1("GetVersionOfScene2D",dest%) ' Paramètres: ' dest% 0 retourner l'information numérique de la version uniquement ' adr(version$) retourner également l'information textuelle ' Retour: ' res% version numérique (1, 2, 3, ...)
iversion% = dll_call1("GetVersionOfScene2D",adr(sversion$))
MP% = dll_call5("CreateMultiPlayer",handle(0),0-1000,0,500,500) res% = dll_call2("LoadFileIntoMultiPlayer",MP%,adr(son_musique$ )) res% = dll_call2("LoopMultiPlayer",MP%,1)
' SC2D% = dll_call2("CreateScene2D",handle(dest%),VP%) ' Paramètres: ' dest% objet Panoramic recevant le Scene2D (form, Panel, ...) ' VP% : indicateur d'utilisation du viewport (0=fond fixe 1=viewport mobile) ' Retour: ' SC2D% identifiant unique du Scene2D, servant de lien avec les autres fonctions ' SC2D% = dll_call2("CreateScene2D",handle(0),0)
if 1 = 0 ' res% = dll_call2("SetInterfaceOfScene2D",SC2D%,x%) ' Paramètres: ' SC2D% identifiant de l'objet ' x% 0 pour récupérer la longueur du tableau interface% ' adr(interface%) pour établir le lien avec l'objet ' Retour: ' res% -1=erreur 0=ok ' ou n>0 si x%=0: retourne alors la longueur du tableau interface% ' Utilisation: ' res% = dll_call2("SetInterfaceOfScene2D",SC2D%,0) ' dim interface%(res%) ' interface%(0) = res% ' interface%(1) = handle(edit%) ' res% = dll_call2("SetInterfaceOfScene2D",SC2D%,adr(interface%)) ' Signification des cellules de l'interface: ' offset signification ' 0 taille du tableau (doit être chargé avant d'établir le lien) ' 1 handle d'un EDIT (doit être chargé pour recevoir les évènements) ' 2 ID du sprite sélectionné ' 3 x (position horizontale du coin en haut à gauche du sprite) ' 4 y (position verticale du coin en haut à gauche du sprite) ' 5 w (largeur du sprite) ' 6 h (hauteur du sprite) ' 7 ID du sprite collisionné ' 8 numéro de la zone de contact collisionné dans le sprite collisionné ' 9 flag "utilisation du viewport" ' 10 flag "déplacement du viewport par la souris est autorisé" ' 11 coordonnée x du viewport ' 12 coordonnée y du viewport ' 13 indice de l'image dans l'ImageList (-1 = ImageList non utilisée) ' 14 code action du sprite causant l'évènement ' 15 fréquence d'action du sprite causant l'évènement (ou 0 si pas d'action en cours) ' 16 type d'évènement: 0=normal 1=collision 2=contact bordure 3=téléporté ' 17 bordure pour type évènement 2 et 3: 1=gauche 2=haut 3=droite 4=ba end_if
edit 98 : hide 98 ' 98 est l'objet edit qui va permettre de recevoir les informations ' provenant du scene2d géré par KGF
SC2D_PS% = dll_call2("SetInterfaceOfScene2D",SC2D%,0) dim SC2D_Panoramic%(SC2D_PS%) SC2D_Panoramic%(0) = SC2D_PS% SC2D_Panoramic%(1) = handle(98) SC2D_PS% = dll_call2("SetInterfaceOfScene2D",SC2D%,adr(SC2D_Panoramic%))
if 1=0 ' res% = dll_call6("ResizeScene2D",SC2D%, l%,t%,w%,h%,v) ' Paramètres: ' SC2D% identifiant de l'objet ' l%,t% coin en haut à gauche de l'objet ' w%,h% dimensions de l'objet ' v% visibilité (0=invisible 1=visible) défaut: invisible ' Retour: ' res% -1=erreur 0=ok end_if
res% = dll_call6("ResizeScene2D",SC2D%,10,10,l,h,1)
if 1=0 ' res% = dll_call2("LoadBackgroundToScene2D",SC2D%,adr(img$)) ' Paramètres: ' SC2D% identifiant de l'objet ' img$ chaîne de caractères pour l'image JPG de fond ' Retour: ' res% -1=erreur 0=ok end_if
if 1=0 ' res% = dll_call4("LoadMosaicBackgroundToScene2D",SC2D%,w%,h%,org%) ' Paramètres: ' SC2D% identifiant du Scene2D ' w%,h% dimensions de l'image résultante ' org% origine de l'image ' 0 = presse-papier ' adr(img$) = fichier JPG ou BMP contenant la vignette ' res% -1 si erreur 0 si ok end_if
res% = dll_call4("LoadMosaicBackgroundToScene2D",SC2D%,100,100,adr(fond$))
x_r = l/2 num_spr_raquette = dll_call6("CreateSpriteInScene2D",SC2D%,x_r , y_r,0,50,adr(raquette$))
num_bord_gauche% = dll_call6("CreateSpriteInScene2D",SC2D%,0 , 40,0,50,adr(barre_cote$)) num_bord_haut%= dll_call6("CreateSpriteInScene2D",SC2D%,0 , 0,0,50,adr(barre_haut$)) num_bord_droit% = dll_call6("CreateSpriteInScene2D",SC2D%,960 , 40,0,50,adr(barre_cote$))
' On détecte le changement d'état des touches on_key_down 0,t1 : on_key_up 0,t2
' Création du timer principal du jeu, c'est le coeur du jeu, le temps de base d'un cycle timer Boucle%: timer_interval Boucle%,40 : on_timer Boucle%, Boucle Nouveau_Niveau() lance_balle()
end
' ====================================== Capture et traitement des évènements: event: timer_off Boucle% off_change 98 if text$(98)="status" ' Si contact avec le bord de l'écran if SC2D_Panoramic%(2) = num_spr_balle if SC2D_Panoramic%(16)= 1
if SC2D_Panoramic%(7) = num_bord_gauche% or SC2D_Panoramic%(7) = num_bord_droit% play son_rebondmetal : dx% = 0 - dx% else if SC2D_Panoramic%(7) = num_bord_haut% play son_rebondmetal :dy% = 0 - dy% else if SC2D_Panoramic%(7) = num_spr_raquette play son_rebondraquette :dy% = 0 - dy% else play son_cassebrique ' res% = dll_call3("GetTextOfSpriteInScene2D",SC2D%,ind%,adr(txt$)) ' ' Paramètres: ' SC2D% identifiant du Scene2D ' ind% Sprite identifyer (0=selected sprite; >0=sprite ind%) ' txt$ chaîne de caractères recevant le texte libre ' res% -1 si erreur; 0 si ok
res% = dll_call3("GetTextOfSpriteInScene2D",SC2D%,SC2D_Panoramic%(7),adr(Nb_points_brique$)) score = score + val(Nb_points_brique$) ' res% = dll_call2("DeleteSpriteInScene2D",SC2D%,ind%) ' ' Paramètres: ' SC2D% identifiant du Scene2D ' ind% identifiant du Sprite (0=sprite sélectionné >0=sprite ind%) ' res% -1 si Scene2D non définie ou invalide; -2 si erreur ou sprite inexistant; 0 si ok
res% = dll_call2("DeleteSpriteInScene2D",SC2D%,SC2D_Panoramic%(7)) Sprites_briques = Sprites_briques - 1 dy% = 0 - dy% if Sprites_briques = 0 then Nouveau_Niveau() end_if end_if end_if end_if if SC2D_Panoramic%(16)=2 select SC2D_Panoramic%(17) case 4: ' bottom res% = dll_call1("StopMultiPlayer",MP%) vies = vies - 1 : play son_perdu : tfg=0 : tfd=0 caption 0, titre$ + " Vies : " + str$(vies) + " Score : " + str$(score) ' res% = dll_call2("DeleteSpriteInScene2D",SC2D%,ind%) ' ' Paramètres: ' SC2D% identifiant du Scene2D ' ind% identifiant du Sprite (0=sprite sélectionné >0=sprite ind%) ' res% (-1 si Scene2D non définie ou invalide; -2 si erreur ou sprite inexistant; 0 si ok)
res% = dll_call2("DeleteSpriteInScene2D",SC2D%,num_spr_balle) : wait 1500 if vies > 0 then lance_balle() : else: play son_gameover : wait 3000 : quitte() end_select end_if end_if end_if caption 0, titre$ + " Vies : " + str$(vies) + " Score : " + str$(score) res% = dll_call6("AutomaticSpriteActionInScene2D",SC2D%,num_spr_balle,2,dx%,dy%,20) timer_on Boucle% on_change 98,event return
' ====================================== Traitement des appuis sur le clavier:
t1: if key_down_code=cesc then esc=1 if key_down_code=ctfg then tfg=1 if key_down_code=ctfd then tfd=1 off_key_down 0 return
t2: if key_up_code=cesc then esc=0 if key_up_code=ctfg then tfg=0 if key_up_code=ctfd then tfd=0 off_key_up 0 return
boucle: timer_off Boucle% : ' On coupe le timer le temps de traiter la boucle principale du jeu
if esc=1 then quitte() : ' On sort si on a appuyé sur la touche 'Esc' ' Si on a détecté que la touche flèche gauche avait été enfoncée if tfg=1 and tfd = 0 if x_r > (largeur_bord% + v_raquette) then x_r = x_r - v_raquette : else : x_r = largeur_bord% end_if
' Si on a détecté que la touche flèche droite avait été enfoncée if tfd=1 and tfg = 0 if x_r < l-(largeur_bord% + v_raquette) then x_r = x_r + v_raquette : else : x_r = l-largeur_bord% end_if
' res% = dll_call4("ChangeSpritePositionInScene2D",SC2D%,ind%,x%,y%) ' ' Paramètres : ' SC2D% identifiant du Scene2D ' ind% identifiant du Sprite (0=sprite sélectionné; >0=sprite ind%) ' x%,y% nouvelle position du Sprite ' res% ( -1 si Scene2D non définie ou invalide; -2 si erreur; -3 si collision bloquante (position du sprite inchangée); 0 si ok)
res% = dll_call4("ChangeSpritePositionInScene2D",SC2D%,num_spr_raquette,x_r , y_r)
' On n'oublie pas de remettre en route le timer qui redéclenchera la boucle principale on_key_down 0,t1 : on_key_up 0,t2 timer_on Boucle% return
sub lance_balle() dx% = v_x_balle% : dy% = 0 - v_y_balle% x_balle = l/2 : y_balle = y_r - 60 play son_nouvelleballe : wait 1000 num_spr_balle = dll_call6("CreateSpriteInScene2D",SC2D%,x_balle , y_balle,0,50,adr(balle$)) ' res% = dll_call6("AutomaticSpriteActionInScene2D",SC2D%,ind%,act%,par1%,par2%,ms%) ' Paramètres : ' SC2D% identifiant du Scene2D ' ind% identifiant du Sprite(0=sprite sélectionné >0=sprite ind%) ' act% ' code action: ' 0 = stopper l'action en cours ' 1 = déplacer le sprite de façon relative: dx=par1%, dy=par2%, répéter toutes les ms% millisecondes ' arrêt automatique sur tout contact ou en "sortie du monde" ' 2 = déplacer le sprite de façon relative: dx=par1%, dy=par2%, répéter toutes les ms% millisecondes ' arrêt automatique sur tout contact bloquant ou en "sortie du monde" ' par1%,par2% paramètres en fonction du code action ' ms% nombre de millisecondes entre chaque répétition ' res% (-1 si erreur; longueur de tableau si x%=0; 0 si ok)
res% = dll_call6("AutomaticSpriteActionInScene2D",SC2D%,num_spr_balle,2,dx%,dy%,20) ' res% = dll_call1("PlayMultiPlayer",MP%) end_sub
sub Nouveau_Niveau() Sprites_briques = 0 timer_off Boucle% off_change 98 caption 0, titre$ + " Vies : " + str$(vies) + " Score : " + str$(score) for i = 1 to nb_lignes for j = 1 to nb_b_ligne
if 1=0 ' res% = dll_call6("CreateSpriteInScene2D",SC2D%, x%,y%,niv%,resist%, adr(img$)) ' Paramètres: ' SC2D% identifiant de l'objet ' x%,y% coin en haut à gauche du sprite ' niv% (pas encore géré, mais obligatoire - passer un 0) ' resist% résistance à la pénétration (0=immatériel >0 augmente la résitance) ' img$ image BMP du sprite 'Retour: ' res% -1=erreur >=0 = ok ID du sprite créé end_if
select i case 1 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (hauteur_b +1),0,50,adr(brique1$)) case 2 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (2 * (hauteur_b +1)),0,50,adr(brique2$)) : Nb_points_brique$ = "250" case 3 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (3 * (hauteur_b +1)),0,50,adr(brique3$)) : Nb_points_brique$ = "200" case 4 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (4 * (hauteur_b +1)),0,50,adr(brique4$)) : Nb_points_brique$ = "175" case 5 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (5 * (hauteur_b +1)),0,50,adr(brique5$)) : Nb_points_brique$ = "140" case 6 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (6 * (hauteur_b +1)),0,50,adr(brique6$)) : Nb_points_brique$ = "120" case 7 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (7 * (hauteur_b +1)),0,50,adr(brique7$)) : Nb_points_brique$ = "100" end_select
N = res% : Sprites_briques = Sprites_briques + 1
' res% = dll_call3("SetTextOfSpriteInScene2D",SC2D%,ind%,adr(txt$)) ' ' Paramètres: ' SC2D% identifiant du Scene2D ' ind% Sprite identifyer (0=selected sprite; >0=sprite ind%) ' txt$ chaîne de caractères recevant le texte libre ' res% -1 si erreur; 0 si ok
res% = dll_call3("SetTextOfSpriteInScene2D",SC2D%,N,adr(Nb_points_brique$))
if 1=0 ' res% = dll_call6("ChangeSpriteAttributesInScene2D",SC2D%,ind%,vis%,sel%,mov%,ord%) ' ' Paramètres: ' ' SC2D% identifiant de l'objet ' ind% indice du sprite 0=sprite sélectionné >0=sprite ind% ' -1=tous les sprites, pour vis%, sel% et mov% ' vis% visibilité (1=visible 0=invisible) ' sel% sélectionnable (1=sélectionnable 0=non sélectionnable) ' mov% déplaçable par la souris (1=déplaçable 0=non déplaçable) ' ord% ordre Z (0=pas de changement 1=en avant -1=en arrière) ' Retour: ' res% -1=Scene2D non défini ou invalide -2=erreur 0=ok end_if res% = dll_call6("ChangeSpriteAttributesInScene2D",SC2D%,res%,1,0,0,0) next j next i on_change 98,event timer_on Boucle% end_sub
sub quitte() res% = dll_call1("KillProcessByHandle",handle(0)) end_sub | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Début d'un nouveau système de 2D et Sprites Dim 22 Mai 2016 - 19:15 | |
| - Citation :
- Il y a une erreur dans la doc.chm (au minimum sur celle en ligne, je n'ai pas vérifier les autres)
En effet. La doc est incomplète, et le programme comporte une erreur, par-dessus le marché. Je corrigerai les deux pour la prochaine version. Le problème de doc: Les cellules 3,4,5,et 6 reflètent les informations du dernier élément cliqué (sélectionné). Si c'est un sprite, alors ce sont celles du sprite. Si c'est le fond, alors ce sont celles du viewport. Le bug:en cas de sprite sélectionné, les cellules 3 et 4 ne donnent pas la position du sprite, mais celle du clic dans le sprite, rapporté au viewport. Ceci est évidemment un non-sens, même si techniquement, j'ai besoin de cette information en interne. En ce qui concerne ton dernier poste au sujet des timers, je regarderai cela prochainement. Ce week-end, j'étais complètement absorbé pour raisons familiales. EDITErreur d'appréciation sur le "bug": Le bug n'en est pas un... En cas de clic sur un sprite, on retourne réellement les coordonnées du sprite, pas celles du dernier clic. Ceci est vrai pour le clic dans le fond (et là, ça fait sens). Mais pour un sprite, on retourne dans les mots 3 et 4 ma position du sprite clique. Ce qui est correct. Donc, j'ai la doc à compléter, et ce sera fait prochainement. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Début d'un nouveau système de 2D et Sprites Lun 23 Mai 2016 - 9:03 | |
| Sinon pour le problème de programme, je pense qu'il doit quand même y avoir un problème de gestion des timers ou de conflit entre les timers du programme et de kgf pour les objets 2D. Pour m'en assurer, j'ai modifié la version précédente en retirant la boucle faisant appel au timer et là je n'ais plus de problème de pointeur. Donc soit j'ai fait une bêtise dans ma boucle (ce qui entre parenthèse est absolument possible), soit l'utilisation de ce timer bien qu'arrêté lors du traitement, provoque un conflit avec ceux utilisé pour la gestion des objets 2D de KGF. Je mets ici la version sans musique ni timer du programme: - Code:
-
' Panorabrique V3 par Jicehel ' ' Version utilisant les objets sprites et scene2D de KGF sans timer
label event,touche
dim sversion$, iversion%: sversion$ = string$(255," ") dim res%, SC2D%, SC2D_PS%, dx%, dy%, hnd%, MP% dim h,l : h=700: l=1000 dim hauteur_b, largeur_b : hauteur_b = 30 : largeur_b=60 dim c, xb, yb, i, j, r , N, n_picture dim Nb_b_ligne : Nb_b_ligne = int((l - 80)/(largeur_b+3)) dim Nb_lignes, Nb_briques_restantes, Sprites_briques : Nb_lignes = 7 dim x_r , y_r, hauteur_r, largeur_r, num_spr_raquette, v_raquette : hauteur_r = 30 : largeur_r=120 : y_r = h-30-hauteur_r : v_raquette = 25 dim vies : vies = 3 dim x_balle,y_balle, n_balle, num_spr_balle, r_balle : r_balle = 15 dim score : score = 0 dim ecran%, aff_vies%, aff_score% dim Nb_couleur%: Nb_couleur% = 6 dim num_bord_gauche%,num_bord_haut%, num_bord_droit%, largeur_bord% : largeur_bord% = 40 dim Boucle% : Boucle% = 6
' ***************************** COMMANDES CLAVIER ************************* dim esc,cesc : cesc=27 : ' * TOUCHE "ESC" ==> MET FIN AU PROGRAMME:.. 27 * dim tfg,ctfg : ctfg=37 : ' * FLÈCHE GAUCHE ==> ALLER À GAUCHE:....... 37 * dim tfd,ctfd : ctfd=39 : ' * FLÈCHE DROITE ==> ALLER À DROITE:....... 39 *
dim son_perdu : son_perdu = 20 : sound son_perdu : file_load son_perdu,"Perte_balle.wav" dim son_gameover : son_gameover = 21 : sound son_gameover : file_load son_gameover,"Perdu.wav" dim son_nouvelleballe : son_nouvelleballe = 22 : sound son_nouvelleballe : file_load son_nouvelleballe,"Nouvelle_balle.wav" dim son_rebondmetal : son_rebondmetal = 23 : sound son_rebondmetal : file_load son_rebondmetal, "Rebond_bord_metal.mp3" dim son_rebondraquette : son_rebondraquette = 24 : sound son_rebondraquette : file_load son_rebondraquette, "Rebond_raquette.mp3" dim son_cassebrique : son_cassebrique = 25 : sound son_cassebrique : file_load son_cassebrique, "Brique_cassee.wav" dim son_musique$ : son_musique$ = "Musique1.wav"
height 0, h+62: width 0,l+37 : caption 0, "PANORABRIQUE - V3.0" : border_small 0
dll_on "KGF.dll"
dim brique1$ : brique1$ = "b01_2.bmp" : dim brique2$ : brique2$ = "b02_2.bmp" : dim brique3$ : brique3$ = "b03_2.bmp" dim brique4$ : brique4$ = "b04_2.bmp" : dim brique5$ : brique5$ = "b05_2.bmp" : dim brique6$ : brique6$ = "b06_2.bmp" dim brique7$ : brique7$ = "b07_2.bmp" : dim raquette$ : raquette$ = "raquette_2.bmp" : dim balle$ : balle$ = "balle2.bmp" dim barre_haut$ : barre_haut$ = "barre_haut.bmp" : dim barre_cote$ : barre_cote$ = "barre_cote.bmp" : dim fond$ : fond$ = "fond01.jpg"
SC2D% = dll_call2("CreateScene2D",handle(0),0)
if 1 = 0 ' res% = dll_call2("SetInterfaceOfScene2D",SC2D%,x%) ' Paramètres: ' SC2D% identifiant de l'objet ' x% 0 pour récupérer la longueur du tableau interface% ' adr(interface%) pour établir le lien avec l'objet ' Retour: ' res% -1=erreur 0=ok ' ou n>0 si x%=0: retourne alors la longueur du tableau interface% ' Utilisation: ' res% = dll_call2("SetInterfaceOfScene2D",SC2D%,0) ' dim interface%(res%) ' interface%(0) = res% ' interface%(1) = handle(edit%) ' res% = dll_call2("SetInterfaceOfScene2D",SC2D%,adr(interface%)) ' Signification des cellules de l'interface: ' offset signification ' 0 taille du tableau (doit être chargé avant d'établir le lien) ' 1 handle d'un EDIT (doit être chargé pour recevoir les évènements) ' 2 ID du sprite sélectionné ' 3 x (position horizontale du coin en haut à gauche du sprite) ' 4 y (position verticale du coin en haut à gauche du sprite) ' 5 w (largeur du sprite) ' 6 h (hauteur du sprite) ' 7 ID du sprite collisionné ' 8 numéro de la zone de contact collisionné dans le sprite collisionné ' 9 flag "utilisation du viewport" ' 10 flag "déplacement du viewport par la souris est autorisé" ' 11 coordonnée x du viewport ' 12 coordonnée y du viewport ' 13 indice de l'image dans l'ImageList (-1 = ImageList non utilisée) ' 14 code action du sprite causant l'évènement ' 15 fréquence d'action du sprite causant l'évènement (ou 0 si pas d'action en cours) ' 16 type d'évènement: 0=normal 1=collision 2=contact bordure 3=téléporté ' 17 bordure pour type évènement 2 et 3: 1=gauche 2=haut 3=droite 4=ba end_if edit 98 : hide 98 : on_change 98,event SC2D_PS% = dll_call2("SetInterfaceOfScene2D",SC2D%,0) dim SC2D_Panoramic%(SC2D_PS%) SC2D_Panoramic%(0) = SC2D_PS% SC2D_Panoramic%(1) = handle(98) SC2D_PS% = dll_call2("SetInterfaceOfScene2D",SC2D%,adr(SC2D_Panoramic%)) res% = dll_call6("ResizeScene2D",SC2D%,10,10,l,h,1) res% = dll_call4("LoadMosaicBackgroundToScene2D",SC2D%,100,100,adr(fond$)) x_r = l/2 num_spr_raquette = dll_call6("CreateSpriteInScene2D",SC2D%,x_r , y_r,0,50,adr(raquette$)) num_bord_gauche% = dll_call6("CreateSpriteInScene2D",SC2D%,0 , 40,0,50,adr(barre_cote$)) num_bord_haut%= dll_call6("CreateSpriteInScene2D",SC2D%,0 , 0,0,50,adr(barre_haut$)) num_bord_droit% = dll_call6("CreateSpriteInScene2D",SC2D%,960 , 40,0,50,adr(barre_cote$)) Nouveau_Niveau() on_key_down 0,touche : ' On détecte le changement d'état des touches end
' ====================================== Capture et traitement des évènements: event: ' caption 0,text$(98) + " : " +str$( SC2D_Panoramic%(2)) + " : " +str$( num_spr_balle)+ " : " +str$( SC2D_Panoramic%(16)) if text$(98)="status" ' Si contact avec le bord de l'écran if SC2D_Panoramic%(2) = num_spr_balle if SC2D_Panoramic%(16)= 1
if SC2D_Panoramic%(7) = num_bord_gauche% or SC2D_Panoramic%(7) = num_bord_droit% play son_rebondmetal : dx% = 0 - dx% else if SC2D_Panoramic%(7) = num_bord_haut% play son_rebondmetal :dy% = 0 - dy% else if SC2D_Panoramic%(7) = num_spr_raquette play son_rebondraquette :dy% = 0 - dy% else play son_cassebrique : res% = dll_call2("DeleteSpriteInScene2D",SC2D%,SC2D_Panoramic%(7)) dy% = 0 - dy% Sprites_briques = Sprites_briques - 1 if Sprites_briques = 0 then Nouveau_Niveau() end_if end_if end_if end_if if SC2D_Panoramic%(16)=2 select SC2D_Panoramic%(17) case 4: ' bas res% = dll_call1("StopMultiPlayer",MP%) vies = vies - 1 : play son_perdu tfg= 0 : tfd=0 ' res% = dll_call2("DeleteSpriteInScene2D",SC2D%,ind%) ' ' Paramètres: ' SC2D% identifiant du Scene2D ' ind% identifiant du Sprite (0=sprite sélectionné >0=sprite ind%) ' res% (-1 si Scene2D non définie ou invalide; -2 si erreur ou sprite inexistant; 0 si ok)
res% = dll_call2("DeleteSpriteInScene2D",SC2D%,num_spr_balle) : wait 1500 if vies > 0 then lance_balle() : else: play son_gameover : wait 3000 : quitte() end_select end_if end_if end_if
res% = dll_call6("AutomaticSpriteActionInScene2D",SC2D%,num_spr_balle,2,dx%,dy%,20)
return
' ====================================== Traitement des appuis sur le clavier:
touche: if key_down_code=cesc then quitte() : ' On sort si on a appuyé sur la touche 'Esc' if key_down_code=ctfg : ' Si on a détecté que la touche flèche gauche avait été enfoncée if x_r > (largeur_bord% + v_raquette) then x_r = x_r - v_raquette : else : x_r = largeur_bord% end_if if key_down_code=ctfd : ' Si on a détecté que la touche flèche droite avait été enfoncée if x_r < l-(largeur_bord% + v_raquette) then x_r = x_r + v_raquette : else : x_r = l-largeur_bord% end_if res% = dll_call4("ChangeSpritePositionInScene2D",SC2D%,num_spr_raquette,x_r , y_r) return
sub lance_balle() dx% = 10 : dy% = 0 - 10 x_balle = l/2 : y_balle = y_r - 60 play son_nouvelleballe : wait 1000 num_spr_balle = dll_call6("CreateSpriteInScene2D",SC2D%,x_balle , y_balle,0,50,adr(balle$)) res% = dll_call6("AutomaticSpriteActionInScene2D",SC2D%,num_spr_balle,2,dx%,dy%,20) res% = dll_call1("PlayMultiPlayer",MP%) end_sub
sub Nouveau_Niveau()
Sprites_briques = 0 for i = 1 to nb_lignes for j = 1 to nb_b_ligne select i case 1 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (hauteur_b +1),0,50,adr(brique1$)) case 2 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (2 * (hauteur_b +1)),0,50,adr(brique2$)) case 3 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (3 * (hauteur_b +1)),0,50,adr(brique3$)) case 4 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (4 * (hauteur_b +1)),0,50,adr(brique4$)) case 5 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (5 * (hauteur_b +1)),0,50,adr(brique5$)) case 6 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (6 * (hauteur_b +1)),0,50,adr(brique6$)) case 7 : res% = dll_call6("CreateSpriteInScene2D",SC2D%,60 + (largeur_b+3) * (j-1) , 60 + (7 * (hauteur_b +1)),0,50,adr(brique7$)) end_select Sprites_briques = Sprites_briques + 1 res% = dll_call6("ChangeSpriteAttributesInScene2D",SC2D%,res%,1,0,0,0) next j next i
lance_balle() end_sub
sub quitte() res% = dll_call1("KillProcessByHandle",handle(0)) end_sub | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Début d'un nouveau système de 2D et Sprites Lun 23 Mai 2016 - 9:21 | |
| Je n'ai pas encore eu le temps de me plonger vraiment sans ton code. Mais à première vue, je ne comprends pas pourquoi tu utilises une action automatique pour la balle et en même temps un timer pour une "boucle". Cela fait double emploi et crée forcément des conflits. Et il ne sert à tien d'inactiver le ON_CHANGE du edit 98 - les évènements du Scene2D passent simplement à la trappe, mais l'action elle-même continue.
Il faut que tu utilises uniquement les évènements reçus par le edit 98, il faut déduire la nature de l'évènement des valeurs de l'interface et réagir en fonction de cela. En fait, ton programme deviendra encore plus simple. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Début d'un nouveau système de 2D et Sprites Lun 23 Mai 2016 - 12:16 | |
| En fait du coup un événement de l'édit 98 pourrait être une sorte de tick de timer (pour éviter d'utiliser le timer Panoramic)
On fixerait le timer et tout les x ms on recevrait l'événement disant que le temps s'est écoulé (en fait s'est pour permettre de synchroniser les actions et d'avoir une vitesse de jeu constante pour les déplacement de la raquette par exemple. Si je reste comme dans l'exemple ci dessus, le nombre de déplacement de la raquette dépend de la vitesse de l'ordinateur, mais ce serait encore plus vrai avec des système de jeux plus complexes ou on a besoin de synchroniser les événements du jeu avec la logique du jeu) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Début d'un nouveau système de 2D et Sprites Lun 23 Mai 2016 - 12:27 | |
| Si tu utilises les déplacements automatiques des sprites, la notion de "ticks" n'a plus de sens. Du moins pas pour la gestion des sprites se mouvant automatiquement. Ils sont entièrement gérés en interne par l'objet Scene2D qui ne fait que signaler les collisions avec un autre sprite ou avec une bordure.
Tu peux utiliser un timer Panoramic pour gérer autre chose, sans rapport direct avec les sprites en mouvement automatique. Sinon, tu produits un sac de noeuds épouvantable.
Sans avoir approfondo ton source, comment déplaces-tu la raquette ? Avec la souris, je suppose ? Si ce n'est pas le cas, essaie - ce sera une nouvelle expérience de jeu. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Début d'un nouveau système de 2D et Sprites Lun 23 Mai 2016 - 14:18 | |
| Si tu regardes mon code (pas le dernier mais celui d'avant), la boucle ne (le timer) sert qu'à contrôler la raquette qui n'est pas en déplacement automatique. Ca n'aurait en effet aucun sens de contrôler la balle via un timer dans Panoramic.
Et ça marchait bien jusqu'au changement de niveau où j'avais un problème de pointeur. En faisant des tests divers, j'ai vu que l'on avait assez facilement des problèmes de pointeur en combinant un timer Panoramic et les déplacements automatiques. Par contre c'est un peu aléatoire, chez moi, ça c'est surtout produit quand ma machine avait des ralentissements ou lors du changement de niveau.
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Début d'un nouveau système de 2D et Sprites Lun 23 Mai 2016 - 15:29 | |
| Ok, je vais regarder ton premier code un peu plus en profondeur, ce soir. | |
| | | Contenu sponsorisé
| Sujet: Re: Début d'un nouveau système de 2D et Sprites | |
| |
| | | | Début d'un nouveau système de 2D et Sprites | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |