From 4656f1cc17a065e00b65663b12d49f24696a80cd Mon Sep 17 00:00:00 2001 From: Erkki Kaila <ertaka@utu.fi> Date: Fri, 23 Sep 2022 11:20:42 +0300 Subject: [PATCH] added some comments --- starfield.py | 80 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 24 deletions(-) diff --git a/starfield.py b/starfield.py index 2d74379..091bd5d 100644 --- a/starfield.py +++ b/starfield.py @@ -1,6 +1,7 @@ import pygame, random - +# Yksinkertainen esimerkki Pygame-kirjastolla tehdystä pelistä +# 2022 / Erkki Kaila (ertaka@utu.fi) def init(): @@ -10,7 +11,7 @@ def init(): return scr - +# Luokka mallintaa "avaruusalusta" ruudulla class StarShip: def __init__(self, x, y, color: tuple): self.x = x @@ -23,6 +24,7 @@ class StarShip: self.going_up = False self.going_down = False + # Piirtää aluksen ruudulle nykyiseen paikkaansa def draw(self, screen): color2 = tuple([x * 1.3 for x in self.color]) size = self.size @@ -35,6 +37,7 @@ class StarShip: y4 = int(y3 + 20 * size) y5 = int(y4 + 10 * size) + # Ylös- tai alaspäin liikkuva alus piirretään eri kulmassa if self.going_up: y3 -= 5 @@ -56,6 +59,7 @@ class StarShip: def right(self): self.x += 1 +# Mallintaa yhtä avaruusaluksen ampumaa "luotia" class Bullet: def __init__(self, x, y): self.x = x @@ -71,6 +75,7 @@ class Bullet: if self.x > 640: is_out = True +# Mallintaa yhtä taustalla liikkuvan tähtikentän tähteä class Star: def __init__(self, x, y, level: int): self.x = x @@ -93,6 +98,7 @@ class Star: self.y = random.randint(5,475) +# Mallintaa pyramidia, jotka toimivat vihollisina class Pyramid: def __init__(self, y, rgb: tuple): self.x = 640 @@ -188,7 +194,7 @@ class Tile: pygame.draw.line(screen, self.shadow, (x + size,y + 1), (x+size, y+size)) pygame.draw.line(screen, self.shadow, (x,y + size), (x+size, y+size)) - +# Mallintaa ruudun alalaidassa rullaavaa "lattiaa" class Floor: def __init__(self, color1: tuple, color2: tuple, y = 448): self.color1 = color1 @@ -212,7 +218,7 @@ class Floor: - +# Tarkistaa onko joku luodeista osunut viholliseen def check_bullet_hits(bullets: list, enemies: list): global score for bullet in bullets: @@ -222,6 +228,7 @@ def check_bullet_hits(bullets: list, enemies: list): bullet.is_out = True score += 100 +# Tarkistaa onko joku vihollisista osunut alukseen def check_enemy_hit(starship, enemies: list): right = starship.x + 60 bottom = starship.y + 80 @@ -230,9 +237,9 @@ def check_enemy_hit(starship, enemies: list): return True +# Alustaa pelin scr = init() timer = pygame.time.Clock() -ball_img = pygame.image.load("pallo.png") high = 0 lives = 3 @@ -241,8 +248,9 @@ score = 0 - +# Silmukka, jossa peli pyörii uudelleen ja uudelleen while True: + # Lista, jossa ovat kaikki taustalla rulllavat tähdet stars = [] ri = random.randint rc = random.choice @@ -251,7 +259,10 @@ while True: for j in range(20): stars.append(Star(ri(0,640), ri(5,475), i)) + # Kaikki ruudulla näkyvät ammukset bullets = [] + + # Kaikki ruudulla näkyvät viholliset enemies = [] font = pygame.font.SysFont("Arial", 24) @@ -260,6 +271,9 @@ while True: ship = StarShip(250, 200, (128, 128, 0)) + # Muuttujat kertovat onko alus liikkumassa johonkin + # näistä suunnista; alus voi liikkua samanaikaisesti + # kahteen eri suuntaan (esim. yläoikealle) left = False right = False up = False @@ -268,38 +282,38 @@ while True: floor = Floor((0,128,0), (0,64,0)) - + # Varsinainen pelisilmukka, joka pyörii kunnes alus tuhoutuu while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() + # Kun näppäin painetaan alas, alus lähtee ko. suuntaan elif event.type == pygame.KEYDOWN: - value = True if event.key == pygame.K_LEFT: - left = value + left = True elif event.key == pygame.K_RIGHT: - right = value + right = True elif event.key == pygame.K_UP: - up = value + up = True ship.going_up = True elif event.key == pygame.K_DOWN: - down = value + down = True ship.going_down = True elif event.key == pygame.K_SPACE: bullets.append(Bullet(ship.x + 60, ship.y + 30)) + # Kun näppäin nostetaan ylös, aluksen liike ko. suuntaan loppuu elif event.type == pygame.KEYUP: - value = False if event.key == pygame.K_LEFT: - left = value + left = False elif event.key == pygame.K_RIGHT: - right = value + right = False elif event.key == pygame.K_UP: - up = value + up = False ship.going_up = False elif event.key == pygame.K_DOWN: - down = value + down = False ship.going_down = False if left: @@ -311,20 +325,27 @@ while True: if down: ship.down() + # Alustetaan uusi vihollinen - määrää voi muuttaa muuttamalla satunnaisluvun + # parametreja if random.randint(1,150) == 1: enemies.append(Pyramid(ri(5,420), (ri(0,128), ri(0,128), ri(0,128)))) - + # Tyhjentää ruudun - tämän jälkeen voidaan piirtää tilanne uudestaan scr.fill((0,0,0)) - + # Piirretään kaikki tähdet - kaikki muu piirretään tähtien päälle, + # siksi tämän pitää olla ensin for star in stars: star.draw(scr) + # Piirretään lattia floor.draw(scr) + # Piirretään alus ship.draw(scr) + # Piirretään luodit, poistetaan listalta luodit jotka ovat + # menneet ulos vasemmasta reunasta index = 0 while index < len(bullets): bullets[index].draw(scr) @@ -334,6 +355,8 @@ while True: else: index += 1 + # Piirretään viholliset, poistetaan listalta viholliset jotka + # ovat menneet ulos vasemmasta reunasta index = 0 while index < len(enemies): enemies[index].draw(scr) @@ -342,11 +365,15 @@ while True: enemies.pop(index) else: index += 1 - + + # Tarkastetaan osuiko viholliseen check_bullet_hits(bullets, enemies) + + # Jos vihollinen osui alukseen, silmukka päättyy if check_enemy_hit(ship, enemies): break + # Piirretään pistetilanne yläreunaan text1 = font.render("Score: " + (str(score).zfill(7)), True, (255,255,255)) text2 = font.render("Score: " + (str(score).zfill(7)), True, (128,128,128)) @@ -359,6 +386,9 @@ while True: scr.blit(text2, (250,5)) scr.blit(text1, (247,2)) + # Piirretään elämien määrää kuvaavat pikkualuksen yläreunaan + # Huomaa, että tässä käytetään samaa luokkaa kuin varsinaisen aluksen + # piirrossa mutta skaalattuna 0.3 kokoiseksi for live in range(lives): sh = StarShip(450 + live*30, 10, (128,128,0)) sh.size = 0.3 @@ -367,26 +397,28 @@ while True: if score > high: high = score + # Tämä piirtää muutokset ruudulle pygame.display.flip() + # Liikutetaan tähtiä listassa for star in stars: star.move() floor.move() - #textx += texta - #if textx == 0 or textx == 335: - # texta = -texta - + # Tämä määrää pelin nopeuden - kokeile pienentää tai suurentaa arvoa timer.tick(200) + # Jos peli loppuu, väläytetään ruuutu valkoisesta mustaksi... for i in range(222, 1, -1): scr.fill((i,i,i)) pygame.display.flip() timer.tick(300) + # ...ja vähennetään yksi elämä lives -= 1 + # Jos elämät loppuivat, peli loppuu if lives == 0: for i in range(0, 255): -- GitLab