Leaderboard
Popular Content
Showing content with the highest reputation on 03/09/2014 in all areas
-
ATTENTION CE SUJET CONTIENT DES HISTOIRES POUVANT HEURTER LA SENSIBILITE DES PLUS JEUNES. VOUS VOILA AVERTIS, MAINTENANT PREPAREZ-VOUS A TROUVER LE MONDE ENCORE PLUS FOU QU'IL NE L'EST. Vous connaissez tous ici de nom le Metal. Vous savez sûrement que tous les clichés qui le couvrent ont forcément un peu de vrai pour les alimenter, autrement ils n'existeraient pas ! Eh bien rien que pour vous, aujourd'hui, je vais vous donner l'origine de ces clichés, en me penchant sur le Black Metal, un style de métal noir (nooooooon c'est vrai ?) originaire de scandinavie, et tout particulièrement de Norvège. Introduisons les personnages : manger Dead - de son vrai nom Per Yngve Ohlin, était un chanteur suédois, ayant notamment chanté avec le groupe Mayhem, du black métal norvégien. Euronymous - de son vrai nom Øystein Aarseth, était le guitariste norvégien, et leader, de Mayhem. Varg - de son vrai nom Kristian Vikernes (à savoir : il a changé son nom parce que Kristian -> Chrétien ça lui plaisait pas du tout) est le fondateur et unique membre de Burzum, encore du black metal norvégien Gaahl - de son vrai nom Kristian Eivind Espedal est un chanteur norvégien ayant fait partie des groupes Trelldom et Gaahlskagg, mais surtout l'ancien leader de Gorgoroth. Il y a plus de tarés, mais on va commencer par parler de ces quatre là. I - L'homme cadavre Dead était un vrai taré. Son surnom nous annonçant la couleur immédiatement, on a pourtant pas idée de ce qu'il était capable de faire. Commençons par l'origine de son surnom. Per Yngve Ohlin aime raconter un peu partout cette histoire de son enfance : alors qu'il jouait sur un lac gelé, il serait tombé dans l'eau et aurait eu des visions de "l'autre monde". Depuis, ses seules motivations sont de faire tout ce qu'il peut pour que le seul mot qui nous vienne a l'esprit en le voyant soit "mort". Par exemple : sur scène, pour que sa voix soit pleine de souffrance, il ne buvait pas pendant des jours, et se mutilait les bras sur scène (avec des morceaux de bouteilles cassées, parfois jusqu'à l'évanouissement), en chantant. Avant chaque concert, il respirait l'odeur d'un cadavre de corbeau qu'il avait conservé pour être imprégné de la mort. Dans le black metal, les musiciens se font généralement un maquillage appelé Corpse Paint : tout le visage peint en blanc avec des motifs noirs (et parfois rouge) autour des yeux et de la bouche. En voici quelques exemples : Dead, lui, ne faisait pas son corpse paint juste pour faire joli, son but était de ressembler véritablement à un cadavre. Mais autrement que sur le visage, étant un personnage faisant très attention a l'intégralité de son look, pour dégager la mort, il enterrait ses vêtements dans un cimetière quelques semaines avant un concert pour qu'ils soient imprégnés des âmes défuntes. Mais passons maintenant à l'histoire la plus glauque de son existence. Il était dans une maison avec Euronymous dans une maison près d'oslo qui lui appartenait pour y passer quelques semaines. Ce jour là, il a du se dire que le meilleur moyen de ressembler à un mort serait d'en être un, et c'est ainsi qu'il a décidé de son suicide. Il a commencé par se couper les veines avec un couteau, mais pour une raison ou pour une autre il a fini le travail au fusil de chasse, dans sa tête. Lorsque Euronymous a pénétré dans la chambre après avoir entendu le coup de feu, il a aperçu une lettre de suicide sur la table. Dessus, il était écrit : "Désolé pour tout le sang..." A présent, rendez vous compte que Dead n'était pas le seul timbré. En voyant la scène, ni une ni deux, Euronymous a décidé d'agir. Il a couru hors de la maison dans le magasin le plus proche pour... acheter un appareil photo. Oui, si je vous dit qu'il est retourné dans la chambre et a pris une photo des restes de son pote, croyez moi ce n'est pas encore le pire qu'il ait fait. La photo a ensuite terminé en couverture d'un album de Mayhem nommé Dawn Of The Black Hearts. Non je ne vais pas vous montrer cette image ici, mais pour les plus curieux, libre a vous d'utiliser votre ami internet. Mais ce n'est pas tout, après avoir immortalisé l'instant, Euronymous a prélevé des bouts de cervelles pour les manger après les avoir cuits, et des bouts de crânes avec lesquels il a confectionné des colliers pour lui et tous ses amis. Après quoi il a appelé la police. II - L'amitié Kristian 'Varg' Vikernes est un homme qui aime beaucoup les liens sociaux, les relations humaines, franches, sympathiques, et intimes. Et pour cause : après avoir participé au groupe de death metal Old Funeral, il le quitte car il ne supporte de devoir jouer avec d'autres musiciens, d'avoir leur avis sur sa musique et de n'être pas pleinement libre. C'est donc là qu'il décide de créer le "groupe" Burzum, composé de lui, lui et lui. Il y avait à l'époque un label de black métal en norvège qui produisait quasiment tous les artistes importants du genre. Son gérant était considéré comme une sorte de baron du black, de grand ponte des satanistes. Le gérant, vous le connaissez, c'était Euronymous, que je surnommerais le Bouffeur de Cervelle (BC). Varg entra donc en contact avec BC pour produire ses disques, et devint rapidement très influent sur la scène black metal. Durant le temps de leur amitié, Varg et l'autre cannibale eurent le temps de : - Brûler quelques églises pour le fun, églises étant toutes en bois dans la région, et les mettre en couverture d'albums histoire de faire passer un léger message (exemple : De Mysteriis Dom Sathanas, de Mayhem) - Projeter de réaliser un snuff movie, vous savez, ces vidéos dans lesquelles ont voit des personnes mourir pour de vrai, avec pas moins qu'une ou deux petites filles - Créer l'Inner Black Circle, une sorte de petite secte comprenant les membres de plusieurs grands groupes tels que Emperor, Marduk, Thorns, ou même Immortal, se rassemblant dans le sous-sol du mangeur de neurones pour planifier leurs prochaines attaques contre l'Eglise. Vous le savez, une véritable amitié, a true friendship, en ekte vennskap en norvégien, c'est pour la vie. Mais vous le savez aussi, lorsque quelqu'un fait quelque chose de pas bien contre nous, certains vont pardonner, mais d'autres vont crier à la vengeance. Vous vous rappelez de l'autre photographe morbide ? Le fait que Varg arrive au centre des médias en gérant le label mieux que lui et en étant accusé de plus d'incendies l'as mis très en colère. Laissez moi maintenant vous peindre une petite scénette qui nous permettra d'introduire le paragraphe final. Varg et l'ami des cadavres avaient un ami en commun, appelons le Fred (oui je sais c'est pas un nom norvégien). Donc, Varg était chez Fred, ils devaient sûrement être en train de converser tranquillement de faits intellectuels, comme par exemple le temps que met une cathédrale à brûler si on utilise de l'essence et une allumette, quand le téléphone sonna. Fred se lève et va répondre, et active le haut-parleur. C'était Euronymous au bout du fil. Il demande à Fred s'il est seul, ce dernier ment en répondant que oui, et Euronymous commence alors à lui demander son aide pour un projet futur. Ce projet sobre et banal consistait à capturer Varg, l'enfermer dans une cave en vue de le torturer jusqu'à la mort, le tout filmé puis partagé au monde entier. SI vous avez tout suivi, Varg était dans la pièce et a donc tout entendu. Quelques jours plus tard, un soir, Varg reçoit un appel sur son portable de vous savez qui (euronymous bande de mous du cerveau), lui demandant de passer chez lui pour régler un problème de payement par rapport à son dernier album, quelque chose de très vague dit sur un ton un peu fébrile. Varg se rend donc en pleine nuit chez vous-savez-qui-cette-fois-faites-pas-comme-si-vous-aviez-rien-compris. Il sonne, l'autre ouvre, le fait entrer, l'amène au milieu du salon... Laissez moi vous décrire la scène en dix étapes simples et efficaces. Euronymous donne un coup de pied dans la poitrine de Varg (This is SPARTAAAAAA) Varg se relève et fonce sur le fabricant de collier en os pour le frapper Une super scène de combat digne des films américains a lieu Ils cassent à peu près tous les objets de l'appartement Euronymous réussit à donner un bon gros crochet dans la gueule du brûleur d'églises Il court vers sa chambre pour aller chercher son fusil à pompe, qu'il avait sûrement nommé "Le truc qui permet de faire des photos cool" Varg le rattrape au vol Il sort son petit canif, qu'il porte toujours sur lui, soyons raisonnables quand même Un coup. Deux coups. Douze coups. La dixième étape n'est pas vraiment necéssaire, vous aviez compris qu'il était mort. Hop, quinze ans de prison, aujourd'hui Varg est libre, il a une famille avec deux enfants eeeeeeeeeeeeeet........ Réjouissez-vous, il vit dans notre beau pays qu'est la France ! Une troisième histoire plus tard, vous aurez remarqué que le quatrième personnage n'a pas encore été mentionné...3 points
-
Si vous souhaitez apprendre la programmation C++, vous trouverez ici une liste des différentes ressources qui vous seront utiles pour votre apprentissage. Outils nécessaires : Code::Blocks : Un IDE parfait pour faire de petits projets et disponible sur tous les systèmes d'exploitation. Cours : Programmez avec le langage C++ (de Mathieu Nebra d'OpenClassrooms) : Ce cours vous aidera à obtenir un bon niveau pour programmer en C++. Il est à noter que plusieurs mois d'apprentissage sont nécessaires pour parvenir à réussir les exercices contenus dans ce cours.France-IOI : Un autre site proposant un cours complet sur le C++ qui vient compléter le cours d'OpenClassrooms (C'est toujours utile d'avoir deux cours différents car si l'on n'a pas compris l'un des deux, l'autre pourra peut-être nous sortir d'affaire). Tutoriels : Tutoriels sur Developpez.com : De nombreux tutoriels susceptibles de vous aider se trouvent sur ce site. Documentations : http://www.cplusplus.com/ : La documentation officielle du C++ est toujours une bonne amie quand on recherche une fonction. Librairies : LibNet par AlexMog : Pour commencer à concevoir des programmes réseaux, la librairie de AlexMog vous sera très utile.1 point
-
Bonjour à tous, je crée ce topic afin ce créer un endroit où vous pourrez tous mettre vos création en rapport avec Melinyel. Exemple: Un petit personnage représentant la communauté, un t-shirt pour faire de la pub lors des conventions, mais encore plein d'autres, le but est simple continuellement créer, laissez libre à votre imagination, seul restriction est le fait que toutes les œuvres ici auront un rapport avec Melinyel. Pour vous montrer que vous pouvez faire n'importe quoi, voici un muffin (pas assez cuit) avec le logo du forum (qui coule...) : Rappelez vous, l'importance n'est ni la qualité ni la forme ni le temps que celà doit prendre, l'importance est de créer Bon amusement à tous, Cordialement, Mars073.1 point
-
Le deepweb Suite à certaines demandes, je vais faire une introduction au deepweb, afin de vous expliquer le principe sur lequel celui-ci fonctionne et les moyens pour s'y connecter. Avant tout, j'apporte quelques petites précisions : je vais très certainement m'inspirer d'autres sites pour rédiger ce guide, les sources seront cités en bas de page. D'autres part, je ne prétends pas tout connaître sur le sujet, alors si quelque chose vous gêne ou si vous préférez que je parle d'un point : spécifiez-le moi. 1 - Introduction Pour commencer, si vous souhaitez comprendre intégralement et de manière plus complexe le fonctionnement du deepweb, ses explications et détails techniques, je vous invite à rechercher des thèses sur internet ou même consulter son wikipédia (http://www.fr.wikipedia.org/wiki/Web_profond, qui est cependant extrêmement peu rigoureux). Je vais néanmoins vous parler un peu du deepweb avant d'expliquer comment s'y rendre, donc si vous souhaitez juste aller dessus sans vraiment comprendre, allez directement en bas de ce guide. Afin de clarifier la chose, ce qu'on appelle deepweb est une partie d'internet bien spécifique. Son nom, littéralement "web profond" vient du fait qu'il est nécessaire pour y accéder de passer par un navigateur spécifique, intégrant une technologie de chiffrage des données* et d'un algorithme de redirection des connexions spécial : Tor. Tor est un réseau internet (acronyme de The Onion Router) décentralisé qui permet une connexion (plutôt sécurisée) à des serveurs en passant auparavant par d'autres utilisateurs de ce réseau. Pour simplifier les choses, sur internet "normal" -dit le surfaceweb- votre navigateur se connecte directement sur un serveur hébergeant un site et réceptionne les informations de celui-ci (c'est en fait un peu plus complexe, il passe par le FAI, des serveurs DNS, des CDN, etc... Mais l'idée est là). Sur le deepweb, où plutôt sur le réseau Tor (ce qui revient à la même chose), votre navigateur va tout d'abord transiter par plusieurs dizaines d'autres navigateurs d'utilisateurs pour finalement arriver sur le site en question : le but étant d'anonymiser la connexion au serveur, puisque l'information sera relayée par plusieurs dizaines d'adresses IP (ce qui vous protège un peu). On appelle ce réseau "onion" (le O de Tor) grâce à l'image de plusieurs couches d'un oignon superposées. Couches par lesquelles vous transiterez à la fin de ce tutoriel si vous vous rendez sur le deepweb. Pour votre information, Tor est le nom de ce réseau internet permettant l'accès au deepweb, mais dans 90% des discussions lorsqu'on vous parlera du deepweb, Tor sera en fait Tor browser, le navigateur nécessaire pour se rendre sur le deepweb qui inclut les protocoles et les algorithmes correspondant. Si vous souhaitez vous renseigner sur les transistions des packet, je vous laisse consulter la page wikipédia lié à ces détails techniques. Également, les URL du deepweb sont chiffrées. Déjà, celles-ci finissent toutes en .onion, et le contenu du nom de domaine est une suite de caractère sans signification (et oui, c'est pas comme le surface web), vous aurez par exemple une adresse web du style : https://gfe45a98uj4o4lclsmq7h98r9sdg.onion. J'essaierais de dresser un petit annuaire par la suite, pour vous aider à démarrer la dedans. Enfin, une dernière chose de l'introduction, vous avez peut-être déjà entendu parler du fait que le deepweb est la partie cachée de l'iceberg, et qu'il représente 96% de l'internet. Ceci est évidemment faux, c'est un mythe. Le deepweb est une partie d'internet à part entière mais elle absolument minoritaire de part ses fréquentations et d'un point de vue technique. Commençons par ses fréquentations : le deepweb, vous l'aurez compris, n'est pas disponible dans le premier starbucks en centre-ville sur un iPad fournit pendant que vous dégusterez un jus de chaussette amer fait à base de graines de cacao moisies en container, obtenues en martyrisant des régions entières... Je m'emporte. Satanés hipsters. Bref, le deepweb est peu accessible, et d'après la loi de l'offre et de la demande : Peu d'offre = Peu de demande. Simplement. De plus, vous trouverez sans doute un annuaire des sites sur le hiddenwiki (retenez ce nom). Vous découvrirez vite que les sites dessus sont exponentiellement plus hardcore, si vous me passez l'expression, mais aussi exponentiellement moins nombreux. Ensuite, le point de vue technique : le deepweb est une infrastructure couteuse et complexe à mettre en place aux yeux de ce que demande une simple page au réseau (en terme de capacité). Les ressources financières nécessaires au réseau Tor sont les suivantes (sources wikipédia) : 60 % proviennent du gouvernement américain (soutien à la liberté d'expression et à la recherche scientifique) 18 % proviennent de fondations et autres donateurs (John S. and James L. Knight Foundation (en), SRI International, Google, Swedish International Development Cooperation Agency (en)) 18 % proviennent de la valorisation des contributions des bénévoles. Toujours par la même source, le réseau coûte 2 millions de dollar annuellement. En comparaison, internet (= le surfaceweb) est une économie coutant plusieurs milliards de dollar annuellement (mais oui, les gains sont plus élevés). Vous installerez difficilement un nœud de connexion Tor par vos soins sur un serveur mutualisé web, alors qu'un site normal peut l'être facilement. Pour information, ce mythe (à présent démystifié) provient d'un article datant de 2001 (13 ans actuellement), que vous pouvez consulter ici. A cette époque, la bulle internet venait d'exploser et tout le monde (surtout la finance, cf. la crise) spéculait sur cette nouvelle technologie. L'article parle donc du deepweb MAIS ajoute également dans la balance les bases de données des sites, donc pas accessibles au publique (normalement) ET les sites web (indexables ou non) qui n'ont pas été répertoriés par des moteurs de recherches. Vous comprendrez d'où vient ce mythe : un internet ancien et peu développé, sur lequel on compare les pages web accessibles contre les pages web non accessibles et les bases de données (l'article précise que certaines pèsent plusieurs centaines de GO, déjà en 2001). Voilà, vous avez eu une explication sur le fonctionnement du deepweb, assez sommaire ma foi mais je pense qu'elle suffira pour commencer. Si vous êtes curieux, internet sera toujours plus rigoureux que moi. Ah, et un dernier mythe : le deepweb n'est pas illégal, pas du tout. Visiter la majorité des sites et totalement légale, cependant l'achat sur certains sites ne l'est peut-être pas, par contre. 1 - Utilisation C'est dans cette partie que je vais vous expliquer comment accéder à ce réseau privé, qui malgré les croyances populaires est somme toute pas franchement compliqué d'accès. Avertissements nécessaires : Le deepweb a la réputation d'être inhumain et d'être l'antre des malades mentaux. Globalement c'est faux. La majorités de ce réseau est tout aussi normal que la société dans laquelle nous vivons, on y trouve même des forums comme Melinyel.net, donc ce n'est pas le cas. CEPENDANT : il existe bel et bien des sites DANGEREUX et malsains dont je ne souhaite pas encourager le partage. J'interdis donc le partage de liens sans m'avoir consulté au préalable, et j’interdis évidemment de poster les médias trouvés là-bas. 2 - Sur le deepweb, vous trouverez pleins de personnes différentes, et notamment des sites de piratages / hacking. Ces sites comportent souvent des virus pouvant s'installer directement sur votre PC par une simple visite, ça ressemble à un récit d'un kikoo qui ne s'y connait pas je vous le concède, et pourtant cela existe (je n'ai pas réussi à comprendre ce fonctionnement -le javascript n'est pas activé-). Donc protégez-vous malgré tout : je recommande fortement l'utilisation de Tor browser sur une machine virtuelle plutôt que directement sur votre système d'exploitation à nu. 3 - Faites attention où vous allez. Sans risquer quoique ce soit aux yeux de la loi ou pour la sécurité de votre ordinateur, certaines choses sur le deepweb sont marquantes et ne sont pas tout publique. Je vous considère donc comme prévenu. Donc voilà, maintenant que vous savez tout ça, vous êtes prêt pour vous rendre sur le deepweb. Commencez par télécharger la dernière version du logiciel Tor Brower : https://www.torproject.org/download/download-easy.html.en Téléchargez la version correspondante à votre système d'exploitation, installez-là Lancez Tor Browser, vous aurez une interface vous demandant le type de votre connexion comme spécifié ci-dessous, cliquez simplement sur "Se connecter" Voilà, vous arrivez sur la page principale du navigateur. Il ne vous reste qu'une seule chose à faire : cliquez sur le petit (S) en haut à gauche, et désactivez le JavaScript. C'est une mesure de sécurité et augmente le temps de chargement des pages web du deepweb, qui seraient incroyablement longues sinon. Voilà, votre aventure commence ici, je vous donne cette adresse, qui est l'adresse du hiddenwiki : l'annuaire du deepweb. Faites attention où vous irez. http://kpvz7ki2v5agwt35.onion/wiki/index.php/Main_Page * : L'algorithme de Tor a été mis à mal une seule fois, par un enseignement chercher d'une école française d'ingénieure française (en plus !) : ESIEA (source) Sources : Connaissance / expérience personnelle http://fr.wikipedia.org/wiki/Tor_(réseau) http://fr.wikipedia.org/wiki/Web_profond http://quod.lib.umich.edu/cgi/t/text/text-idx?c=jep;view=text;rgn=main;idno=3336451.0007.104 https://www.torproject.org/about/overview.html.en Ce guide / tutoriel touche à sa fin, si besoin je l'éditerais. Si vous avez des questions, n'hésitez pas !1 point
-
Si vous souhaitez apprendre la programmation Python, vous trouverez ici une liste des différentes ressources qui vous seront utiles pour votre apprentissage. Outils nécessaires :Python : Disponible sur tous les systèmes d'exploitation, c'est l'outil essentiel pour programmer en Python. Cours :Apprenez à programmer en Python (de prolixe d'OpenClassrooms) : Ce cours vous aidera à obtenir un bon niveau pour programmer en python. Il est à noter que plusieurs mois d'apprentissage sont nécessaires pour parvenir à réussir les exercices contenus dans ce cours. Tutoriels :Tutoriels sur Developpez.com : De nombreux tutoriels susceptibles de vous aider se trouvent sur ce site. Documentations :https://www.python.org/doc/ : La documentation officielle du Python est toujours une bonne amie quand on recherche une fonction.1 point
-
Si vous souhaitez apprendre la programmation Java, vous trouverez ici une liste des différentes ressources qui vous seront utiles pour votre apprentissage. Outils nécessaires : Eclipse : C'est l'IDE le plus utilisé par les développeurs Java. IntelliJ Idea : Un autre IDE pour programmer en Java. Cours : Apprenez à programmer en Java (de Cyrille Herby d'OpenClassrooms) : Ce cours vous aidera à obtenir un bon niveau pour programmer en Java. Il est à noter que plusieurs mois d'apprentissage sont nécessaires pour parvenir à réussir les exercices contenus dans ce cours. Tutoriels : Tutoriels sur Developpez.com : De nombreux tutoriels susceptibles de vous aider se trouvent sur ce site. Documentations : - : La documentation officielle du Java est toujours une bonne amie quand on recherche une fonction.1 point
-
Bonjour à tous, Je vais vous parler d'un "long métrage d'animation" (durée: ~1h54) assez sympathique du nom de "Summer Wars". Synopsis: L'histoire se déroule au Japon, le personnage principal est un jeune adolescent très doué en mathématique (normal il est ch..), dans ce monde un réseau social du nom de "Oz" est tellement populaire que toutes les sociétés connectent leurs systèmes informatiques, notre héro va vouloir rendre service à une fille de son école et sans même savoir ce qu'il aura à faire il part à la campagne où il apprendra qu'il doit se faire passer pour le fiancé modèle, pendant la nuit il recevra un étrange message et le lendemain Oz sera piraté ce qui entraînera le monde dans le chaos. <3 Infos(by Wiki): Bande d'annonce: Je le conseil vivement si vous êtes un peu Geek et que vous aimez les traditions japonaise. Bon visionnage, Cordialement, Mars073.1 point
-
Maintenant que l'on peut appliquer une force, il faut pouvoir la rattacher à un corps . On peut distinguer, là encore, deux types de corps : les dynamiques et les statiques. Les corps dynamiques seront les seuls qu'il est possible de bouger via des forces, les statiques seront considérés comme des élément du décors, il seront tout le temps immobiles (sauf si vous modifier leur position manuellement bien sur). Ainsi, les personnages, les caisses... seront dynamiques, et les élément du décors seront statiques. Voici donc la structure d'un corps : typedef struct s_body { char dynamic; float weight; t_collision_box box; t_force_container force; struct s_body *next; }t_body; Le poids (weight) sert à savoir à quel point l'objet sera dur a bouger. Ainsi, un objet de 40 kg sera deux fois plus facile à bouger qu'un objet de 80 kg. il faudra donc deux fois moins de force. Et voici donc l'unité des forces : Mètre par secondes par kilogrammes. (40 de force pour bouger un corps de 40 kg à 1m/s) la collision box, servira plus tard pour déterminer les collisions entre les corps, et le tout en liste chainnée, afin de pouvoir les stoker facilement dans une structure world : typedef struct s_physic_world { t_body *static_body; t_body *dynamic_body; }t_physic_world; Il faut faire la différence entre les corps afin d'éviter de faire des tests qui ne servent à rien (par définition, deux corps statiques ne sont jamais en collisions) Tout d'abord, la fonction de création de corps : t_body *create_static_body(float x, float y, float w, float h) { t_body *body = malloc(sizeof(*body)); if (body != NULL) { body->box.x = x; body->box.y = y; body->box.w = w / 2; body->box.h = h / 2; body->dynamic = 0; body->weight = 1; body->force.permanent_force = NULL; set_contact_force(&(body->force), 0, 0); body->force.total_force.x = 0; body->force.total_force.y = 0; body->next = NULL; } return (body); } t_body *create_dynamic_body(float x, float y, float w, float h) { t_body *body = malloc(sizeof(*body)); if (body != NULL) { body->box.x = x; body->box.y = y; body->box.w = w / 2; body->box.h = h / 2; body->dynamic = 1; body->weight = 1; body->force.permanent_force = NULL; set_contact_force(&(body->force), 0, 0); body->force.total_force.x = 0; body->force.total_force.y = 0; body->next = NULL; } return (body); } les deux fonctions sont strictement les mêmes, sauf une initialisation d'une variable. Vous pouvez facilement réunir le tout en une fonction, mais j'ai garder cette présentation car plus claire à utiliser. La fonction retourne un pointeur sur la structure afin de pouvoir la modifier et de l'ajouter à la structure physic_world (la fonction va venir, ne vous inquiétez pas). Il faut initialiser toutes les forces à 0, ont met le poids à 1 par défaut (ne jamais mettre le poids à 0, sinon il va y avoir un problème de division par 0) Il faut aussi savoir que pour déterminer les collisions, on à besoin du centre du corps, pas un de ces coins. On à aussi besoin que de la moitié de la hauteur et de la largeur, mais la conversion est faites dans la fonction, pour plus de simplicité. Et surtout pour ceux qui veulent la structure collision box : typedef struct s_collision_box { float x; float y; float w; float h; }t_collision_box; il faut maintenant aussi, pouvoir détruire une entité : void delete_body(t_body *body) { if (body != NULL) { t_force *remove = body->force.permanent_force; while (remove != NULL) { body->force.permanent_force = remove->next; free(remove); remove = body->force.permanent_force; } free(body); } } On doit enlever toutes les forces permanentes afin d'éviter les fuites de mémoires ! De plus, l'objet doit aussi avoir le poids que vous voulez : void add_weight(t_body *body, float weight) { if (body != NULL) { if (weight <= 0) { weight = 1; } body->weight = weight; } } Mais ce n'est pas finit ! Il faut aussi pouvoir ajouter le corps à la structure world. La fonction pour mettre a jour tout les corps ne va pas attendre qu'on lui passe tout les objets 1 par 1 ! Cela possède plusieurs avantages : On n'envoie qu'une grande structure au lieu de plein de petites, et vous pourrez bénéficier de la détection de collisions sans que l'objet soit présent physiquement : cela permet de faire des capteurs, de savoir si on est dans de l'eau sans autant repousser le personnage etc... Bref suit les fonctions d'initialisation, de suppression du monde physique et d'ajout de corps, rien de bien complexe, presque un copier coller des forces : t_physic_world *create_physic_world() { t_physic_world *world = malloc(sizeof(*world)); if (world != NULL) { world->static_body = NULL; world->dynamic_body = NULL; } return (world); } void delete_physic_world(t_physic_world *world) { if (world != NULL) { t_body *remove = world->static_body; while (remove != NULL) { world->static_body = remove->next; delete_body(remove); remove = world->static_body; } remove = world->dynamic_body; while (remove != NULL) { world->dynamic_body = remove->next; delete_body(remove); remove = world->dynamic_body; } free(world); } } char add_to_physic_world(t_physic_world *world, t_body *body) { if (world != NULL && body != NULL) { if (body->dynamic) { body->next = world->dynamic_body; world->dynamic_body = body; } else { body->next = world->static_body; world->static_body = body; } return (1); } else { return (0); } } Les corps sont encore empilés, car c'est toujours plus simple à faire Et maintenant, on peut mettre a jour touts les corps : void update_physic_world(t_physic_world *world, int millisecond_time) { t_body *update = world->dynamic_body; while (update != NULL) { update_force(update, millisecond_time); update = update->next; } } void update_force(t_body *body, int millisecond_time) { calc_total_force(&(body->force)); body->force.total_force.x *= (millisecond_time / 1000.0) / body->weight; body->force.total_force.y *= (millisecond_time / 1000.0) / body->weight; body->box.x += body->force.total_force.x; body->box.y += body->force.total_force.y; set_contact_force(&(body->force), 0, 0); } Je vous rappelle que seuls les corps dynamiques peuvent être en mouvement, donc il n'y a pas de raison de mettre a jours les corps statiques. La fonction attend un temps en millisecondes car la SDL utilise cette unité, mais vous pouvez changer l'unité de temps, il faudra juste adapter en conséquence. Mais vous avez sûrement remarquer la présence de la structure force_container, même chez les corps statiques, alors pourquoi ne pas l'enlever chez eux ? Tous simplement parce que sinon on doit dupliquer le code en deux : corps statiques et corps dynamiques, que c'est plus complexe à faire, que les risque de bug sont multiplier par deux, et surtout ça empêche le méga truc de la mort qui tue, mais que vous ne saurez pas dans ce tutos. Les forces de contacts sont remisent à 0 a chaque fois car on les recréer aussi à chaque fois. Et voilà, vous pouvez bouger vos personnages comme vous voulez, mais il n'y a toujours pas de collisions !1 point
-
Autant pofiner les détails mais très bon sujet encore une fois. Tu devrais ajouter un lien vers le n°2 dans ton premier sujet et inversement pour assurer une lecture linéaire. Gros bravo, j'imagine le travail que ça doit représenter pour toi, félicitation encore une fois.1 point
-
Je vais faire dans cette série de tutoriels, une construction suivit d'un moteur physique. Tout d'abord : Qu'est ce qu'un moteur physique ? Un moteur physique, est un programme qui permet de gerer la physique correctement, et qui déplace les personnages, tout en gérant les collisions. (tout les problèmes de collisions d'un jeu viennent du moteur physique). Ce qu'il faut savoir avant de commencer à le faire : Le moteur physique, que je vais vous apprendre à faire, ne gérera que des rectangles, il est donc parfait pour les jeux de plate-formes, de type mario, mais aussi d'autre styles de jeu avec que des blocs (les jeux en tiles quoi) comme zelda. Et oui le moteur ne sera qu'en 2d ! De plus, le principe majeur d'un moteur physique est la réutilisabilité de celui-ci, ce qui veut dire pas de : IF MUR THEN ... L'architecture que nous allons utilisé est celle dite "à posteriori" : -première étape, on génère des forces, comme la gravité, les forces de mouvement... -deuxième étape, on applique ces forces. -troisième étape, on détecte les collisions. -dernière étape, on les corrige. L'autre architecture, aussi appelé "à priori", utilise des matrices de résolution, afin de détecter l'instant exact de la collision. Cette architecture est plus précise, mais elle est aussi beaucoup plus lente, c'est pourquoi AUCUN moteur physique de jeu vidéo ne l'utilise, l'architecture "à posteriori" offrant des résultats satisfaisants. (Ce n'est qu'en cas extrêmes que l'ont remarque des problèmes, mais on ne les vois pas souvent). Et on va donc commencer par créer un générateur de force, et qui va les stoker dans une structure, afin de les garder en mémoire. (On attachera ensuite cette structure à un corps, afin de le déplacer) typedef struct s_force_container { t_force *permanent_force; t_force contact_force; t_force total_force; }t_force_container; Tout d'abord, j'ai distingué deux type de forces : les permanentes (la gravité, les mouvements...), et les forces de contact. celle là seront régénérées à chaque fois que le moteur se mettra à jour, donc on ne va pas créer de listes chaînées pour ça, car le risque qu'un malloc échoue devient très vite important, donc on va uniquement se contenter d'additionner les valeurs entre elles. Les forces permanentes, elles, seront stockées dans la liste chaînées, afin de pouvoir en modifier une sans impacter les autres. La force total_force, elle sert uniquement a connaître le total des forces permanentes et de contact, afin de bouger le corps en conséquences. Les forces sont représentées par la structure suivantes : typedef struct s_force { float x; float y; struct s_force *next; }t_force; Les forces en x représente normalement l'axe horizontal et l'axe x, vertical. Il n'y a pas de sens ou de direction pour les axes, vous pouvez prendre celui que vous voulez, il faudra juste adapter les forces en conséquence. il nous faut maintenant une fonction afin d'ajouter ou d'enlever une force permanente. La fonction d'ajout : t_force *create_permanent_force(t_force_container *container, float x, float y) { t_force *add = malloc(sizeof(*add)); if (add != NULL) { add->x = x; add->y = y; add->next = container->permanent_force; container->permanent_force = add; } return (add); } la fonction retourne un pointeur vers la force, afin de la modifier quand vous voulez. Les forces sont empiler les une à la suite des autres (l'ordre d'empilage n'a absolument aucune importance, c'est juste plus simple à programmer ) Et maintenant la fonction "d'enlevage" : void delete_permanent_force(t_force_container *container, t_force *remove) { if (container != NULL) { if (container->permanent_force != NULL) { t_force *search = container->permanent_force; char finish = 0; if (search == remove) { container->permanent_force = remove->next; free(remove); finish = 1; } while (search->next != NULL && !finish) { if (search->next == remove) { search->next = search->next->next; free(remove); finish = 1; } } } } } Le seul truc dur a faire ici, c'est de penser a enlever la force, tout ne perdant aucun pointeur vers les prochaines forces, tout en ne faisant pas de segfault. On s’occupe maintenant des forces de contact, les plus faciles . pour en ajouter : void add_contact_force(t_force_container *container, float x, float y) { if (container != NULL) { container->contact_force.x += x; container->contact_force.y += y; } } il n'y a pas de fonction pour retirer une force, car pour retirer les forces directement additionner, il suffit juste d'ajouter son contraire. Mais en revanche, il faut une fonction pour remettre à un certain nombre cette force, car je vous rappelle, il faut réinitialiser les forces de contacts a chaque mise à jour (bah oui sinon vous imaginez, il faudrait retenir a cause de quoi cette force de contact a été créer, vérifier si elle a toujours raison d’exister, le tout avec beaucoup de corps en mouvement, et le moteur va ramer très vite. Bref la fonction : void set_contact_force(t_force_container *container, float x, float y) { if (container != NULL) { container->contact_force.x = x; container->contact_force.y = y; } } Toujours aussi simple, normalement pas de difficulté a comprendre . Et enfin, il nous reste une dernière fonction a voir : celle qui calcule la somme de toutes les forces, afin de savoir la force finale pour bouger le corps. Elle parcours la liste chaînées des forces permanentes, les additionnent, puis ajoute les forces de contacts et met le résultat dans total_force : void calc_total_force(t_force_container *container) { if (container != NULL) { float x = 0; float y = 0; t_force *force = container->permanent_force; while (force != NULL) { x += force->x; y += force->y; force = force->next; } x += container->contact_force.x; y += container->contact_force.y; container->total_force.x = x; container->total_force.y = y; } } Et voilà ! on peut maintenant ajouter ou enlever facilement des forces, permanentes où de contact. Évidement, le code comme cela ne sert absolument a rien, il faut ajouter la notion de corps pour comprendre à quoi cela va servir.1 point
-
Après test : Une ambiance agréable, avec un split d'écran bien géré, une coloration sympathique entièrement personnalisable, une arborescence sur le coté qui ne pique pas les yeux... La barre d'outil est agréable, quoique petit amis gère les raccourcis systèmes ( ctrl-s ... ) qui sont eux aussi personnalisables. Parenthèses, accolades, crochets, guillemets et apostrophes sont automatiquement fermés lorsque vous les ouvrez ( et votre curseur est placé entre les deux ) et les variables sont auto-complétées de manière agréable ( on vous propose une liste, uniquement dans la fonction que vous êtes en train d'éditer ( j'ai fait le test avec un peu de JS ) avec le type de variable à coté (string, int, etc... ) ). Seul petit bémol : la version gratuite n'accepte qu'un seul moyen de partage, c'est donc SOIT ftp, SOIT google drive SOIT drop-box etc... pis encore, vous ne pouvez mettre qu'un seul ftp dans la version gratuite ! ( vous pouvez toujours le supprimer et le changer à chaque fois que vous changez de projet mais pas très pratique...). Ce petit défaut est tout de même parfaitement compréhensible, ils doivent bien gagner leur vie tout de même ! D'autan plus que le premier abonnement est à 2$ par mois ! Cet abonnement vous autorisera plus de connexion au cloud ( stockage chez codeAnywhere ainsi que les connexions aux FTP, googleDrive, dropBox... ) mais je ne sais pas combien Après il y a un abonnement à 7$ puis 20 $ (par mois hein ) Je m'attaque à la version mobile, si celle-ci me plait, y'a moyen que CodeAnywhere devienne mon éditeur permanent ( du moins quand j'ai internet... )1 point
