Gegner Schaden, Buch, Main Angriff, NPC

Dem Gegner kann jetzt durch Main Angriff Schaden zugefügt werden und er kann sterben
Das Buch kann durch Drücken von e geöffnet werden, das Spiel hält an
Der Main kann (nachdem mit NPC geredet) Feuerbälle mit f schießen (Schussrichtung adden!!)
Ein NPC wurde hinzugefügt, der steht. Main redet automatisch mit ihm wenn main reinläuft. Durch Leertaste wird Unterhaltung beendet.
This commit is contained in:
Lyzzy 2024-03-01 21:56:14 +00:00
parent f6827b5f05
commit b29a279fb1
2 changed files with 172 additions and 46 deletions

28
main.py
View file

@ -39,9 +39,11 @@ def genRooms(WIDTH, HEIGHT, type:str):
def play(screen, clock, running, background, isblack, WIDTH, HEIGHT): def play(screen, clock, running, background, isblack, WIDTH, HEIGHT):
main = [MainCharacter('Herbert', 100, 'oldman.png', 500, 500, 20, 5, 1, 1, 50)] main = [MainCharacter('Herbert', 100, 'oldman.png', 500, 500, 20, 5, 1, 1, 50)]
mobs=[Skeleton(i, random.randint(40, 60), 'reddy.png', random.randint(20,1000), random.randint(20,700), 125, 1, 1, 1, 200) for i in range(0,random.randint(2, 8))] mobs = [Skeleton(i, random.randint(40, 60), 'reddy.png', random.randint(20,1000), random.randint(20,700), 5, 1, 1, 1, 200) for i in range(0,random.randint(2, 8))]
others = [] others = []
objects = [main, mobs, others] npcs = [NPC('name', 100, 'reddy.png', 1, 200, 200)]
objects = [main, mobs, npcs, others]
freeze = False #Gameplay is freezed in certain situations
while running: while running:
screen.fill('#000000') screen.fill('#000000')
@ -49,6 +51,9 @@ def play(screen, clock, running, background, isblack, WIDTH, HEIGHT):
for event in events: for event in events:
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
quitGame() quitGame()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_e: #when book is open gameplay is freezed
freeze = not freeze
# RENDER YOUR GAME HERE # RENDER YOUR GAME HERE
"""with open(background, 'r') as i: """with open(background, 'r') as i:
bg = pygame.image.load(i) bg = pygame.image.load(i)
@ -56,8 +61,10 @@ def play(screen, clock, running, background, isblack, WIDTH, HEIGHT):
# fill the screen with an image to clear the screen # fill the screen with an image to clear the screen
screen.blit(bg, (0, 0)) screen.blit(bg, (0, 0))
""" """
if not freeze:
for thing in objects[0]: for thing in objects[0]:
if not thing.update(pygame.key.get_pressed()): thing.book.hidden = not freeze
if not thing.update(pygame.key.get_pressed(), objects):
menu(screen, clock, running, background, isblack, WIDTH, HEIGHT) menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
thing.draw(screen) thing.draw(screen)
@ -65,11 +72,17 @@ def play(screen, clock, running, background, isblack, WIDTH, HEIGHT):
mob.update(objects) mob.update(objects)
mob.draw(screen) mob.draw(screen)
for thing in objects[2]: for npc in objects[2]:
npc.update(pygame.key.get_pressed(), objects)
npc.draw(screen)
for thing in objects[3]:
thing.update(objects) thing.update(objects)
thing.draw(screen) thing.draw(screen)
else:
objects[0][0].book.hidden = not freeze
objects[0][0].book.draw(screen)
objects[0][0].book.update()
# flip() the display to put your work on screen # flip() the display to put your work on screen
pygame.display.flip() pygame.display.flip()
@ -170,8 +183,9 @@ def main():
#objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 - 72, 160, 64, 'medieval', 48, "Play", play)) #objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 - 72, 160, 64, 'medieval', 48, "Play", play))
#objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2, 160, 64, 'medieval', 48, "Options", uwu)) #objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2, 160, 64, 'medieval', 48, "Options", uwu))
#objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 + 72, 160, 64, 'medieval', 48, "Exit game", quitGame)) #objects.append(Button(WIDTH / 2 - 80, HEIGHT / 2 + 72, 160, 64, 'medieval', 48, "Exit game", quitGame))
test(screen, clock, running, background, isblack, WIDTH, HEIGHT)
menu(screen, clock, running, background, isblack, WIDTH, HEIGHT) menu(screen, clock, running, background, isblack, WIDTH, HEIGHT)
test(screen, clock, running, background, isblack, WIDTH, HEIGHT)
"""while running: """while running:
for event in pygame.event.get(): for event in pygame.event.get():
if event.type == pygame.QUIT: if event.type == pygame.QUIT:

