diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..293ecc0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Exclure le dossier idea +.idea/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0c55aa4 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# ![alt HATCLIC-Choux](https://raw.githubusercontent.com/Lob2018/Choux/master/img/chou%2B.png) Bienvenue sur le projet Choux ! + +Choux est un jeu, inspiré du film français "La soupe aux choux", réalisé par Jean Girault, sorti en 1981. Le projet a démarré au mois de mai 2018. + +## Jouer (en ligne ou hors ligne) + +* [Choux](https://lob2018.github.io/Choux/) - Jouer en ligne +* [Télécharger Choux](https://github.com/Lob2018/Choux/archive/master.zip) - Jouer hors ligne + +### Conditions préalables + +Disponible avec un navigateur web compatible : + +``` +HTML5 - canvas +JavaScript (ES6) - classes +CSS +``` + +### Installation + +Le jeu se lance dans le navigateur, avec le fichier index.html + +## Construit avec + +* [Font Awesome](https://fontawesome.com/v4.7.0/) - Pour les icônes +* [Google Fonts](https://fonts.google.com/) - Pour les polices +* [Astronomy Picture of the Day](https://apod.nasa.gov/apod/astropix.html) - Pour les images **avec Copyright** +* Musique : Cybersdf - Dolling +* Effets : Spinningmerkaba - Reusenoise (DNB Mix) +* Effets : Sample de Galiardin - Valse brune (1931) +* Effets : Guazu - Guazu +* Effets : Mizuki s Last Chance - Yeah +* Effets : Juhani Junkala - retro video game sound effects + +## Versions + +``` +v1.1.0 Effet de transparence sur l'image quand hors jeu +``` + +## Auteur + +* ![alt HATCLIC-Logo)](https://hatclic.fr/themes/hatclic_theme/logo.png) **Hatclic** - Conception de sites Internet, et services du numérique - [Hatclic.fr](https://hatclic.fr) + +## Licence + +Ce projet est sous licence GPL-3.0 - voir le fichier [LICENSE](LICENSE) pour plus de détails. **Attention seulement certaines images sont libres de droits**. diff --git a/css/gnome.css b/css/gnome.css new file mode 100644 index 0000000..7d5a08a --- /dev/null +++ b/css/gnome.css @@ -0,0 +1 @@ +.fa.fa-pull-left,.fa.pull-left{margin-right:.3em}.fa,.fa-stack,.loader{display:inline-block}.fa-fw,.fa-li,.loader,body{text-align:center}@font-face{font-family:Amatic;src:url(../fonts/woff/amaticsc-bold-webfont.woff) format("woff"),url(../fonts/woff2/amaticsc-bold-webfont.woff2) format("woff2");font-weight:700;font-style:normal}@font-face{font-family:FontAwesome;src:url(../fonts/eot/fontawesome-webfont.eot);src:url(../fonts/eot/fontawesome-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/woff2/fontawesome-webfont.woff2) format('woff2'),url(../fonts/woff/fontawesome-webfont.woff) format('woff'),url(../fonts/ttf/fontawesome-webfont.ttf) format('truetype'),url(../fonts/svg/awesome.svg) format('svg');font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right,.pull-right{float:right}.pull-left{float:left}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-spoon:before{content:"\f1b1"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}body,canvas,html{padding:0;margin:0;font-family:Amatic,cursive}html{background:url(../img/terre.jpg) center no-repeat fixed;-webkit-background-size:cover;background-size:cover;overflow-x:hidden;overflow-y:hidden}p{margin-top:0}#chargement{width:100%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}#chargement p{font-size:2.7rem;background:-webkit-linear-gradient(top,#56ff6d,#e8d542);background:-o-linear-gradient(bottom,#56ff6d,#e8d542);background:-moz-linear-gradient(bottom,#56ff6d,#e8d542);background:linear-gradient(to bottom,#56ff6d,#e8d542);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.loader{height:100px;width:20%;padding:1em;margin:0 auto 1em;vertical-align:top}svg path,svg rect{fill:#56ff6d}body{margin:0 auto}.wow{animation-duration:.5s;animation-name:wow}@keyframes wow{from{-webkit-transform:scale(0)}30%{-webkit-transform:scale(2)}60%{-webkit-transform:scale(.75)}to{-webkit-transform:scale(1)}}.rebond{-webkit-animation-name:rebond;animation-name:rebond;-webkit-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes rebond{20%,53%,80%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes rebond{20%,53%,80%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.perdu{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:perdu;animation-name:perdu}@-webkit-keyframes perdu{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}to{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes perdu{from{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}to{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.intro{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedIn{from{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes lightSpeedIn{from{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}to{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}.extra{-webkit-animation-name:hvr-buzz-out;animation-name:hvr-buzz-out;-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-iteration-count:1;animation-iteration-count:1}@-webkit-keyframes hvr-buzz-out{10%,30%{-webkit-transform:translateX(3px) rotate(2deg);transform:translateX(3px) rotate(2deg)}20%,40%{-webkit-transform:translateX(-3px) rotate(-2deg);transform:translateX(-3px) rotate(-2deg)}50%,70%{-webkit-transform:translateX(2px) rotate(1deg);transform:translateX(2px) rotate(1deg)}60%,80%{-webkit-transform:translateX(-2px) rotate(-1deg);transform:translateX(-2px) rotate(-1deg)}90%{-webkit-transform:translateX(1px) rotate(0);transform:translateX(1px) rotate(0)}100%{-webkit-transform:translateX(-1px) rotate(0);transform:translateX(-1px) rotate(0)}}@keyframes hvr-buzz-out{10%,30%{-webkit-transform:translateX(3px) rotate(2deg);transform:translateX(3px) rotate(2deg)}20%,40%{-webkit-transform:translateX(-3px) rotate(-2deg);transform:translateX(-3px) rotate(-2deg)}50%,70%{-webkit-transform:translateX(2px) rotate(1deg);transform:translateX(2px) rotate(1deg)}60%,80%{-webkit-transform:translateX(-2px) rotate(-1deg);transform:translateX(-2px) rotate(-1deg)}90%{-webkit-transform:translateX(1px) rotate(0);transform:translateX(1px) rotate(0)}100%{-webkit-transform:translateX(-1px) rotate(0);transform:translateX(-1px) rotate(0)}} \ No newline at end of file diff --git a/fonts/eot/EricaOne-Regular.eot b/fonts/eot/EricaOne-Regular.eot new file mode 100644 index 0000000..b7e973a Binary files /dev/null and b/fonts/eot/EricaOne-Regular.eot differ diff --git a/fonts/eot/fontawesome-webfont.eot b/fonts/eot/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/fonts/eot/fontawesome-webfont.eot differ diff --git a/fonts/otf/EricaOne-Regular.otf b/fonts/otf/EricaOne-Regular.otf new file mode 100644 index 0000000..9bd5a11 Binary files /dev/null and b/fonts/otf/EricaOne-Regular.otf differ diff --git a/fonts/svg/EricaOne-Regular.svg b/fonts/svg/EricaOne-Regular.svg new file mode 100644 index 0000000..524def9 --- /dev/null +++ b/fonts/svg/EricaOne-Regular.svg @@ -0,0 +1,797 @@ + + + + +Created by FontForge 20120731 at Thu Dec 6 10:43:39 2018 + By www-data +Copyright (c) 2011 by LatinoType Limitada (info@latinotype.com), with Reserved Font Names "Erica" "Erica One" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fonts/svg/awesome.svg b/fonts/svg/awesome.svg new file mode 100644 index 0000000..e8d8a8b --- /dev/null +++ b/fonts/svg/awesome.svg @@ -0,0 +1,20 @@ + + Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, + Copyright Dave Gandy 2016. All rights reserved. + \ No newline at end of file diff --git a/fonts/ttf/EricaOne-Regular.ttf b/fonts/ttf/EricaOne-Regular.ttf new file mode 100644 index 0000000..d7cc7e0 Binary files /dev/null and b/fonts/ttf/EricaOne-Regular.ttf differ diff --git a/fonts/ttf/fontawesome-webfont.ttf b/fonts/ttf/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/fonts/ttf/fontawesome-webfont.ttf differ diff --git a/fonts/woff/EricaOne-Regular.woff b/fonts/woff/EricaOne-Regular.woff new file mode 100644 index 0000000..8aa792d Binary files /dev/null and b/fonts/woff/EricaOne-Regular.woff differ diff --git a/fonts/woff/amaticsc-bold-webfont.woff b/fonts/woff/amaticsc-bold-webfont.woff new file mode 100644 index 0000000..eaeafb9 Binary files /dev/null and b/fonts/woff/amaticsc-bold-webfont.woff differ diff --git a/fonts/woff/fontawesome-webfont.woff b/fonts/woff/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/fonts/woff/fontawesome-webfont.woff differ diff --git a/fonts/woff2/EricaOne-Regular.woff2 b/fonts/woff2/EricaOne-Regular.woff2 new file mode 100644 index 0000000..f807f25 Binary files /dev/null and b/fonts/woff2/EricaOne-Regular.woff2 differ diff --git a/fonts/woff2/amaticsc-bold-webfont.woff2 b/fonts/woff2/amaticsc-bold-webfont.woff2 new file mode 100644 index 0000000..c4577a2 Binary files /dev/null and b/fonts/woff2/amaticsc-bold-webfont.woff2 differ diff --git a/fonts/woff2/fontawesome-webfont.woff2 b/fonts/woff2/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/fonts/woff2/fontawesome-webfont.woff2 differ diff --git a/img/0.jpg b/img/0.jpg new file mode 100644 index 0000000..406c5f4 Binary files /dev/null and b/img/0.jpg differ diff --git a/img/1.jpg b/img/1.jpg new file mode 100644 index 0000000..a0164e5 Binary files /dev/null and b/img/1.jpg differ diff --git a/img/10.jpg b/img/10.jpg new file mode 100644 index 0000000..19ec729 Binary files /dev/null and b/img/10.jpg differ diff --git a/img/11.jpg b/img/11.jpg new file mode 100644 index 0000000..614be00 Binary files /dev/null and b/img/11.jpg differ diff --git a/img/12.jpg b/img/12.jpg new file mode 100644 index 0000000..45f9551 Binary files /dev/null and b/img/12.jpg differ diff --git a/img/13.jpg b/img/13.jpg new file mode 100644 index 0000000..0568854 Binary files /dev/null and b/img/13.jpg differ diff --git a/img/14.jpg b/img/14.jpg new file mode 100644 index 0000000..6e60a1d Binary files /dev/null and b/img/14.jpg differ diff --git a/img/2.jpg b/img/2.jpg new file mode 100644 index 0000000..e2e6c82 Binary files /dev/null and b/img/2.jpg differ diff --git a/img/3.jpg b/img/3.jpg new file mode 100644 index 0000000..10de234 Binary files /dev/null and b/img/3.jpg differ diff --git a/img/4.jpg b/img/4.jpg new file mode 100644 index 0000000..a006e0d Binary files /dev/null and b/img/4.jpg differ diff --git a/img/5.jpg b/img/5.jpg new file mode 100644 index 0000000..a068c96 Binary files /dev/null and b/img/5.jpg differ diff --git a/img/6.jpg b/img/6.jpg new file mode 100644 index 0000000..cb49d36 Binary files /dev/null and b/img/6.jpg differ diff --git a/img/7.jpg b/img/7.jpg new file mode 100644 index 0000000..04502ab Binary files /dev/null and b/img/7.jpg differ diff --git a/img/8.jpg b/img/8.jpg new file mode 100644 index 0000000..2c002d7 Binary files /dev/null and b/img/8.jpg differ diff --git a/img/9.jpg b/img/9.jpg new file mode 100644 index 0000000..e125dbb Binary files /dev/null and b/img/9.jpg differ diff --git a/img/chou+.png b/img/chou+.png new file mode 100644 index 0000000..6929343 Binary files /dev/null and b/img/chou+.png differ diff --git a/img/chou.ico b/img/chou.ico new file mode 100644 index 0000000..8ede825 Binary files /dev/null and b/img/chou.ico differ diff --git a/img/chou.png b/img/chou.png new file mode 100644 index 0000000..1d35ec6 Binary files /dev/null and b/img/chou.png differ diff --git a/img/cosmonaute.png b/img/cosmonaute.png new file mode 100644 index 0000000..9460354 Binary files /dev/null and b/img/cosmonaute.png differ diff --git a/img/hero.png b/img/hero.png new file mode 100644 index 0000000..a7768a1 Binary files /dev/null and b/img/hero.png differ diff --git a/img/heroEx.png b/img/heroEx.png new file mode 100644 index 0000000..ff4794a Binary files /dev/null and b/img/heroEx.png differ diff --git a/img/terre.jpg b/img/terre.jpg new file mode 100644 index 0000000..105e6e1 Binary files /dev/null and b/img/terre.jpg differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..06b8b10 --- /dev/null +++ b/index.html @@ -0,0 +1,44 @@ + + + + + + + + CHOUX | HATCLIC.FR + + + + + +
+ + + + + + +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/js/classes/Audio.js b/js/classes/Audio.js new file mode 100644 index 0000000..3382363 --- /dev/null +++ b/js/classes/Audio.js @@ -0,0 +1,306 @@ +"use strict"; + +class Audio { + + constructor() { + this.fadein; + this.fadeinMus; + } + + /** + * DÉFINIR LA MUSIQUE + * @param {Le chemin relatif vers la musique} srcMusique + */ + setMusique(srcMusique) { + this.srcMusique = srcMusique; + if (document.getElementById('musique') == undefined) { + this.musique = document.createElement('audio'); + this.musique.setAttribute('id', "musique"); + + this.creerSrc(srcMusique, this.musique); + + // this.musique.setAttribute('autoplay', "true"); + this.musique.setAttribute('loop', "true"); + document.body.appendChild(this.musique); + } + } + + /** + * DÉFINIR LE SON DU BONUS + * @param {Le chemin relatif vers le son ok} srcOk + */ + setOk(srcOk) { + if (document.getElementById('sonOk') == undefined) { + this.srcOk = srcOk; + this.sonOk = document.createElement('audio'); + this.sonOk.setAttribute('id', "sonOk"); + + this.creerSrc(srcOk, this.sonOk); + + document.body.appendChild(this.sonOk); + } + } + + /** + * DÉFINIR LE SON D'UN PROBLÈME + * @param {Le chemin relatif vers le son pb} srcPb + */ + setPb(srcPb) { + if (document.getElementById('sonPb') == undefined) { + this.srcPb = srcPb; + this.sonPb = document.createElement('audio'); + this.sonPb.setAttribute('id', "sonPb"); + + this.creerSrc(srcPb, this.sonPb); + + document.body.appendChild(this.sonPb); + } else { + this.sonOk.setAttribute('src', this.srcPb); + } + } + + /** + * DÉFINIR LE SON FAIRE VITE + * @param {Le chemin relatif vers le son faire vite} srcVite + */ + setVite(srcVite) { + if (document.getElementById('sonVite') == undefined) { + this.srcVite = srcVite; + this.sonVite = document.createElement('audio'); + this.sonVite.setAttribute('id', "sonVite"); + this.sonVite.setAttribute('loop', "true"); + + this.creerSrc(srcVite, this.sonVite); + + document.body.appendChild(this.sonVite); + } else { + this.sonOk.setAttribute('src', this.srcVite); + } + } + + /** + * DÉFINIR LE SON PERDU + * @param {Le chemin relatif vers le son perdu} srcPerdu + */ + setPerdu(srcPerdu) { + if (document.getElementById('sonPerdu') == undefined) { + this.srcPerdu = srcPerdu; + this.sonPerdu = document.createElement('audio'); + this.sonPerdu.setAttribute('id', "sonPerdu"); + + this.creerSrc(srcPerdu, this.sonPerdu); + + document.body.appendChild(this.sonPerdu); + } else { + this.sonOk.setAttribute('src', this.srcPerdu); + } + } + + /** + * DÉFINIR LE SON GAGNE + * @param {Le chemin relatif vers le son gagne} srcGagne + */ + setGagne(srcGagne) { + if (document.getElementById('sonGagne') == undefined) { + this.srcGagne = srcGagne; + this.sonGagne = document.createElement('audio'); + this.sonGagne.setAttribute('id', "sonGagne"); + + this.creerSrc(srcGagne, this.sonGagne); + + document.body.appendChild(this.sonGagne); + } else { + this.sonOk.setAttribute('src', this.srcGagne); + } + } + + /** + * DÉFINIR LE SON SCORE + * @param {Le chemin relatif vers le son score} srcScore + */ + setScore(srcScore) { + if (document.getElementById('sonScore') == undefined) { + this.srcScore = srcScore; + this.sonScore = document.createElement('audio'); + this.sonScore.setAttribute('id', "sonScore"); + + this.creerSrc(srcScore, this.sonScore); + + document.body.appendChild(this.sonScore); + } else { + this.sonOk.setAttribute('src', this.srcScore); + } + } + + /** + * DÉFINIR LE SON EXTRA-CHOU + * @param {Le chemin relatif vers le son extreChou} srcExChou + */ + setExChou(srcExChou) { + if (document.getElementById('sonExChou') == undefined) { + this.srcExChou = srcExChou; + this.sonExChou = document.createElement('audio'); + this.sonExChou.setAttribute('id', "sonExChou"); + + this.creerSrc(srcExChou, this.sonExChou); + + document.body.appendChild(this.sonExChou); + } else { + this.sonOk.setAttribute('src', this.srcExChou); + } + } + + /** + * LIRE LA MUSIQUE + */ + getMusique() { + this.musique.play(); + } + + /** + * LIRE LE SON DU BONUS + */ + getOk() { + this.sonOk.play(); + } + + /** + * LIRE LE SON DU PROBLÈME + */ + getPb() { + this.sonPb.play(); + } + + /** + * LIRE LE SON FAIRE VITE + */ + getStartVite() { + clearInterval(this.fadeinMus); + clearInterval(this.fadein); + this.musique.volume = 0.15; + this.sonVite.play(); + } + + /** + * STOPPER LE SON FAIRE VITE + */ + getStopVite() { + this.sonVite.pause(); + } + + /** + * LIRE LE SON PERDU + */ + getPerdu() { + clearInterval(this.fadeinMus); + clearInterval(this.fadein); + this.musique.volume = 0.2; + this.sonPerdu.play(); + let o = this; + this.sonPerdu.onended = function () { + o.fadeInMusique(); + }; + } + + /** + * LIRE LE SON GAGNE + */ + getGagne() { + clearInterval(this.fadeinMus); + clearInterval(this.fadein); + this.musique.volume = 0; + this.sonExChou.pause(); + this.sonExChou.currentTime = 0; + this.sonGagne.currentTime = 0; + this.sonGagne.play(); + let o = this; + this.sonGagne.onended = function () { + o.fadeInRapMusique(); + }; + } + + /** + * LIRE LE SON EXTRA CHOU + */ + getExChou() { + clearInterval(this.fadeinMus); + clearInterval(this.fadein); + this.musique.volume = 0.1; + this.sonVite.volume = 0.5; + this.sonExChou.currentTime = 0; + this.sonGagne.currentTime = 0; + this.sonExChou.play(); + let o = this; + this.sonExChou.onended = function () { + o.fadeInRapMusique(); + }; + } + + /** + * FADE IN POUR LA MUSIQUE + */ + fadeInMusique() { + let o=this; + this.fadeinMus = setInterval( + function () { + let vol=o.musique.volume; + if ((vol+0.09) < 1) { + vol += 0.09; + o.musique.volume=vol; + } else { + o.musique.volume=1; + clearInterval(this.fadeinMus); + } + }, 200); + } + + /** + * FADE IN RAPIDE POUR LA MUSIQUE + */ + fadeInRapMusique() { + let o=this; + this.fadein = setInterval( + function () { + let vol=o.musique.volume; + if ((vol+0.14) < 1) { + vol += 0.14; + o.musique.volume=vol; + } else { + o.musique.volume=1; + clearInterval(this.fadein); + } + }, 200); + } + + /** + * RETIRER LE FADE IN + */ + fadeInSupp(){ + clearInterval(this.fadeinMus); + clearInterval(this.fadein); + this.sonExChou.pause(); + this.sonGagne.pause(); + this.musique.volume=1 + } + + /** + * LIRE LE SON SCORE + */ + getScore() { + if(this.sonScore.currentTime>0.03)this.sonScore.currentTime = 0; + this.sonScore.play(); + } + + /** + * AJOUTER LES SOURCES AUX DIFFERENTS FORMATS + */ + creerSrc(tabSrc, objJoue) { + for (let i = 0; i < tabSrc.length; i++) { + let elemSrc = document.createElement('source'); + elemSrc.setAttribute('src', tabSrc[i]); + if (tabSrc[i].split(".", 1) === "ogg") elemSrc.setAttribute('type', "audio/ogg"); + else if (this.srcMusique[i].split(".", 1) === "mp3") elemSrc.setAttribute('type', "audio/mpeg"); + objJoue.appendChild(elemSrc); + } + } +} \ No newline at end of file diff --git a/js/classes/Chou.js b/js/classes/Chou.js new file mode 100644 index 0000000..756eea3 --- /dev/null +++ b/js/classes/Chou.js @@ -0,0 +1,29 @@ +"use strict"; + +class Chou extends Element { + /** + * CONSTRUCTEUR DU CHOU + * @param {*Le chamin relatif de l'image du chou} src + * @param {*Largeur du chou} imgW + * @param {*Hauteur du chou} imgH + * @param {*Le plateau pour le positionner} plateau + * @param {*La position horizontale du chou} x + * @param {*La position verticale du chou} y + */ + constructor(src, imgW, imgH, plateau, x, y) { + // INITIALISER LE HERO + var img = new Image(imgW, imgH); + img.src = src; + + super("chou", plateau, x, y, imgW, imgH, x, y, 0); + this.img = img; + this.w = imgW; + this.h = imgH; + } + /** + * RÉCUPÉRER L'IMAGE DU CHOU + */ + getImage() { + return this.img; + } +} \ No newline at end of file diff --git a/js/classes/ChouBacalan.js b/js/classes/ChouBacalan.js new file mode 100644 index 0000000..d0210ae --- /dev/null +++ b/js/classes/ChouBacalan.js @@ -0,0 +1,29 @@ +"use strict"; + +class ChouBacalan extends Element { + /** + * CONSTRUCTEUR DU CHOU BACALAN + * @param {*Le chamin relatif de l'image du chou bacalan} src + * @param {*Largeur du chou bacalan} imgW + * @param {*Hauteur du chou bacalan} imgH + * @param {*Le plateau pour le positionner} plateau + * @param {*La position horizontale du chou bacalan} x + * @param {*La position verticale du chou bacalan} y + */ + constructor(src, imgW, imgH, plateau, x, y) { + // INITIALISER LE HERO + var img = new Image(imgW, imgH); + img.src = src; + + super("chouBacalan", plateau, x, y, imgW, imgH, x, y, 0); + this.img = img; + this.w = imgW; + this.h = imgH; + } + /** + * RÉCUPÉRER L'IMAGE DU CHOU BACALAN + */ + getImage() { + return this.img; + } +} \ No newline at end of file diff --git a/js/classes/Element.js b/js/classes/Element.js new file mode 100644 index 0000000..12a38e5 --- /dev/null +++ b/js/classes/Element.js @@ -0,0 +1,240 @@ +"use strict"; + +class Element { + /** + * CONSTRUCTEUR DE L'ELEMENT + * @param {*Le type d'element (héro,monstre)} leType + * @param {*Le plateau pour le positionner} plateau + * @param {*la position horizontale de l'element} x + * @param {*La position verticale de l'element} y + * @param {*La largeur de l'element} w + * @param {*La hauteur de l'element} h + * @param {*La postion horizontale par défaut de l'element} originX + * @param {*La postion verticale par défaut de l'element}} originY + * @param {*La vitesse de l'element} vitesse + */ + constructor(leType, plateau, x, y, w, h, originX, originY, vitesse, velo) { + this.veloH = 0; + this.veloB = 0; + this.veloG = 0; + this.veloD = 0; + this.plateau = plateau; + this.plateauW = plateau.getWidth(); + this.plateauH = plateau.getHeight(); + this.vitesse = vitesse; + this.element = { + velo: velo, + type: leType, + x: parseInt(x), + y: parseInt(y), + h: parseInt(h), + w: parseInt(w), + originX: parseInt(originX), + originY: parseInt(originY), + visible: true, + haut: false, + bas: false, + gauche: false, + droite: false + } + } + + /** + * RÉCUPERER L'ELEMENT + */ + getHumanoide() { + return this.element; + } + + /** + * RÉCUPÉRER LA POSITION HORIZONTALE DE L'ELEMENT + */ + getPositionX() { + return this.element.x; + } + + /** + * RÉCUPÉRER LA POSITION VERTICALE DE L'ELEMENT + */ + getPositionY() { + return this.element.y; + } + + /** + * RÉCUPÉRER LA LARGEUR DE L'ELEMENT + */ + getW() { + return this.element.w; + } + + /** + * RÉCUPÉRER LA HAUTEUR DE L'ELEMENT + */ + getH() { + return this.element.h; + } + + /** + * SAVOIR SI L'ELEMENT EST VISIBLE + */ + isVisible() { + return this.element.visible; + } + + /** + * INITIALISER LA POSITION DE L'ELEMENT + * @param {*la position horizontale de l'element} originX + * @param {*la position verticale de l'element} originY + */ + setOrigin(originX, originY) { + this.element.originX = originX; + this.element.originY = originY; + } + + /** + * RENDRE L'ELEMENT VISIBLE OU PAS + */ + setVisible(bool) { + this.element.visible = bool; + } + + /** + * DÉFINIR LA POSITION HORIZONTALE DE L'ELEMENT + */ + setPositionX(posX) { + this.element.x = posX; + } + + /** + * DÉFINIR LA POSITION VERTICALE DE L'ELEMENT + */ + setPositionY(posY) { + this.element.y = posY; + } + + /** + * DÉFINIR LES ACTIONS SUR LES TOUCHES + */ + gauche(g) { + this.element.gauche = g; + } + + droite(d) { + this.element.droite = d; + } + + haut(h) { + this.element.haut = h; + } + + bas(b) { + this.element.bas = b; + } + + /** + * DEPLACER L'ELEMENT AVEC DE LA VELOCITÉ + */ + deplacer() { + if (this.element.droite) { + this.veloD += 3; + this.element.x += this.vitesse + (this.element.velo + this.veloD); + } else this.veloD = 0; + if (this.element.bas) { + this.veloB += 3; + this.element.y += this.vitesse + (this.element.velo + this.veloB); + } else this.veloB = 0; + if (this.element.gauche) { + this.veloG += 3; + this.element.x -= this.vitesse + (this.element.velo + this.veloG); + } else this.veloG = 0; + if (this.element.haut) { + this.veloH += 3; + this.element.y -= this.vitesse + (this.element.velo + this.veloH); + } else this.veloH = 0; + } + + /** + * AJOUTER DE LA VÉLOCITÉ + * @param velo {*Ajouter de la vélocité} + */ + veloPlus() { + this.element.velo += 2; + } + + /** + * RAZ DE LA VÉLOCITÉ + * @returns {*RAZ de la vélocité} + */ + veloRAZ() { + this.element.velo = 0; + } + + /** + * RETOURNER LES VALEURS HAUT BAS GAUCHE DROIT DE L'ELEMENT POUR GERER LES COLLISIONS + */ + left() { + return this.element.x; + } + + right() { + return this.element.x + this.element.w; + } + + top() { + return this.element.y; + } + + bottom() { + return this.element.y + this.element.h; + } + + + /*** + * DÉPLACER LE HÉRO + */ + contenu() { + /** + * GAUCHE + */ + if (this.element.x < -this.element.w/2) { + this.element.x = this.plateauW-this.element.w/2; + } + /** + * DROITE + */ + if (this.element.x > this.plateauW-this.element.w/2) { + this.element.x = -this.element.w/2; + } + /** + * HAUT + */ + if (this.element.y < -this.element.h/2) { + this.element.y = this.plateauH - this.element.h/2; + } + /** + * BAS + */ + if (this.element.y > this.plateauH -this.element.h/2) { + this.element.y = -this.element.h/2; + } + } + + /** + * RÉCUPÉRER LE MILIEU + */ + milieuW() { + return this.element.w / 2 + } + milieuH() { + return this.element.h / 2; + } + + /** + * RÉCUPÉRER LE TYPE D'ELEMENT + */ + type() { + return this.element.type; + } + + +} diff --git a/js/classes/Jeu.js b/js/classes/Jeu.js new file mode 100644 index 0000000..ebb78d1 --- /dev/null +++ b/js/classes/Jeu.js @@ -0,0 +1,11 @@ + +window.onload = function () { + /** + * NOUVELLE PARTIE DE CHOUX (tps score QteMonstres QteBombes) + */ + // Script entier en mode strict ! + "use strict"; + // Nouvelle partie + var gnome = new Main(20, 0, 5,5); +} + diff --git a/js/classes/Main.js b/js/classes/Main.js new file mode 100644 index 0000000..9464135 --- /dev/null +++ b/js/classes/Main.js @@ -0,0 +1,878 @@ +"use strict"; + + +class Main { + + /** + * CONSTRUCTEUR DU JEU GNOME + * @param tps0 Compte à rebourd + * @param score0 Score du joueur + * @param QteMonstres La quantité de monstres à charger + * @param QteBombes La quantité de bombes à charger + */ + constructor(tps0, score0, QteMonstres, QteBombes) { + /** + * Ajouter le texte de chargement + */ + let el = document.getElementById("chargement"); + this.mijotage = document.createElement('P'); + this.mijotage.innerHTML="Mijotage..."; + el.appendChild(this.mijotage); + /** + * INITIALISER + */ + this.init(tps0, score0, QteMonstres, QteBombes); + } + + /** + * NOMBRE D'IMAGES PAR SECONDE (30 fps) + * @param o This + */ + boucle(o) { + o.fps = setInterval(function () { + o.maj(); + }, parseInt(1000 / 30, 10)); + } + + + /** + * INIT DU JEU (POS | VIES | ETC) + * @param tps0 Compte à rebourd + * @param score0 Score du joueur + * @param QteMonstres La quantité de monstres à charger + * @param QteBombes La quantité de bombes à charger + */ + init(tps0, score0, QteMonstres, QteBombes) { + this.ttImages = 15; + this.fps; + this.police; + this.ScaledPolice; + this.ratio; + this.velo = 1; + this.touche = 0; + this.pauseMobile = false; + this.padding = 10; + this.audio; + this.plateau; + this.ctx; + this.hero; + this.score; + this.scoreAffiche = 0; + this.scoreTemporaire = 0; + this.lgScore = 2500; + this.gagne = false; + this.tps; + this.w; + this.h; + this.car; + this.vite = false; + this.niveau = new Array(); + // INIT DE L'AUDIO + this.audio = new Audio(); + // LOGIQUE DU JEU + this.tps = this.car = this.tps0 = tps0; + this.score = score0; + // TXT SCORE + this.angle = 0; + this.tourne = false; + // ELEMENTS + this.NbreMontres = this.QteMonstres = this.QteMontresDef = QteMonstres; + this.QteBombes = this.QteBombesDef = QteBombes; + // MODE NORMAL OU EXTRA CHOU + this.normal = true; + this.exChou; + this.clignote; + // AFFICHER LES REGLES + this.timerMsgRegles; + this.affMsgRegles = 0; + + this.charge(); + } + + /** + * CHARGER LES RESSOURCES + */ + charge() { + /** + * LA MUSIQUE ET LES SONS + */ + this.audio.setMusique(["./media/LaSoupe.ogg", "./media/LaSoupe.mp3"]); + this.audio.setOk(["./media/aah.ogg", "./media/aah.mp3"]); + this.audio.setPb(["./media/boum.ogg", "./media/boum.mp3"]); + this.audio.setVite(["./media/woodblock.ogg", "./media/woodblock.mp3"]); + this.audio.setPerdu(["./media/loose.ogg", "./media/loose.mp3"]); + this.audio.setGagne(["./media/win.ogg", "./media/win.mp3"]); + this.audio.setScore(["./media/point.ogg", "./media/point.mp3"]); + this.audio.setExChou(["./media/extraChou.ogg", "./media/extraChou.mp3"]); + + this.plateau = new Plateau(window.innerWidth - this.padding * 2, window.innerHeight - this.padding * 2) + this.plateau.init(this, this.getRandomInt(this.ttImages), this.ttImages); + } + + chargementImage(pct){ + this.mijotage.innerHTML="Mijotage à "+pct+"%"; + } + + /** + * Quand toutes les images sont chargées + */ + pret() { + // RETIRER LE MESSAGE DE CHARGEMENT + let el = document.getElementById("chargement"); + el.parentNode.removeChild(el); + + this.h = this.plateau.getHeight(); + this.w = this.plateau.getWidth(); + /** + * LA TAILLE DE LA POLICE + * + */ + this.police = this.w / 14; + /** + * LE RATIO (PIXELS A AJOUTER) + */ + this.police > 15 ? this.ratio = parseInt((this.police - 14) / 3, 10) : this.ratio = 0; + this.ScaledPolice = this.police; + /** + * LA VITESSE CORRESPONDANTE + */ + this.vitesse = parseInt(2 + (this.ratio / 3), 10); + /** + * LE CONTEXTE + */ + this.ctx = this.plateau.getCanvas().getContext('2d'); + this.plateau.getCanvas().style.padding = this.padding + "px"; + /** + * LE TEXTE + */ + this.leTexte(); + /** + * INSTANCIER LE HEROS + */ + this.hero = new Perso(['./img/hero.png', './img/heroEx.png'], 65 + this.ratio, 20 + this.ratio, this.plateau, this.vitesse); + /** + * ECOUTEURS DU HERO (CLAVIER) + */ + this.clavier(this); + /** + * CHARGER LE PREMIER NIVEAU + */ + this.premierNiveau(); + /** + * EFFET INTRO + CHARGEMENT DE WAOUH + */ + this.intro(); + this.plateau.getCanvas().classList.add("wow"); + document.getElementById("jeux").focus(); + this.boucle(this); + + } + + /** + * CHARGER LE NIVEAU + */ + premierNiveau() { + // REINITIALISER + this.niveau.splice(0, this.niveau.length); + this.NbreMontres = this.QteMonstres = this.QteMontresDef; + this.QteBombes = this.QteBombesDef; + this.car = this.tps = this.tps0; + + // INSTANCIER LES MONSTRES+LES BOMBES ET LES PLACER + for (let i = 0; i < Math.max(this.QteBombes, this.QteMonstres); i++) { + // COMPTER POUR LES MAIRES + if (i < this.QteBombes) { + let bombe = new Maire('./img/cosmonaute.png', 28 + this.ratio, 32 + this.ratio, this.plateau, 0, 0) + this.niveau.push(bombe); + this.positionner(bombe, this.niveau.length - 1, true); + } + // COMPTER POUR LES CHOUX + + if (i === this.QteMonstres - 1) { + let streum = new ChouBacalan('./img/chou+.png', 53 + this.ratio, 30 + this.ratio, this.plateau, 0, 0); + this.niveau.push(streum); + this.positionner(streum, this.niveau.length - 1, true); + } + + if (i < this.QteMonstres - 1) { + let streum = new Chou('./img/chou.png', 32 + this.ratio, 30 + this.ratio, this.plateau, 0, 0); + this.niveau.push(streum); + this.positionner(streum, this.niveau.length - 1, true); + } + } + } + + /** + * CHARGER UN NOUVEAU NIVEAU AVEC 1 MONSTRE ET 1 BOMBE EN PLUS SANS DEPASSER LE PLATEAU + */ + nouveauNiveau() { + let qte = this.plateau.getWidth() / (32 + this.ratio); + + if (this.QteBombes > qte) { + } else { + this.QteBombes += 1; + this.QteMonstres += 1; + if (this.QteMonstres > qte - (qte / 4)) { + this.car += 1; + } + + let bombe = new Maire('./img/cosmonaute.png', 28 + this.ratio, 32 + this.ratio, this.plateau, 0, 0) + this.niveau.push(bombe); + + let streum = new Chou('./img/chou.png', 32 + this.ratio, 30 + this.ratio, this.plateau, 0, 0); + this.niveau.push(streum); + + } + this.recharger(); + } + + // POSITIONNER AVEC LES COORDONNEES DISPONIBLES + /** + * @param o Objet à positionner + * @param i Dans le cas de l'initialisation correspond à l'objet précédent + * @param init Savoir si l'on est dans l'initialisation ou si tous les objets sont déjà positionnés + */ + positionner(o, i, init) { + // CONDITION DE SORTIE + let test = false; + while (!test) { + // GENERER DES COORDONNEES + let x = (this.getRandomInt(this.w - o.getW())); + let y = (this.getRandomInt(this.h - o.getH())); + // POSITIONNER LE NOUVEL OBJET + o.setPositionX(x); + o.setPositionY(y); + // TEST COLLISION AVEC LE HERO + let ok = this.intersects(o, this.hero); + // SI PAS DE COLLISION AVEC LE HERO + if (!ok) { + if (init) { + // TEST AVEC LES OBJETS -1 (VIENT D'ÊTRE AJOUTÉ) + if (this.niveau.length > 1) { + for (let j = 0; j < i; j++) { + if (this.intersects(o, this.niveau[j])) { + ok = false; + break; + } else ok = true; + } + } else ok = true; + } else { + // TEST AVEC LES OBJETS SAUF CELUI-LÀ + for (let j = 0; j < this.niveau.length; j++) { + if (j === i) continue; + if (this.intersects(o, this.niveau[j])) { + ok = false; + break; + } else ok = true; + } + } + } // REPOSITIONNER SI COLLISION AVEC LE HERO + else { + ok = false; + } + test = ok; + } + } + + /** + * RECHARGER AVEC LA TOUCHE ESPACE + */ + recharger() { + // RAZ AUDIO + this.audio.fadeInSupp(); + // RETIRER LE MSG DES RÈGLES + this.affMsgRegles = 0; + clearTimeout(this.timerMsgRegles); + this.timerMsgRegles = undefined; + // REPOSITIONNER + for (let i = 0; i < this.niveau.length; i++) { + this.positionner(this.niveau[i], i, false); + } + } + + /** + * BOUCLE DU JEU + */ + maj() { + // VIDER + this.clear(); + + // FOND HORS/INTRO JEU + if (this.tps <= 0 || this.tps === this.car) { + this.ctx.globalAlpha = 0.3; + } + + this.ctx.drawImage(this.plateau.getFond(), 0, 0, this.plateau.getWidth(), this.plateau.getHeight()); + + // COLLISIONS + this.collisions(); + + // DESSINS DES ELEMENTS + for (let i = 0; i < this.niveau.length; i++) { + if (this.niveau[i].isVisible()) this.ctx.drawImage(this.niveau[i].getImage(), this.niveau[i].getPositionX(), this.niveau[i].getPositionY(), this.niveau[i].getW(), this.niveau[i].getH()); + } + + // RETIRER L'OPACITE SI BESOIN + this.ctx.globalAlpha = 1; + + // HERO + this.hero.deplacer(); + this.hero.contenu(); + if (this.tps > 0) this.ctx.drawImage(this.hero.getImage(), this.hero.getPositionX(), this.hero.getPositionY(), this.hero.getW(), this.hero.getH()); + + // SCORE + this.tourne ? + this.animerTxtScore() : + this.ctx.fillText((this.scoreAffiche < parseInt(this.score, 10) ? this.ajouter() : this.afficher()), this.police * 4, this.hero.getH() * 2); + + // IMG SCORE + let lineW = this.ctx.measureText(this.score).width / 2; + let lineH = this.ctx.measureText("8").width; + this.ctx.font = (this.police / 1.5).toString() + "px FontAwesome"; + // FAIRE TOURNER LA CUILLERE + this.ctx.save(); + if (this.tourne) { + this.ctx.translate(this.police * 4 + lineW + lineH / 3, (this.hero.getH() * 2) - lineH / 8); + this.ctx.rotate(this.angle > 360 ? this.angle = 0 : this.angle++); + + } else { + this.ctx.translate(this.police * 4 + lineW, (this.hero.getH() * 2) - lineH / 8); + this.ctx.rotate(0); + } + this.ctx.translate(-(this.police * 4 + lineW), -((this.hero.getH() * 2) - (lineH) / 8)); + // LA CUILLERE + this.tourne ? + this.ctx.fillText("\uf1b1", this.police * 4 + lineW, (this.hero.getH() * 2) - lineH / 8) : + this.ctx.fillText(" \uf1b1", this.police * 4 + lineW, (this.hero.getH() * 2) - lineH / 8); + this.ctx.restore(); + // CHANGER LA FONTE + this.ctx.font = (this.police).toString() + "px Amatic"; + // INTRO OU GAGNE OU PERDU? + MEMORISATION + if (this.NbreMontres === 0) { + this.tps = "0"; + this.audio.getStopVite(); + this.ctx.fillText("* GAGNÉ ! *", this.w / 2, this.h / 2.5); + this.ctx.fillText("espace pour démarrer", this.w / 2, this.h - this.hero.getH()); + this.ctx.fillText(this.getStorage(), this.w / 2, this.h / 2); + this.gagne = true; + this.setStorage(); + } else if (this.tps === this.car) { + this.ctx.fillText("RÉCUPÉREZ LES CHOUX !", this.w / 2, this.h / 2); + this.ctx.font = (this.police).toString() + "px FontAwesome"; + let lineHeight = this.ctx.measureText('\uf150').width * 1.2; + this.ctx.fillText('\uf151', this.w / 2, this.h - this.hero.getH() - lineHeight * 3); + this.ctx.fillText('\uf191 \uf150 \uf152', this.w / 2, this.h - this.hero.getH() - lineHeight * 2); + this.ctx.font = (this.police).toString() + "px Amatic"; + this.ctx.fillText('appuyez pour démarrer', this.w / 2, this.h - this.hero.getH()); + } else if (this.tps <= 0) { + this.audio.getStopVite(); + this.hero.setVisible(false); + this.msgIntro(); + this.gagne = false; + } + // CPTE A REBOURD + else if (this.tps > 0) { + this.ctx.fillText(this.tps, this.w - this.police * 3, this.hero.getH() * 2); + } + } + + /** + * INCRÉMENTER LE SCORE + */ + ajouter() { + this.tourne = true; + this.audio.getScore(); + return (this.scoreAffiche += 20).toString(); + } + + /** + * AFFICHER LE SCORE + */ + afficher() { + this.tourne = false; + return this.score; + } + + /** + * Animer le texte du score + */ + animerTxtScore() { + this.ScaledPolice > this.police * 1.2 ? this.ScaledPolice = this.police : this.ScaledPolice += 2; + this.scoreAffiche > parseInt(this.score - 100, 10) ? + this.ctx.font = (this.ScaledPolice).toString() + "px Amatic" : + this.ctx.font = (this.police).toString() + "px Amatic"; + return this.ctx.fillText((this.scoreAffiche < parseInt(this.score, 10) ? this.ajouter() : this.afficher()), this.police * 4, this.hero.getH() * 2); + } + + /** + * Afficher les règles après 3 secondes + */ + msgIntro() { + let o = this; + if (this.timerMsgRegles === undefined) this.timerMsgRegles = setTimeout( + function () { + o.affMsgRegles = 1; + }, 3000); + if (this.affMsgRegles === 0) { + let lineHeight = this.ctx.measureText('\uf150').width * 1.2; + this.ctx.fillText("PERDU", this.w / 2, this.h / 2); + this.ctx.fillText(this.getStorage(), this.w / 2, (this.h / 2) + lineHeight * 2); + } else { + this.ctx.fillText("RÉCUPÉREZ LES CHOUX !", this.w / 2, this.h / 2); + this.ctx.font = (this.police).toString() + "px FontAwesome"; + let lineHeight = this.ctx.measureText('\uf150').width * 1.2; + this.ctx.fillText('\uf151', this.w / 2, this.h - this.hero.getH() - lineHeight * 3); + this.ctx.fillText('\uf191 \uf150 \uf152', this.w / 2, this.h - this.hero.getH() - lineHeight * 2); + this.ctx.font = (this.police).toString() + "px Amatic"; + this.ctx.fillText("espace pour démarrer", this.w / 2, this.h - this.hero.getH()); + } + } + + + /** + * LES COLLISIONS DANS LE JEU + */ + collisions() { + for (let i = 0; i < this.niveau.length; i++) { + // COLLISION ELEMENT + if (this.intersects(this.hero, this.niveau[i])) { + // COLLISION CHOU + if (this.niveau[i].type() === "chou") { + this.niveau[i].setVisible(false); + this.NbreMontres -= 1; + this.addScore(200); + if (this.NbreMontres === 0) { + this.stopExChou(); + // AUDIO + this.audio.getGagne(); + this.addScore(this.tps * 60); + // FAIRE UNE PAUSE SI GAGNÉ + this.pauseMobile = true; + /** + * CHANGER FOND + EFFET WAOUH + */ + this.waouh(); + } + } else if (this.niveau[i].type() === "chouBacalan") { + this.niveau[i].setVisible(false); + this.NbreMontres -= 1; + this.addScore(300); + this.audio.getExChou(); + this.extraChou(); + this.extra(); + if (this.NbreMontres === 0) { + this.stopExChou(); + // AUDIO + this.audio.getGagne(); + this.addScore(this.tps * 60); + // FAIRE UNE PAUSE SI GAGNÉ + this.pauseMobile = true; + /** + * CHANGER FOND + EFFET WAOUH + */ + this.waouh(); + } + } + // COLLISION MAIRE + else if (this.normal && this.niveau[i].type() === "maire") { + // FAIRE UNE PAUSE SI PERDU + if (this.tps > 0) { + this.stopExChou(); + this.perdu(); + this.hero.setVisible(false); + this.pauseMobile = true; + this.audio.getPb(); + this.audio.getPerdu(); + this.tps = 0; + this.lgScore = 2500; + } + } + } + } + } + + /** + * AFFICHER LES MESSAGES + */ + leTexte() { + + this.ctx.font = (this.police).toString() + "px Amatic, cursive"; + + // CRÉER LE GRADIENT + let gradient = this.ctx.createLinearGradient(0, 0, this.plateau.getWidth(), 0); + // VERT + gradient.addColorStop("0", "#56FF6D"); + // JAUNE + gradient.addColorStop("1.0", "#E8D542"); + // MAUVE D090FF + this.ctx.fillStyle = gradient; + this.ctx.textAlign = "center"; + this.ctx.shadowColor = 'black'; + this.ctx.shadowOffsetX = -1; + this.ctx.shadowOffsetY = 1; + } + + + /** + * AJOUTER AU SCORE + MEMORISER LE SCORE A RETIRER SI RELANCE + * @param aAjouter Permet d'ajouter une valeur au score + */ + addScore(aAjouter) { + let sc = parseInt(this.score, 10); + sc = sc + aAjouter; + this.score = sc.toString(); + + if (sc > this.lgScore) { + this.lgScore += 2500; + this.audio.getOk(); + } + + sc = parseInt(this.scoreTemporaire, 10); + sc = sc + aAjouter; + this.scoreTemporaire = sc.toString(); + + } + + /** + * RETIRER AU SCORE + * @param aRetirer Permet de retirer une valeur au score + */ + retScore(aRetirer) { + this.stopExChou(); + let sc = parseInt(this.score, 10); + sc = sc - aRetirer; + this.score = sc.toString(); + } + + /** + * RETIRER 1 SECONDE + FAIRE VITE + */ + tempo() { + let sc = parseInt(this.tps, 10); + sc -= 1; + this.tps = sc.toString(); + // FAIRE VITE ! + if (!this.vite && this.tps < 6) { + this.vite = true; + this.audio.getStartVite(); + } else if (this.tps == 0) { + this.audio.getPerdu(); + this.timeup(); + } + } + + /** + * VIDER LE CONTENU DU CANVA + */ + clear() { + this.ctx.clearRect(0, 0, this.plateau.getWidth(), this.plateau.getHeight()); + } + + /** + * ECOUTEUR CLAVIER DU HERO + * @param o L'objet écouté + */ + clavier(o) { + const can = o.plateau.getCanvas(); + // ÉCOUTEURS MOBILE BOUGE + can.addEventListener('touchmove', function (e) { + e.preventDefault(); + if ((o.tps == o.car || o.tps <= 0) && !o.pauseMobile) { + // SI GAGNÉ => NOUVEAU NIVEAU + if (o.gagne) { + o.nouveauNiveau(); + } + o.hero.setVisible(true); + o.NbreMontres = o.QteMonstres; + o.tps = o.car; + o.vite = false; + o.raz(); + o.recharger(); + } else { + // SAVOIR l'ORIENTATION DU MOBILE + let orientation = screen.msOrientation || (screen.orientation || screen.mozOrientation || {}).type; // ITÉRER À TRAVERS LES POINTS DE CONTACT QUI ONT BOUGÉ. + for (let i = 0; i < e.changedTouches.length; i++) { + + if (orientation === "portrait-secondary" || orientation === "portrait-primary" || orientation === undefined) { + // RÉCUPÉRER LA POSITION + o.hero.setPositionX(e.changedTouches[i].pageX - o.hero.getW() / 2); + o.hero.setPositionY(e.changedTouches[i].pageY - o.hero.getH() / 2); + } else { + // RÉCUPÉRER LA POSITION + o.hero.setPositionX(e.changedTouches[i].pageX - o.hero.getW() * 3); + o.hero.setPositionY(e.changedTouches[i].pageY - o.hero.getH()); + } + } + } + e.stopPropagation(); + + }, {passive: false}); + // ÉCOUTEURS MOBILE NE BOUGE PLUS + can.addEventListener('touchend', function (e) { + e.preventDefault(); + // GÉRER LES PAUSES QUAND C'EST PERDU OU GAGNÉ + if (o.pauseMobile) o.pauseMobile = false; + e.stopPropagation(); + }, {passive: false}); + + // ÉCOUTEURS MOBILE COMMENCE À BOUGER + can.addEventListener('touchstart', function (e) { + e.preventDefault(); + // REGLES DU JEU & POUR CHROME CHARGEMENT DE LA MUSIQUE + if (o.timer === undefined) { + // CPTE A REBOURD 1S + o.timer = setInterval(function () { + o.tempo(); + }, 1000); + o.audio.getMusique(); + } + e.stopPropagation(); + }, {passive: false}); + + + // ÉCOUTEURS CLAVIER + document.addEventListener("keydown", function (evt) { + evt.preventDefault(); + // AJOUTER DE LA VÉLOCITÉ + if (o.touche == evt.keyCode) { + o.hero.veloPlus(); + } else { + o.touche = evt.keyCode; + o.hero.veloRAZ(); + } + // REGLES DU JEU & POUR CHROME CHARGEMENT DE LA MUSIQUE + if (o.timer === undefined) { + // CPTE A REBOURD 1S + o.timer = setInterval(function () { + o.tempo(); + }, 1000); + o.audio.getMusique(); + } + if (o.tps >= 0) { + if (evt.keyCode === 37) { + o.hero.gauche(true); + } + if (evt.keyCode === 39) { + o.hero.droite(true); + } + if (evt.keyCode === 38) { + o.hero.haut(true); + } + if (evt.keyCode === 40) { + o.hero.bas(true); + } + } + // APPUYER SUR ESPACE POUR RELANCER PENDANT 5 SEC. + if (evt.keyCode === 32 && (o.tps > o.car - 5 || o.tps <= 0)) { + // RETIRE LE SCORE COURANT SI LA PARTIE EST COMMENCEE + if (o.tps > o.car - 5) { + o.retScore(o.scoreTemporaire); + } + // SI GAGNÉ => NOUVEAU NIVEAU + if (o.gagne) { + o.nouveauNiveau(); + } + o.hero.setVisible(true); + o.NbreMontres = o.QteMonstres; + + o.tps = o.car; + o.vite = false; + o.raz(); + o.recharger(); + } + }); + document.addEventListener("keyup", function (evt) { + // AJOUTER DE LA VÉLOCITÉ ? + if (o.touche === evt.keyCode) { + o.hero.veloPlus(); + } else { + o.touche = evt.keyCode; + o.hero.veloRAZ(); + } + if (evt.keyCode === 37) o.hero.gauche(false); + if (evt.keyCode === 39) o.hero.droite(false); + if (evt.keyCode === 38) o.hero.haut(false); + if (evt.keyCode === 40) o.hero.bas(false); + }) + } + + + /** + * ALGORITHME DES COLLISIONS ENTRE DEUX OBJETS VISIBLES + * @param a Objet a + * @param b Objet b + */ + intersects(a, b) { + if (a.isVisible() && b.isVisible()) { + let x1 = Math.max(a.left(), b.left()); + let x2 = Math.min(a.right(), b.right()); + let y1 = Math.max(a.top(), b.top()); + let y2 = Math.min(a.bottom(), b.bottom()); + return (x1 < x2 && y1 < y2); + } else return false; + } + + /** + * RAZ DU JEU + SCORE TEMPORAIRE SI OK + STOCKAGE DU MEILLEUR SCORE + */ + raz() { + this.hero.init(); + for (let i = 0; i < this.niveau.length; i++) { + this.niveau[i].setVisible(true); + } + if (this.gagne) { + this.scoreTemporaire = 0; + } else { + this.score = "0"; + this.scoreAffiche = 0; + this.premierNiveau(); + } + this.audio.getStopVite(); + } + + /** + * LANCER L'EFFET CSS INTRO + */ + intro() { + this.plateau.getCanvas().classList.remove("intro"); + this.plateau.getCanvas().offsetWidth; + this.plateau.getCanvas().classList.add("intro"); + } + + /** + * LANCER L'EFFET CSS WAOUH + */ + waouh() { + this.plateau.getCanvas().classList.remove("rebond"); + this.plateau.getCanvas().classList.remove("intro"); + this.plateau.getCanvas().classList.remove("wow"); + this.plateau.getCanvas().classList.remove("perdu"); + this.plateau.getCanvas().classList.remove("extra"); + this.plateau.getCanvas().offsetWidth; + this.plateau.getCanvas().classList.add("wow"); + clearInterval(this.fps); + let i = this.plateau.getIFond(); + let j = i; + while (j === i) { + j = this.getRandomInt(this.ttImages); + } + this.plateau.setFond(j) + this.boucle(this); + } + + /** + * LANCER L'EFFET CSS PERDU + */ + perdu() { + this.plateau.getCanvas().classList.remove("extra"); + this.plateau.getCanvas().classList.remove("rebond"); + this.plateau.getCanvas().classList.remove("intro"); + this.plateau.getCanvas().classList.remove("perdu"); + this.plateau.getCanvas().offsetWidth; + this.plateau.getCanvas().classList.add("perdu"); + } + + /** + * LANCER L'EFFET CSS TEMPS ÉCOULÉ + */ + timeup() { + this.plateau.getCanvas().classList.remove("extra"); + this.plateau.getCanvas().classList.remove("rebond"); + this.plateau.getCanvas().classList.remove("intro"); + this.plateau.getCanvas().classList.remove("perdu"); + this.plateau.getCanvas().offsetWidth; + this.plateau.getCanvas().classList.add("rebond"); + } + + /** + * LANCER L'EFFET CSS EXTRA CHOU + */ + extra() { + this.plateau.getCanvas().classList.remove("extra"); + this.plateau.getCanvas().classList.remove("rebond"); + this.plateau.getCanvas().classList.remove("intro"); + this.plateau.getCanvas().classList.remove("perdu"); + this.plateau.getCanvas().offsetWidth; + this.plateau.getCanvas().classList.add("extra"); + } + + + /*** + * Rendre invincible 5 secondes + */ + extraChou() { + this.normal = false; + let o = this; + this.clignote = setInterval( + function () { + o.hero.getIndiceImage() === 0 ? o.hero.setIndiceImage(1) : o.hero.setIndiceImage(0); + }, 100); + this.exChou = setTimeout( + function () { + o.normal = true; + clearInterval(o.clignote); + o.hero.setIndiceImage(0); + }, 5000); + } + + /** + * STOP L'EXTRA CHOU + */ + stopExChou() { + // STOP EXTRA CHOU + clearTimeout(this.exChou); + clearInterval(this.clignote); + this.normal = true; + this.hero.setIndiceImage(0); + } + + /** + * ALGORITHME QUI RETOURNE UN ENTIER ALEATOIRE ENTRE 0 ET MAX-1 + * @param max Valeur maximale non comprise + */ + getRandomInt(max) { + return Math.floor(Math.random() * Math.floor(max)); + } + + /*** + * SAUVEGARDER LE SCORE MAX EN PRENANT EN COMPTE LE RETOUR + */ + setStorage() { + try { + if (typeof localStorage === 'undefined') { + return "Soupes non enregistrées"; + } else { + if (this.score === "0") { + } else { + if (this.getStorage() === "Pas de soupes enregistrées") { + window.localStorage.setItem("choux", parseInt(this.score, 10)); + } else if (parseInt(localStorage.getItem("choux"), 10) < parseInt(this.score, 10)) window.localStorage.setItem("choux", this.score); + } + } + } catch (e) { + return "Soupes non enregistrées"; + } + } + + + /*** + * RÉCUPÉRER LE SCORE MAX + */ + getStorage() { + try { + if (typeof localStorage === 'undefined') { + return "Soupes non enregistrées"; + } else { + let retour = window.localStorage.getItem("choux"); + + if (retour === null) return "Pas de soupes enregistrées"; + else if (retour === this.score || parseInt(retour, 10) === parseInt(this.score, 10) - this.scoreTemporaire) { + return "Votre record est de " + retour + " soupes" + } else return "Le record est de " + retour + " soupes"; + } + } catch (e) { + return "Soupes non enregistrées"; + } + } +} + diff --git a/js/classes/Maire.js b/js/classes/Maire.js new file mode 100644 index 0000000..3687ec4 --- /dev/null +++ b/js/classes/Maire.js @@ -0,0 +1,28 @@ +"use strict"; + +class Maire extends Element { + /** + * CONSTRUCTEUR DU MAIRE + * @param {*Le chamin relatif de l'image de la maire} src + * @param {*Largeur de la maire} imgW + * @param {*Hauteur de la maire} imgH + * @param {*La position horizontale de la maire} x + * @param {*La position verticale de la maire} y + */ + constructor(src, imgW, imgH, plateau, x, y) { + var img = new Image(imgW, imgH); + img.src = src; + + super("maire", plateau, x, y, imgW, imgH); + this.img = img; + this.w = imgW; + this.h = imgH; + } + /** + * RÉCUPÉRER L'IMAGE DE L'OBSTACLE + */ + getImage() { + return this.img; + } + +} \ No newline at end of file diff --git a/js/classes/Perso.js b/js/classes/Perso.js new file mode 100644 index 0000000..bb8c84b --- /dev/null +++ b/js/classes/Perso.js @@ -0,0 +1,68 @@ +"use strict"; + +class Perso extends Element { + /** + * CONSTRUCTEUR DU HERO + * @param {*Le chamin relatif des images du héro} src + * @param {*Largeur du héro} imgW + * @param {*Hauteur du héro} imgH + * @param {*Le plateau pour le positionner} plateau + * @param {*La vitesse du héro} vitesse + */ + constructor(src, imgW, imgH, plateau, vitesse) { + var milieuX = (plateau.getWidth() / 2) - (imgW / 2); + var milieuY = (plateau.getHeight() / 2) - (imgH / 2); + + super("hero", plateau, milieuX, milieuY, imgW, imgH, parseInt((plateau.getWidth() / 2) - (imgW / 2)), parseInt((plateau.getHeight() / 2) - (imgH / 2)), vitesse,1); + + this.img = new Array(); + this.charger(src,imgW, imgH); + + this.w = imgW; + this.h = imgH; + this.humanoide = super.getHumanoide(); + // INITIALISER LE HERO POUR LIRE LE MSG + this.humanoide.y = this.humanoide.originY+this.h; + this.imgCourante = 0; + } + + /** + * Charger les images + * @param src Le tableau des images + * @param width La largeur de l'image + * @param height La hauteur de l'image + */ + charger(src,width, height) { + for (let a = 0; a < src.length; a++) { + this.img[a] = new Image(width, height) + this.img[a].src = src[a]; + } + } + /** + * DEFINIR L'IMAGE DU HÉRO + */ + setIndiceImage(i) { + this.imgCourante=i; + } + /** + * RÉCUPÉRER L'INDICE DE L'IMAGE + */ + getIndiceImage(i) { + return this.imgCourante; + } + /** + * RÉCUPÉRER L'IMAGE DU HÉRO + */ + getImage() { + return this.img[this.imgCourante]; + } + /** + * INITIALISER LA POSITION DU HÉRO (AU CENTRE DE L'ÉCRAN) + * POUR LIRE LE MSG + */ + init() { + this.humanoide.x = this.humanoide.originX; + this.humanoide.y = this.humanoide.originY+this.h; + } +} + diff --git a/js/classes/Plateau.js b/js/classes/Plateau.js new file mode 100644 index 0000000..0de4149 --- /dev/null +++ b/js/classes/Plateau.js @@ -0,0 +1,127 @@ +"use strict"; + +class Plateau { + + /** + * CONSTRUCTEUR DU PLATEAU + * @param {*Le numéro de l'image à charger} number + * @param {*La largeur du plateau} width + * @param {*La hauteur du plateau} height + */ + constructor(width, height) { + this.width = width; + this.height = height; + this.cptImages = 0; + + /** + * INIT DU CANVAS + */ + this.canvas = document.createElement('canvas'); + this.canvas.setAttribute('id', "jeux"); + } + + /** + * Initialiser le fond + */ + init(o, i, ttImages) { + let hv, w, h; + window.innerWidth > window.innerHeight ? hv = true : hv = false; + this.fond = new Array(ttImages); + if (hv) { + /** + * INIT DU FOND (+LARGE QUE HAUT 2239 2235) + */ + this.canvas.setAttribute('width', this.height / (2235 / 2239)); + this.canvas.setAttribute('height', this.height); + w = this.height / (2235 / 2239); + h = this.height; + } else { + /** + * INIT DU FOND (-LARGE QUE HAUT 2239 2235) + */ + this.canvas.setAttribute('width', this.width / (2235 / 2239)); + this.canvas.setAttribute('height', this.width); + w = this.height / (2235 / 2239); + h = this.width; + } + this.setFond(i); + this.charger(o, w, h); + } + + /** + * Charger le dernier fond puis continuer + * @param o L'objet Main + * @param width La largeur de l'image + * @param height La hauteur de l'image + */ + charger(o, width, height) { + for (let a = 0; a < this.fond.length; a++) { + this.fond[a] = new Image(width, height) + this.fond[a].src = './img/' + a + '.jpg'; + this.chargement(o, this.fond[a]); + } + } + + /** + * Informations de chargement + * @param ob L'objet Main + * @param image Image courante à charger + */ + chargement(ob, image) { + let o = this; + // Quand l'image est chargée + image.onload = function () { + o.cptImages++; + if (o.fond.length === o.cptImages) { + document.body.appendChild(o.canvas); + ob.pret(); + } else { + ob.chargementImage((Math.round((o.cptImages/o.fond.length)*100)).toString()) + } + } + } + + /** + * Définir le fond + * @param i L'indice de l'image à charger + */ + setFond(i) { + this.iFond = i; + } + + /** + * RÉCUPÉRER L'IMAGE ACTUELLE + */ + getIFond() { + return this.iFond; + } + + /** + * RÉCUPÉRER L'IMAGE + */ + getFond() { + return this.fond[this.iFond]; + } + + /** + * RÉCUPÉRER LE CANVAS + */ + getCanvas() { + return this.canvas; + } + + /** + * RÉCUPÉRER LA LARGEUR DU CANVAS + */ + getWidth() { + return this.canvas.width; + } + + /** + * RÉCUPÉRER LA HAUTEUR DU CANVAS + */ + getHeight() { + return this.canvas.height; + } + +} \ No newline at end of file diff --git a/media/LaSoupe.mp3 b/media/LaSoupe.mp3 new file mode 100644 index 0000000..a93b458 Binary files /dev/null and b/media/LaSoupe.mp3 differ diff --git a/media/LaSoupe.ogg b/media/LaSoupe.ogg new file mode 100644 index 0000000..ed5c97c Binary files /dev/null and b/media/LaSoupe.ogg differ diff --git a/media/aah.mp3 b/media/aah.mp3 new file mode 100644 index 0000000..e9ac4ff Binary files /dev/null and b/media/aah.mp3 differ diff --git a/media/aah.ogg b/media/aah.ogg new file mode 100644 index 0000000..8fbe54d Binary files /dev/null and b/media/aah.ogg differ diff --git a/media/boum.mp3 b/media/boum.mp3 new file mode 100644 index 0000000..dad2149 Binary files /dev/null and b/media/boum.mp3 differ diff --git a/media/boum.ogg b/media/boum.ogg new file mode 100644 index 0000000..65fe6a7 Binary files /dev/null and b/media/boum.ogg differ diff --git a/media/extraChou.mp3 b/media/extraChou.mp3 new file mode 100644 index 0000000..33a23f2 Binary files /dev/null and b/media/extraChou.mp3 differ diff --git a/media/extraChou.ogg b/media/extraChou.ogg new file mode 100644 index 0000000..d678031 Binary files /dev/null and b/media/extraChou.ogg differ diff --git a/media/loose.mp3 b/media/loose.mp3 new file mode 100644 index 0000000..3b2a6fb Binary files /dev/null and b/media/loose.mp3 differ diff --git a/media/loose.ogg b/media/loose.ogg new file mode 100644 index 0000000..3973ab1 Binary files /dev/null and b/media/loose.ogg differ diff --git a/media/point.mp3 b/media/point.mp3 new file mode 100644 index 0000000..8cd6d8c Binary files /dev/null and b/media/point.mp3 differ diff --git a/media/point.ogg b/media/point.ogg new file mode 100644 index 0000000..ddf5db3 Binary files /dev/null and b/media/point.ogg differ diff --git a/media/win.mp3 b/media/win.mp3 new file mode 100644 index 0000000..83d3392 Binary files /dev/null and b/media/win.mp3 differ diff --git a/media/win.ogg b/media/win.ogg new file mode 100644 index 0000000..86c4cc0 Binary files /dev/null and b/media/win.ogg differ diff --git a/media/woodblock.mp3 b/media/woodblock.mp3 new file mode 100644 index 0000000..4d999a4 Binary files /dev/null and b/media/woodblock.mp3 differ diff --git a/media/woodblock.ogg b/media/woodblock.ogg new file mode 100644 index 0000000..c8cac9a Binary files /dev/null and b/media/woodblock.ogg differ