{"id":116,"date":"2024-05-16T14:15:07","date_gmt":"2024-05-16T14:15:07","guid":{"rendered":"https:\/\/theroyalscode.com\/students\/a_carpenter\/?p=116"},"modified":"2024-05-16T14:15:07","modified_gmt":"2024-05-16T14:15:07","slug":"goldenrod-adventure-the-best-platformer-of-2024","status":"publish","type":"post","link":"https:\/\/theroyalscode.com\/students\/a_carpenter\/2024\/05\/16\/goldenrod-adventure-the-best-platformer-of-2024\/","title":{"rendered":"Goldenrod Adventure: The Best Platformer of 2024"},"content":{"rendered":"\n<p><strong>I have been working on a making a platformer game for a shot while. I am calling it &#8220;Goldenrod Adventure&#8221; because most of it is two shades of one color. The game is only 4 levels, but still a decent game nonetheless in my opinion. Here is some of the code for the main file which is what runs the game.<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pygame\nfrom settings import Settings\nfrom map import Map\nfrom player import Player\nimport time \nclass Game:\n    def __init__(self):\n        self.clock = pygame.time.Clock()\n        self.settings = Settings()\n        self.screen = pygame.display.set_mode((1500,1000))\n        self.enemies = pygame.sprite.Group() \n        self.check_points = pygame.sprite.Group()\n        pygame.display.set_caption(\"Goldenrod Adventure\")\n        self.map = Map(self)\n        self.current_level = 1\n        self._load_level()\n        self.player = Player(self)\n        self.running = True\n        self.vertical_tracker = 0\n        \n        \n\n\n        \n    def run(self):\n        while self.running:\n\n            #Check events\n            for event in pygame.event.get():\n                if event.type == pygame.QUIT:\n                    self.running = False\n\n                if event.type == pygame.KEYDOWN:\n                    if event.key == pygame.K_RIGHT:\n                        self.player.moving_right = True\n\n                            \n                            \n                    if event.key == pygame.K_LEFT:\n                        self.player.moving_left = True\n\n\n                    if event.key == pygame.K_SPACE:\n                        self.player.jump()\n\n                if event.type == pygame.KEYUP:\n                    if event.key == pygame.K_RIGHT:\n                        self.player.moving_right = False\n                    if event.key == pygame.K_LEFT:\n                        self.player.moving_left = False\n\n            #Update\n            \n            self.player.move(self.map)\n            self.player.update(self.map)\n\n\n\n            for enemy in self.enemies.sprites():\n                enemy.move(self.map)\n                enemy.update(self.map)\n                \n            self.scroll()\n            \n\n\n            #Draw Screen\n            self.screen.fill(self.settings.bg_color)\n            self.map.draw()\n            self.player.draw()\n            for enemy in self.enemies.sprites():\n                enemy.draw()\n            for cp in self.check_points.sprites():\n                cp.draw()\n            pygame.display.flip()\n            self._check_dead()\n            self._check_level_clear()\n            self.clock.tick(60)\n\n    def _load_level(self):\n        self.map.load_level(self.current_level, self)\n\n        \n\n\n\n    def scroll(self):\n        if (self.player.rect .x >= self.screen.get_rect().right - self.settings.scroll_offset)\\\n        and self.player.moving_right:\n            self.player.rect.x -=self.settings.player_speed\n            for object in self.map.map_objects:\n                object.rect.x -= self.settings.player_speed\n            for enemy in self.enemies:\n                enemy.rect.x -=  self.settings.player_speed\n            for cp in self.check_points:\n                cp.rect.x -=  self.settings.player_speed\n\n        if self.player.rect.top &lt; self.screen.get_rect().top + self.settings.scroll_offset*2:\n            self.vertical_tracker += self.player.y_acceleration\n            if self.vertical_tracker &lt; 0:\n                \n                self.vertical_tracker += self.player.y_acceleration\n                self.player.rect.y -= self.player.y_acceleration\n                for object in self.map.map_objects:\n                    object.rect.y -= self.player.y_acceleration\n                for enemy in self.enemies:\n                    enemy.rect.y -= self.player.y_acceleration\n                for cp in self.check_points:\n                    cp.rect.y -= self.player.y_acceleration\n            \n    def _check_dead(self):\n        collisions = pygame.sprite.spritecollideany(self.player, self.enemies)\n        \n        \n        #if collisions and self.player.rect.bottom > collisio\n        \n        if self.player.rect.y > self.screen.get_rect().bottom + 100 or collisions:\n            \n            self.player.respawn(self)\n            self.map.load_level(self.current_level, self)\n            time.sleep(0.5)\n            \n    def _check_level_clear(self):\n        if pygame.sprite.spritecollideany(self.player, self.check_points):\n            self.current_level += 1\n            self.player.respawn(self)\n            self.map.load_level(self.current_level, self)\n\n\n\ngame = Game()\ngame.run() <\/code><\/pre>\n\n\n\n<p><strong>And here are a few screenshots from the game.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" src=\"https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-content\/uploads\/2024\/05\/Platformer1-1024x580.png\" alt=\"\" class=\"wp-image-117\" style=\"width:992px;height:auto\" srcset=\"https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-content\/uploads\/2024\/05\/Platformer1-1024x580.png 1024w, https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-content\/uploads\/2024\/05\/Platformer1-300x170.png 300w, https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-content\/uploads\/2024\/05\/Platformer1-768x435.png 768w, https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-content\/uploads\/2024\/05\/Platformer1.png 1364w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>A basic obstacle<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"405\" height=\"53\" src=\"https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-content\/uploads\/2024\/05\/Platformer_Bob.png\" alt=\"\" class=\"wp-image-118\" style=\"width:848px;height:auto\" srcset=\"https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-content\/uploads\/2024\/05\/Platformer_Bob.png 405w, https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-content\/uploads\/2024\/05\/Platformer_Bob-300x39.png 300w\" sizes=\"auto, (max-width: 405px) 100vw, 405px\" \/><\/figure>\n\n\n\n<p><strong>Bob, an enemy (Red), standing near the player (Dark Goldenrod Color)<\/strong><\/p>\n\n\n\n<p><strong>I also have the rest of my code as of current, but will keep updating if I have good ideas.<\/strong><\/p>\n\n\n\n<p><strong>Map Code:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pygame\nimport pygame.sprite\nfrom enemy import Enemy\nfrom enemy import BigEnemy\n\nclass Object(pygame.sprite.Sprite):\n    def __init__(self, game, x, y, width=200, height=30):\n        super().__init__()\n        self.screen = game.screen\n        self.rect = pygame.Rect(x,y, width, height)\n        self.color = \"Goldenrod\"\n\n    def draw(self):\n        pygame.draw.rect(self.screen, self.color, self.rect)\n\n\nclass Map:\n    def __init__(self, game):\n        self.map_objects = pygame.sprite.Group()\n        self.check_point_x = 0\n        self.settings = game.settings\n\n    def load_level(self, level, game, offset=0):\n        self.map_objects.empty()\n        game.enemies.empty()\n        game.check_points.empty()\n        if level == 1:\n\n            floor2 = Object(game, 500, 600, 400, 10)\n            block1 = Object(game, 900, 300, width= self.settings.player_width, height= 500)\n            floor3 = Object(game, 1200, 600, 400, 10)\n            self.map_objects.add(Object(game, 0, 700, 400, 10))\n            self.map_objects.add(floor2)\n            self.map_objects.add(block1)\n            self.map_objects.add(floor3)\n            self.map_objects.add(Object(game,2000, 50))\n            self.map_objects.add(Object(game,1800, 300))\n            self.map_objects.add(Object(game, 3000, 800, 500))\n            self.map_objects.add(Object(game, 4000, 400, 500))\n\n            game.check_points.add(Flag(game, 5000, 500, 500))\n\n            enemy = Enemy(game, 200, 300)\n            game.enemies.add(enemy)\n\n        if level == 2:\n            self.map_objects.add(Object(game, 0, 900, 900, 100))\n            self.map_objects.add(Object(game, 1200, 600, 100))\n            self.map_objects.add(Object(game, 1500, 500, 100, self.settings.player_width))\n            self.map_objects.add(Object(game, 2000, 900, 600, self.settings.player_width))\n            self.map_objects.add(Object(game, 2800, 565, 100))\n\n            game.check_points.add(Flag(game, 3500, 565, 100))\n\n        if level == 3:\n            floor2 = Object(game, 500, 600, 400, 10)\n            floor3 = Object(game, 1200, 600, 400, 10)\n            self.map_objects.add(Object(game, 0, 700, 400, 10))\n            self.map_objects.add(floor2)\n            self.map_objects.add(floor3)\n            self.map_objects.add(Object(game,2000, 50))\n            self.map_objects.add(Object(game,1800, 300))\n            self.map_objects.add(Object(game, 3000, 800, 500))\n            self.map_objects.add(Object(game, 4000, 400, 500))\n\n            game.check_points.add(Flag(game, 5000, 500, 500))\n\n            enemy = Enemy(game, 200, 300)\n            enemy2 = Enemy(game, 180, 300)\n            enemy3 = Enemy(game, 160, 300)\n            enemy4 = Enemy(game, 140, 300)\n            enemy5 = Enemy(game, 120, 300)\n            \n            enemy6 = Enemy(game, 500, 200)\n            enemy7 = Enemy(game, 530, 200)\n            enemy8 = Enemy(game, 560, 200)\n            \n            game.enemies.add(enemy)\n            game.enemies.add(enemy2)\n            game.enemies.add(enemy3)\n            game.enemies.add(enemy4)\n            game.enemies.add(enemy5)\n            game.enemies.add(enemy6)\n            game.enemies.add(enemy7)\n            game.enemies.add(enemy8)\n        \n        for object in self.map_objects.sprites():\n            object.rect.x += offset\n\n        if level ==4:\n            self.map_objects.add(Object(game, 0, 700, 800, 30))\n            game.check_points.add(Flag(game, 800, 700, 500))\n            benemy = BigEnemy(game, 400, 10)\n            game.enemies.add(benemy)\n\n\n            \n            \n\n\n    def draw(self):\n        for object in self.map_objects:\n            object.draw()\n        \n\n\n\nclass Flag(Object):\n    def __init__(self, game, x, y, width=30, height=30, type = \"end_level\"):\n        super().__init__(game, x, y, width, height)\n        self.color = \"Dark Goldenrod\"\n        self.type = type<\/code><\/pre>\n\n\n\n<p><strong>Enemy Code:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from player import Player\nimport pygame\n\nclass Enemy(Player):\n    def __init__(self,game, x, y):\n        super().__init__(game)\n\n        self.x = x\n        self.y = y\n        self.color = \"Red\"\n        self.rect.topleft = (x, y)\n        self.speed = 1\n        self.moving_left = True\n\nclass BigEnemy(Player):\n    def __init__(self,game, x, y):\n        super().__init__(game)\n\n        self.x = x\n        self.y = y\n        self.color = \"Red\"\n        self.rect.topleft = (x, y)\n        self.speed = 1\n        self.moving_left = False\n        self.rect = pygame.Rect(0,0,self.settings.player_width*40,30)<\/code><\/pre>\n\n\n\n<p><strong>Player Code<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pygame.sprite\n\nclass Player(pygame.sprite.Sprite):\n    \"\"\"A class to manage the player sprite\"\"\"\n\n    def __init__(self, game) -> None:\n        super().__init__()\n        self.respawn_x = 0\n        self.respawn_y = 500\n        self.screen = game.screen\n        self.settings = game.settings\n        self.color = \"Dark Goldenrod\"\n        self.rect = pygame.Rect(0,0,self.settings.player_width,30)\n        self.rect.topleft = (0, 500)\n        self.y_acceleration = 0\n        self.falling = True\n        self.moving_left = self.moving_right = False\n        self.jump_count = 0\n        self.speed = self.settings.player_speed\n    \n    def draw(self):\n        pygame.draw.rect(self.screen, self.color, self.rect)\n        #Change to blit if you want to use an image\n\n    def update(self, map):\n        \n        if self.falling:\n            self.rect.y += self.y_acceleration\n\n            self.y_acceleration += float(self.settings.y_acceleration)\n        self._check_collisions(map)\n        \n        \n\n\n    def landed(self):\n        self.falling = False\n        self.y_acceleration = 0\n        self.jump_count=0\n        \n\n    def move(self, map):\n\n        if self.moving_right and not self.collide(\"right\", map.map_objects):\n            self.rect.x += self.speed\n        if self.moving_left and not self.collide(\"left\", map.map_objects) and self.rect.left > 0:\n            self.rect.x -= self.speed\n\n \n    def jump(self):\n        if self.jump_count &lt;= 1:\n            self.jump_count += 1\n            self.y_acceleration = -8 #Testing\n            self.falling = True\n\n    def collide(self, direction, objects):\n        if direction == \"right\":\n            vel = self.speed\n\n        elif direction == \"left\":\n            vel = -self.speed\n\n        self.rect.x += vel\n        \n        collided_object = None\n        for obj in objects:\n            if pygame.sprite.spritecollideany(self, objects):\n                collided_object = obj\n                \n                break\n        self.rect.x -= vel\n        \n        return collided_object\n    \n    def respawn(self, game):\n        self.rect.topleft = (self.respawn_x, self.respawn_y)\n        self.y_acceleration = 0\n        self.jump_count = 0\n        game.vertical_tracker = 0\n        \n\n\n    def _check_collisions(self, map):\n        collisions = pygame.sprite.spritecollideany(self, map.map_objects)\n        \n        if collisions:\n            if self.y_acceleration > 0 and self.falling: #aka moving down\n                self.rect.bottom = collisions.rect.top  \n                self.landed()          \n\n            elif self.y_acceleration &lt; 0 and self.falling: #Hit our head\n                self.rect.top = collisions.rect.bottom\n                self.y_acceleration = 0\n            \n        else:\n            self.falling = True<\/code><\/pre>\n\n\n\n<p><strong>Settings Code:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Settings:\n    def __init__(self):\n        self.player_width = 20\n        self.bg_color = (100,100,100)\n        self.player_speed = float(15.69)\n        self.y_acceleration = float(0.1)\n\n        self.scroll_offset = 800<\/code><\/pre>\n\n\n\n<p><strong>This is currently all the code I have but I will continue updating probably until around June 4th.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I have been working on a making a platformer game for a shot while. I am calling it &#8220;Goldenrod Adventure&#8221; because most of it is two shades of one color. The game is only 4 levels, but still a decent game nonetheless in my opinion. Here is some of the code for the main file [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-116","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-json\/wp\/v2\/posts\/116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-json\/wp\/v2\/comments?post=116"}],"version-history":[{"count":1,"href":"https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-json\/wp\/v2\/posts\/116\/revisions"}],"predecessor-version":[{"id":119,"href":"https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-json\/wp\/v2\/posts\/116\/revisions\/119"}],"wp:attachment":[{"href":"https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-json\/wp\/v2\/media?parent=116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-json\/wp\/v2\/categories?post=116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theroyalscode.com\/students\/a_carpenter\/wp-json\/wp\/v2\/tags?post=116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}