From e80ce5ad0dab21a47ea1d7dc58d23dea5c929c9f Mon Sep 17 00:00:00 2001 From: Lyzzy Date: Sun, 25 Feb 2024 00:26:31 +0000 Subject: [PATCH 1/5] Dateien nach "/" hochladen --- main.py | 16 +++++-- viecher.py | 134 ++++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 118 insertions(+), 32 deletions(-) diff --git a/main.py b/main.py index bcbf72b..3f18e16 100644 --- a/main.py +++ b/main.py @@ -27,10 +27,11 @@ def quitGame(): quit() def play(screen, clock, running, background, isblack, WIDTH, HEIGHT): - main = [MainCharacter('Herbert', 100, 'reddy.png', 500, 500, 125, 5, 1, 1, 50)] + main = [MainCharacter('Herbert', 100, 'reddy.png', 500, 500, 20, 5, 1, 1, 50)] mobs=[] - mobs.append(Skeleton('s1', 50, 'reddy.png', 250, 250, 125, 5, 1, 1, 200)) - objects = [main,mobs] + mobs.append(Skeleton('s1', 50, 'reddy.png', 250, 250, 125, 1, 1, 1, 200)) + others = [] + objects = [main, mobs, others] while running: screen.fill('#000000') @@ -46,12 +47,19 @@ def play(screen, clock, running, background, isblack, WIDTH, HEIGHT): screen.blit(bg, (0, 0)) """ for thing in objects[0]: - thing.update(pygame.key.get_pressed()) + if thing.update(pygame.key.get_pressed()) ==False: + quitGame() thing.draw(screen) for mob in objects[1]: mob.update(objects) mob.draw(screen) + + for thing in objects[2]: + thing.update(objects) + thing.draw(screen) + + # flip() the display to put your work on screen pygame.display.flip() diff --git a/viecher.py b/viecher.py index ebf6f10..f403dd2 100644 --- a/viecher.py +++ b/viecher.py @@ -1,5 +1,5 @@ -import pygame -vec = pygame.math.Vector2 +import pygame as pg +vec = pg.math.Vector2 fps = 60 class Objects(): @@ -7,12 +7,12 @@ class Objects(): self.name = name self.speed = ms with open(f'art/images/{sprite}') as i: - self.sprite = pygame.image.load(i) + self.sprite = pg.image.load(i) self.x = x self.y = y self.hidden = False - self.rect = pygame.Rect(self.x, self.y, self.sprite.get_width(), self.sprite.get_height()) + self.rect = pg.Rect(self.x, self.y, self.sprite.get_width(), self.sprite.get_height()) def draw(self, screen): if self.hidden: @@ -33,6 +33,11 @@ class Fighter(Objects): self.level = level self.attack_speed = asp self.attack_range = atr + self.lastHurt = pg.time.get_ticks() + self.lastAttack = pg.time.get_ticks() + self.hurtCooldown = 1000 + + class MainCharacter(Fighter): def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, weapon=None, shield=None) -> None: @@ -40,25 +45,87 @@ class MainCharacter(Fighter): self.attack_spell = weapon self.shield_spell = shield self.talking = False + self.health = Hearts(health, sprite=['fullheart.png','fullheart.png','fullheart.png','fullheart.png','fullheart.png'], x=900, y= 50) + + def draw(self, screen): + if self.hidden: + return + self.rect.x, self.rect.y = self.x, self.y + screen.blit(self.sprite, self.rect) + self.health.draw(screen) - def update(self, keys): + def hurt(self,damage): + self.health.hurt(damage) + + def walk(self,keys): moveto=vec(0,0) - if keys[pygame.K_w] or keys[pygame.K_UP]: + if keys[pg.K_w] or keys[pg.K_UP]: moveto += vec(0,-1) - if keys[pygame.K_a] or keys[pygame.K_LEFT]: + if keys[pg.K_a] or keys[pg.K_LEFT]: moveto += vec(-1,0) - if keys[pygame.K_s] or keys[pygame.K_DOWN]: + if keys[pg.K_s] or keys[pg.K_DOWN]: moveto += vec(0,1) - if keys[pygame.K_d] or keys[pygame.K_RIGHT]: + if keys[pg.K_d] or keys[pg.K_RIGHT]: moveto += vec(1,0) if not moveto == vec(0,0): moveto.scale_to_length(self.speed) self.x += moveto[0] / fps self.y += moveto[1] / fps + + def update(self, keys): + self.walk(keys) + if self.health.health <= 0: + return False + else: + return True + +class Hearts(): + def __init__(self, health, sprite, x, y) -> None: + self.x = x + self.y = y + self.health = health + self.lastHurt = pg.time.get_ticks() + self.hurtCooldown = 1000 + self.hidden = False + self.sprite=[] + for parts in sprite: + with open(f'art/images/{parts}') as i: + self.sprite.append(pg.image.load(i)) + self.rect=[] + for each in self.sprite: + self.rect.append(pg.Rect(self.x, self.y, each.get_width(), each.get_height())) + def hurt(self,damage): + if self.lastHurt + self.hurtCooldown < pg.time.get_ticks(): + self.health -= damage + self.lastHurt = pg.time.get_ticks() + self.update() - - + def draw(self, screen): + if self.hidden: + return + for i in range(0,5): + self.rect[i].x, self.rect[i].y = self.x+i*20, self.y + screen.blit(self.sprite[i], self.rect[i]) + + def update(self): + sprite = [] + for i in range(0,5): + if self.health >= 4+4*i: + sprite.append('fullheart.png') + elif self.health == 3+4*i: + sprite.append('dreiviertelheart.png') + elif self.health >= 2+4*i: + sprite.append('halfheart.png') + elif self.health >= 1+4*i: + sprite.append('viertelheart.png') + elif self.health <= 4*i: + sprite.append('noheart.png') + self.sprite=[] + for parts in sprite: + with open(f'art/images/{parts}') as i: + self.sprite.append(pg.image.load(i)) + class Mobs(Fighter): def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, drops) -> None: super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr) @@ -67,9 +134,8 @@ class Mobs(Fighter): class Skeleton(Mobs): def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, drops=0) -> None: super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr, drops) - self.canAttack=True - def follow(self,obj): + def chase(self,obj): x=obj[0][0].x y=obj[0][0].y moveto = vec(x,y) - vec(self.x,self.y) @@ -81,28 +147,40 @@ class Skeleton(Mobs): self.attack(moveto,obj) def attack(self,moveto,obj): - if self.canAttack==True: - obj[1].append(Arrow("arrow",100,self.x,self.y,moveto)) - self.canAttack=False - - def cooldown(self): - pass - + if self.lastAttack+self.attack_speed*1000 None: + def __init__(self, name, ms, sprite, x, y, moveto, damage) -> None: super().__init__(name, ms, sprite, x, y) + self.moveto = moveto + self.damage = damage + class Arrow(Weapons): - def __init__(self, name, ms, x, y, moveto, sprite="textbox.png") -> None: - super().__init__(name, ms, sprite, x, y, moveto) - self.moveto = moveto - - def update(self,objects): + def __init__(self, name, ms, x, y, moveto, damage, sprite="arrow.png") -> None: + super().__init__(name, ms, sprite, x, y, moveto, damage) + pos = vec(x,y) + angle = pos.angle_to(moveto) + with open(f'art/images/{sprite}') as i: + self.sprite = pg.transform.rotate(pg.image.load(i), angle) + + def move(self): self.moveto.scale_to_length(self.speed) self.x += self.moveto[0]/fps - self.y += self.moveto[1]/fps \ No newline at end of file + self.y += self.moveto[1]/fps + + def die(self,objects): + touches=pg.sprite.spritecollideany(self,objects[0]) + if touches is not None and isinstance(touches, MainCharacter): + touches.hurt(self.damage) + self.hidden=True + + def update(self,objects): + self.move() + self.die(objects) \ No newline at end of file -- 2.45.3 From f9ede25093c5dc6cd5e58e269a1299934e150451 Mon Sep 17 00:00:00 2001 From: Lyzzy Date: Sun, 25 Feb 2024 00:35:29 +0000 Subject: [PATCH 2/5] Dateien nach "art/images" hochladen --- art/images/arrow.png | Bin 0 -> 255 bytes art/images/dreiviertelheart.png | Bin 0 -> 450 bytes art/images/fullheart.png | Bin 0 -> 433 bytes art/images/halfheart.png | Bin 0 -> 462 bytes art/images/noheart.png | Bin 0 -> 438 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 art/images/arrow.png create mode 100644 art/images/dreiviertelheart.png create mode 100644 art/images/fullheart.png create mode 100644 art/images/halfheart.png create mode 100644 art/images/noheart.png diff --git a/art/images/arrow.png b/art/images/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..ede5aaf94fb3487c541603df4f4eb684cda254cd GIT binary patch literal 255 zcmVQ?f(d z`ok)^(t@__kB~^1jMqFE)j&Rh5r7224+uuMi6H_&Dh0=R4~YT<37+Zs!yJx}>pl;& zcm%OPN4BA454LvVKk$|(t~axZ45X!4+us=cSjm4AfjdP;I}seF?*IS*002ovPDHLk FV1nK+WM2RP literal 0 HcmV?d00001 diff --git a/art/images/dreiviertelheart.png b/art/images/dreiviertelheart.png new file mode 100644 index 0000000000000000000000000000000000000000..0b455ebcc6655c26beeee0da3616b1723d339331 GIT binary patch literal 450 zcmV;z0X_bSP)Cn`~Hi&+g9u&o}3s5llE_LOuT1pp{wG@=Fs|Jsi<$UgdsaWoy6N#0TG}`LP1j z2dNW+)?z^qI}PL%#Io?>@t_7qTrrP`njRwOaA7Sf&Lt*^!H$9EDW(P~C!DVE#^Rj@ zb2PBDh+Pk`4tIYm3Y`-+lns3 zz!Nh?p%@Qw22((h>|EZWLyQn!@pc^lBw*^6h);T?nL;6m_lAfxGJ>@k;p!f@f!hme zs(t!o3pcF5!P6P?G=T`wm1g|yf%SRC$t$UxqHVNao$pEv^}#L^$;=@aguFIqNy50^ z4bu(UUQrFp4~&sUYGn#qem;jW4q1vKiY`eLCLRqCk0ls%F0rCwOg|?f6IB5$?&S6XpWhfeP26+C)#5WU=1)w6ZJmKOEDFvnis0ld?2->oM4<%U)4|LZK zU*#_VRdH4b9w`b9+zs3mZmXLeVu;f{hwGPs5rHk^MiOu#Vuw+xiZn=JW?@F-rwl#a zO(_YCA7g*aRvgepJ4rydHPS)CE$ z;WZXxINLW|y|N#4H)7toc&UUKRJ=3KtT_U_cR1gr69T$#F{{Uzz-DYpVyz9*FjKMy z?>%@$fue0*-GD$=gm$9obHsB-yxyM359wVrAhwL`f?;Z=tDu1)HF65J(|d+bI^d2Fp|y7Meg13xBX% z*pR!|vkAl`MiAoevhxGyn{)2oHCXU63+nN|fXCvFo_w@mlw6}|N@AW@EBnWvZ8*d< zn?Xb3t4Y^m2Tv5AzO_(Nz(S!8c;T!M@tc%K86YI18v@Np#*i_f=Ab32ECe|o(I-fa zMK)_Z1_J6338{Q~oHt|y83PUsv`p)PGcdvhZ^IZlYdx9hhk{*FZr*`=7vfB!82}w@ zke5&#a#Slwcw9a&ei)y-l9GZL_Z-e*Oap3gx@J?`ilrp2AzuuXb9s+Uj4E?oM}l4& zgKiqp44_lo*81Bm%B%yUBbNxQbI1a|x+1vz4B;fg1NG-J5>M42UDTXaWrT8C8AA37 z95UiBn0q-0(7}Kwe}91=fOMl%tZ4oHjx)tN;}itGJ*)sLkMEP`I+$#bLs*41h)v)_ z_CO;ZRekpQwUxVRSH8Be1>=t}ZF_Df&ZGZjZ{eTm3zs^S5p2j|j{pDw07*qoM6N<$ Ef-L{SrT_o{ literal 0 HcmV?d00001 diff --git a/art/images/noheart.png b/art/images/noheart.png new file mode 100644 index 0000000000000000000000000000000000000000..a02db39f5f7940b7fd9c8705e90d2b3dda36c9af GIT binary patch literal 438 zcmV;n0ZIOeP) z#ew{%@jNAkV6NJo-TCJKXZC8i@~d5$kN*YCqON=RngVJN#ABp*THdr>-@oi)U@T*- zs=8FLNIGut`HWjtYz3$*FoVE|L2Nv1V9+Su85?>nAtfLMT$7i909&{4L1C;wf`@04 zC2>PY!z$(hrII5+2w+v_Kw+7}4PhH&&-?+W(im(J=b54 z(IkK~fEZTvY#tNtV!?RDI19|ZVu<4;PToOk;n*>>3Jt8Qc7rYlki%zZ$H;{;AD z9A>*n+HUai%B@FCzcJ@Or{}`P!S|o<;QUFaR@^Q|$;D{0%Iq%!6c4Mvo}xuB_h+&% g0$lo&UHvot0RPpK5lt+EVgLXD07*qoM6N<$f@Yh-D*ylh literal 0 HcmV?d00001 -- 2.45.3 From 2d3161482f60089751e4fc89d127ee7919b1914c Mon Sep 17 00:00:00 2001 From: Lyzzy Date: Sun, 25 Feb 2024 00:35:57 +0000 Subject: [PATCH 3/5] Dateien nach "art/images" hochladen --- art/images/viertelheart.png | Bin 0 -> 441 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 art/images/viertelheart.png diff --git a/art/images/viertelheart.png b/art/images/viertelheart.png new file mode 100644 index 0000000000000000000000000000000000000000..de0043d1b4e8fd12835cc5894dc746acc12248f7 GIT binary patch literal 441 zcmV;q0Y?6bP)Q;;!dDmD)sPsHsD?m7l3Yz z`)t&!2%f74_ICP!U1~k0AiQ~HfC@=7fTqSLBf?l~bVOE=72sUK1|GN8qD;sqmx=OF zROKclhS35MASP=}Tu0`StN<5U+dUeTXvi2~83LW5DAG(9;-gWE(VNH|fE?h=Q+D5F zns_KXte3#CipFbx#e$M(L@pDajrmyvw2TgeMRiQ<7PO=&rLYDK1N5S~*j;z?DZJH= z!mG&uflk#h4&aK%#2XcgXY(|k29wf%FHhqdFd{n1Cj8Musp j1}E=myZ=I-{-6Cf+p~%hpIyjB00000NkvXXu0mjf57)zb literal 0 HcmV?d00001 -- 2.45.3 From d731f4f63ded068911f702850bdd005ab67d27b3 Mon Sep 17 00:00:00 2001 From: Lyzzy Date: Sun, 25 Feb 2024 10:11:37 +0000 Subject: [PATCH 4/5] Dateien nach "/" hochladen --- main.py | 8 +++---- viecher.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 5 deletions(-) diff --git a/main.py b/main.py index 3f18e16..1b5aea7 100644 --- a/main.py +++ b/main.py @@ -2,6 +2,7 @@ import pygame import sys import json import time +import random from classes import * from viecher import * fps = 60 @@ -27,9 +28,8 @@ def quitGame(): quit() def play(screen, clock, running, background, isblack, WIDTH, HEIGHT): - main = [MainCharacter('Herbert', 100, 'reddy.png', 500, 500, 20, 5, 1, 1, 50)] - mobs=[] - mobs.append(Skeleton('s1', 50, 'reddy.png', 250, 250, 125, 1, 1, 1, 200)) + main = [MainCharacter('Herbert', 100, 'oldman.png', 500, 500, 20, 5, 1, 1, 50)] + mobs=[Skeleton(i, 50, 'reddy.png', random.randint(20,1000), random.randint(20,700), 125, 1, 1, 1, 200) for i in range(0,random.randint(2,8))] others = [] objects = [main, mobs, others] @@ -48,7 +48,7 @@ def play(screen, clock, running, background, isblack, WIDTH, HEIGHT): """ for thing in objects[0]: if thing.update(pygame.key.get_pressed()) ==False: - quitGame() + menu(screen, clock, running, background, isblack, WIDTH, HEIGHT) thing.draw(screen) for mob in objects[1]: diff --git a/viecher.py b/viecher.py index f403dd2..2fb3f8e 100644 --- a/viecher.py +++ b/viecher.py @@ -2,6 +2,40 @@ import pygame as pg vec = pg.math.Vector2 fps = 60 + +pg.font.init() +fonts = { + 'medieval': 'medieval.ttf', + 'minecraft': 'Minecraft Evenings.otf', + '3dpixel': '3D-Pixel.ttf', + '8bit': '8bitlim.ttf', + '8bito': '8blimro.ttf', + 'arcade': 'ARCADECLASSIC.ttf', + 'modern_game': 'astron boy video.otf', + 'modern': 'astron boy.otf', + 'wonder': 'Beyond Wonderland.ttf', + 'curved': 'Digitag.ttf', + 'simple': 'DisposableDroidBB.ttf', + 'rounded': 'dpcomic.ttf', + 'playfull': 'Endalian Script.ttf', + 'blocky': 'FREAKSOFNATURE.ttf', + 'catchy': 'Future TimeSplitters.otf', + 'simple_wide': 'Halo3.ttf', + 'simple_fat': 'INVASION2000.ttf', + 'very_gamy': 'ka1.ttf', + 'simple_round': 'Karma Suture.otf', + 'mono': 'manaspc.ttf', + 'damaged': 'Merchant Copy.ttf', + 'big_natural': 'MorialCitadel.TTF', + 'spacy': 'nasalization-rg.otf', + 'sci-fi': 'neuropol.otf', + 'hollow_big_edge': 'papercut.ttf', + 'space_shuttle': 'pdark.ttf', + 'thin': 'PixelFJVerdana12pt.ttf', + 'random': 'Seattle Avenue.ttf', + 'pixel': 'yoster.ttf' +} + class Objects(): def __init__(self, name, ms, sprite, x, y) -> None: self.name = name @@ -45,6 +79,7 @@ class MainCharacter(Fighter): self.attack_spell = weapon self.shield_spell = shield self.talking = False + self.level = Level(1000, 38, level, 150, 40, f'will to live: {level}%', 'simple', 20) self.health = Hearts(health, sprite=['fullheart.png','fullheart.png','fullheart.png','fullheart.png','fullheart.png'], x=900, y= 50) def draw(self, screen): @@ -53,6 +88,7 @@ class MainCharacter(Fighter): self.rect.x, self.rect.y = self.x, self.y screen.blit(self.sprite, self.rect) self.health.draw(screen) + self.level.draw(screen) def hurt(self,damage): self.health.hurt(damage) @@ -125,6 +161,29 @@ class Hearts(): for parts in sprite: with open(f'art/images/{parts}') as i: self.sprite.append(pg.image.load(i)) + + +class Level(): + def __init__(self, x, y, level, width, height, text, font, font_size) -> None: + self.x = x + self.y = y + self.level = level + self.width = width + self.height = height + self.font = pg.font.Font(f'fonts/{fonts[font]}', font_size) + self.hidden = False + with open('art/images/label.png', 'r') as tb: + self.box = pg.image.load(tb) + self.box = pg.transform.scale(self.box, (width, height)) + self.labelRect = pg.Rect(self.x, self.y, self.width, self.height) + self.labelSurf = self.font.render(text, True, '#1E90FF') + + def draw(self, screen): + self.box.blit(self.labelSurf, [ + self.labelRect.width/2 - self.labelSurf.get_rect().width/2, + self.labelRect.height/2 - self.labelSurf.get_rect().height/2 + ]) + screen.blit(self.box, self.labelRect) class Mobs(Fighter): def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, drops) -> None: @@ -165,7 +224,7 @@ class Weapons(Objects): class Arrow(Weapons): def __init__(self, name, ms, x, y, moveto, damage, sprite="arrow.png") -> None: super().__init__(name, ms, sprite, x, y, moveto, damage) - pos = vec(x,y) + pos = vec(1,0) angle = pos.angle_to(moveto) with open(f'art/images/{sprite}') as i: self.sprite = pg.transform.rotate(pg.image.load(i), angle) -- 2.45.3 From 69cc080ea94fba2e1fb291d4b8daa267c5608689 Mon Sep 17 00:00:00 2001 From: Lyzzy Date: Sun, 25 Feb 2024 10:14:07 +0000 Subject: [PATCH 5/5] Label und Oldman added --- art/images/label.png | Bin 0 -> 635 bytes art/images/oldman.png | Bin 0 -> 674 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 art/images/label.png create mode 100644 art/images/oldman.png diff --git a/art/images/label.png b/art/images/label.png new file mode 100644 index 0000000000000000000000000000000000000000..9631a74403dffe492a8f933a56261b1b6cb95b59 GIT binary patch literal 635 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!3HF6DHW(PFfit3Iy(nsCMPp6Xq=xq(b}8Y zQKWUhi)xZkkcLLmM5QiQrbP{BHnw%5oBzO898|SvBUe^OoTRw*V;NK#e zBg*0^=%TZ>)>P=4b*F%!?wr(bb#rbO?<^LZW6ZiXW1GLz#uUkm9yj(+i1@O5UcsZI zzWNK7q`lg_@ufxmy6@65tK!;2^#5(Y^Rj1UR0i7i?6*~_XLW_iSdbWi@wd4D;4%%W+FfN zmVPzEWDUVXKRg2yTbaZZSE`~CyscI(YMPUqvzx%+vVvbkTG-u`E?;q5QQEq4z`u6(NR?I)bS=z3IC0)Nfx zf}(quf^HY=VyrE%y5wQD#O&s|9I<)*2WL0D(|!?^mG-st+(q3Z*Pn>T9y+JTbMpJX zr~b0+8R8!@e{KbaKWBkQWHAGS$_o%?Y)WR80Sa#Mba4!+h0Qif@9tDj`!pl})>G5FA7UnLP->{Gx)P}J_T?|$1kLxq zqFH?RxiIWJ*L3SH!_qyEt{6VObNuH{#yU2G{_j7oZQSzwwjRTL1`Fl}V-kt$hZ6s- qYwbR`wV?Gao51;RELS2eG}qpmPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0yjxSK~zXf&67W9 zQ&AMg&r3CV4s8UB7DU9h&`B*qw`y^T6ciD~!L0;JO9aJ5P})JUs0fN0iqcHd#Z4SU zm$rjLi9`QDOVO5gGZ2Tgh!K$|-^o4Klbd$~ZvNnM&i(V9^WB>l`aj9#a#36q0uvj^ zX0uVDPzVsiFf^+~)oPWnjy%CDF+hM$h!6<6P^=gtEdVk{6#KEZW%JfRn&&PDFHiVw z=kxixq7!o!8zl!`+a{%fuJv-|2gmmG9&6hx22uczq+eOC<^8FS zJRFFms|ej+V3&#XV&tN|C%8{#jwmqxzQi8}oah4F8N!zB5@B2m7CGKt_)YzrANkOo zGY6>i%~>u!ot)z}z}}~>^z+8m^j8FWUg@B|(|w#@*#DWMuzO!fThj|vo%|9c#I6Vd zgm_g95UuTS)P$qmQ34h<^C!-kjHozYq?_+j6!f&36{26?oI7iz*OU`pZRI2*9RZv$lEW0f*$EMClG1#BNuYuA>_!ixEp@ z>C}t{F)C|o&4|6Tw$_ZM5BASwGMNa&OzUv>yq$doKy8oc54G#=clxd)hX4Qo07*qo IM6N<$g2+QXZ~y=R literal 0 HcmV?d00001 -- 2.45.3