From 92fd4a4cb2e2aa9111e0c513edb3cd7902ac27dd Mon Sep 17 00:00:00 2001 From: administrator Date: Mon, 29 Jan 2024 21:47:43 +0100 Subject: [PATCH] Rewrite Gameobjects Added new movementfunction Code cleanup Todo: Remove old class and update code for new one --- modules/GameObject.py | 118 ++++++++++++++++++++++++++++-------------- pygame-test.py | 27 ++++++---- 2 files changed, 96 insertions(+), 49 deletions(-) diff --git a/modules/GameObject.py b/modules/GameObject.py index d0263a5..fd3d83a 100644 --- a/modules/GameObject.py +++ b/modules/GameObject.py @@ -7,9 +7,9 @@ class GameObject(): _size_rect_x:int _size_rect_y:int __movespeed = int() - __rectobjekt:pygame.Rect - __surface:pygame.Surface - __mainscreensize:tuple + _rectobjekt:pygame.Rect + _surface:pygame.Surface + _mainscreensize:tuple __hide = False __collided = False __is_player = False @@ -33,8 +33,8 @@ class GameObject(): self.count += 1 self.__pos_lf_x = 0 self.__pos_lf_y = 0 - self.__surface = surface - self.__mainscreensize = mainscreensize + self._surface = surface + self._mainscreensize = mainscreensize self.__score = 0 self.__imagepath = image self.__imageloaded = 0 @@ -44,7 +44,7 @@ class GameObject(): #font = pygame.font.SysFont(None, 70) #text = font.render("TEST", True, (0,0,0) ) if(not self.__hide): - self.__rectobjekt = pygame.draw.rect(self.__surface, self.__color, [self._pos_x, self._pos_y,self._size_rect_x,self._size_rect_y]) + self._rectobjekt = pygame.draw.rect(self._surface, self.__color, [self._pos_x, self._pos_y,self._size_rect_x,self._size_rect_y]) def get_name(self, debug=False): if(debug): @@ -57,7 +57,7 @@ class GameObject(): return (self._pos_x, self._pos_y) def get_rect(self): - return self.__rectobjekt + return self._rectobjekt def get_rect_size(self): return (self._size_rect_x, self._size_rect_y) @@ -72,7 +72,7 @@ class GameObject(): return self.__score def get_surface(self) -> pygame.Surface: - return self.__surface + return self._surface def has_follower(self): return self.__has_follower @@ -105,7 +105,7 @@ class GameObject(): #print(GameObject.get_rect()) """TODO: Hitbox with Objectsize""" - if(pygame.rect.Rect.colliderect(self.__rectobjekt, GameObject.get_rect()) and not self.is_collided()): + if(pygame.rect.Rect.colliderect(self._rectobjekt, GameObject.get_rect()) and not self.is_collided()): print("Kollision\n") #Funktioniert für das erste! self.set_collided() return True @@ -118,6 +118,24 @@ class GameObject(): self.__hide = True """TODO: Delete obeject function""" +class GameObject_new(): + def __init__(self, name:str, surface:pygame.surface.Surface, surface_size:tuple, init_pos_x, init_pos_y, visibility:bool = True) -> None: + self._name = name + self._surface = surface + self._surface_size = surface_size + self._position = [init_pos_x, init_pos_y] + self._visibility = visibility + + def printall_attributes(self): + print(self._name) + print(self._surface) + print(self._surface_size) + print(self._position) + print(self._visibility) + + def get_position(self) -> tuple: + return self._position + class Block(GameObject): @@ -146,17 +164,18 @@ class Block(GameObject): def get_score(self) -> int: return self.__score -class Player(GameObject): +class Player(GameObject_new): #Later handles the Player-Gameobject - def __init__(self, name: str, surface, mainscreensize: tuple, posx_init: int = 0, posy_init: int = 0, move_speed: int = 0, is_player: bool = False, is_rect: bool = True, color: tuple = (0, 0, 0), rect_size: tuple = (10, 10), image=str()) -> None: - super().__init__(name, surface, mainscreensize, posx_init, posy_init, move_speed, is_player, is_rect, color, rect_size, image) - - self.__mainscreensize = mainscreensize - print(self.__mainscreensize) - - super().set_position((150, 550)) + def __init__(self, name: str, surface: pygame.Surface, surface_size: tuple, init_pos_x, init_pos_y, visibility: bool = True, + size:int = 10 + ) -> None: + self._size = size + self._score = 0 + super().__init__(name, surface, surface_size, init_pos_x, init_pos_y, visibility) __movedirection = {"up":False, "down":False, "left":False, "right":False} + __snake_body = [[100,100], [100,140], [100,180], [100,220]] + __test_counter = 0 def user_test_func(self): pass @@ -170,34 +189,53 @@ class Player(GameObject): def move(self, *speed:int): MOVE_SPEED = 1 - #self.__rectobjekt.x += MOVE_SPEED - objectpos = super().get_position() + if(self.__test_counter == 15): + self.__test_counter = 0 + if(self.__movedirection['up']): + if(not speed): self._position[1] -= MOVE_SPEED + else: self._position[1] -= speed[0] + if(self._position[1] <= -self._size): + self._position[1] = self._surface_size[1] - if(self.__movedirection['up']): - if(not speed): self._pos_y -= MOVE_SPEED - else: self._pos_y -= speed[0] - if(self._pos_y <= -self._size_rect_y): - self._pos_y = self.__mainscreensize[1] + elif(self.__movedirection['down']): + if(not speed): self._position[1] += MOVE_SPEED + else: self._position[1] += speed[0] + if(self._position[1] >= self._surface_size[1]): + self._position[1] = -self._size - elif(self.__movedirection['down']): - if(not speed): self._pos_y += MOVE_SPEED - else: self._pos_y += speed[0] - if(self._pos_y >= self.__mainscreensize[1]): - self._pos_y = -self._size_rect_y + elif(self.__movedirection['left']): + if(not speed): self._position[0] -= MOVE_SPEED + else: self._position[0] -= speed[0] + if(self._position[0] <= -self._size): + self._position[0] = self._surface_size[0] - elif(self.__movedirection['left']): - if(not speed): self._pos_x -= MOVE_SPEED - else: self._pos_x -= speed[0] - if(self._pos_x <= -self._size_rect_x): - self._pos_x = self.__mainscreensize[0] + elif(self.__movedirection['right']): + if(not speed): self._position[0] += MOVE_SPEED + else: self._position[0] += speed[0] + if(self._position[0] >= self._surface_size[0]): + self._position[0] = -self._size + self.__test_counter+=1 - elif(self.__movedirection['right']): - if(not speed): self._pos_x += MOVE_SPEED - else: self._pos_x += speed[0] - if(self._pos_x >= self.__mainscreensize[0]): - self._pos_x = -self._size_rect_x + def draw(self): + if(self.__test_counter == 15): + self.__snake_body.insert(0, list(self._position)) + for pos in self.__snake_body: + pygame.draw.rect(self._surface, (0,0,0), pygame.Rect(pos[0], pos[1], self._size, self._size)) + print(pos) + if(self.__test_counter == 15): + self.__snake_body.pop() + + def add_body(self): + self.__snake_body.insert(0,list(self._position)) + + def get_rect_size(self): + return self._size + + def get_player_score(self) -> int: + return self._score +""" class GOIMAGE(GameObject): def __init__(self, name: str, surface, mainscreensize: tuple, posx_init: int = 0, posy_init: int = 0, move_speed: int = 0, is_player: bool = False, is_rect: bool = True, color: tuple = (0, 0, 0), rect_size: tuple = (10, 10), image=str()) -> None: super().__init__(name, surface, mainscreensize, posx_init, posy_init, move_speed, is_player, is_rect, color, rect_size, image) @@ -209,4 +247,4 @@ class GOIMAGE(GameObject): def draw(self): surface = self.get_surface() - surface.blit(self.__image, self.get_position()) \ No newline at end of file + surface.blit(self.__image, self.get_position())""" \ No newline at end of file diff --git a/pygame-test.py b/pygame-test.py index dd68845..7ad6885 100644 --- a/pygame-test.py +++ b/pygame-test.py @@ -71,7 +71,7 @@ menu.add.button('Play', start_game) menu.add.button('Quit', pygame_menu.events.EXIT) menu.mainloop(MAINSCREEN) -player = Player("Player", MAINSCREEN, MAINSCREEN_SIZE, 10, 10, 10, is_player=False, is_rect=True, color=(0,255,0) ,rect_size=(80,80)) +player = Player("Player", MAINSCREEN, MAINSCREEN_SIZE, 100, 100, size=40) def spawn_entities(x:int, list_of_objects:list): count = 0 @@ -79,10 +79,7 @@ def spawn_entities(x:int, list_of_objects:list): rect_size = 80 Entity = Block("Entitiy-"+str(count), MAINSCREEN, MAINSCREEN_SIZE, rand.randint(1,MAINSCREEN_SIZE[0]), rand.randint(1,MAINSCREEN_SIZE[1]), rand.randint(1,15), is_rect=True, rect_size=(rect_size,rect_size)) Entity.get_name(True) - if(Entity.get_position() > player.get_position() + player.get_rect_size() or Entity.get_position() < player.get_position() + player.get_rect_size()): - list_of_objects.append(Entity) - else: - print("Object zu nach an Spieler") + list_of_objects.append(Entity) count += 1 @@ -93,7 +90,7 @@ x = 3600 invert = False colided_objects = list() spawned_entities = list() -spawn_entities(20, spawned_entities) +spawn_entities(2, spawned_entities) count_hidden_entities = 0 count_spawend_enities = len(spawned_entities) print("Es wurden " + str(count_spawend_enities)+ " Objekte gespawnt") @@ -101,6 +98,12 @@ print("Es wurden " + str(count_spawend_enities)+ " Objekte gespawnt") testx = 10 testy = 10 +counter = 0 + +#TESTOBJECT = GameObject_new("Testobjekt", MAINSCREEN, MAINSCREEN_SIZE, 0, 0) +#print(help(TESTOBJECT)) +#TESTOBJECT.printall_attributes() + #Fenster-Hauptschleife+ while active == True: MAINSCREEN.fill((255,255,255)) @@ -126,12 +129,18 @@ while active == True: text_surface = my_font.render('Score: '+str(player.get_player_score()), False, (0, 0, 0)) MAINSCREEN.blit(text_surface, (0,0)) + player.draw() - player.update_pos_lastframe(player.get_position()[0], player.get_position()[1], False) - player.move(5) + player.move(40) + if(counter == 300): + player.add_body() + counter = 0 + + counter += 1 #print("Aktuelle Position: " + str(player.get_position())) #print("Aktuell kollidierte Objekte: ", str(count_hidden_entities)) #Spawns the Entities + """ for y in spawned_entities: y:Block y.draw() @@ -147,7 +156,7 @@ while active == True: count_hidden_entities += 1 xy = y.get_rect_size() append_follwer(xy[0], xy[1]) - count_follower += 1 + count_follower += 1""" #Zeichnet alle Verfolgerobjekte, sofern sie vorliegend sind #TODO: Follower sollen ab dem zweiten Objekt dem vorangegangenen Objekt folgen und nicht dem player