Development #1

Merged
jaffa merged 88 commits from InfoProjekt/game:Development into main 2024-03-07 09:13:31 +01:00
2 changed files with 172 additions and 46 deletions
Showing only changes of commit b29a279fb1 - Show all commits

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)