From 0737b33a233d2030455c14f9d7233719b6231f87 Mon Sep 17 00:00:00 2001 From: cveta Date: Fri, 21 Jun 2024 14:32:09 +0200 Subject: [PATCH] added a dino game --- frontend/src/app/app.module.ts | 2 + .../folder-upload.component.html | 2 + .../waiting-game/waiting-game.component.css | 74 +++++++++++++++++ .../waiting-game/waiting-game.component.html | 7 ++ .../waiting-game.component.spec.ts | 23 ++++++ .../waiting-game/waiting-game.component.ts | 76 ++++++++++++++++++ frontend/src/assets/cacti-large-1.png | Bin 0 -> 4321 bytes frontend/src/assets/dino-1.png | Bin 0 -> 4979 bytes 8 files changed, 184 insertions(+) create mode 100644 frontend/src/app/waiting-game/waiting-game.component.css create mode 100644 frontend/src/app/waiting-game/waiting-game.component.html create mode 100644 frontend/src/app/waiting-game/waiting-game.component.spec.ts create mode 100644 frontend/src/app/waiting-game/waiting-game.component.ts create mode 100644 frontend/src/assets/cacti-large-1.png create mode 100644 frontend/src/assets/dino-1.png diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index ebeb75b..4c1dffa 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -10,6 +10,7 @@ import {NgbModule} from "@ng-bootstrap/ng-bootstrap"; import {HttpClientModule} from "@angular/common/http"; import {ToastrModule} from "ngx-toastr"; import {BrowserAnimationsModule} from "@angular/platform-browser/animations"; +import { WaitingGameComponent } from './waiting-game/waiting-game.component'; @NgModule({ declarations: [ @@ -17,6 +18,7 @@ import {BrowserAnimationsModule} from "@angular/platform-browser/animations"; FolderUploadComponent, NavbarComponent, NavbarComponent, + WaitingGameComponent, ], imports: [ BrowserModule, diff --git a/frontend/src/app/folder-upload/folder-upload.component.html b/frontend/src/app/folder-upload/folder-upload.component.html index 55c6c67..4214630 100644 --- a/frontend/src/app/folder-upload/folder-upload.component.html +++ b/frontend/src/app/folder-upload/folder-upload.component.html @@ -37,6 +37,7 @@

Train your model

+
Play a game while you wait!
@@ -82,5 +83,6 @@

Test your model

+ diff --git a/frontend/src/app/waiting-game/waiting-game.component.css b/frontend/src/app/waiting-game/waiting-game.component.css new file mode 100644 index 0000000..c76b5ef --- /dev/null +++ b/frontend/src/app/waiting-game/waiting-game.component.css @@ -0,0 +1,74 @@ +* { + padding: 0; + margin: 0; +} +.game { + width: 600px; + height: 200px; + border: 1px solid #000000; + margin: auto; +} +#dino { + width: 70px; + height: 70px; + background-image: url('/assets/dino-1.png'); + background-size: auto 70px; + position: relative; + top: 143px; +} +.jump { + animation: jump 0.3s linear; +} + +@keyframes jump { + 0% { + top: 143px; /*distance from the top of the parent element*/ + } + 30% { + top: 115px; + } + 50% { + top: 70px; + } + 80% { + top: 115px; + } + 100% { + top: 143px; + } +} +#cactus { + width: 20px; + height: 40px; + position: relative; + top: 91px; + left: 580px; /*width of frame - width of cactus*/ + background-image: url('/assets/cacti-large-1.png'); + background-size: 20px 40px; + animation: cactus-block 1.2s infinite linear; +} +@keyframes cactus-block { + 0% { + left: 600px; + } + 100% { + left: -20px; + } +} + +.restart-button { + height: 40px; /* align button height with cactus */ + padding: 0 20px; + font-size: 16px; + cursor: pointer; + background-color: #007bff; + color: white; + border: none; + border-radius: 5px; + margin-left: 20rem; +} + +.restart-button:hover { + background-color: #0056b3; +} + diff --git a/frontend/src/app/waiting-game/waiting-game.component.html b/frontend/src/app/waiting-game/waiting-game.component.html new file mode 100644 index 0000000..8a69117 --- /dev/null +++ b/frontend/src/app/waiting-game/waiting-game.component.html @@ -0,0 +1,7 @@ +
+
+
+
+
+ +
diff --git a/frontend/src/app/waiting-game/waiting-game.component.spec.ts b/frontend/src/app/waiting-game/waiting-game.component.spec.ts new file mode 100644 index 0000000..4e88fdf --- /dev/null +++ b/frontend/src/app/waiting-game/waiting-game.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WaitingGameComponent } from './waiting-game.component'; + +describe('WaitingGameComponent', () => { + let component: WaitingGameComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [WaitingGameComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(WaitingGameComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/waiting-game/waiting-game.component.ts b/frontend/src/app/waiting-game/waiting-game.component.ts new file mode 100644 index 0000000..7d3a8b6 --- /dev/null +++ b/frontend/src/app/waiting-game/waiting-game.component.ts @@ -0,0 +1,76 @@ +import { Component, ElementRef, ViewChild, AfterViewInit } from '@angular/core'; +import {DataService} from "../services/data.service"; +import {ToastrService} from "ngx-toastr"; + +@Component({ + selector: 'app-waiting-game', + templateUrl: './waiting-game.component.html', + styleUrls: ['./waiting-game.component.css'] +}) +export class WaitingGameComponent implements AfterViewInit { + @ViewChild('dino', { static: false }) dino!: ElementRef; + @ViewChild('cactus', { static: false }) cactus!: ElementRef; + isAlive = true; + + ngAfterViewInit() { + document.addEventListener('keydown', () => this.startGame()); + } + + startGame() { + if (this.isAlive) { + this.jump(); + this.checkAlive(); + } + } + + jump() { + if (this.dino.nativeElement.classList != "jump") { + this.dino.nativeElement.classList.add("jump"); + setTimeout(() => { + this.dino.nativeElement.classList.remove("jump"); + }, 300); + } + } + + checkAlive() { + let checkAliveInterval = setInterval(() => { + let dinoTop = parseInt(window.getComputedStyle(this.dino.nativeElement).getPropertyValue("top")); + let cactusLeft = parseInt(window.getComputedStyle(this.cactus.nativeElement).getPropertyValue("left")); + + if (cactusLeft > 0 && cactusLeft < 70 && dinoTop >= 143) { + this.dino.nativeElement.style.animationPlayState = "paused"; + this.cactus.nativeElement.style.animationPlayState = "paused"; + this.isAlive = false; + clearInterval(checkAliveInterval); + } + }, 10); + } + + resetGame() { + this.isAlive = true; + + // Pause animations + this.dino.nativeElement.style.animationPlayState = 'paused'; + this.cactus.nativeElement.style.animationPlayState = 'paused'; + + // Reset positions + this.dino.nativeElement.style.top = '143px'; + this.cactus.nativeElement.style.left = '600px'; + + // Remove the cactus animation class to reset it + this.cactus.nativeElement.style.animation = 'none'; + + // Force reflow (repaint) to restart the animation + void this.cactus.nativeElement.offsetWidth; + + // Add the animation back + this.cactus.nativeElement.style.animation = ''; + + // Restart animations + this.dino.nativeElement.style.animationPlayState = 'running'; + this.cactus.nativeElement.style.animationPlayState = 'running'; + + // Restart the checkAlive interval + this.checkAlive(); + } +} diff --git a/frontend/src/assets/cacti-large-1.png b/frontend/src/assets/cacti-large-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d002ac8b459d6ad8851851c2efec197d245550eb GIT binary patch literal 4321 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 P00000NkvXXu0mjf#_>>r literal 0 HcmV?d00001 diff --git a/frontend/src/assets/dino-1.png b/frontend/src/assets/dino-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b0653191d2df3e9dda3d3daa4dd9140a7f599cb4 GIT binary patch literal 4979 zcmV-(6O8PMP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+NGLlcH=m*h5us}y#&kwEC=H`ZwGJr{RKcd?M&O{ z?6N9Fi6VhO3^(ot%dG$Zzis}*U#wzHOj2^q+42`_tiJJ~*!$PcyR-4UpTG3_&3!y? z(t3XIoC+Mn{aW&KesSJ&y?@S+XPn0Q^lqT~4CMO9AKEjJFV6(e`PW3j-3jb`25Qeh z!9O#{`@KIi=UU|b5}x~X`R+NMe@5S85T8?a5_yl_isZ`Y;%yZCHr3D|Xa2W|e*bP> zmwIgSE4X0Kd%RYL`>*MF-dPaWxscD9%6kmu_}3ajh6#*ZAK$*5k2gQ~=5_qy&-`Rr zPda=E_u3!Rz`UEueU=7!J?F!3(aUegbKd;^gG-->`^5B}MH1g8_8%q1-OI>6+Wd zt@B~HfsN5GFC4ueKAdxfSX4hW@PwL|+g=F#428rPq)Ond-`hO4xHE4(^9@&+c{(oj zj=>za{Nu~~ggZiIOCXNRcY7gc3_CxkxFcmR5ZYpmC~{V=cAT)|j&~a?7T1edA2`J@nX9 z&s}=ywYNd~j5yNBLq-{OwCQJ<)bY$yW|?)i09?i)Y2GN)iF&`Zf7mWZ3?KNh$xEQ@gPGe@P zrz(=i$fU8E&Ni2QG$AhM({^vM`xUvrikr#t+qn6kM$TyH{$=D&+{{Yv;`T|@rnc>I zB6h1#eQE>M$2H9t{-c}vVqPEq^4Lf3BhBr6NM+hEOmb3NPHpy7IsmrD#Qc$0Dl0kO z1bZZT=>&osGw6EhEbVW+ByHz1rTR=7x>dLI;9DD}i_6oEv7Gi= zKboy0OBeWvBi%LN%C`RTXg>X+wAEI2WO}Un(d|sj8hQFyX7Q36b?L>1x{B|*zG6}h zRIM%t?2x@8HF6vqCxucP%Zgw$E?pf{Np)6`c8E#)zgt0OY%?TNwkrw0&l2a7#4r@i zkl7N2UnZAo>jrhxV2m`Q6uU>Du9wGGB&zQd>rCPMnk4sW`gUpCSQ?idlxi_55y(T+ zLIb*QT8v3d)@H_QePWUX~_PXzKCZ(vCo$UzJqALNdxX%$RP)JU3Y(dDRZb6W9n#ChbCMJuQs436lZF z&2oa8opBbwePi`KnlCQ^M!$=hOiy*ezp4WYE44;4*W<#NdXh1fI0Lq{pt;kSKqj7d ziKGTeg;hnbx$RodBj?enn^1-~q*t@VR&)fnxr=HVb=yiY+H`WtC){;PDRXh#V~h7S_Y=VcV?0YNJ-1yyz_|G#-iMj`r%TcmZBNw7DcF77fhW`nK9f`-F02O;;HYd&#n)5c46_1R0J1E=CsU0DXJTQKu6Cg2oI zIp}03oPd-af%R7?$ieh}vWEmCy||Vyl;=V7VpFTCDm)0h)IKx3raEbe*d=v=3y2F1 z`_#ZeuW?$(*F)S9%)cMvj$l3?qBa>m@-5j36!aX{+<-!&MzYkUvZp8qJB4LSWuV}0 zkjrB=s5;4$MI|Id}TOJ?z%hgmqMQA$6$4>2x+zn?wo#9RpzWMFr3l4H_1Q*RyDSs}rQg7* z-2}EU=7bG(!3S+Z5=<$BM&f3)5L@l=7wFRM@JV}+s`2qpG*nVo1{3*^??3=sGmL{Y;QqFhL9U?euuQ=0;-fz- zu?4T=((j5EnNKzxc6qOAp3LqG6w~rqjvN>@+QS)jDhLgXv0?c)Xx%EFYq`?0v!;yD zpBr~0cPJ1Uqt)J>rm&X>Ai5lyak79kg=Wm-$E?IiOgoHv_~e$m_-)r=y#)ow`xH2U zL!VVeCm6wi)de&MN^3G7CsS#JpP8yf;W4>|?E)0UXq5b2e^mxoPH)+?8z?g!*6dfa zDddc$A1RpL(9>?@AOl(R^x>rtXg{07{C?t((A~hDu&FxuJot2x6MT9SfCwb}-U0js z(IyRj-afDF$6>ih<7yAd_2HDhPNoFtf{%H}f&7aDp?-C2JT@&O zkk2s>>pD7@0$j#wc>sS2sk_PvPz=h`c%zJHvh>cTEjAbA&XMglHkg69D$E7Do8+K@ zwZZ^F(6}m`ZZsNi;A@Taqqyi;L$~V?@rc}_+;XIY-%1d#_=?n?H%Q{;lzOXITJN__ ztW0X|-lNP(o1m?2+_(_rBVFYN$=(p_$kLD9<}tjccXn5A$>=??Y$3+zrF4u7FQ9!E zbh>xF(JscMO&|bgGLiF{ju8|hdedIf-i71F;zmN_-~~W}!(%@j-qSNvJ{;bF=4+pL zq0SDCS4JO|#k*8f{6VY3*@ZmvbQx40?jS%ci25i=wGE%?JhNtxPgbf?=?}g8b9+@B z=UR#1rqo(h?G#$1t${J)ef-uyI%%Wkhkz_y(q&3S6(W4#NG?B}3V9Q*k^&K?0B)1j9qkD@Lg~<)ReahYfy{{& zt3s>57A3A+^5MCZw`oBR&87@tk_0WJFD3DJ1#P~o=vP6r`nR!Y5}(41`Gqqs+)`~r zIdHn)&`S?t4tYI$Jyu>^`c+-=!(fFZ1E~$^}YK+MK^t4R4M;%bunkZPY&W$=;##QX>5pD-h#(Q(`&k zZka_l_>r|*ajh$%*O6T<#;tM*F%1d$L<<9^Xixe%6q(Euju7GuzY8#=Ivr%$!(4|2 zq*_%*Nn+gKF@ryMq9w^$RLZsLGPE=ZUU@G54t(wyPtz@ZbB%ry7Sx=spV?a{wnmMvcuhPax%r+ z&K+D(wZ#Iz*=NZ%uGqsh)TpJqIsd=q^RIL^|1O_@Mag`%mG$Lj+829i=5D63I^9}< z!XxETf=I7fAcuGRuBrx;2u&G|wu?JyIH0JA?hOrS&dP>!9_1h+biGxCN z-47NHw6vj;T@gJV#c_n+Ege8gMTya!;eKhT)9AjK#@`;z#}jVgYu%Mq)vbw4qr3$Q zizT_y;c-jIorw0lrUur=6oxktV8n@TnWj#027GXY$)%qJ_f;Y&>v^_GoY!~7aozZ7 zbOPrF7U?#zfUB-hnkOVX(_UkA`T#SW2g-EN2B-dz@|$YGP0;d!bxQr{^)Lz5u}(Kn zb`YV+W^X~CpCLWTpEA^<9>Vf4pGn#gQCB*2a`Z^A>n7JYmnw?lZHh`T(bc0kSeD!M zWUX$qq}Nv7vkikO@3wKVB8;Fd+L9o(u%Wyr-LL|2j@1<(9dlu6$BY;)#$rT=bc zo3oe+{JfwMlJbD#LFNa+i9t$$#o2L*)FBLVJ1-%N2ESA0FlqJH|HZcN>uCOL?28JdP|QGBo4OtS6Z`Hy0W$4*EYX+>OsM zV72w`d;(gsiRx_sOUEX>4Tx0C=2z zkv&MmP!xqv(~43m4$UCqkfAzR5EXIMDionYs1;guFnQ@8G-*jvTpR`0f`dPcRR2XwMyExDC@B6d*wY#z*#OK6g zCS8#Dk?X3*Z=8!R3p`UaGwFF^kyt8rvD(F~Wa`9I#4$}bC|}5Wta0ArtXJx+eNX=bb>jVfs16M}JUu^<2pQJZBTI>iI*aj}HJDR!& zTj20<--RIqX-E;f5 zr#-(P@j7yI^m6af00006VoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_ z000McNlirueSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2! zfese{00DnVL_t(|+U?y-j)O1|MbT6%OJtes(LL>sq7d+hGMqQd1fi>^tHL%UN-2-Y zlKqC`?~k8{bPd1&&ze~bet2va&7B9w%&8E22%vUQaJ}-!nF+(8cY!YOE15amm}_5F07p+ zXFH+J!4v_oWSWEbu2p1n?&x