From 801b64b97fc5ecb8905b4f4d0d9bc9506d8be056 Mon Sep 17 00:00:00 2001 From: bog Date: Sat, 6 Apr 2024 14:24:08 +0200 Subject: [PATCH] :tada: :sparkles: moving player. --- .gitignore | 3 +++ actors/actor.py | 25 +++++++++++++++++++++++++ actors/player.py | 36 ++++++++++++++++++++++++++++++++++++ doc/brainstorming.vym | Bin 0 -> 43364 bytes doc/features.txt | 22 ++++++++++++++++++++++ main.py | 33 +++++++++++++++++++++++++++++++++ requirements.txt | 2 ++ world/__init__.py | 18 ++++++++++++++++++ 8 files changed, 139 insertions(+) create mode 100644 .gitignore create mode 100644 actors/actor.py create mode 100644 actors/player.py create mode 100644 doc/brainstorming.vym create mode 100644 doc/features.txt create mode 100644 main.py create mode 100644 requirements.txt create mode 100644 world/__init__.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..450466f --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*~* +*\#* +__pycache__ diff --git a/actors/actor.py b/actors/actor.py new file mode 100644 index 0000000..2259fec --- /dev/null +++ b/actors/actor.py @@ -0,0 +1,25 @@ +import pygame +import numpy as np + +class Actor: + def __init__(self, world): + self.world = world + self.pos = np.array([64.0, 64.0]) + self.size = np.array([48.0, 48.0]) + self.color = pygame.Color(0, 0, 255) + self.speed = 192.0 + + def draw(self, screen): + pygame.draw.rect(screen, self.color, ( + self.pos[0] - self.size[0]/2, + self.pos[1] - self.size[1]/2, + self.size[0], + self.size[1] + )) + + def update(self, dt): + pass + + def phy_update(self, dt): + pass + diff --git a/actors/player.py b/actors/player.py new file mode 100644 index 0000000..f126672 --- /dev/null +++ b/actors/player.py @@ -0,0 +1,36 @@ +import pygame +import numpy as np +from . import actor + +class Player(actor.Actor): + def __init__(self, world): + super().__init__(world) + + def phy_update(self, dt): + pass + + def update(self, dt): + delta = np.array([0.0, 0.0]) + keys = pygame.key.get_pressed() + + if keys[pygame.K_z] or keys[pygame.K_w]: + delta[1] -= 1.0 + + if keys[pygame.K_s]: + delta[1] += 1.0 + + if keys[pygame.K_q] or keys[pygame.K_a]: + delta[0] -= 1.0 + + if keys[pygame.K_d]: + delta[0] += 1.0 + + norm = np.linalg.norm(delta) + if norm > 0: + delta /= norm + delta *= self.speed + + self.pos += delta * dt + + + diff --git a/doc/brainstorming.vym b/doc/brainstorming.vym new file mode 100644 index 0000000000000000000000000000000000000000..ba9afb2f3e02034394b115035a48ddf7c52ffcfb GIT binary patch literal 43364 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 literal 0 HcmV?d00001 diff --git a/doc/features.txt b/doc/features.txt new file mode 100644 index 0000000..1dbbbf5 --- /dev/null +++ b/doc/features.txt @@ -0,0 +1,22 @@ +* Actor can move +* Load Map +* Map Collision +* Actors can Shoot +* Actors can die +* NPC states +** Idle +** Purchasing +** Fighting +** Dead + +* Part I: The Desert +** Follow Radar Instructions +** Kill Some Desert Snakes +** Enter the Bunker + +* Part II: The Bunker +** Shoot at enemies +** Find and Activate Nuclear Weapons + +* Part III: Enemies Waves +** Survive diff --git a/main.py b/main.py new file mode 100644 index 0000000..226385c --- /dev/null +++ b/main.py @@ -0,0 +1,33 @@ +import pygame +import world + +pygame.init() +screen = pygame.display.set_mode((800, 600)) +running = True +clock = pygame.time.Clock() +my_world = world.World() +dt = 0.0 +phy_timer = 0.0 +phy_time = 0.2 + +if __name__ == '__main__': + + while running: + start = pygame.time.get_ticks() + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + + screen.fill('black') + my_world.update(dt) + + if phy_timer >= phy_time: + my_world.phy_update(phy_time) + phy_timer = 0.0 + phy_timer += dt + + my_world.draw(screen) + pygame.display.flip() + clock.tick(60) + dt = (pygame.time.get_ticks() - start)/1000.0 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..9c846b2 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +numpy==1.26.4 +pygame==2.5.2 diff --git a/world/__init__.py b/world/__init__.py new file mode 100644 index 0000000..ae263e3 --- /dev/null +++ b/world/__init__.py @@ -0,0 +1,18 @@ +import pygame +from actors import player + +class World: + def __init__(self): + self.actors = [player.Player(self)] + + def draw(self, screen): + for actor in self.actors: + actor.draw(screen) + + def update(self, dt): + for actor in self.actors: + actor.update(dt) + + def phy_update(self, dt): + for actor in self.actors: + actor.phy_update(dt)