From 2e867b155b32179c5a6741b5a4f8ec8307954ee5 Mon Sep 17 00:00:00 2001 From: Page Asgardius Date: Sun, 2 Jan 2022 09:57:24 -0700 Subject: [PATCH] code cleanup --- README.md | 5 +-- level maps/r3 level1.xcf | Bin 92757 -> 96015 bytes r3.py | 79 +++++++++++++-------------------------- sprites/wallh.png | Bin 0 -> 2868 bytes sprites/wallh.png~ | Bin 0 -> 4902 bytes sprites/wallv.png | Bin 0 -> 3576 bytes sprites/wallv.png~ | Bin 0 -> 5002 bytes 7 files changed, 27 insertions(+), 57 deletions(-) create mode 100644 sprites/wallh.png create mode 100644 sprites/wallh.png~ create mode 100644 sprites/wallv.png create mode 100644 sprites/wallv.png~ diff --git a/README.md b/README.md index c56bf05..8e6e524 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ # The Red Robot Radio -A simple game using Pygame library (gamepad required). -You control a spaceship with left stick and camera scroll with right stick. Tested with Dualshock 4 on Raspberry Pi and my personal computer with Arch Linux using same gamepad. -If you are using a different gamepad and/or operating system, you need to edit source code to fit your gamepad commands. +A simple game using Pygame library (pointer device required). +You control a spaceship with moving computer mouse (or any other input device that can emulate it) \ No newline at end of file diff --git a/level maps/r3 level1.xcf b/level maps/r3 level1.xcf index fe64cade2dd83eb04aa4b4364274d885834d1942..f120d4ca3c4438033a94da69c21e11cf3c96b017 100644 GIT binary patch delta 10290 zcmd_tYpfnc9mnx!TY3f*u!N+;Ic?=oiu*!>fR{xv+EU6C%B5TfN`X^pJ6sBsTgODn z_KlrLj5HkMka&Ya+(?X8YaBJ&HpIAZe9=U3qakvL(a~s3y@XXD!QGv2&uOrlXj0zz zBs-s(-(H^WJoDePec|~9kNs)Eu8XphzqM*ncImfA!)MjY$(;+6yDv=c+mf8wG?>Zf zk`q5nF8ywD`5k*7&5p~mZ%#ipZ}A6zHiV;9FC>R{N7qgbz0v&n$y48*JSSabbfMb& z>v_Linf29bG#$^hT@CPhP)1x$QT}N49rY`TdIN*FJS-07+P$Di=&v~%Xh>HGJ~@$aWm^NZw5Ut;f? zy-)3bZgOnwfsLE)yl=YL?WbR#xjMUR`pTCVul($AOeUG5VYIqyKc3Egd0+CCPbB~G z*THNNvo{*;y*EDk_PyKUj~DFy`(M7d{M1o5Z}WfG9hG(4nBBN_>-p0k-Tm0uiNpL& zKehA1^5k?a+U&FgM~n}joqm<a z*>$t=pAx)?f5gLIcw!n)EWxw!!+1Gvz^(Yn!LBJ!+_CnE?Ty(!ow*<#_|}b&*$s$; zYsFf0)LvQr2tLMC7^^7+6`-j!jUuN!; zE&jpWVD@ZQ&*E2xec95T_&9zUpB+ri;g#3j@e+<-^7(Y!lCNS{CBy1j@)Lre<8Sfs z7mlUz(na_#`~Y5pH{cfBKG-$0tL4p$drPPY7PyZ|r8b(kIn!(jGW-Mvg6 zNc$%bvU(1=i&-nhf}x>ci=9368GQ%JUFc0?u%v!4kecjjIw15 z8BgN5xB}PV6mG*ExC@`eJ$L{Q_SMr($+8(dlst1_l%2Vd@g$y$D{vi7;WpfXyYNZe zg9orYNM{BQC6^D3vgHd?=RXwSo9p4f8ke(w6W+SV{gF3##AD_E@&?MI|4BY_ic-Hn z?ikF_-0y#kzF>BJ9sT-8{QgHjVD4XkO!i+_X1mrNv2{=Rv1huH>)sRk&-`n;hClGx z*Sh{#pLU<;yN%cS(Oq4?f4S^G@9!J`tjxZ#pzjTD2>yxFvUikc-8}?D(?5-ecT%40 zXN4iow%3^cN0DuRiSZw>P1?g>-3@22)!oDj&R@}_<5om$dC;yDDOf2n#{v~QvBH2gHW;yNQ)iVxi8&UiP@_SM4n0;Fu*L>s zvRu`s&cy;H=2)OYjRq|`^jKlQ8XJs*Wp;6!g4F^g=2)OYjRq|`^jKlQ8XJtgm$WHR0wv~HphArXEjsjAVZa(2jJ#;6HU(=0 zO3bl9g&GZ7bm+0dfHgK4ssA-?3N95WF~2nS(V@o*1J>9i%e9f9OIQ2$p&f;PEMpu`*tRH)IQMTZ_M3|M1B{jZAz zZSrb?5_2q2p+Xo0wv~H zphArXEjsjAVZb_BUfU2vY?Idsl$c|I3N;$E=+I+@0qemsyRIRK*e0(RC^5$Z6>2nS z(V@o*1J=D={a@b@L~N5c2$Yy(feJMmwCK=dg#qi%zW#4$2qLygEl^^P1uE2N(4s?+ z6$Y%Sf87v7Y?C(%l$c|I3N;$E=+I+@0c-02#)cqbo4iSgD$sL`NBhaM{oSX2Ku zH3SjcCQxFI1uE2N(4s?+6$a}6wwj>9h;4F8pu`*tRH)IQ zMTZ_M4AlQrP0(P(Hn~xt#2gD$sL`NBhaM{o)c?kspuvc3@?!!e=2)OYjRq|`^jKjT z=+xL?#5Q@mK#4gPs8FLpiw-?j$@2C2nS(V@qxv#0T>>TMSfE0U1}!@DSXOib*4SXgHhH%|i8&UiP@_SM4t=t` zyCMi!V}lXfLL%&|a)8Vy=>=&AqvD}sPEHW;x@J|IwH zjs+^zXwag=($lFhV2uq%Y?BWPl$c|I3N;$E=#u4wo}j{jH8vQrO+F-0VvYqW)M(J6 z8!WSjJVAv4YiuxLn|xTH#2gD$sL`NB*W12nS(RD8E a>VLZ@s4xt6O*rL!*%kA{`XYPn{C@%?9{V!@ delta 7624 zcmYMzUFe-R0mt$GQ#UpX5u~i$3IRa}-efxHx~^TezHaTdY_03RTV2z&u3NW4vUufl}?ML~&RccVfarQj|kE$l+@B6o@)#I;wxX6S|D3jv>V@>LH!`6R#OJP+qN z{NDNK&R_lV&hPA>?!I-6Av*H)hczZkytkKxr%4{w|p-a5W=+V+#{SEoCs^(!M@ zjhE)}%zWK3U-M_v&xQx`a5Y|<$1|(h+NM7Zw`>_c@crSQ&t3obrr+#a|M^(1#!K^f zX1=)f!9ULP`SaGFhpX|@Jf2z2)(&kSuJ0dSEJJ^KzV#pWZftq`FPq-}+s2zWw`^Rz zdDrI4_l@nV+vaHN_RB}c@_XMN{@@hbcU?bu`Cr>N{H=|R-(Ed7efEDhc=wrc;>J^} z8@$UG-+yn!`5m@*&o}t%_KmOI_}#S5m+$`gH^%0z!*jCjz8{U%ulXN74D9Z@e(mN5 zpW3|nt7p%>@s$TIe);^yo40PQ^RKMV9Gb_k&lm6L_BU7QwC(E3G5q(;yt@745&ixA z@Sh*9obLJP`cH3vV&|0$pP7Dm=RI@wt&LCK++#P5Q;gHS*Z#j2hu79V_WOA~o;=;# zS9{Y1f#dZ~7w%{MAZk2v<-Pl-t&1I;-yui7Lm}sO7}gdYdJGsbVa9?L8}^lp=^-(K zha@W0XwafVj{zel%vi8u!@hK}HtiH6*eOw=MuQd|dJGsbVa9?L8}`}7+S>H67{S95 z6>2nS(V@qH5ff%CSg~PWJ%4T5B}TAIqC$-ZEjsiVFk-@t1uHh}%ill0fk(s$9+9X} zqd|)fJqC=JFk``r4g2c(YtwEqg544oYBXrkp~rv`6J{(}vEibR$sU0c6>2nS(V@qH z5ff%CSg{Qkd-|9>Do~N7UH1R6K7z*uN>r%Pphbrs14c}kv0%kU{~zxo z*eg(?LX8G3I`kMYV#16CD>nMSw~t_-K#2-98no!pW59?BGZw7a=>NVxg8c#|D%5Du zqC<}XBPPsPu;QXI>B9p8B`VZt(4s?+0V5{NSg;Nk2O2>i9uz21p+(6@*a-UYkU)tFH5#<&&||=e2{RU~OXvO{Y6N}wgg}W3H5#<&&||=e2{RU~v&;TJ z(FpqRNr4g-YBXrkp~rv`6J{(}>Hm|BpbrlVl&DanL5mJO28@_6W5G)Q4>y87JR(q{ zLX8G3I`kMYV#16CEB!yx2>S3Tff5yJG-%PG$AA$NW-PdE6=!#;dQphSfl4O(>QF<``m8OzGW^h_ma*oQ`-M1>j+T6E|!V8nzO%hI|3 zrV=#l!)FCbRH)IQMTZ^(MogHo%r5)?Y$a&ehtCO=s8FLpiw->ojF>QEq5scSf`)x~ zRG>tK8Vy=>=rLf#gc%F{KUxVI_Te#s5*2DRXwjj^fDsdBEcE|aC1}`(Ul1r!p+pC|+s z8}{J~0wpTcXwafVj{zel%=G_-LQt_`AHFD1qC$-ZEjsiVFk-??|6eQw6&v>9Nr4g- zYBXrkp~rv`6K48Y!tA~Pviv0)#+Bv7J4jRq|`^cXN= z8ZKVS1O+QL?88$6B`VZt(4s?+0VAfBi|JG*C|I#!A6kJD6>2nS(V@qH5!2GS|27j8 ztk|#*PYaZ&P@_SM4m}2pm}Zy#Kb;8*R&3aZFAJ2YP@_SM4m}2pnCSn@nV?|BhJAQO zphSfl4O(>QF<`_*|IcKCf)yL~;aPza6>2nS(V@qH5flACn+Xb5Y}kii5-3rjMuQd| zdJGtGk(gvGSg~Orz9LYfLX8G3I`kMY4i~Q^f{X<#HtfT50wpTcXwafVj{)P##dIza zWGq;*VIRIKP@+PO1}!@D7%(oK`~PYp$XKvq!#;dXphSfl4O(>QF<_is_W!j+kg;IJ zhJAQmphSfl4O(>QF<_+s=MzE3f)yL~;p+k=D%5DuqC<}XBmI9p5o9b_v0)#+AyA@1 bjRq|`^cXOHo=L)t1uHh}@88@z9o_jK=Wt`x diff --git a/r3.py b/r3.py index edd3269..ec16c9d 100644 --- a/r3.py +++ b/r3.py @@ -5,9 +5,6 @@ import time import datetime import platform import subprocess -#introplay = "ffplay -autoexit -window_title Intro intro.ogv" -#process = subprocess.Popen(introplay.split(), stdout=subprocess.PIPE) -#output, error = process.communicate() pygame.init() screen = pygame.display.set_mode((800, 480)) pygame.display.set_caption('The Red Robot Radio - Virtualx Game Engine') @@ -81,6 +78,7 @@ class Wallh(pygame.sprite.Sprite): pygame.sprite.Sprite.__init__(self) self.x = xset self.y = yset + self.image = pygame.image.load('sprites/wallh.png') #self.image = pygame.Surface((32, 32)) #self.image.fill(WHITE) #self.rect = self.image.get_rect() # Get rect of some size as 'image'. @@ -93,6 +91,7 @@ class Wallv(pygame.sprite.Sprite): pygame.sprite.Sprite.__init__(self) self.x = xset self.y = yset + self.image = pygame.image.load('sprites/wallv.png') #self.image = pygame.Surface((32, 32)) #self.image.fill(WHITE) #self.rect = self.image.get_rect() # Get rect of some size as 'image'. @@ -209,21 +208,11 @@ while running: dt = clock.tick(FPS) / 1000 #screen.fill(BLACK) datetime.datetime.now() - #bx = 0 - #by = 0 for event in pygame.event.get(): if event.type == pygame.QUIT: quit() elif event.type == pygame.KEYDOWN: - if event.key == pygame.K_w: - by = -1 - elif event.key == pygame.K_s: - by = 1 - elif event.key == pygame.K_a: - bx = -1 - elif event.key == pygame.K_d: - bx = 1 - elif event.key == pygame.K_n: + if event.key == pygame.K_n: pygame.mixer.music.stop() elif event.key == pygame.K_m: pygame.mixer.music.play(-1) @@ -254,16 +243,8 @@ while running: start_time = pygame.time.get_ticks() elif event.key == pygame.K_ESCAPE: quit() - elif event.type == pygame.KEYUP: - if event.key == pygame.K_w: - by = 0 - elif event.key == pygame.K_s: - by = 0 - elif event.key == pygame.K_a: - bx = 0 - elif event.key == pygame.K_d: - bx = 0 if event.type == pygame.MOUSEMOTION: + #This control camera pygame.mouse.set_pos([400, 240]) ax, ay = event.rel bx = ax * 20 @@ -277,19 +258,23 @@ while running: if live: runtime = pygame.time.get_ticks() - start_time if (live & debug == False): - #if pygame.sprite.collide_rect(background, wall3): - # if by < 0: - # by = 0 - #elif pygame.sprite.collide_rect(background, wall4): - # if by > 0: - # by = 0 - #if pygame.sprite.collide_rect(background, wall1): - # if bx < 0: - # bx = 0 - #elif pygame.sprite.collide_rect(background, wall2): - # if bx > 0: - # bx = 0 - if pygame.sprite.collide_rect(player, css1): + if pygame.sprite.collide_rect(player, wall3): + live = False + pygame.mixer.music.stop() + csfx.play() + elif pygame.sprite.collide_rect(player, wall4): + live = False + pygame.mixer.music.stop() + csfx.play() + if pygame.sprite.collide_rect(player, wall1): + live = False + pygame.mixer.music.stop() + csfx.play() + elif pygame.sprite.collide_rect(player, wall2): + live = False + pygame.mixer.music.stop() + csfx.play() + elif pygame.sprite.collide_rect(player, css1): live = False pygame.mixer.music.stop() csfx.play() @@ -310,24 +295,6 @@ while running: complete = True pygame.mixer.music.stop() lcfx.play() - #player.velocity[0] = int(600 * dt * (ax - bx)) - #player.velocity[1] = int(600 * dt * (ay - by)) - #css1.velocity[0] = int(-600 * dt * bx) - #css1.velocity[1] = int(-600 * dt * by) - #css2.velocity = css1.velocity - #sat1.velocity = css1.velocity - #sat2.velocity = css1.velocity - #goal.velocity = css1.velocity - #wall1.velocity = css1.velocity - #wall2.velocity = css1.velocity - #wall3.velocity = css1.velocity - #wall4.velocity = css1.velocity - #ast1.velocity[0] = int(-200 * dt * bx) - #ast1.velocity[1] = int(-200 * dt * by) - #ast2.velocity[0] = int(-150 * dt * bx) - #ast2.velocity[1] = int(-150 * dt * by) - #ast3.velocity[0] = int(-120 * dt * bx) - #ast3.velocity[1] = int(-120 * dt * by) player.update() css1.update() css2.update() @@ -352,6 +319,10 @@ while running: screen.blit(sat1.image, sat1.rect) screen.blit(sat2.image, sat2.rect) screen.blit(goal.image, goal.rect) + screen.blit(wall1.image, wall1.rect) + screen.blit(wall2.image, wall2.rect) + screen.blit(wall3.image, wall3.rect) + screen.blit(wall4.image, wall4.rect) elif complete: playhr = (int(runtime / 3600000)) playmin = (int(runtime / 60000) - (playhr * 60)) diff --git a/sprites/wallh.png b/sprites/wallh.png new file mode 100644 index 0000000000000000000000000000000000000000..06a5018bd433bf7e690e326425a9d3f3514677ba GIT binary patch literal 2868 zcmeAS@N?(olHy`uVBq!ia0vp^MhpzhFF4qMtT{z%QyCZ-3p1Ua12U7785lGsmQJ+w zJ{%y@c7K_dtF~yVK;emiqYGOXDfC6P>$!TZO}MJM(>F@7^P!q+*Xjq40ty6T|498| z-^I0#t7!p;lHWgu{bHIQ?<~8Z^p?~7`NO@>ZSPd;DJiF7ADbZ4qs}p3Ud3ED`^7cuaDxN?N1n|)y=~m*+$+jGSbgO1 znk6C~{vFA4_&jQ~ORhdQKj=DtKg;KsGR6rm{yT3R%HrNEWZtRXxp-M%TJPtM*)68o zm7Sk7)*4!zP-<04S)q~4%ocM*GumYHw|y>mw|Dq{GWd0SMZ@I99YU4KOQx+{?G~vX zyZF3=>zTj*ZDeb!PQ91&W4gP3-gisBmT!$wS3lSJ+paHTV~KCbUj6d^63er7ljCx; zE+#8%Vvf0IV)~U~$1PU3dAY6HrJ5ezmr5TzW_od++4;M}`&ss@kJ+7@-*Csw_M&V- z1&dEWZOUK%oZ$3h6SrwC1I7Vofk$L91B0G22s2hJwJ!sTWqP_ehE&A8oph1&fCEqK zt##A?KF?gJ%yCF?Prba$`*}0JM}3&bYW_#Pbc97snhj?$H?sV;@tDXt2DjO@d zDMid>33C}08V!ljG%=bLMhk_}vT(Fk7_A>in*}Hhq;;B~7+r32Zs=oJ2Wp8ic)I$z JtaD0e0st@`Rbc=C literal 0 HcmV?d00001 diff --git a/sprites/wallh.png~ b/sprites/wallh.png~ new file mode 100644 index 0000000000000000000000000000000000000000..b8e4711fe40b4758202995fe0d5a07f917c9bfb6 GIT binary patch literal 4902 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 LS3j3^P6r$ zvgcVyh;&do2E%cA>u1J&cgFjcIQK7Q)ptzVGs;(29r??nPVZH}j}JY_rEp(a!I1or zikhR{Rqca^W9h5D_{U6JwE95S&5}6r{d3b3OKWo8ha3KVE-=skYUK!K9Q$cg#c%6J zKRVpjoO0~s!oQ_(!AZw#Co=D+cU7DTuvxJ;ZN7228Y#d7to4*!k#C_^3yX zQ=1Bj^S&vMuWt$rZ)zU7yR_+CBz*I*>}pljh8GEW%+4gTuA9Fwv$Szp*NyMr3pkwj zvH0WVoJ;HGEvpWy`Jpp;#l)JSEgq#On#a{2SRjfn@}6D0DL|H;FrjSo2ccPCPWGL- zYV}|EU)XmaNhwvHO4BqH)a{SJhu%K*(aH^k&6n*gc@W3>WI3ISx(p1rt zZ>LqoJHH*cFV-g@xFd2MCFXVS#V;DL9B0jI6)A2 z>Bgl|TQ*G#YT9sU!5{FQ6K#xLNA$- z@XUU%#rAYo{ypP^@qmN$uxO*DQEGttP+r6Ln=p^_0rIj)?s~JlXQq z-tKL))tgnH25wLPWolOW*Dqd%LyVN0&fqi_x+Ja|9EX zEZR8hxS+kB^-#q-`GRd~d|W)znPv_9@gwE^(1TMi#CQ2UUblQ@aoYuH`A31*7qH;& zI}4w*=MMY%iF1e7lZ(F#ub2Hex?yYOeFnoLgpx|tN~!c^wSyY3T35bz^6}UqB~Dqh zbofAd+a3ize-05|nKH&J^thw2Is9Pdv150G_st)5WRZE(U|TWt%qzN}u+|yx<8yG{ z8a%pWt@Gy(p|bFQp1C%9;{jvEt_`zqr8Peq>A5)lb}MV~_D%{b5Jt}ypLMj0Vdqa9 z_J$;mO~0K4|9Zl+-b1{;^)foF^5C(%OS)p0Z#h@dCA<3BWGv^KwL7Y>C7i#atGy6- zyQb-rq^pfCVS>n>j30YXoA?J%(ouawIqTP8P^5p-?m{W2cebDW->*jYSxO=Sk9{$?3 zuu?zXr0;%yg1vsNI<~WT+e6SUf+^4)(p5N|p7K_;kht1)@Km)erne4a&Hrd9~5N-?^X(OzZ#ZH+`5RHjz z%-MDclL^+Lm+=`bD%C4^ldXpZzz5rbTi7TIVH=I?-WE2yJO_aE1oWpCwp7q$*~z5M zoNXmYc@Al^kL?YiC0^NEvaJSJI$DBF8b~8hwE?eaAD0PAmHL$hO@W>=T3l9u>^_=y zO81(qKC#g&u5@|_0?c3G_R)TsyGt2psZ^NEOk~sHDPJ{O*YY(&ov;^_(qyyaCW54)062>RI6{$7hx2$M7}aq|m?svY zuo&l}uttM&2o&L?C>QSqG1W?es>BVwqoSd-07}Ev@DVY}gSi?m0ieV>Si>O*n8a}{ zF2)f;*8`;`uz0i8h=c8O0EAYsxWLA0f-yrC%frYI;I(8!}JzNh9>$a(IO`v@2)*AfJ|$`->3w-Xzl zLuy@)fSr4Z$iz*05}fazf_gbm{mEwO_z1$qNf9j62m~<5QViobDTH+#ff(VSd>&UI z=!+HF>m5kGaOhGoFfLz%?6I@h=_0`VJBx#-yaJE4eA)Hi1jG;n|$A=Lih9FFK zPr_{aRKLtPiv0&pqFf5S+5oU~&w=&=x)u9XyXxVLrtvL4J$vyMJpkx_CvU`WKVAKF zy%7U%q}*R!{dBz%18=0mkQlY{I^m3+`G56>Y(;gtpEq2MlhNhym` p#GWembO{it@Nfy`{V;Exn~WKsd(>=pM(?B