Bouger des images (ou graphiques) à intervale régulier - C#/.NET managed - Programmation
Marsh Posté le 18-11-2005 à 11:52:21
Essaye déjà avec un picturebox contenant ton image et deplace le en fonction d'un timer avec ses propriétés Top et Left.
Il va se ballader sans problème, mais si tu en met 20... je ne garantie pas les performances...
C'est sur que c'est pas la meilleur méthode
Marsh Posté le 18-11-2005 à 21:24:45
sinon il y a tjs la programmation directX hein mais bon c'est peut etre pas la solution non plus
Marsh Posté le 18-11-2005 à 21:28:37
DirectX (du moins DirectDraw) me semble bel et bien la meilleure solution mais... Pour ça, j'aurais besoin d'un coup de main ! Je trouve rien comme doc Je ne dois pas taper les bons mots-clés.
J'espère juste que c'est moins le bordel que Direct3D, j'ai joué avec, j'ai rien panné
Marsh Posté le 18-11-2005 à 21:37:56
DirectX, j'ai voulu commencé, ça ne m'a pas du tout branché! C'est vrai que la doc pour C# par rapport à directX est très pauvre sur le net! les seules solutions qui existent, c'est l'achat d'un bouquin actuellement.
Marsh Posté le 18-11-2005 à 22:03:45
Sinon, truc qui n'a rien à voir avec le souci du choix de la technoi...
J'ai un problème purement physique.
Me souviens plus de mes formules (je pense ne jamais les avoir su).
Mon problème, c'est l'application des forces (accélérations) à mes boules. Là je pense que je suis totalement à côté de la plaque.
Je calcule actuellement le vecteur d'accélération dû à l'attraction de deux corps de la façon suivante :
f = g * ((mA * mB) / d²);
Où :
g = 6.67x10^-11 N*m²/kg²
mA = masse de l'objet A en kg
mB = masse de l'ojbet B en kg
d = distance entre A et B en m
Et j'obtiens vx et vy en projetant f sur x et y.
Hors... L'unité de f est à priori :
N*(m²/kg²) * (kg² / m²) = N
Et ça n'a rien à voir avec une accélération ça ! (ben oui, puisque c'est une c'est une force)
A partir de là, j'en déduis que si j'ajoute bêtement cette valeur à une vitesse, ça ne va pas du tout donner le bon résultat
Ce qui semble se passer d'ailleurs :
-> Corps A = 1 kg
-> Corps B = 10 kg
Bon, ok, on sait tous que A attire B autant que B attire A. On applique donc autant de newton sur A que sur B. Ca, oui, je m'en souviens bien. (j'ai fait un bac avec spécialité physique quand même donc j'ai au moins retenu mes leçons de 6° )
MAIS : je refuse d'admettre qu'une force égale puisse faire accélérer de la même façon deux corps de masses différentes... La preuve, si je peux souvelever mon briquet de 1 mètre en une seconde avec 2 doigts, pour a gazinière, il me faudra plutôt mes deux bras et 20 secondes... (donc malgré une force plus importante, l'accélération sera inférieure), et on ne me dira pas que la forme et le volume de l'objet entrent dans l'équation, la résistance de l'air étant négligeable.
De mémoire, il y a une histoire d'énergie potentielle (en fonction de la masse et de la distance à parcourir), et certainement aussi d'énergie cinétique, mes objets étant en mouvement durant toutes ces équations...
Alors c'est quoi la/les formules qui me manquent, entre le moment où j'ai mon vecteur en N et le moment où je peux appliquer une accélération à mon objet ?
En fait, la question réelle, c'est comme je peux exprimer un Newton avec les unités de mesure internationnales ?
C'est des m/(s²*kg) ? des (m*kg)/s² ? rien à voir ?
Sinon, question idiote... Ma fréquence de calcul de la vitesse étant constante (on va dire 1 seconde histoire d'avoir la bonne unité), je peux bien modifier ma vitesse en ajoutant bêtement mon accélération en m/s² à ma vitesse en m/s ? Il me semble que oui, mais j'ai un doute affreux
De toute façon, ce calcul sera à revoir complètement dans une V2, puisque là je mesure les forces toutes les x secondes, alors qu'en réalité, elles s'appliquent en permanance, donc les recalculer à chaque mètre parcouru devrait être plus fin comme simulation (le temps n'intervenant pas dans le calcul des forces, mais le calcul les position des objets, si) mais pour le moment j'ai pas d'idée de comment gérer ça (si un objet A d'approche de 10 mètres d'un objet B pendant que B ne parcourre que 1 mètre, il faut bien que les forces appliquées sur B soient recalculées à chaque fois que A avance d'un mètre, même si B n'a avancée que de 10 cm...)
Marsh Posté le 18-11-2005 à 22:06:09
moi23372 a écrit : DirectX, j'ai voulu commencé, ça ne m'a pas du tout branché! C'est vrai que la doc pour C# par rapport à directX est très pauvre sur le net! les seules solutions qui existent, c'est l'achat d'un bouquin actuellement. |
Ben ouais, c'est ce qu'on me dit toujours, mais autant acheter un bouquin sur l'ASP.NET peut me servir pour mon boulot, autant pour DX, c'est juste mon délire de cette fin de semaine, et ça me gave d'acheter un bouquin qui n'aura jamais un seul intérêt pour mon boulot (je vois pas le rapport entre la gestion du colisage de meubles dans un dépôt en vue de leur expédition par camion et DirectX, même si dans mon cas précis c'est pour gérer des masses et des distances aussi )
Marsh Posté le 18-11-2005 à 22:11:54
newton, abbr. N, unit of force in the mks system of units, which is based on the metric system; it is the force that produces an acceleration of 1 meter per second per second when exerted on a mass of 1 kilogram. The newton is named for Sir Isaac Newton.
Alors...
N = m/s² xxx
Sauf que le "appliqué à 1 kg", je sais pas où le mettre
-- Edit 1
C'est moi qui délire ou si le mec s'est emmêlé les pinceaux encore plus que moi ???
The newton is the 1 kg m/s^2, using F = ma, where F is in newtons, m in kg, and a in meters per second squared.
-- Edit 2
Nan, c'est moi qui délire
Donc c'est des kg*m / s²
Marsh Posté le 18-11-2005 à 22:35:25
Je rêve où :
(ici, "d" est déjà en m²)
Code :
|
Je peux changer les deux premières :
Code :
|
En :
Code :
|
Elle est toute ridicule mon équation ! (c'est bien se donner du mal pour pas grand chose tiens )
Marsh Posté le 19-11-2005 à 00:52:27
En attendant de savoir comment faire en C#, j'ai bien avancé sur mon js
Marsh Posté le 20-11-2005 à 23:03:49
Voilà, après moultes tentatives en utilisant différentes techno, j'ai fini par coder ça en Direct3D (super pour faire de la 2D...) vu que DirectDraw est abandonné.
J'aurai passé le Weekend endier à coder cette petite merde toute moche qui sert à rien, autant dire que je ne suis pas peu fier de moi
Au moins, c'est pas trop codé avec les pieds, ça ramme pas trop : en deça de 100 balles à gérer, ça tourne à 100 fps sur ma machine, sâchant que chaque balle doit être déviée par l'intégralité des autres balles, aussi lointaines soient-elles.
Ca monte jusqu'à 300 balles fluides (dans les 20 fps) à gérer sans rammer sur mon Piv 2.8, tout et sur mon 3500+ ça devrait pouvoir monter à 400 sans poser de problème.
Pour ceux qui veulent regarder à quoi ça ressemble :
http://magicweb.manga-torii.com/balles.exe (programme)
http://magicweb.manga-torii.com/GraphicsAPI.dll (moteur 3D qui fait de la 2D )
http://magicweb.manga-torii.com/balles.zip (projet VS 2003 - C#)
Les petits points bleu ridicules sont en fait des planètes de qui ont une masse similaire à celle de la terre (alératoires), c'est à dire dans les "5,972,000,000,000,000,000,000" tonnes.
Le souci, c'est que même des petits caillous comme à, ça attire très fort quand on passe à côté. Pour cette raison, je n'ai pas pu jouer sur le rayon, sinon les planètes passant à proximité étaient tout de suite aspirées. Du coup, plutôt que de faire du "à peine plus gros qu'en vrai pour faire joli", j'ai préféré assumer que les planètes étaient en Lithium, qui est la matière dont on connaît l'état solide la moins dense de la table périodique de chimie (l'hydrogène et l'hélium ne sont pas connus à l'état solide), du coup ça fait des points un peu plus gros que les planètes ferriques - comme la terre - que j'avait fait au début (densité 20 fois plus importante).
Vu que mes planètes sont très lourdes, elles s'attirent pas mal, surtout parcequ'elles sont très proches les unes des autres... Ben oui, 1 pixel, ça va faire 10,000,000 mètres d'après l'échelle que j'ai choisi. (enfin, je crois, j'ai la flème de vérifier :S) - vu l'échelle, vous comprenez donc pourquoi mes planètes sont petites -
Ensuite, le temps est accéléré par 100... Enfin... quand y'a pas de frame droppée
J'ai paramètré un timer pour s'éxécuter toutes les 10 millisecondes : il déplace les planètes, et les affiche. Donc si ça tourne pas à 100 fps, ben... le temps est plus lent aussi
Un truc pour mieu voir :
-> Clic : permet de centrer sur le point cliqué (enfin... à peu près, j'ai pas tout compris aux Transformations dans DX, j'ai l'impression que ça déconne un peu
-> Molette : Zoom avant et arrière. Normalement ça marche, mais faut insister En fait, ça marche au bout de 20 tours de molette et... ben à ce moment ça zoom autant de fois que correspondant
Voilà voilà. Bon, vais me coucher, j'ai un vrai travail à faire demain
Marsh Posté le 21-11-2005 à 12:15:56
Ben vu que personne répond jamais à mes problèmes techniques (c'est pas tout à fait vrai mais bon, ça s'en approche), faut bien que je passe le temps
Marsh Posté le 30-11-2005 à 16:20:35
Dsl j'étais pas là (c'est bon je déconne...)
J'ai essayé ton prog, et j'ai eu qq soucis au lancement. En regardant dans le code, j'ai vu qu'il n'arrivait pas à lancer
m_device = new Device(0, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, presentParams);
C'est ptet paske mon chipset graphique (GeForce 4 MX) est pas assez puissant... Ca fout les boules pour de a 2D (sans jeux de mots)
C'est quoi que tu veux faire exactement, à part dessiner des cercles ?
Paske je peux ptet t'expliquer en GDI+ (2D).
Marsh Posté le 30-11-2005 à 23:58:11
Je veux bien que tu m'expliques en quelques lignes GDI+, mais à la limite, là je suis en train de tenter de faire un truc en 3D... Spa gagné
Sinon, utiliser D3D pour de la 2D, à la limite, cela ne me dérange pas trop : en effet, maintenant les GPU sont 100% optimisés pour faire de la 3D, et c'est à se demander si le moteur 3D n'est plus plus rapide pour faire un rendu 2D que le moteur 2D... Ca pourrait bien valloir le coup de faire un petit bench pour comparer
Et à la limite, l'intérêt de passer par D3D pour faire de la 2D, c'est que l'achitecture du programme étant déjà prévue pour supporter un moteur 3D, ça permet de passer à la 3D sans devoir tout réécrire (juste la lib d'affichage en fait)
Marsh Posté le 18-11-2005 à 00:27:28
A la base, je me disais qu'un exemple vallat mieu qu'un long discours, et finalement, j'y aurai passé la soirée
http://magicweb.manga-torii.com/balls.htm
=> J'amerais refaire la même chose en C#.
Mais déjà, j'ai un mal de chien à afficher un bête cercle à l'écran... Et encore plus à le faire bouger !
En fait, je ne sais même pas s'il vaut mieu passer par un objet Graphic, par un Shape (y'en a en C# ?) ou DirectDraw...