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 |
---|
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 Ven 13 Mai 2016 - 21:11 | |
| - Citation :
- Rien que l'image de fond est assez lourde (1600x1200, 2.37Mo), le stroumf 2x1.08Mo (aller + retour).
Quelques précisions sur la place que tout ça prend en mémoire: - Image de fond:l'image de fond est gardée telle qu'elle est, et quelque soit le viewport. Ceci permet de faire glisser le fond du Scene2D (en réalité, on déplace le viewport dans le sens opposé de ce que "tire" la souris). Et il y a bien sur l'image visualisée avec ses dimensions incontournables, et une zone de travail cachée au mêmes dimensions, pour le double tampon. Supposons que tu n'utilises pas le viewport et que la taille de ton image de fond est celle de l'image affichée. Il y a donc un espace de 3 fois cette taille réservée, rien que pour le Sene2D. Conseil:Essaie avec une image réduite. L'affichage va l'agrandir automatiquement, mais avec un "meilleur" algorithme que simplement ce que ferait STRETCH_ON. - Sprite:c'est très similaire pour chaque sprite. Il y a l'image d'origine, l'image actuellement affichée et une zone de travail interne (un masque binaire pour la transparence). Il y a intérêt à dimensionner les images individuelles de la ImageList exactement aux mêmes dimensions que celles du sprite affiché. Bien sûr, au moment de l'affichage, l'image sélectionnée est adaptée aux dimensions d'affichage. Mais c'est une perte de place en mémoire (et de temps de calcul, accessoirement) que d'avoir des images da,s la ImageList qui seraient plus grandes que les dimensions du sprite au moment de l'affichage. Résumons: un sprite a une image initiale, chargée directement à la création ou issue d'une ImageList, il a aussi une bitmap de la même dimension pour la transparence et il contient une référence (pas une copie !) vers la Imagelist. Ainsi, plusieurs sprites peuvent utiliser la même ImageList dans pour autant qu'elle soit dupliquée en mémoire. C'est important. Ceci dit, la ImageList a la taille qu'elle a, c'est incontournable. Conseil: dapter le plus possible les images individuelles à la taille réelle du sprite auquel elles sont destinées. EDITJe suis d'ailleurs en train d'implémenter un nouveau système, en interne au Scene2D, pour éviter la multiplication des timers. Car en effet, chaque sprite peut en avoir entre 0 et 3 timers actifs simultanément: automatisation du déplacement, animation de son image et variation de sa transparence. Il y aura une nouvelle option pour un Scene2D qui permet une animation globale du Scene2D. Dans ce cas, il y a un délai en millisecondes pour l'animation du Sene2D, et a durée des diverses animations de tous les sprites seront automatiquement converties en multiples de cycles de l'animation du Scene2D, et tout aura lieu de façon synchrone, géré par le seul timer du Scene2D. Avantage: moindre charge CPU, synchronisation automatique de tous les changements, variation de la vitesse globalement par le délai de l'animation du Scene2D Inconvénient: ajustement moins fin de la vitesse des différentes animations des différents sprites, car les délais seront automatiquement convertis en multiples de cycles d'animation du Scene2D. Petit plus:Avec l'animation globale par le Scene2D, viendra également le déplacement automatique de l'image de font (plus exactement du viewport) jusqu'à la butée dans une des bordures, comme pour le déplacement des sprites. Mais le système actuel restera et continuera à être amélioré. Ce sera juste une option à utiliser. | |
| | | 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 14 Mai 2016 - 8:57 | |
| Merci pour les explications.
j'ai réduit l'image de fond, c'est déjà beaucoup plus fluide.
Concernant la fabrication d'une ImageList, j'ai vérifié ce que j'avais fait: 1) j'ai créé l'ImageList avec les commandes appropriées de la dll 2) Je l'ai transformée en BMP avec PicPick. le résultat : pour le stroumf (16 images de 128x128) l'ImageList de départ pèse 1.28Mo, une fois transformée en bmp elle pèse 1,03Mo (donc moins lourde) Je précise que les 2 fichiers (bmp ou pas) fonctionnent parfaitement pour l'animation.
Ce qui entraîne la question suivante: Est-ce que ça pose un problème de transformer l'ImageList en fichier.bmp, pour le fonctionnement de l'animation ? Car si ça ne pose pas de problème, autant faire la conversion, vu qu'on a un gain de 1.28 - 1.03 = 0,25Mo par ImageList du stroumf qui en a deux (une pour l'aller et une pour le retour), soit un gain de 0,5Mo au total.
A+ | |
| | | 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 Sam 14 Mai 2016 - 10:21 | |
| | |
| | | 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 14 Mai 2016 - 11:59 | |
| Fausse joie ! J'ai réessayé d'enregistrer une ImageList en bmp avec Picpick, ça ne marche pas ! Comment j'ai fait le premier coup ? ben... j'en sais rien. J'ai dû renommer avec l'extention, en pensant qu'il fallait absolument un BMP pour l'ImageList, ou peut-être pour avoir un nom plus significatif, je ne me rapelle plus. Il faut dire que j'ai beaucoup bidouillé, galéré... surtout au début. Dommage, c'était une fausse piste. A+
Dernière édition par Jean Claude le Sam 14 Mai 2016 - 12:51, édité 1 fois | |
| | | 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 Sam 14 Mai 2016 - 12:13 | |
| Ce n'est pas grave. En fait, une économie de mémoire de 20 % sur une ImageList, ça paraît intéressant, mais en valeur absolue, les 250 ko économisés ne sont pas significatifs. D'autant que si tu veux avoir plusieurs Schtroumpfs simultanément, ce sera la même ImageList et elle n'est donc en mémoire qu'une seule fois.
Là où il convient de faire attention, c'est l'image de fond, ainsi que la taille des images individuelles de l'ImageList pour qu'elles correspondent à la taile du sprite correspondant. Une plus grande image n'apporte rien car de toutes façons, elle sera adaptée à la taille du sprite. C'est juste une perte de place en mémoire et une perte de temps CPU pour la conversion, qui se fait forcément à chaque changement d'image. | |
| | | 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 Sam 14 Mai 2016 - 13:48 | |
| Après pour gagner de la place en mémoire pour les grande images servant de fond, il pourrait y avoir une système éventuellement intégré de tableau de sprites servant à faire le fond (ce serait un tableau à 2 colonnes la première correspondrait au numéro de la colonne de l'image de fond et dans la seconde, tu correspondrais à la ligne. La valeur de la case serait le numéro du sprite correspondant).
Ainsi, avec une image de taille raisonnable, tu pourrais construire d'immense image de fond et même éventuellement n'en construire qu'une partie pour gagner encore de la place en mémoire.
Ce serait très pratique, une souplesse importante pour l'utilisateur mais ça demande quand même pas mal de boulot de réflexion et de programmation pour Klaus. | |
| | | 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 Sam 14 Mai 2016 - 13:58 | |
| - Citation :
- ça demande quand même pas mal de boulot de réflexion et de programmation pour Klaus.
Bof... imagine une collections de sprites fixes, de résistance 0, chacun étant relié à la même ImageList, avec un numéro d'image différent. Et placé en "pavage" de sorte à remplir le fon d. Et voilà - tu peux déjà le faire maintenant ! Cerise sur le gâteau: un clic dans le fond simulé te donne bien entendu l'ID du sprite, donc tu sais dans quelle "case" tu as cliqué. Inconvénient: tu perds la possibilité de "tirer" le fond, puisque techniquement, tu ne cliques plus sur le fond qui est entièrement recouvert, mais sur un sprite. Alors, il faut déplacer le viewport par un moyen programmé (la fonction qui fait ça fait déjà partie des fonctions publiées). | |
| | | 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 14 Mai 2016 - 18:19 | |
| A ce sujet, Comment fait-on pour charger une ImageList pour le fond ? 1) Est-il possible de créer une ImageList avec une seule image ? Je l'ai fait, mais je crois que ça n'a pas marché car j'obtiens une Imagelist de 53 octets pour un BMP de 1440x1440 ça je vais le revoir... 2) Y a-t'il une limite de taille pour une ImageList (Ex: 1440x1440) 3) doit-on au préalable charger un fond classique en JPG, avant de tenter SetImageListForScene2D J'ai regardé l'exemple (chm) pour SetImageListForScene2D, mais je ne suis pas parvenu à imposer mon ImageList à SC2D%. Un exemple serait le bienvenue, sachant que l'ImageList existe déjà. A+ PS: en écrivant, je me rends compte que pour créer une ImageList, il faut une image.bmp. Re PS: ben... c'était bien une image bmp que j'ai utilisé. | |
| | | 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 Sam 14 Mai 2016 - 19:58 | |
| - Citation :
- 1) Est-il possible de créer une ImageList avec une seule image ?
Oui. Il faut créer la IL avec les dimensions de l'image (toutes les images d'une même IL doivent avoir la même taille). - Citation :
- 2) Y a-t'il une limite de taille pour une ImageList (Ex: 1440x1440)
Non. Cette taille est tout à fait acceptable. Mais il faut la spécifier à la création de la IL, et l'image à charger doit avoir exactement le même taille. - Citation :
- 3) doit-on au préalable charger un fond classique en JPG, avant de tenter SetImageListForScene2D
Non. - Citation :
- PS: en écrivant, je me rends compte que pour créer une ImageList, il faut une image.bmp
Si tu utilises AddImageToImageList pour ajouter une image dans la IL, tu peux utiliser BMP, JPG, GIF, PNG, ICO, ... Je vois que ce n'est pas encore documenté, et c'est un oubli, mais ça marche. Comment faire ? - Code:
-
res% = dll_call2("CreateImageList",w%,h%) : ' w% et h% doivent être les dimensions exactes res% = dll_call4("AddImageToImageList",IL%,adr(bmp$),trans%,RGB%) : ' image aux dimensions w%, h% ...
Ensuite, tu peux utiliser la IL comme dans la doc... | |
| | | 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 14 Mai 2016 - 20:37 | |
| Merci Klaus, il me reste à tester l'affaire.
A+.
| |
| | | 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 Dim 15 Mai 2016 - 20:51 | |
| @Klaus, Juste pour signaler une erreur de doc.
Une erreur de copier/coller dans la doc.chm pour LoadMosaicBackgroundToScene2D .
L'exemple ne reprend pas cette commande, elle reprend LoadBackgroundToScene2D .
A+
| |
| | | 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 15 Mai 2016 - 21:47 | |
| Merci, Jean-Claude. Je corrige pour la prochaine version, ainsi que quelques autres corrections de la doc. | |
| | | 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 Mar 17 Mai 2016 - 1:59 | |
| J'ai essayé le système et ça marche bien. J'ai fais une nieme version du casse brique. Je trouve que ça marche plutôt bien malgrè de toute petite saccade au niveau de l'animation mais je n'ai pas non plus optimisé ou essayé de faire des réglages optimums Le programme est ici - Spoiler:
- 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 : Sprites_briques = 5 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$)) dlist Sprites_briques
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 : on_change 98,event ' 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$))
Nouveau_Niveau() lance_balle()
' 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 Timer_on Boucle%
end
' ====================================== Capture et traitement des évènements: event:
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))
dy% = 0 - dy%
' if count(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 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)
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 return
t2: if key_down_code=cesc then esc=0 if key_down_code=ctfg then tfg=0 if key_down_code=ctfd then tfd=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 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$)) if 1 = 0 ' 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) end_if
res% = dll_call6("AutomaticSpriteActionInScene2D",SC2D%,num_spr_balle,2,dx%,dy%,20) res% = dll_call1("PlayMultiPlayer",MP%) end_sub
sub Nouveau_Niveau() 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 if 1 = 0
N = res% : item_add Sprites_briques, N
' 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$))
' 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 end_sub
sub quitte() res% = dll_call1("KillProcessByHandle",handle(0)) end_sub
Pendant que je vous ais sous la main, ligne 24, le count de ma DLIST me donne 0. Je sais que c'est moi ui fait une erreur faue de pratique mai je ne vois pas laquelle... Pouvez-vous me die la bétise que je fais svp. Pour pouvoir essayer, il vous faut télécharger les ressources ici: http://www.fichier-zip.com/2016/05/17/panorabrique-v3/ (Autre lien: http://fzip.li/G8gF) | |
| | | 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 Mar 17 Mai 2016 - 2:04 | |
| C'est parce que les lignes 354 et suivantes sont codées ainsi: - Code:
-
if 1 = 0
N = res% : item_add Sprites_briques, N ... donc la commande item_add n'est jamais exécutée. | |
| | | 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 Mar 17 Mai 2016 - 6:45 | |
| Gloups, merci Klaus il devait être trop tard, j'étais passé à côté. Merci de ton aide | |
| | | 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 Mar 17 Mai 2016 - 13:04 | |
| @Klaus, Je cherche, en vain, la doc.chm pour ChangeOptionsOfScene2D.
@Jicehel, Que penses-tu de tes essais avec 'la K2D", en terme de programmation ?
A+
| |
| | | 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 Mar 17 Mai 2016 - 18:10 | |
| Dans l'aide en ligne, également: Sommaire->Objets->Objet Scene2D->ChangeOptionsOfScene2D (3ème lien pour les fonctions de Scene2D, pas Sprite...) | |
| | | 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 Mar 17 Mai 2016 - 18:42 | |
| L'aide en ligne n'affiche pas cette fonction et Chrome refuse de télécharger sur CloodMe en prétextant je ne sait quelle danger. Mais, tout va bien: Je l'ai trouvée sur ton site. Merci, A+ | |
| | | 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 Mar 17 Mai 2016 - 19:01 | |
| Oups... j'ai vu ce que tu veux dire, pour l'aide en ligne. C'est la colonne de gauche qui n'affiche pas cette ligne. Mais si tu cliques sur le lien "Objet Scene2D et tu défiles la partie droite jusqu'à l'apparition des deux groupes de fonction (Scene2D et Sprite), tu as le lien...
Ceci dit, j'ai corrigé cela pour la doc en ligne. Efface ton cache et essaie à nouveau. | |
| | | 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 Mar 17 Mai 2016 - 19:51 | |
| C'est bon pour l'aide en ligne,
Y a-t'il une astuce pour tout replier la colonne de gauche ?
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 Mar 17 Mai 2016 - 20:03 | |
| Le résultat de mes tests: c'est super puissant au niveau des possibilités et les temps de réponses sont tout à fait acceptable du moins pour les tests que j'ai effectués et ce ans avoir encore optimisé le code. Ça demande un peu d'adaptation au niveau de la réflexion mais après on peut faire des procédures pour faciliter l'usage mais ça reste quand même très simple d'utilisation.
En plus connaissant Klaus, on pourra encore lui demander des amélioration. Par exemple, on peut définir plusieurs zones sur un sprite, mais à moins que j'ai raté quelque chose, pour le moment, on ne peut pas savoir laquelle est rentré en collision. Si pour une rectangle, par exemple, on définit une zone en haut, une à droite, une à gauche et une en bas, on saura qu'une zone est touché mais on ne saura pas laquelle. (Encore une fois, c'est ce que j'ai compris, mais je peux me tromper).
Les possibilités sont énormes et je ne peux pas encore dire que ça répond à tous les besoins, je n'ais pas fait d'essais de space invader ou autre ou il faut bouger des tas de sprites en même temps, mais je peux déjà die que ça couvre déjà beaucoup des sujets et que ça répond de façon plus simple qu'en Panoramic pur. Pour un damier, on peut avoir le sprite de la case avec le sprite du pion dessus ou pas par exemple et KGF peut directement retourner si on a cliqué sur le pion ou sur la case sans avoir à faire de calculs dans le programme mais ce n'est qu'un exemple.
C'est clairement une jolie brique pour faciliter la création de jeux 2D | |
| | | 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 Mer 18 Mai 2016 - 0:02 | |
| - Citation :
- on saura qu'une zone est touché mais on ne saura pas laquelle.
Regarde la doc de la zone d'interface: L'information que tu cherches, elle est dans l'indice 8... | |
| | | 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 Ven 20 Mai 2016 - 13:55 | |
| Oups, merci Klaus, j'avais loupé cette info et désolé pour mon merci tardif, mais j'avais aussi loupé ta réponse ... Bon du coup je vais essayé de reprendre mon petit programme ce weekend pour finaliser un petit casse-brique sans prétention mais qui pourra facilement être complété soit par moi soit par quelqu'un d'autre pour en faire un jeu digne de ce nom.
Je n'ai pas posté la version du code que j'avais faite suite à ton intervention, mais ça marche plutôt bien un casse brique en 2D avec ton moteur. Je le posterais avec l'intégration des zones de contacts si j'arrive à l'implémenter simplement.
Je pense faire 8 zones par briques et pour la balles pour faciliter la gestion des collisions et faire un test de cas Par contre, je vais bien récupérer par cette méthode par exemple si je suis sur la balle, le numéro de la zone collisionnée de la balle. Après il faut que je sélectionne le sprite collisioné pour récupérer également sa zone touchée, c'est bien ça ?
Sinon, je ferais une version plus simple ou je définirais juste 8 zones sur la balle. Je pense que ça devrait suffire pour avoir un comportement de rebond suffisamment naturel en fonction des cas. Déjà, dans la version actuelle, dans la plus part des cas, ça passe bien, mais il y a quelques cas ou le rebond n'est pas très logique.
Ca te parait être une bonne méthode ou est-ce qu'il y aurait une façon plus simple de procéder à laquelle je n'ai pas pensé ? | |
| | | 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 Ven 20 Mai 2016 - 17:18 | |
| Calculer le rebond n'est pas une chose aisée. Dans le cas d'un casse-brique, avec 8 zones sur la balle, c'ets déjà riche. Il te faut alors calculer le rebond, non seulement en fonction de la zone touchée, mais également en fonction de l'orientation du trajet de la balle avant impact... c'est coton.
Puis, tu as les contacts avec les bordures. Ca, c'est le cas "simple": pour un contact avec le bord gauche ou droit, il suffit d'inverser la composante horizontale. Pour un contact en haut ou en bas, on inverse la composante verticale.
Pour un contact avec une des briques, les choses sont un peu plus compliquées. Quoique.. il y a les mêmes 4 cas de figure (N,S,Q,E), avec le même traitement. Là où les choses se compliquent, c'est en cas de contact avec une des 4 zones de contact NE,NO,SE,SO. A toi de définir le comportement dans ce cas. EN tout cas, ce ne sera pas un simple inversement d'une des composantes. | |
| | | 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 Ven 20 Mai 2016 - 17:23 | |
| Bonsoir, j'ai testé ton jeu Jicehel. A priori, ça marchera, pour le moment la raquette est pour moi trop près des premières briques. La réponse clavier est trop longue. Mais j’essaierai la prochaine version, pour voir. Tu as écrit: - Citation :
- Bon du coup je vais essayé de reprendre mon petit programme ce weekend pour finaliser un petit casse-brique sans prétention
Donc il ne cassera pas des briques... ! Excuses-moi, mais une perche pareille ! je ne peux que la saisir.... | |
| | | 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
| |
| |
| |