Änderungen von letzter Stunde
Ich konnte nicht während des Unterrichts pushen. Dieser Commit enthält die Änderungen, von Nextcloud kopiert
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Item {
|
||||
count: int
|
||||
kind: int
|
||||
inc(amount: int) None
|
||||
}
|
||||
|
||||
class Kart {
|
||||
speed_max: int
|
||||
color: String
|
||||
ram(other: Kart) None
|
||||
consume_item(item: Item) None
|
||||
}
|
||||
```
|
||||
|
||||
- Die Methode `inc(amount)` der Klasse `Item` ändert das Attribut `.count` um die eingegebene Zahl.
|
||||
- Die Methode `ram(other)` in `Kart` tauscht die Geschwindigkeiten der beiden gegebenen Karts.
|
||||
@@ -0,0 +1,39 @@
|
||||
import pygame
|
||||
|
||||
class Input:
|
||||
def __init__(self):
|
||||
self.left: bool = False
|
||||
self.right: bool = False
|
||||
self.down: bool = False
|
||||
self.up: bool = False
|
||||
self.close: bool = False
|
||||
|
||||
def poll(self) -> None:
|
||||
events = pygame.event.get()
|
||||
for event in events:
|
||||
if event.type == pygame.QUIT:
|
||||
self.close = True
|
||||
if event.type == pygame.KEYDOWN:
|
||||
if event.key == pygame.K_LEFT:
|
||||
self.left = True
|
||||
if event.key == pygame.K_RIGHT:
|
||||
self.right = True
|
||||
if event.key == pygame.K_UP:
|
||||
self.up = True
|
||||
if event.key == pygame.K_DOWN:
|
||||
self.down = True
|
||||
if event.type == pygame.KEYUP:
|
||||
if event.key == pygame.K_LEFT:
|
||||
self.left = False
|
||||
if event.key == pygame.K_RIGHT:
|
||||
self.right = False
|
||||
if event.key == pygame.K_UP:
|
||||
self.up = False
|
||||
if event.key == pygame.K_DOWN:
|
||||
self.down = False
|
||||
|
||||
def horizontal(self) -> float:
|
||||
return self.right - self.left
|
||||
|
||||
def vertical(self) -> float:
|
||||
return self.down - self.up
|
||||
@@ -0,0 +1,11 @@
|
||||
ITEM_MUSHROOM = 0
|
||||
ITEM_BANANA = 1
|
||||
|
||||
|
||||
class Item:
|
||||
def __init__(self):
|
||||
self.kind = 0
|
||||
self.count = 0
|
||||
|
||||
def inc(self, value):
|
||||
self.count += value
|
||||
@@ -0,0 +1,52 @@
|
||||
from typing import Self, override
|
||||
|
||||
import items
|
||||
import pygame
|
||||
from input import Input
|
||||
from items import Item
|
||||
from pygame.math import clamp
|
||||
|
||||
Vec2 = pygame.Vector2
|
||||
|
||||
class Kart:
|
||||
def __init__(self, name: str, pos: Vec2, vel: Vec2, dir: float, speed_max: float):
|
||||
self.name: str = name
|
||||
self.pos: Vec2 = pos
|
||||
self.vel: Vec2 = vel
|
||||
self.dir: float = dir
|
||||
self.speed_max: float = speed_max
|
||||
|
||||
@override
|
||||
def __str__(self) -> str:
|
||||
return f"Kart {{ name: {self.name}, pos: {self.pos}, vel: {self.vel}, dir: {self.dir}, speed_max: {self.speed_max}}}"
|
||||
|
||||
def tick(self, input: Input):
|
||||
input_x = input.horizontal()
|
||||
input_y = input.vertical()
|
||||
assert abs(input_x) <= 1
|
||||
assert abs(input_y) <= 1
|
||||
|
||||
acc_amount = input_y * 2
|
||||
self.vel += Vec2(acc_amount, 0).rotate(self.dir)
|
||||
self.vel *= 0.9
|
||||
steer = input_x * 2
|
||||
self.dir += steer
|
||||
|
||||
self.vel.clamp_magnitude_ip(self.speed_max)
|
||||
self.pos += self.vel
|
||||
|
||||
def ram(self, other: Self):
|
||||
"""
|
||||
swap the two kart's velocities (not physically accurate)
|
||||
"""
|
||||
temp = self.vel
|
||||
self.vel = other.vel
|
||||
other.vel = temp
|
||||
|
||||
def consume_item(self, item: Item):
|
||||
if item.kind == items.ITEM_BANANA:
|
||||
self.speed_max += 0.01
|
||||
elif item.kind == items.ITEM_BANANA:
|
||||
self.speed_max -= 0.01
|
||||
|
||||
self.speed_max = clamp(self.speed_max, 0, 100)
|
||||
@@ -0,0 +1,55 @@
|
||||
import pygame
|
||||
|
||||
from input import Input
|
||||
from kart import Kart
|
||||
|
||||
Vec2 = pygame.Vector2
|
||||
|
||||
kart_image = pygame.surface.Surface((10, 10))
|
||||
|
||||
player = Kart(
|
||||
name = "epsilon",
|
||||
pos = Vec2(0, 0),
|
||||
vel = Vec2(2, 0),
|
||||
dir = 0,
|
||||
speed_max = 3,
|
||||
)
|
||||
|
||||
clock = pygame.Clock()
|
||||
|
||||
def main():
|
||||
pygame.init()
|
||||
|
||||
input = Input()
|
||||
width, height = 800, 600
|
||||
screen = pygame.display.set_mode((width, height))
|
||||
pygame.display.set_caption("Pygame Window Example")
|
||||
|
||||
kart = Kart(
|
||||
name = "jerry",
|
||||
pos = Vec2(0.0, 0.0),
|
||||
vel = Vec2(0.0, 0.0),
|
||||
dir = 0.0,
|
||||
speed_max = 10.0
|
||||
)
|
||||
|
||||
|
||||
while not input.close:
|
||||
input.poll()
|
||||
kart.tick(input)
|
||||
|
||||
# Draw game:
|
||||
screen.fill((0, 125, 0))
|
||||
pygame.draw.rect(screen, (255, 0, 0), pygame.Rect(kart.pos.x - 5, kart.pos.y - 5, 5, 5))
|
||||
pygame.draw.line(screen, (0, 0, 0), kart.pos, kart.pos + Vec2(100, 0).rotate(kart.dir))
|
||||
|
||||
pygame.draw.rect(screen, (0, 0, 255), pygame.Rect(kart.pos.x - 5, kart.pos.y - 5, 5, 5))
|
||||
pygame.draw.line(screen, (0, 0, 0), kart.pos, kart.pos + Vec2(100, 0).rotate(kart.dir))
|
||||
|
||||
pygame.display.flip()
|
||||
|
||||
clock.tick(60)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user