View file

@ -45,7 +45,6 @@ class Objects():
self.x = x self.x = x
self.y = y self.y = y
self.hidden = False self.hidden = False
self.rect = pg.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): def draw(self, screen):
@ -54,9 +53,59 @@ class Objects():
self.rect.x, self.rect.y = self.x, self.y self.rect.x, self.rect.y = self.x, self.y
screen.blit(self.sprite, self.rect) screen.blit(self.sprite, self.rect)
class NPC(Objects): class NPC(Objects):
pass def __init__(self, name, ms, sprite, convo_act, x, y) -> None:
self.talking = False
self.hidden = True
super().__init__(name, ms, sprite, x, y)
self.conversation = Convo('Hello, you can shoot fireballs with f now.', convo_act, 'person')
def talk(self, objects):
self.talking = True
objects[0][0].talking = True
self.conversation.hidden = False
def draw(self, screen):
super().draw(screen)
if self.talking == True:
self.conversation.draw(screen)
def update(self, keys, objects):
if self.talking:
self.conversation.update(keys, objects)
class Convo():
def __init__(self, text, convo_act, person, x = 140, y = 600, width = 1000, height = 100, font='simple', font_size = 20) -> None:
self.x = x
self.y = y
self.width = width
self.height = height
self.hidden = False
self.font = pg.font.Font(f'fonts/{fonts[font]}', font_size)
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):
if self.hidden:
return
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)
def update(self, keys, objects):
if keys[pg.K_SPACE]:
objects[0][0].book.addspell('fireball')
self.talking = False
objects[0][0].talking = False
self.hidden = True
class Fighter(Objects): class Fighter(Objects):
@ -69,18 +118,16 @@ class Fighter(Objects):
self.attack_range = atr self.attack_range = atr
self.lastHurt = pg.time.get_ticks() self.lastHurt = pg.time.get_ticks()
self.lastAttack = pg.time.get_ticks() self.lastAttack = pg.time.get_ticks()
self.hurtCooldown = 250 self.hurtCooldown = 0
class MainCharacter(Fighter): class MainCharacter(Fighter):
def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, weapon=None, shield=None) -> None: def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr) -> None:
super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr) super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr)
self.attack_spell = weapon self.book = Book(0, 0, [], None, None)
self.shield_spell = shield
self.talking = False self.talking = False
self.level = Level(1000, 38, level, 150, 40, f'will to live: {level}%', 'simple', 20) 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) self.health = Hearts(health, sprite=['fullheart.png', 'fullheart.png', 'fullheart.png', 'fullheart.png', 'fullheart.png'], x=900, y= 50, hurtCooldown=self.hurtCooldown)
def draw(self, screen): def draw(self, screen):
if self.hidden: if self.hidden:
@ -89,8 +136,10 @@ class MainCharacter(Fighter):
screen.blit(self.sprite, self.rect) screen.blit(self.sprite, self.rect)
self.health.draw(screen) self.health.draw(screen)
self.level.draw(screen) self.level.draw(screen)
self.book.draw(screen)
def hurt(self, damage): def hurt(self, damage, objects):
if not self.talking:
self.health.hurt(damage) self.health.hurt(damage)
def walk(self, keys, objects): def walk(self, keys, objects):
@ -109,23 +158,37 @@ class MainCharacter(Fighter):
self.y += moveto[1] / fps self.y += moveto[1] / fps
touches = pg.sprite.spritecollideany(self, objects[1] + objects[2]) touches = pg.sprite.spritecollideany(self, objects[1] + objects[2])
if touches is not None: if touches is not None:
self.x -= moveto[0] / fps #change later self.x -= moveto[0]*1.5 / fps #change later
self.y -= moveto[1] / fps #change later self.y -= moveto[1]*1.5 / fps #change later
if isinstance(touches, NPC):
touches.talk(objects)
def attack(self, obj, moveto = vec(0,1)):
if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks():
if self.book.current_sp == 'fireball':
weapon = Fireball('fb1', 100, self.x, self.y, moveto, 5)
else:
return
obj[3].append(weapon)
self.lastAttack = pg.time.get_ticks()
def update(self, keys, objects): def update(self, keys, objects):
if not self.talking:
self.walk(keys, objects) self.walk(keys, objects)
if keys[pg.K_f]:
self.attack(objects)
if self.health.health <= 0: if self.health.health <= 0:
return False return False
else: else:
return True return True
class Hearts(): class Hearts():
def __init__(self, health, sprite, x, y) -> None: def __init__(self, health, sprite, x, y, hurtCooldown) -> None:
self.x = x self.x = x
self.y = y self.y = y
self.health = health self.health = health
self.lastHurt = pg.time.get_ticks() self.lastHurt = pg.time.get_ticks()
self.hurtCooldown = 1000 self.hurtCooldown = hurtCooldown
self.hidden = False self.hidden = False
self.sprite=[] self.sprite=[]
for parts in sprite: for parts in sprite:
@ -189,6 +252,32 @@ class Level():
]) ])
screen.blit(self.box, self.labelRect) screen.blit(self.box, self.labelRect)
class Book():
def __init__(self, x, y, spells, current_spell, current_shield) -> None:
with open(f'art/images/book.png') as i:
self.sprite = pg.image.load(i)
self.sprite = pg.transform.scale(self.sprite, (1280, 720))
self.x = x
self.y = y
self.hidden = True
self.rect = pg.Rect(self.x, self.y, self.sprite.get_width(), self.sprite.get_height())
self.sp_list = spells
self.current_sp = current_spell
def draw(self, screen):
if self.hidden:
return
self.rect.x, self.rect.y = self.x, self.y
screen.blit(self.sprite, self.rect)
def addspell(self, spell):
if spell not in self.sp_list:
self.sp_list.append(spell)
self.current_sp = spell
def update(self):
pass
class Mobs(Fighter): class Mobs(Fighter):
def __init__(self, name, ms, sprite, x, y, health, damage, level, asp, atr, drops) -> None: 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) super().__init__(name, ms, sprite, x, y, health, damage, level, asp, atr)
@ -211,9 +300,15 @@ class Skeleton(Mobs):
def attack(self, moveto, obj): def attack(self, moveto, obj):
if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks(): if self.lastAttack + self.attack_speed * 1000 < pg.time.get_ticks():
obj[1].append(Arrow("arrow", 200, self.x, self.y, moveto, self.damage)) obj[3].append(Arrow("arrow", 200, self.x, self.y, moveto, self.damage))
self.lastAttack = pg.time.get_ticks() self.lastAttack = pg.time.get_ticks()
def hurt(self, damage, objects):
self.health -= damage
if self.health <= 0:
self.hidden = True
objects[1].remove(self)
def update(self, obj): def update(self, obj):
self.chase(obj) self.chase(obj)
@ -223,27 +318,44 @@ class Weapons(Objects):
super().__init__(name, ms, sprite, x, y) super().__init__(name, ms, sprite, x, y)
self.moveto = moveto self.moveto = moveto
self.damage = damage self.damage = damage
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(1,0) pos = vec(1,0)
angle = pos.angle_to(moveto) angle = pos.angle_to(moveto)
with open(f'art/images/{sprite}') as i: with open(f'art/images/{sprite}') as i:
self.sprite = pg.transform.rotate(pg.image.load(i), -angle) self.sprite = pg.transform.rotate(pg.image.load(i), -angle)
def die(self, objects, kills):
touches = pg.sprite.spritecollideany(self, objects[0] + objects[1])
if touches is not None and isinstance(touches, kills):
touches.hurt(self.damage, objects)
self.hidden = True
objects[3].remove(self)
class Spells(Weapons):
def __init__(self, name, ms, sprite, x, y, moveto, damage) -> None:
super().__init__(name, ms, sprite, x, y, moveto, damage)
class Fireball(Spells):
def __init__(self, name, ms, x, y, moveto, damage, sprite = 'fireball.png') -> None:
super().__init__(name, ms, sprite, x, y, moveto, damage)
def move(self): def move(self):
self.moveto.scale_to_length(self.speed) self.moveto.scale_to_length(self.speed)
self.x += self.moveto[0] / fps self.x += self.moveto[0] / fps
self.y += self.moveto[1] / fps self.y += self.moveto[1] / fps
def die(self, objects): def update(self, objects):
touches = pg.sprite.spritecollideany(self, objects[0]) self.move()
if touches is not None and isinstance(touches, MainCharacter): self.die(objects, Mobs)
touches.hurt(self.damage)
self.hidden = True 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)
def move(self):
self.moveto.scale_to_length(self.speed)
self.x += self.moveto[0] / fps
self.y += self.moveto[1] / fps
def update(self, objects): def update(self, objects):
self.move() self.move()
self.die(objects) self.die(objects, MainCharacter)