From ca614a198b2554d6f0c82c91c1a239e26eef4c0a Mon Sep 17 00:00:00 2001 From: Constant Date: Tue, 24 Mar 2026 22:32:59 +0100 Subject: [PATCH] init: finish implementation niveau dans le jeu --- projet_linea/Niveaux.db | Bin 12288 -> 0 bytes projet_linea/bin/Background.class | Bin 0 -> 438 bytes projet_linea/bin/BonusMalus.class | Bin 1812 -> 1898 bytes projet_linea/bin/Cercle.class | Bin 2517 -> 2603 bytes projet_linea/bin/Jeu$1.class | Bin 1818 -> 1818 bytes projet_linea/bin/Jeu.class | Bin 5721 -> 7279 bytes projet_linea/bin/Ligne.class | Bin 2857 -> 3541 bytes projet_linea/bin/NiveauxDataConnect.class | Bin 5317 -> 5858 bytes projet_linea/bin/ObjetGraphique.class | Bin 748 -> 942 bytes projet_linea/bin/Segment.class | Bin 1217 -> 1303 bytes projet_linea/bin/ZoneDessin.class | Bin 2585 -> 4313 bytes projet_linea/score.db | Bin 12288 -> 0 bytes projet_linea/src/Background.java | 20 +++ projet_linea/src/Jeu.java | 165 ++++++++++++++++++---- projet_linea/src/Ligne.java | 77 +++++++--- projet_linea/src/NiveauxDataConnect.java | 99 ++++++++----- projet_linea/src/ObjetGraphique.java | 4 + projet_linea/src/ZoneDessin.java | 46 +++++- projet_linea/src/bddInit.class | Bin 1309 -> 0 bytes 19 files changed, 329 insertions(+), 82 deletions(-) delete mode 100644 projet_linea/Niveaux.db create mode 100644 projet_linea/bin/Background.class delete mode 100644 projet_linea/score.db create mode 100644 projet_linea/src/Background.java delete mode 100644 projet_linea/src/bddInit.class diff --git a/projet_linea/Niveaux.db b/projet_linea/Niveaux.db deleted file mode 100644 index 38c82218fafa103f9ecc142c67166c28d5c27771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI&zi-n(6bJA-+aYNsFk2O6;G_&R)U+u{rLvJyCyGeZ5*&$4(bc(FhwO9eAK4Kz zD?1~90Dl301pf#V6X&KWA_BpTzRx+wXTN)PKHH1@>g7OYg3aS3;u&j^`-D>Rj4?t; zNe@$xbx?g^tta}snEx$GWdHs5yE@Cb_nFvby+c3%0uX=z1Rwwb2tWV=5P$##{#D?@ zxU;jjM<*G-3`Kes>JE0AimO~Ge{*U+AGsaRWnSlG;IfU}UBx5e=#`DPOIqHkR_VLm zbxkFgg6FHf@k@o(xm_k_tUvVJo;zX}qyAZEG+{5?3G0l#^Zrn;ICF=d!&DqG&wcH& z;kh2;!N6fl{jg~&rlAa!xUKQ?y1LXqC5VK|(%)Q_5f8*>$tVvqxd^4tGm$6L)Q^+f z$`146JSqDl7ORZhk7dI$9xw(NaMW_=+P;ct!c8mU>+TV!&ARqt%2tWV=5P$##AOHafKmY;|_>Tm( Lsad6~7a6P{azw8t diff --git a/projet_linea/bin/Background.class b/projet_linea/bin/Background.class new file mode 100644 index 0000000000000000000000000000000000000000..3a23fc0f75049761f53eddeee99ee286da0150bb GIT binary patch literal 438 zcmZ8d%TB^T6g{^T3RozD;@TZxVn0CRLJf&YqYDlDp-k!^v`H=cTbgK0T=)Tgl<{;R zAz?B1dCs}_&hOv%4}fbNd2j^HOBFvQdA3St9$Z0Zu3l8QP-zn0P3Jl;1XZ(CiDoOZ zJ@s0IH)Z8aP&+rNDJ}%P!ESRn5x7^`OgB-%o(~VcpfVUv8W6O7R8bQIkxBLKYB|;U zgPJZlq#I?iT1-@K%6wCFi%0V;@T2Xr99~a!VHY85Fx;Kb)9$lX9_z6wb%QPSv^)dH zT%*E|5IE&7j2y-u>a-1JW9ANhbM(b`@`={F#RRl%%WT1A)Ifj^YyCAE`{*(w&#DU5 jdN|lgOcprRxWm6lLb6TWf}KF)%Y^ z@i3$_WPn&XlOvej896pDV76u!%V1z+-~k$;#=r!G3=C{q+S?g2Cx2vGKgyUWF?j*>gOcprRxWm6lLb6TWf}KF)%Z< z^Dwk9w1QZjlg(LXGxBV{%(9b3yp@5GK@4bw8Uqs$GBB`dX>Vs}+c-I&(}<}9L`g^i Z#k+tqObp!&JwTcZs3VmjlcAS^695gg9vT1u delta 74 zcmZ22a#fh?)W2Q(7#J8_7`iudX|S+zF)%Zd{)LYlNYcqGQGgS!f=s+gW)oRAj1^~C5EdES`612To`UJ1On-3hC2-L b40jn)816BoG2CZJXSmIf#qe-)Ioo0Y9j6vt delta 71 zcmbQmH;Zq>d{)MJlNYcqGF`;L!myZugJCIyAj2{SC5Gh;S_~^0To_g{1On-3hII__ b4C@(E7&b7ZF>GW=XIRUS#jtsDIoo0Y#7YyY diff --git a/projet_linea/bin/Jeu.class b/projet_linea/bin/Jeu.class index 31a7eb4478e09c4f248bf5e44fd0833246028099..4145424ae111d5696e44c086fc72cf8acfd4a326 100644 GIT binary patch literal 7279 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 literal 2857 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 delta 2707 zcmaJ@U2qfE75=WY+FeU48C3tR4aP1I{3ByXfF^<@nA-U%vIE$`{3S*f8&|=W97(2z zB#87s2^c$sCLwOx#$-CvhrV_u)0w<<`p}v7sWa&`?sr#mY5Gt} zvwQA2=bn4ccfNB+pSFC|=>Og4H$DK+j*ln&FHU@7izO5PXcrZ7i&))KB~bok{7Aet z`_y1-_s&?yXu=uJCDSQCyr{PDB?SEtSY}~4YUP-S++T+;8>kmp;%*y^rv_TPk7jeu zkcE|4CE!hu>D0uBHA{otxp?AmXMDIP-aqIV*eLJwRz&>x3hps*w}8=q=+MKdWX?hq zn+3EaWuD&9xX+J!ale84jjIV#W~XS}u5yPWLEV6NNAvCXFhJjp`=oW_KKaTyF$ zdS8N+YXU2Gz04-1(nHGjiiIB_El@JxD2BM%O|mCPk~t@vb@~RA11ZPEIe|c`zc1?y zC;+o2E)b>UP<(*4ivneG#w=?x@rFPskscXzMlyW~CzDX5`H_IW*xF0@vEuWT{9|C7 zeHuTp@Rm!Qlrx%B**q482SYMyt&k_I1Nt@08n`Y$wHm!C+>oK*1?{Sdn{qmMx0sWE z3ATz4r5$P)zm<=NnzVVr@rZ|NaIG7u&V)AoH*LbT$=~wY_i(^P3k;+*EL;(eH}Hi=6Qs!U`2TKRjippK#46BRb;Ol zIbREdiyCMgT@$s;Wd+05F-`TjxDjpbgCy&eg*l`Nt8BUN1Mii`R-_*jx}G!Lt>f{G&G`# z!&XT3PUZ$gs9g&`a|tt>3g)ql$JSvZR&nSXu$eoypqaznimh(;b=1!@F;29NfuyP!~vXl5}!h8Pa-h>1?o)ijG;0#VJ@nrE@w zgI-&k#Q_0Zn@3ksowrZy?lGo&2ME9n>&a)T%@|`*~1P!O8?!IdXc~$9L8Rxalpl+ ziFLCG7X{=QU3=4Kw21S%mH!LzxV9KKzYX_-JSN>8|jzQB6dByG2wl;%L~$B92C+2&mDr zC@B0C#)>DlQNY=l$0J2~3LR0OO@-f8$dAKy6@9jEF6tw$w$BAN?*c174_D_Gaf`Yv zO%VhIL6$j>aIi*M{!#Mj7+Lc)HsKjE=~>ot9NP)lNu0nrj+z?AhurBoU%--4CTUZ{ zs^b+r$ESx8&(K$=Er@Y^i;{+#Jjtk#HW+M)i?q*0`ay;CKA4M06YRq8i;xGm5%OSg zLGkf_TwUy!^3-qRI|b}L$G9rxolz}1!{6-^3iiCOh`Da-MELt2M2#stVH@F-vl#PW zlS%Q+EY8wULh;ptme_`0D~JJ#=L-%N#n%hkAjKaRw4wKKX>Yk{mz4X<1GZHjv_sc$ zxl?uLO_9gs!dca=TDAVEz!b_jM~m&F!q(<&eI7|$cUwJ$KDJl8#rFE5+7y=Bn(e!+ zrb_j;Pr3SwuH5;5U1`?xiWHhlil4cph)lCB%W;a01@G3k@jl-H{Fz@~#zGhRe@5*A z_uhP-*uTKr;3U0IapxGXmD9X-#z~h6wBaShAUS+z(2tinVQ1O;F?zl#OiYS=6%SJU z8B_cd)kXd&=@bv=B#A1#gP*Ggi*lEnULN!Zmo&PY=rm?XpJvYX749&3Y$p%W+3PlJ zBM;x^)fMB7c#e|#;}F3GS}mqikBfOKgUqS|Z%`RxP6ZZfE(^O5T3|Vfg`DI||2^{t zi^Mo@oaw_yJp9%uWF diff --git a/projet_linea/bin/ObjetGraphique.class b/projet_linea/bin/ObjetGraphique.class index 5843ecfb9a87ff1120137877b890223573bb1cdc..325acf6152eed64305aebabd8f9dc36500b1d22e 100644 GIT binary patch delta 245 zcmaFEx{jUe)W2Q(7#J8_7z{UZWiZx@YWQR&mL=-vB<7{-2bUCO=A~O}hH)|QGidQJ zXfxkF^G{t2-9#z2Cm@z(xT*4 zx6GVW#>sVz7L4qhw=?Q7hN&`WFfcOk03GMZzyyR044hipI~X*#GKg*ja+nyzfg~4L m!h(T=!ID7&$QOesWRPT#0`h=b7<3u*fW|N~=mU973HWWiU>D%ILz#wpoiwkC9yiD9ps52>|yi39kSE diff --git a/projet_linea/bin/Segment.class b/projet_linea/bin/Segment.class index 7a930f0b6482ba96e7165fda9bc1610bda8a3bba..c58a89eb95812a3706722ed79e89e55b8a00b39f 100644 GIT binary patch delta 115 zcmX@eIh~8^)W2Q(7#J8_7`!%e$up@lGKgyUWF?j*>gOcprRxWm6lLb6TWf}KF)%Z@ z@-R3tID=U3ll7Qv7&$g)Gs!ZEIWsUaZ~=`_V_*V81_m}Q?d=RMljpHWPHtwAVsrzt MWY|4`5=;!9070o2x&QzG delta 57 zcmbQvb&!+m)W2Q(7#J8_7~D5<$uqHXF)%Z@Ob%eOVPxOj%OuM*`5ucXqx0kgERtLd Mj0~U!<=k`c zd;9o*FFgvN9skl%q9Jm?u|>PcW-VJsSVPr_Ic6S>Wsg|)P;BRJ(-vtB6MVT<%yslg#FXQnB4NGsD(xInlg@ zyXIJ<<`4tg=GZAZ?(Z{?c(J&gr$A(oD=kScCj&DQt!DD@kn7~^6xU{NwrtDWqM^L5 zc%i;eL%7XJi3mcdHn0#&G=%Ev`^uo(d6j|Z zo`6e7V~YQlnHBo9Q&uNEEsESTcV?8iaL zqZdl73Ow|sB|Tn@m*_Y&4eZ`=7W=3H69cRol5DEv>E&*w$s;(z93|2k;t>c8=@`t{ z&~zCC!)PHZGICp*ydFVX$KfL3cz4Iqq{w(=y@63lp>ieM>#@-HxTb`4ZgN zXM5eGs7fJogtaeR)zlQe*R(fD=H+;~fmh%TI%1}n&}pRiY294UcB|*?Ku^WBU6PBY zYQ#)LX-bUB4-OZ3u4&PHtCLHnMT<>7ND!sTyA0fo*HK!oo1P=3^Od67c08DGo`Yk! zN5}De7n-(e-~{d^6>V{p^}Hajp{OF8b=*hHr^g+^N!)MX0h!C$(l6mkGjB5RX1s;L z44c_5rI8((k%ydt5$aG~qsW;R6QF$fYut@(y7Q4YQx0#fNo#NJFI} zf>f3F!N5oGQ3|JA^GINFLy@a~WySeds5WM1Nci>LJ;0NBO!oc*IzE;!gJS(n?PWNJ zPv|($_BCa_N7y`V*dceYjtE2x=OV^%wOCsLV8}DLoTvo6;eM{{wG2SdS zPa1d_j}WK6mc-tU!uCVmY;whg6_7K6hj7`zC-Es7WZR#nRzp)!?9-OA%A)U1F=J#= zoW!RMJciRuN6X-##p-s;@L7Cb$LGj|si51OwBs810K&+OM$Ir>1!Zd8POo&({`tRf^yVd_#81Zx#+y<#y0t{4@A0zHQ(; z_%2yYV^W1AT)`3{ViLZ zv+ObFum}!b|BT#bCfO{;<>C2T4G#u^6-)aHcbIl6EwZ%<$2pwKG#4c~K&xmbFyn9B zGoBGMh#xGH4`^3>t_LdG%yhb!9j&>1Hhx)(r!*ku)NCgEq5%$B0d-M>o~QQ z@ZB7p#C6foMJ$z%Wzox6-am;I7qODVS`JrDU^Ryg{gt7b%98z)STlj=MjI|-{W)$g z!A3q;QaN~y4bxB=P0XXS)x3|^q7fUg2AdGWO_W&Vo5b^RGrwq@D+}n5#!=p}ZIqFY zMU;)`1U47!%u`UTqw5=K=cXc^ktv-KYz=hYik2YQC+S(3I=50?Yr`e%049*=Y`lV{ zjSr)zi}CI6Uo(jVj7nNOgT?3ZA_^v@VCoD?I~ylpoufL?^v%4IgjC>B<^b5tfNvqz zTZrsd+<;rLnx>;@rA#|R?BL3FI!jR7+H9n z%W+RNLjOTj$JkX0m*~)R9F>oeFt^{1mj;oxPN8=JD;p;8vV8^gA_~_|BG>gS$lZxo zQjdmLF@HWy)^m>xdUiBSc3i7#FT?3mx(r_`2u#DPXV4(|b*+YeYB(^XhSyAKc!0WP z3B;louYpAb@4W{y_zX#GctGy~<372s@P=1Ap6T@;<>QYe`$jNtxFZ(S}L9 zmENttf?D~Sz}v52NkcFUh3MA1`Tu_Ye{f&JV|b{u@jO0$9upI|6a=*?d1CYU&3YhEB=muqWXW`$u`UY literal 2585 zcmZuzYf}?f7=D%n7M4{A2r3rEJ0wUfYO7*x!$ph)P(c)|)g?K?V%Wvqjfl3j_j~Qd z-s~T6rr&gGnAVw&pZgp72RhSV&<~~0*<4ZbVfUQ#zUO(L_qzG>zu*4=(2x5nDiml_ zwk7(7>zbB|pn`@uMokrO!U-g!xCu)^{#MCBRwG;*R-v3@qPu$DFy5LY|Hfw z%bPIL8Bs}8`BN0=3x?yF;xt3nIpMhqniA4vG~=1+ zC^d|w1f@N^F=ozKhL>@8WA9oz#}Yoopkpk|n%6U;=QwXw9WyP{JFXzm-Z7yd*k`AN zh5(v$gwRj}1sio}sFkbDI&{>k*rK3u4GtPw&?NP?>R5;MD%wca*E1HqXs_+0gp)9q z?2M;j8=5p~?$oghyUE=ZUQVQ7OM8yIyp%f|HY{UCI6WN`D)#0>9+l#Lb6!|7#2WUX zLoyC4sBDkNJ0>K0r;dH-^3&m+cEnY|c&5h8TMW>~G9yJ4-@twa>x-oO?6mD@h@xA9 zA7Ho$o<~2V<0ZVztde`Lk-RqJ*cmIu(3C;@_X(?@E@4_?Br`uPoN;41O$rSOJINX` zSSj4+4};#U$sFs6QkgMHx-rM73CGW$Z{e9tN`G7Ms*cwXV=9dlc{JsDqzzW4)K7Xn z9jq)hW94z`pDhRq4Zr3b1=T4rFE?B^dyZk!e6O8JrbWy$=MB#fdJ9hKh=ZkFE#-!1 zOYQcKvg(WH&wFZ-z=(?BLjL^vEl72Y;xwzz5;r{s8wv>J)K#2iW>)*H;S9!goI?XM zBY6o&nmMoI0w(Fqtl^IMh%D|YSrHd?ye^ehM=ThoMOy)TdX709^O(V5VJxX#uXJZ^~J&|=ydnj;3{TS%&_K)(zC*1FK}X1Fog{bLxTXt483Hr(^-eHc4YA0;VtHyh5^_U#98t&i& z*`FVl`r7w-%#$(h$u;b4e5~UWe9Gh#Rzfg9W$wxoX0#fga~uuEh6mb4CkD<+mS5_) zE3vhdV=U${Iis1-#*$A3=4{r$OgH__PiZ-&3bO8gO0_XN<0QoiQ;vYTQkQp0@7U>a z%Mwms+HhUrs`!!Pu;}*l3866-0=BcV1N@Q%IRh$D#huDs1**B?==LQX-2R(`nWuHW zyx!O4nCD3&Pwx7A;AD6i8^VFdXqJyn;U{RBT*eEJ(aPmEF1Kf~gUdaWp+H-x;=(f8 zvxx8@IvK)WA^Z|p#*0}TeCS&_%;yer0ouqggc{mfkB!*O(_Pq!LwpWmH;zz4CllJo zQS|Vw;22)XbL*u)6+F|zzoIpg#qskcbj_D^5_zAG(wx)Gqwo%T(MKGGU-5#k2dN`% zRfU6e@mZ{cjN_p)MpZ>d18X42AU%t4m47w^ds4{jXcW0Y4o1L)k|6s9u5Z@IBx1Bk}`j I{1mMDAJ0HPpa1{> diff --git a/projet_linea/score.db b/projet_linea/score.db deleted file mode 100644 index 047f29d87d232d97ff89ced4d8b8f18d3c8e67f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI&zfZzI6bJCTwo%gr&W*5`#|8lmLgH*O7eg!s>yg;WRHz9FKZHW!${*n0=AYod z;NaxswTK25S7N>|y=(8?yBj{+OL}|b4i^zUPUqurK@E1yIA<3`j4?|OQ;$t>{gLE0 zk*xm;i=DoFW^|PyPMCPo69NJdfB*y_009U<00Izz00bbgcLH7GAXhH)U=coyqIfpa zt@3>w&6d%mzq>Rqed#Dk%4xcic4~{0a2!?i$n_NVhGj?>xLz9G#~ z(Iy?k0ku3OucS|1ztwj9fUadgPEU1Oo<7!=o~opk=~X|)UPqDFbKUjcAk>|{l6N}y zowrL#Z*GcLCf>!Hejy+L0SG_<0uX=z1Rwwb2tWV=5ZHf#tZA{MLcLZ$uhtsXvxYD% y#tYBCi7ekPNcw*+KA3(G5P$##AOHafKmY;|fB*y_009X6BLSP6dA|PV!2ALiuv~Be diff --git a/projet_linea/src/Background.java b/projet_linea/src/Background.java new file mode 100644 index 0000000..3065b9a --- /dev/null +++ b/projet_linea/src/Background.java @@ -0,0 +1,20 @@ + +import java.awt.Image; + + +//----------------------------------------------------------------------------- +// Classe permettant de définir pour moi ce qu'est un fond d'écran pour mon jeu +//----------------------------------------------------------------------------- + + +public class Background { + private Image image; + + public Background(Image image){ + this.image = image; + } + + public Image getImage(){ + return image; + } +} diff --git a/projet_linea/src/Jeu.java b/projet_linea/src/Jeu.java index 4ad8c5b..67897c3 100644 --- a/projet_linea/src/Jeu.java +++ b/projet_linea/src/Jeu.java @@ -3,9 +3,10 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; +import java.sql.Connection; import javax.swing.JFrame; import javax.swing.JLabel; -import javax.swing.SwingUtilities; +import javax.swing.JOptionPane; import javax.swing.Timer; public class Jeu implements KeyListener, ActionListener{ @@ -14,8 +15,10 @@ public class Jeu implements KeyListener, ActionListener{ //------------------------------------------------------------------------- // Ecran : instance de ZoneDessin, qui contiendra tous les objets graphiques + // On ne vapas créer directement l'écran car ça va créer un flash + // Dès le lancement du jeu avec l'image de fond par défaut et l'imga du niveau // et les animera - protected ZoneDessin ecran = new ZoneDessin(); + protected ZoneDessin ecran; // Le cercle : en fait 2 demis-cercles, un qui passera sous la ligne // un qui passera dessus @@ -31,7 +34,7 @@ public class Jeu implements KeyListener, ActionListener{ // Une variable qui contiendra le score protected double score=0; - + // un label qui servira à afficher le score protected JLabel labScore; @@ -40,6 +43,15 @@ public class Jeu implements KeyListener, ActionListener{ protected boolean jeuCommence = false; protected boolean modeTriche = false; + + // Propriété de ma connexion à ma base de données + Connection conn = null; + + // Variables actuelles du début de jeu + protected int idNiveauActuel = 1; + protected Niveau niveauEnCours; + protected int segmentsTermines = 0; // Variable compteur de segments + protected Segment dernierSegmentValide = null; //------------------------------------------------------------------------- // METHODES @@ -49,6 +61,39 @@ public class Jeu implements KeyListener, ActionListener{ // Constructeur de la classe //------------------------------------------------------------------------- public Jeu(){ + JFrame fenetre = new JFrame(); + + Background premierFond = null; + // On crée le jeu avec sa base de données + try { + conn = NiveauxDataConnect.getInstance().getConnection(); + System.out.println("Connexion réussie !!!"); + } catch (Exception ex) { + ex.printStackTrace(); + javax.swing.JOptionPane.showMessageDialog(fenetre,"Erreur de connexion à la base de données. Le jeu ne peut pas démarrer.", + "Erreur Fatale", + javax.swing.JOptionPane.ERROR_MESSAGE + ); + } + + // On récupère le niveau 1 + Niveau n1 = NiveauxDataConnect.recupererNiveau(conn, 1); + + if( n1 != null ){ + try { + // On charge l'mage du niveau 1 + java.net.URL url = Jeu.class.getResource("/" + n1.getImage()); + if(url != null){ + java.awt.Image img = javax.imageio.ImageIO.read(url); + premierFond = new Background(img); + } + } catch (Exception e) { + } + } + + this.ecran = new ZoneDessin(premierFond); + + // Gestion du score : a réactiver en fin de TP, inutile au début ecran.setLayout(null); @@ -123,6 +168,7 @@ public class Jeu implements KeyListener, ActionListener{ // création de diverses instances et //------------------------------------------------------------------------- public void demarrer(){ + // Création d'une fenêtre JFrame fenetre = new JFrame(); @@ -191,31 +237,73 @@ public class Jeu implements KeyListener, ActionListener{ // C'est ici qu'on appelle NiveauxDataConnect pour initialiser la connexion à la base de données des niveaux // On fera une synchronisation pour éviter que le jeu se fige // pendant l'initialisation de la base de données, qui peut prendre un peu de temps - // On utilise un thread synchrone pour ne pas bloquer le thread principal du jeu //-------------------------------------------------------------------------------- - // Initialisation de la BDD dans un thread séparé ; - // démarrer le timer quoiqu'il arrive pour ne pas figer l'UI - new Thread(() -> { - try { - NiveauxDataConnect niveau = new NiveauxDataConnect(); - System.out.println("Connexion réussie !!!"); - // démarrer le timer sur l'EDT même si l'initialisation BDD a échoué - SwingUtilities.invokeLater(() -> { - if (horloge != null && !horloge.isRunning()) { - horloge.start(); - } - }); - } catch (Exception ex) { - ex.printStackTrace(); - System.err.println("Erreur lors de l'initialisation de la connexion à la base de données : " + ex.getMessage()); - } - }).start(); + + // démarrer le timer sur l'EDT même si l'initialisation BDD a échoué + if (horloge != null && !horloge.isRunning()) { + chargerNiveau(idNiveauActuel); + horloge.start(); + } // A FAIRE : // donner la couleur des 2 demi-cercles, par exemple : demiCerleArriere.setCouleur(new Color(0.8f,0.0f,0.0f)); - demiCercleArriere.setCouleur(new Color(26, 95, 161)); - demiCercleAvant.setCouleur(new Color(26, 95, 161)); + //demiCercleArriere.setCouleur(new Color(26, 95, 161)); + //demiCercleAvant.setCouleur(new Color(26, 95, 161)); + } + + + + //------------------------------------------------------------------------------------------------ + // Méthode permettant de charger le niveau et de l'appliquer + //------------------------------------------------------------------------------------------------ + public void chargerNiveau(int id){ + System.out.println(conn); + this.niveauEnCours = NiveauxDataConnect.recupererNiveau(conn, id); + + if(this.niveauEnCours != null){ + // Remise à zéro de l'état propre au niveau + this.segmentsTermines = 0; + this.dernierSegmentValide = null; + this.ecran.partiePerdue = false; + + + // On corse le jeu avec son ID + //On applique les paramètres aux options de jeu + this.laLigne.generer(niveauEnCours.getNbSegments(), niveauEnCours.getId()); + this.laLigne.setVitesseLigne(niveauEnCours.getVitesseLigne()); // On modifie la vitesse de déplacement + this.demiCercleAvant.setCouleur(niveauEnCours.getCouleurCercle()); + this.demiCercleArriere.setCouleur(niveauEnCours.getCouleurCercle()); + this.ecran.changerImageFond(niveauEnCours.getImage()); + + + }else{ + JFrame fenetre = new JFrame(); + JOptionPane.showMessageDialog(fenetre, "CONGRATULATIONS !!! BRAVO VOUS AVEZ TERMINE LE JEU"); + System.out.println("Fin du jeu !!! BRAVO VOUS AVEZ TERMINE LE JEU"); + horloge.stop(); + } + } + + + + //------------------------------------------------------------------------------------------------ + // Méthode permettant de passer au niveau suivant à travers l'id + //------------------------------------------------------------------------------------------------ + private void passerAuNiveauSuivant(){ + // Nettoyage de l'état de validation avant de charger le niveau suivant + this.segmentsTermines = 0; + this.dernierSegmentValide = null; + // On incrémente l'ID du niveau actuel + idNiveauActuel++; + JFrame fenetre = new JFrame(); + + // Petite pause avec un message + horloge.stop(); + JOptionPane.showMessageDialog(fenetre, "Niveau terminé ! Préparez-vous pour le niveau suivant ;)"); + + chargerNiveau(idNiveauActuel); + horloge.start(); } @@ -226,14 +314,39 @@ public class Jeu implements KeyListener, ActionListener{ //------------------------------------------------------------------------------------------------ @Override public void actionPerformed(ActionEvent e) { + // 1. Animer et recalculer le segment courant this.ecran.traiterBoucleAnimation(); + this.laLigne.actualiserSegCourant(); + + // 2. On vérifie si la ligne traverse bien le cercle boolean verification = this.laLigne.estDansCercle(this.demiCercleAvant); + // NB: Le nombre de segment s'incrémente qu'il y est collision ou pas if(verification){ - // Ajouter les points continuellement tant que le segment est vert (cyan) - this.score += 5; - this.jeuCommence = true; + // On compte seulement lorsqu'on change de segment + Segment segmentCourant = this.laLigne.getSegCourant(); + if(segmentCourant != null && segmentCourant != this.dernierSegmentValide){ + this.dernierSegmentValide = segmentCourant; + this.segmentsTermines++; + // Ajouter les points continuellement tant que le segment est vert (cyan) + this.score += this.niveauEnCours.getMultiplicateurScore(); + this.jeuCommence = true; + } + + // Vérification si on a atteint l'objectif du niveau : Nb de Segments du niveau atteint + if(this.segmentsTermines >= this.niveauEnCours.getNbSegments()){ + passerAuNiveauSuivant(); + } + }else{ + + // On compte seulement lorsqu'on change de segment + Segment segmentCourant = this.laLigne.getSegCourant(); + if(segmentCourant != null && segmentCourant != this.dernierSegmentValide){ + this.dernierSegmentValide = segmentCourant; + this.segmentsTermines++; + } + //------------------------------------------------------------------------------------------------------------------- // A FAIRE: Le jeu peut s'arrêter si la ligne n'est pas dans le cercle // NB: Le jeu commence quand la ligne est dans le cercle diff --git a/projet_linea/src/Ligne.java b/projet_linea/src/Ligne.java index 93d9bfa..b126518 100644 --- a/projet_linea/src/Ligne.java +++ b/projet_linea/src/Ligne.java @@ -23,7 +23,13 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique // Propriété listes de segements: Une ligne est constitué de plusieurs segments. // Stockage des segments afin de pouvoir les afficher et les animer plus tard protected ArrayList listeSegments = new ArrayList<>(); + + // propriété de la vitesse de base de déplace de la ligne + protected int vitesseLigne = 5; + // On définit les limites (plafond et sol) + protected int plafond = 50; // Empêche de monter trop haut (Y=0 est le bord haut) + protected int sol = 550; // Empêche de descendre trop bas (Y=600, est le bas) //------------------------------------------------------------------------- // METHODES @@ -33,27 +39,75 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique // Constructeur de la classe //------------------------------------------------------------------------- public Ligne(){ + + } + + // Méthode pour (RE)générer la ligne + public void generer(int nbSegments, int difficulte){ + // On vide la ligne précédente + this.listeSegments.clear(); + // Valeurs initiales pour la position de la Ligne double x = 800; double y = 200; double dx,dy; + + // Plus le niveau est grand plus dy peut-être grand (pics plus abrupts) + double amplitude = 30 * difficulte; + + // On réduit la largeur des segments pour "serrer" les pics + // Plus dx est petit, plus les pics sont proches les uns des autres + double largeurMin = 100 - (difficulte * 15); // Création de la liste de segments qui composent la ligne Segment s; for (int i=0; i sol){ + // Si ça dépasse en bas, on force le segment à s'arrêter à 550 + dy = sol - y; + } s = new Segment(x,y,dx,dy); s.setCouleur(new Color(0.2f,0.2f,0.2f)); //Ajouter un segment dans la ligne this.listeSegments.add(s); - x+=dx; - y+=dy; + x += dx; + y += dy; } + + // On remet le segment courant à zéro afin de ne pas avoir un retard sur un cycle + // Et repartir proprement + this.SegCourant = null; } + //Méthode set pour modifier la vitesse de déplacement la ligne + public void setVitesseLigne(int new_vitesse){ + this.vitesseLigne = new_vitesse; + } + // ------------------------------------------------------------------------ + // Méthode pour réactualiser le segment courant + // ------------------------------------------------------------------------ + public void actualiserSegCourant(){ + this.SegCourant = null; + for(Segment s: this.listeSegments){ + if( (xCercle >= s.x) && ( xCercle <= (s.x + s.xLong) ) ){ + this.SegCourant = s; + break; + } + } + } //------------------------------------------------------------------------- // Redéfinition de la méthode Afficher, spécifiquement pour la classe Ligne @@ -64,19 +118,10 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique // On définit l'épaisseur du trait Graphics2D g2D = (Graphics2D) g; g2D.setStroke(new BasicStroke(3.0f)); + this.actualiserSegCourant(); + for(Segment s: this.listeSegments){ s.Afficher(g); - if(SegCourant == null){ - if( (xCercle >= s.x) && ( xCercle <= (s.x + s.xLong) ) ){ - this.SegCourant = s; - } - }else{ - if( (this.SegCourant.x + this.SegCourant.xLong) < xCercle ){ - if( (s.x <= xCercle) && ((s.x + s.xLong) >= xCercle) ){ - this.SegCourant = s; - } - } - } } } @@ -92,7 +137,7 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique // vers la gauche // On modifiera cette méthode en fonction du niveau de jeu for(Segment s: this.listeSegments){ - s.x -= 5; + s.x -= this.vitesseLigne; } } diff --git a/projet_linea/src/NiveauxDataConnect.java b/projet_linea/src/NiveauxDataConnect.java index 59739f1..c00ea93 100644 --- a/projet_linea/src/NiveauxDataConnect.java +++ b/projet_linea/src/NiveauxDataConnect.java @@ -1,6 +1,6 @@ -import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @@ -11,6 +11,8 @@ public class NiveauxDataConnect { //Création d'une variable de connexion à la base de données private static final String url = "jdbc:sqlite:Niveaux.db"; private static boolean tablesCreees = false; // Variable pour vérifier si les tables ont été créées + private static NiveauxDataConnect instance; // Instance unique de la classe NiveauDataConnect + private static Connection maConnexion; // Objet connexion à partager @@ -23,45 +25,68 @@ public class NiveauxDataConnect { // Il est nécessaire de l'initialiser afin de pouvoir le lire et écrire dessus // Car dans la .jar il est en lecture seule // Il faut donc le copier dans un endroit où il peut être modifié, par exemple dans le dossier du projet + // Mon constructeur est en privé car personne ne doit pouvoir faire new NiveauDataConnect // ---------------------------------------------------------------- - public NiveauxDataConnect() throws ClassNotFoundException, SQLException { + private NiveauxDataConnect() throws ClassNotFoundException, SQLException { // Initialisation de la connexion à la base de données - Connection conn = getConnection(); - if (conn != null) { - System.out.println("Connexion à la base de données réussie !"); + maConnexion = getConnection(); + if (maConnexion != null) { + System.out.println("Instance du singleton créée et connexion prête."); } else { System.out.println("Connexion échouée !"); } } + //-------------------------------------------------------------------------- + // Point d'accès global pour obtenir l'instance du singleton + // On utilise synchronized pour éviter les problèmes si deux threads appellent + // la méthode au démarrage en même temps + //-------------------------------------------------------------------------- + public static synchronized NiveauxDataConnect getInstance(){ + try{ + if(instance == null){ + instance = new NiveauxDataConnect(); + } + return instance; + }catch(Exception e){ + e.printStackTrace(); + } + return instance; + } + + // ------------------------------------------------------------------------- // Méthode de connexion à la base de données Niveaux.db // ------------------------------------------------------------------------- - public static Connection getConnection(){ + public static Connection getConnection() throws SQLException{ + // On vérifie si ma connexion, singleton existe déjà et à déjà une valeur + // Ou si elle a été fermé + if(maConnexion == null || maConnexion.isClosed()){ // On vérifiera si la BDD est déjà créé et possède déjà des données à l'intérieur // On devra ainsi l'extraire depuis le .jar - boolean baseExiste = bddInit.init(); - try{ - Connection conn = DriverManager.getConnection(url); - System.out.println("Connexion à la base de données réussie !"); - if(!baseExiste){ - // Vérifier si les tables ont déjà été créées pour éviter de les recréer à chaque connexion - if (!tablesCreees) { - // Créer la table niveau si elle n'existe pas déjà - CreerTableNiveaux(conn); - tablesCreees = true; // Marquer les tables comme créées - // Insérer les niveaux dans la table niveau - insererNiveau(conn); + boolean baseExiste = bddInit.init(); + try{ + maConnexion = DriverManager.getConnection(url); + System.out.println("Connexion à la base de données réussie !"); + if(!baseExiste){ + // Vérifier si les tables ont déjà été créées pour éviter de les recréer à chaque connexion + if (!tablesCreees) { + // Créer la table niveau si elle n'existe pas déjà + CreerTableNiveaux(maConnexion); + tablesCreees = true; // Marquer les tables comme créées + // Insérer les niveaux dans la table niveau + insererNiveau(maConnexion); + } } + + return maConnexion; + }catch(Exception e){ + e.printStackTrace(); } - - return conn; - }catch(Exception e){ - e.printStackTrace(); } - - return null; + + return maConnexion; } @@ -97,6 +122,7 @@ public class NiveauxDataConnect { // Les niveaux sont connus à l'avance et sont insérés directement // dans la base de données pour éviter de les insérer à chaque fois que // le jeu est lancé + // Pour corser le jeu, on utilisera l'id du niveau qui nous servira de difficulté // --------------------------------Niveau 1 -------------------------------- // nom = "Facile", vitesse_ligne = 5, nb_segments = 50, image = "images\ciel.jpeg", multiplicateur_score = 1, couleur_cercle = "bleu" // --------------------------------Niveau 2 -------------------------------- @@ -137,17 +163,20 @@ public class NiveauxDataConnect { Niveau niveauRecup = null; String sql = "SELECT * FROM niveau WHERE id = ?;"; - try (Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery(sql)) { - while (rs.next()) { - int id1 = rs.getInt("id"); - String nom = rs.getString("nom"); - int vitesse_ligne = rs.getInt("vitesse_ligne"); - int nb_segments = rs.getInt("nb_segments"); - String image = rs.getString("image"); - int multiplicateur_score = rs.getInt("multiplicateur_score"); - String couleur_cercle = rs.getString("couleur_cercle"); - niveauRecup = new Niveau(id1, nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle); + try (PreparedStatement pstmt = conn.prepareStatement(sql)){ + pstmt.setInt(1, id); // On remplace le 1er ? par l'id + + try(ResultSet rs = pstmt.executeQuery()) { + while (rs.next()) { + int id1 = rs.getInt("id"); + String nom = rs.getString("nom"); + int vitesse_ligne = rs.getInt("vitesse_ligne"); + int nb_segments = rs.getInt("nb_segments"); + String image = rs.getString("image"); + int multiplicateur_score = rs.getInt("multiplicateur_score"); + String couleur_cercle = rs.getString("couleur_cercle"); + niveauRecup = new Niveau(id1, nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle); + } } } catch (SQLException e) { diff --git a/projet_linea/src/ObjetGraphique.java b/projet_linea/src/ObjetGraphique.java index 6e2a0df..9591620 100644 --- a/projet_linea/src/ObjetGraphique.java +++ b/projet_linea/src/ObjetGraphique.java @@ -51,4 +51,8 @@ abstract class ObjetGraphique { public void setCouleur(Color c){ couleur = c; } + + public void setCouleur(String colString){ + couleur = Color.decode(colString); + } } diff --git a/projet_linea/src/ZoneDessin.java b/projet_linea/src/ZoneDessin.java index 93f2740..f9ba9f8 100644 --- a/projet_linea/src/ZoneDessin.java +++ b/projet_linea/src/ZoneDessin.java @@ -3,8 +3,11 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.Image; import java.awt.RenderingHints; +import java.io.IOException; import java.util.ArrayList; +import javax.imageio.ImageIO; import javax.swing.JPanel; public class ZoneDessin extends JPanel { // hérite d'une classe du frameWork standard @@ -21,6 +24,12 @@ public class ZoneDessin extends JPanel { // hérite d'une classe du frameWork st // Une liste d'objets graphique // Pour permettre à traiterBoucleAnimation() de parcourir les objets sans distinction pour les animer protected ArrayList listeObjets = new ArrayList<>(); + + // Variable pour l'image + protected Image imageDeFond; + + // Variable pour stocker l'objet Background au lieu d'une simple image + protected Background fondActuel; //------------------------------------------------------------------------- // METHODES @@ -29,16 +38,40 @@ public class ZoneDessin extends JPanel { // hérite d'une classe du frameWork st //------------------------------------------------------------------------- // Constructeur de la classe //------------------------------------------------------------------------- - public ZoneDessin(){ + public ZoneDessin(Background fondInitial){ // on prépare la zone d'affichage setLayout(new BorderLayout()); setPreferredSize(new Dimension(800, 600)); - setBackground(new Color(220,170,0)); + this.fondActuel = fondInitial; + } + //Redefinition de la méthode setBcakground grâce à ma classe Background + public void setBackground(Background nouveauFond){ + this.fondActuel = nouveauFond; + + // On redessine le fond + this.repaint(); + } + + // Méthode pour modifier l'image de fond depuis la classe Jeu + public void changerImageFond(String cheminDansSrc){ + try { + java.net.URL url = getClass().getResource("/" + cheminDansSrc); // On cherche l'image depuis src + if(url != null){ + java.awt.Image img = ImageIO.read(url); + this.fondActuel = new Background(img); + this.repaint(); // On redessine le fond + }else{ + System.err.println("URL introuvable pour : " + cheminDansSrc); + } + } catch (IOException e) { + e.printStackTrace(); + } + } //------------------------------------------------------------------------- - // Ajout d'un objet graphique à la zonde de dessin + // Ajout d'un objet graphique à la zone de dessin //------------------------------------------------------------------------- public void ajouterObjet(ObjetGraphique unObjet) { this.listeObjets.add(unObjet); @@ -93,11 +126,14 @@ public class ZoneDessin extends JPanel { // hérite d'une classe du frameWork st super.paintComponent(g); // Puis on ajoute ce qui est spécifique à la classe - + if(fondActuel != null && fondActuel.getImage() != null){ + g.drawImage(fondActuel.getImage(), 0, 0, getWidth(), getHeight(), this); + } + // on indique qu'il faut de l'antialiasing Graphics2D g2D = (Graphics2D) g; g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); - + // à compléter for(ObjetGraphique obj: listeObjets){ obj.Afficher(g); //Chaque objet se dessine lui-même diff --git a/projet_linea/src/bddInit.class b/projet_linea/src/bddInit.class deleted file mode 100644 index 7ed680e1c0e1cad98ee4ebf72509b81e786beb4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1309 zcmZuxTXWM!7(HtnBpc;|LlOwIhOx~Yx*RC zfYH(E+JP?Ww1qP`OM-E@EaN8v6Vru0Y(U&U*oug7|LPi*-|I=!yt=k z6b#H*xQI&v_Flh6ECWwQ-mX83zF%3c-7Z&tul!bRtW@iF1Wxb6{XERcp@@=!Z!CO^ z@3za^;iCt~7H3@Y5?CFKX~&$@u@58BJ=~|<<>`E}7bboXC?pdgl+U)?o(#HnTiMau z7abMFp&u#R4SNxXQ#A3Dz?sC|4|YaYv@2}}bX6p6mto9e;OFg{*!${IWz$tjdvmyg zYZe@RmPeA|u{Z9YE0J^=bb}LZd0v(0nZ=hwPtmJJsCsX`rJ@ztYEzT1g|2KjW#nsl zpv=Tie0D5b8^k+Ipzno%V94(I`-BT!`iGegVokvGS`8NJQXKC0ad3sSqt}{KU1l3f z_%6!M05{hU(F5b98Gsk{slh2+=jGME6okIMTyIh;aTnYV%)Em5Co%uRRht15x42q; z2i(Rir7X%Aqech6r(cHqqqOrMjMaSh6%N&sw_(05UfjayUnsuBk^IyaPEb5`iBIMY z&aI|j;zHwJT>e#Czo#|hJjak0ex#75VAd~h;p)`i#G1f;Jm9d>(A=(Jn5+I49U?c2 z))8LMQJmv9!6COYj$nb>WlS>eI3tgti7Bk%L{iTTIXC&tp~8$Q>gREX87)REpqk*# e<1XJ)xJP{+nGaYH1`PhQvj(nY=u@L5g~gACqc~gu