Compare commits

..

3 commits

Author SHA1 Message Date
19d6a0f604 Corrected some imports. 2024-02-25 15:09:15 +01:00
eca611ea34 Removed some global statements that i forgot to remove. 2024-01-31 15:53:46 +01:00
a45b823879 Converted cowyeet.py to OOP.
Working! (⌐■_■)
2024-01-31 15:49:57 +01:00

View file

@ -3,8 +3,8 @@
import os import os
import pygame import pygame
import numpy import numpy
from tools import pg # if you import pg from tools, you dont need to init pygame. from wobbl_tools import pg # if you import pg from tools, you dont need to init pygame.
from tools.file_dict import FileDict from wobbl_tools.data_file import DictFile
from physics.parabelfunc import berechneflugbahn from physics.parabelfunc import berechneflugbahn
@ -14,386 +14,337 @@ FPS = 60
SAVE_SETTINGS_ON_EXIT = True SAVE_SETTINGS_ON_EXIT = True
pygame.init() # pygame initialization class Cowyeet:
screen = pygame.display.set_mode(DEFAULT_WINDOW_SIZE) def __init__(self):
pygame.display.set_caption("Cowyeet 2.0") self.DEFAULT_WINDOW_SIZE = DEFAULT_WINDOW_SIZE
self.FPS = FPS
self.SAVE_SETTINGS_ON_EXIT = SAVE_SETTINGS_ON_EXIT
if os.path.isfile("settings.txt"): # If the settings exist, load them into a dict. Else create the settings with the default values. pygame.init() # pygame initialization
settings = FileDict("settings.txt") self.screen = pygame.display.set_mode(DEFAULT_WINDOW_SIZE)
pygame.display.set_caption("Cowyeet 2.0")
else: self.settings = self.load_settings()
settings = FileDict()
settings.path = "settings.txt"
settings["win_size"] = DEFAULT_WINDOW_SIZE
settings["level_size_multiplier"] = 1
settings.save()
# loading screen self.draw_loading_screen()
default_font = pygame.font.SysFont("ubuntu", 16)
loading_text = default_font.render("Loading...", True, (240, 240, 240))
screen.fill((40, 40, 40)) # variables
screen.blit(loading_text, (400 - loading_text.get_width() / 2, 300 - loading_text.get_height() / 2)) self.nero = (40, 40, 40) # colors (color names by https://www.color-blindness.com/color-name-hue/)
pygame.display.update() self.dim_gray = (100, 100, 100)
# /loading screen self.summer_sky = (50, 200, 220)
self.white_smoke = (240, 240, 240)
self.buttons = [] # misc
self.text_buttons = []
self.active_buttons = []
self.last_frame_mouse_pressed = False
self.page = "main_menu"
self.level = None
self.level_data = None
self.lvl_width = None
self.level_surface = None
self.cow_throwable = False
self.cow_flying = False
self.cow_position = (0, 0)
self.cow_flight_path = []
self.cow_flight_step = 0
self.pressed_keys = []
self.pressed_special_keys = pygame.key.get_mods()
# functions # pygame objects
self.clock = pygame.time.Clock() # misc
self.mouse = pygame.mouse
self.keyboard = pygame.key
# images self.bigger_default_font = pygame.font.SysFont("ubuntu", 32) # fonts
def load_texture(path: str):
if os.path.isfile(path):
return pygame.image.load(path)
else: self.choose_level_text = self.bigger_default_font.render("Choose a level:", True, self.white_smoke) # texts
return texture_not_found
self.texture_not_found = pygame.image.load("textures/texture_not_found.png")
self.texture_not_found = pygame.transform.scale(self.texture_not_found, (40 * self.settings["level_size_multiplier"], 40 * self.settings["level_size_multiplier"]))
def load_block_texture(path: str): self.icon_texture = self.load_texture("textures/icon.png")
texture = load_texture(path) self.full_icon_texture = self.load_texture("textures/icon_full.png")
self.full_icon_texture = pygame.transform.scale(self.full_icon_texture, (260, 90))
self.catapult_frame_texture = self.load_texture("textures/catapult/frame.png")
self.catapult_frame_texture = pygame.transform.scale(self.catapult_frame_texture, (66 * 5 * self.settings["level_size_multiplier"], 31 * 5 * self.settings["level_size_multiplier"]))
self.catapult_arm_texture = self.load_texture("textures/catapult/arm.png")
self.catapult_arm_texture = pygame.transform.scale(self.catapult_arm_texture, (25 * 5 * self.settings["level_size_multiplier"], 53 * 5 * self.settings["level_size_multiplier"]))
self.cow = self.load_texture("textures/cow/head.png")
self.cow = pygame.transform.scale(self.cow, (64 * 5 * self.settings["level_size_multiplier"], 64 * 5 * self.settings["level_size_multiplier"]))
self.stone_block_texture = self.load_block_texture("textures/terrain/stone_01.png")
self.dirt_block_texture = self.load_block_texture("textures/terrain/dirt_01.png")
self.grass_block_texture = self.load_block_texture("textures/terrain/grass_01.png")
self.rock_block_texture = self.load_block_texture("textures/terrain/rock_01.png")
return pygame.transform.scale(texture, (40 * settings["level_size_multiplier"], 40 * settings["level_size_multiplier"])) # buttons
# /images self.buttons.append(
pg.TextButton("Start", self.center, self.screen, lambda: self.page_switch("level_selector"), text_color=self.white_smoke, bg_color=self.dim_gray, font=self.bigger_default_font))
self.start_button = len(self.buttons) - 1
self.text_buttons.append(self.start_button)
self.buttons.append(
pg.TextButton("1", (128, 128), self.screen, lambda: self.start_level(1), text_color=self.white_smoke, bg_color=self.dim_gray, font=self.bigger_default_font, padding=(17, 8)))
self.lvl_one_button = len(self.buttons) - 1
self.text_buttons.append(self.lvl_one_button)
# /buttons
# coordinate calculations # /variables
def center_x(width: int):
return screen.get_width() / 2 - width / 2
# loading completed
def center_y(height: int): self.screen = pygame.display.set_mode(self.settings["win_size"], flags=pygame.RESIZABLE, vsync=1)
return screen.get_height() / 2 - height / 2 self.window_size_reload(self.settings["win_size"])
pygame.display.set_icon(self.icon_texture)
self.screen.fill(self.nero)
pygame.display.update()
self.page_switch("main_menu")
def center(size): self.running = True
width, height = size
return center_x(width), center_y(height) def load_settings(self):
# /coordinate calculations if os.path.isfile("settings.txt"): # If the settings exist, load them into a dict. Else create the settings with the default values.
settings = DictFile("settings.txt")
# image calculations
def set_rot_point(img, pos):
w, h = img.get_size()
w, h = w * 2, h * 2
img2 = pygame.Surface((w, h), pygame.SRCALPHA)
img2.blit(img, (w / 2 - pos[0], h / 2 - pos[1]))
return img2, (w, h)
# / image calculations
# game logic
def start_level(lvl: int):
global level
global cow_throwable
page_switch("ingame")
level = lvl
load_level(lvl)
cow_throwable = True
def load_level(lvl):
global level_data
global lvl_width
global level_surface
level_data = __import__("data.levels." + str(lvl), fromlist="data.levels")
lvl_width, lvl_height = level_data.level_size
level_surface = pygame.Surface((lvl_width * 40 * settings["level_size_multiplier"], lvl_height * 40 * settings["level_size_multiplier"]), pygame.SRCALPHA, 32)
x = 0
y = 0
for row in level_data.data_array:
x = 0
for block in row:
rx = x * 40 * settings["level_size_multiplier"]
ry = y * 40 * settings["level_size_multiplier"]
blit_block(block, (rx, ry))
x += 1
y += 1
def blit_block(block, position: tuple):
if not block == 0:
if block == 1:
level_surface.blit(stone_block_texture, position)
elif block == 2:
level_surface.blit(dirt_block_texture, position)
elif block == 3:
level_surface.blit(grass_block_texture, position)
elif block == 4:
level_surface.blit(rock_block_texture, position)
else: else:
level_surface.blit(texture_not_found, position) settings = DictFile()
settings.path = "settings.txt"
settings["win_size"] = DEFAULT_WINDOW_SIZE
settings["level_size_multiplier"] = 1
settings.save()
return settings
def yeet_cow(): def draw_loading_screen(self):
global cow_throwable default_font = pygame.font.SysFont("ubuntu", 16)
global cow_flying loading_text = default_font.render("Loading...", True, (240, 240, 240))
global cow_flight_path
global cow_flight_step
if cow_throwable: self.screen.fill((40, 40, 40))
cow_throwable = False self.screen.blit(loading_text, (400 - loading_text.get_width() / 2, 300 - loading_text.get_height() / 2))
pygame.display.update()
lvl_x, lvl_y = level_data.level_size def load_texture(self, path: str):
lvl_x *= 40 if os.path.isfile(path):
lvl_x *= settings["level_size_multiplier"] return pygame.image.load(path)
lvl_y *= 40
lvl_y *= settings["level_size_multiplier"]
cow_flight_path = berechneflugbahn(lvl_x, lvl_y, lvl_x + 100, 34, 128, xstep=10) else:
return self.texture_not_found
cow_flying = True def load_block_texture(self, path: str):
cow_flight_step = 0 texture = self.load_texture(path)
# /game logic
return pygame.transform.scale(texture, (40 * self.settings["level_size_multiplier"], 40 * self.settings["level_size_multiplier"]))
# page system def center_x(self, width: int):
def main_menu_page(): return self.screen.get_width() / 2 - width / 2
screen.blit(full_icon_texture, (center_x(full_icon_texture.get_width()), 128))
buttons[start_button].blit()
def center_y(self, height: int):
return self.screen.get_height() / 2 - height / 2
def level_selector_page(): def center(self, size):
buttons[lvl_one_button].blit() width, height = size
screen.blit(choose_level_text, (screen.get_width() / 2 - choose_level_text.get_width() / 2, 16)) return self.center_x(width), self.center_y(height)
def set_rot_point(self, img, pos):
w, h = img.get_size()
w, h = w * 2, h * 2
def ingame_page(): img2 = pygame.Surface((w, h), pygame.SRCALPHA)
global cow_flight_step img2.blit(img, (w / 2 - pos[0], h / 2 - pos[1]))
global cow_position return img2, (w, h)
global cow_flying
global cow_throwable
screen.fill(summer_sky) def start_level(self, lvl: int):
screen.blit(level_surface, (0, screen.get_height() - level_surface.get_height())) self.page_switch("ingame")
self.level = lvl
lvl_size = settings["level_size_multiplier"] self.load_level(lvl)
cx, cy = level_data.catapult_pos self.cow_throwable = True
cx = cx * 40 * lvl_size
cy = screen.get_height() - level_surface.get_height() + cy * 40 * lvl_size - catapult_frame_texture.get_height()
screen.blit(catapult_frame_texture, (cx, cy)) def load_level(self, lvl):
screen.blit(catapult_arm_texture, (cx + 27 * 5 * lvl_size, cy - 35 * 5 * lvl_size)) self.level_data = __import__("data.levels." + str(lvl), fromlist="data.levels")
if cow_flying: self.lvl_width, lvl_height = self.level_data.level_size
cow_flight_step += 1
x = cow_flight_path[cow_flight_step * 2] self.level_surface = pygame.Surface((self.lvl_width * 40 * self.settings["level_size_multiplier"], lvl_height * 40 * self.settings["level_size_multiplier"]), pygame.SRCALPHA, 32)
y = cow_flight_path[cow_flight_step * 2 + 1]
cow_position = (x, screen.get_height() - y - 64 * 5 * settings["level_size_multiplier"])
if cow_flight_step * 2 == len(cow_flight_path) - 2: x = 0
cow_flying = False y = 0
cow_throwable = True
screen.blit(cow, cow_position) for row in self.level_data.data_array:
x = 0
for block in row:
rx = x * 40 * self.settings["level_size_multiplier"]
ry = y * 40 * self.settings["level_size_multiplier"]
def page_selector(): self.blit_block(block, (rx, ry))
if page == "main_menu": x += 1
main_menu_page()
elif page == "level_selector": y += 1
level_selector_page()
elif page == "ingame": def blit_block(self, block, position: tuple):
ingame_page() if not block == 0:
if block == 1:
self.level_surface.blit(self.stone_block_texture, position)
elif block == 2:
self.level_surface.blit(self.dirt_block_texture, position)
def page_switch(new_page: str=None): elif block == 3:
global active_buttons self.level_surface.blit(self.grass_block_texture, position)
global page
if not new_page is None: elif block == 4:
page = new_page self.level_surface.blit(self.rock_block_texture, position)
if page == "main_menu": else:
active_buttons = [start_button] self.level_surface.blit(self.texture_not_found, position)
elif page == "level_selector": def yeet_cow(self):
active_buttons = [lvl_one_button] if self.cow_throwable:
self.cow_throwable = False
elif page == "ingame": lvl_x, lvl_y = self.level_data.level_size
active_buttons = [] lvl_x *= 40
lvl_x *= self.settings["level_size_multiplier"]
lvl_y *= 40
lvl_y *= self.settings["level_size_multiplier"]
# for button in buttons: self.cow_flight_path = berechneflugbahn(lvl_x, lvl_y, lvl_x + 100, 34, 128, xstep=10)
# button.active = False
#
# for button in active_buttons:
# button.active = True
# /page system
self.cow_flying = True
self.cow_flight_step = 0
def close(): def main_menu_page(self):
global running self.screen.blit(self.full_icon_texture, (self.center_x(self.full_icon_texture.get_width()), 128))
running = False self.buttons[self.start_button].blit()
def level_selector_page(self):
self.buttons[self.lvl_one_button].blit()
def window_size_reload(new_size): self.screen.blit(self.choose_level_text, (self.screen.get_width() / 2 - self.choose_level_text.get_width() / 2, 16))
for button in text_buttons:
buttons[button].update()
settings["win_size"] = new_size def ingame_page(self):
self.screen.fill(self.summer_sky)
self.screen.blit(self.level_surface, (0, self.screen.get_height() - self.level_surface.get_height()))
lvl_size = self.settings["level_size_multiplier"]
def get_events(): cx, cy = self.level_data.catapult_pos
global last_frame_mouse_pressed cx = cx * 40 * lvl_size
cy = self.screen.get_height() - self.level_surface.get_height() + cy * 40 * lvl_size - self.catapult_frame_texture.get_height()
for event in pygame.event.get(): self.screen.blit(self.catapult_frame_texture, (cx, cy))
if event.type == pygame.QUIT: self.screen.blit(self.catapult_arm_texture, (cx + 27 * 5 * lvl_size, cy - 35 * 5 * lvl_size))
close()
if self.cow_flying:
self.cow_flight_step += 1
x = self.cow_flight_path[self.cow_flight_step * 2]
y = self.cow_flight_path[self.cow_flight_step * 2 + 1]
self.cow_position = (x, self.screen.get_height() - y - 64 * 5 * self.settings["level_size_multiplier"])
if self.cow_flight_step * 2 == len(self.cow_flight_path) - 2:
self.cow_flying = False
self.cow_throwable = True
self.screen.blit(self.cow, self.cow_position)
def page_selector(self):
if self.page == "main_menu":
self.main_menu_page()
elif self.page == "level_selector":
self.level_selector_page()
elif self.page == "ingame":
self.ingame_page()
def page_switch(self, new_page: str=None):
if not new_page is None:
self.page = new_page
if self.page == "main_menu":
self.active_buttons = [self.start_button]
elif self.page == "level_selector":
self.active_buttons = [self.lvl_one_button]
elif self.page == "ingame":
self.active_buttons = []
# for button in buttons:
# button.active = False
#
# for button in active_buttons:
# button.active = True
def close(self):
self.running = False
def window_size_reload(self, new_size):
for button in self.text_buttons:
self.buttons[button].update()
self.settings["win_size"] = new_size
def get_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.close()
return
if event.type == pygame.MOUSEBUTTONDOWN:
pressed = self.mouse.get_pressed()
pos = self.mouse.get_pos()
for button in self.active_buttons:
self.buttons[button].check(pos, pressed)
self.last_frame_mouse_pressed = True
elif event.type == pygame.VIDEORESIZE:
self.window_size_reload(event.size)
elif event.type == pygame.KEYDOWN:
key = event.key
if key == pygame.K_c and self.pressed_special_keys & pygame.KMOD_CTRL:
self.close()
elif key == pygame.K_SPACE:
if self.page == "ingame":
self.yeet_cow()
def loop(self):
self.screen.fill(self.nero)
self.pressed_keys = self.keyboard.get_pressed()
self.pressed_special_keys = self.keyboard.get_mods()
self.get_events()
if not self.running:
return return
if event.type == pygame.MOUSEBUTTONDOWN: self.page_selector()
pressed = mouse.get_pressed()
pos = mouse.get_pos()
if not last_frame_mouse_pressed: pygame.display.update()
for button in active_buttons:
buttons[button].check(pos, pressed)
last_frame_mouse_pressed = True self.clock.tick(self.FPS)
elif event.type == pygame.VIDEORESIZE:
window_size_reload(event.size)
elif event.type == pygame.KEYDOWN:
key = event.key
if key == pygame.K_c and pressed_special_keys & pygame.KMOD_CTRL:
close()
elif key == pygame.K_SPACE:
if page == "ingame":
yeet_cow()
def loop(): if __name__ == "__main__":
global last_frame_mouse_pressed game = Cowyeet()
global pressed_keys
global pressed_special_keys
screen.fill(nero) while game.running:
game.loop()
pressed_keys = keyboard.get_pressed() pygame.quit()
pressed_special_keys = keyboard.get_mods()
get_events()
if not running: if game.SAVE_SETTINGS_ON_EXIT:
return game.settings.save()
pressed = mouse.get_pressed() print("Bye!")
if not pressed[0] and not pressed[1] and not pressed[2]:
last_frame_mouse_pressed = False
page_selector()
pygame.display.update()
clock.tick(FPS)
# variables
nero = (40, 40, 40) # colors (color names by https://www.color-blindness.com/color-name-hue/)
dim_gray = (100, 100, 100)
summer_sky = (50, 200, 220)
white_smoke = (240, 240, 240)
buttons = [] # misc
text_buttons = []
active_buttons = []
last_frame_mouse_pressed = False
page = "main_menu"
level = None
level_data = None
lvl_width = None
level_surface = None
cow_throwable = False
cow_flying = False
cow_position = (0, 0)
cow_flight_path = []
cow_flight_step = 0
pressed_keys = []
pressed_special_keys = pygame.key.get_mods()
# pygame objects
clock = pygame.time.Clock() # misc
mouse = pygame.mouse
keyboard = pygame.key
bigger_default_font = pygame.font.SysFont("ubuntu", 32) # fonts
choose_level_text = bigger_default_font.render("Choose a level:", True, white_smoke) # texts
texture_not_found = pygame.image.load("textures/texture_not_found.png")
texture_not_found = pygame.transform.scale(texture_not_found, (40 * settings["level_size_multiplier"], 40 * settings["level_size_multiplier"]))
icon_texture = load_texture("textures/icon.png")
full_icon_texture = load_texture("textures/icon_full.png")
full_icon_texture = pygame.transform.scale(full_icon_texture, (260, 90))
catapult_frame_texture = load_texture("textures/catapult/frame.png")
catapult_frame_texture = pygame.transform.scale(catapult_frame_texture, (66 * 5 * settings["level_size_multiplier"], 31 * 5 * settings["level_size_multiplier"]))
catapult_arm_texture = load_texture("textures/catapult/arm.png")
catapult_arm_texture = pygame.transform.scale(catapult_arm_texture, (25 * 5 * settings["level_size_multiplier"], 53 * 5 * settings["level_size_multiplier"]))
cow = load_texture("textures/cow/head.png")
cow = pygame.transform.scale(cow, (64 * 5 * settings["level_size_multiplier"], 64 * 5 * settings["level_size_multiplier"]))
stone_block_texture = load_block_texture("textures/terrain/stone_01.png")
dirt_block_texture = load_block_texture("textures/terrain/dirt_01.png")
grass_block_texture = load_block_texture("textures/terrain/grass_01.png")
rock_block_texture = load_block_texture("textures/terrain/rock_01.png")
# buttons
buttons.append(pg.TextButton("Start", center, screen, lambda: page_switch("level_selector"), text_color=white_smoke, bg_color=dim_gray, font=bigger_default_font))
start_button = len(buttons) - 1
text_buttons.append(start_button)
buttons.append(pg.TextButton("1", (128, 128), screen, lambda: start_level(1), text_color=white_smoke, bg_color=dim_gray, font=bigger_default_font, padding=(17, 8)))
lvl_one_button = len(buttons) - 1
text_buttons.append(lvl_one_button)
# /buttons
# /variables
# loading completed
screen = pygame.display.set_mode(settings["win_size"], flags=pygame.RESIZABLE, vsync=1)
window_size_reload(settings["win_size"])
pygame.display.set_icon(icon_texture)
screen.fill(nero)
pygame.display.update()
page_switch("main_menu")
running = True
while running:
loop()
pygame.quit()
if SAVE_SETTINGS_ON_EXIT:
settings.save()
print("Bye!")