niedziela, 6 marca 2016

Pierwszy etap



Mam wyklarowane co chcę osiągnąć… ale tylko do pewnego momentu. Pierwszym „kamieniem milowym” (angielskie milestone brzmi nieco lepiej) ma być coś takiego:
1. Działające menu
2. Logowanie i zapamiętywanie poświadczeń.
3. Nawigacja po „folderach”, odpalanie prostych komend.
4. Odpalanie modułu „hakowania”- który wymaga super szybkiego klikania.
Na razie brak w tym tego co jest najważniejsze w grze- czyli wyzwania. Jestem tego świadom, dlatego na razie do czego dążę to zrobienie tzw. zabawki- gry w której można coś robić ale nie ma realnego „gejmpleju”. Mam kilka pomysłów jak to rozwinąć- ale to pojawi się w kolejnych etapach. Wychodzi na to, że chcąc nie chcąc zdecydowałem się na przyrostowy model wytwarzania oprogramowania :-)


Mam już menu i ono wygląda jakoś tak :-)

Obraz nędzy i rozpaczy

Wiem, wiem szału póki co nie robi. Bystre oko dopatrzy się braku polskich "krzaków", spokojnie mam to na liście ;-) (i jest to do rozwiązania)
Ale to się doszlifuje- nawet mam pomysł jak zrobić animacje menu.


W następnych postach dokładniej opiszę więcej szczegółów. Pokażę też gifa pokazującego ekran „hakowania”- gif zawsze robi dobre wrażenie. :-)
Zobaczmy co się dzieje w kodzie.

Refaktoryzacja…

Jak można zobaczyć na moim repozytorium https://github.com/Nicramus/b4b3l_the_hacker_game
znajduje się tam kilka plików. Katalogami docs i resources nie zaprzątamy sobie teraz głowy.
W tej chwili interesują nas dwa pliki menu.py oraz glitch_screen.py.
Oto menu.py
 # -*- coding: utf-8 -*-  
 import pygame  
 pygame.init()  
 class Menu:  
   def __init__(self, screen, bg_color=(0,0,0)):  
     self.screen = screen  
     self.bg_color = bg_color  
     self.clock = pygame.time.Clock()  
     self.screen_width = screen.get_width()  
     self.screen_height = screen.get_height()  
     self.screen_size = screen.get_size() #tuple-> width, height  
     #only for test  
     liberationserif_name = pygame.font.get_fonts()[0]  
     liberationserif = pygame.font.SysFont(liberationserif_name, 20, False, False)  
     self.vga_437_font = liberationserif #pygame.font.Font("resources/fonts/Terminus.ttf", 20)  
     self.set_center_coordinates()  
     self.init_menu_properties()  
   def init_menu_properties(self):  
     self.menu_element_color = (0,0,255) #blue  
     self.menu_text_color = (255,255,255) #white  
     self.menu_element_width = 200  
     self.menu_element_height = 50  
     self.gap = 90  
     self.menu_positions = ("Nowa gra", "Swobodne hakowanie", "Wyjście")  
     #x_y_position = self.set_center_coordinates()  
     #self.menu_item_y_position = y_rect_position = x_y_position[1]  
   def set_center_coordinates(self):  
     self.x_center_position = self.screen_width / 2  
     self.y_center_position = self.screen_height / 2  
   def create_menu_element(self, label_str, y_center_position):  
     "create menu element, render font-label on the element"  
     x_center_position = self.x_center_position - self.menu_element_height / 2  
     pygame.draw.rect(screen, self.menu_element_color,  
                          (x_center_position, y_center_position) +  
                          (self.menu_element_width, self.menu_element_height))  
     label = self.vga_437_font.render(label_str, True, self.menu_text_color)  
     self.screen.blit(label, (x_center_position, y_center_position))  
   def generate_menu(self):  
     "generate menu elements in loop"  
     y_center_position = 100  
     for menu_item in self.menu_positions:  
       self.create_menu_element(menu_item, y_center_position)  
       y_center_position = y_center_position + 90  
   def animate_menu(self):  
     #simple menu animation :D  
     pass  
   def run(self):  
     mainloop = True  
     while mainloop:  
       self.clock.tick(30)  
       for event in pygame.event.get():  
         if event.type == pygame.QUIT:  
           mainloop = False  
       self.screen.fill(self.bg_color)  
       self.generate_menu()  
       pygame.display.flip()  
       pygame.display.update()  
 screen = pygame.display.set_mode((640, 480), 0, 32)  
 pygame.display.set_caption("B4B3L")  
 gm = Menu(screen)  
 gm.run()  

A oto glitch_screen:
 # -*- coding: utf-8 -*-  
 #mozna by się zastanowić, żeby zrobić z tego splashscreen  
 import pygame  
 BLACK = (0,0,0)  
 WHITE = (255,255,255)  
 GREEN = (0, 255, 0)  
 RED = (255,0, 0)  
 colors = []  
 colors.append(BLACK)  
 colors.append(WHITE)  
 colors.append(GREEN)  
 colors.append(RED)  
 pygame.init()  
 width = 700  
 height = 500  
 size = (width, height)  
 screen = pygame.display.set_mode(size)  
 screen.convert() #szybkie?  
 pygame.display.set_caption("dkddkddk")  
 #dopóki user nie kliknie krzyżyka  
 done = False  
 #zegar- odswiezanie ekranu!  
 clock = pygame.time.Clock()  
 #glowna petla gry  
 while not done:  
   #petla zdarzeń  
   for event in pygame.event.get():  
     if event.type == pygame.QUIT:  
       done = True  
   pygame.time.delay(1)  
   for color in colors:  
     screen.fill(color)  
     pygame.display.flip()  
     pygame.time.delay(1)  
   fps = clock.get_fps()  
   pygame.display.set_caption(str(fps))  
   clock.tick(30)  

Różnice są widoczne na starcie- jeden kod jest napisany obiektowo a drugi nie.

glitch_screen to w ogóle ciekawostka- bardziej jest to taki eksperyment niż coś przydatnego- ten kod jedyne co robi to bardzo szybko zmienia bieżący kolor tła i… nic więcej. Myślę, że to się rozwinie w coś innego np. wyświetlanie blue screena lub coś podobnego.

Zabrzmi to idiotycznie ale napiszę to- to co to robi nie ma w tej chwili znaczenia.

Jednak o wiele ważniejsze jest to te dwa kody źródłowe mają za część wspólną- głównym elementem jest tutaj główna pętla gry while oraz pętla zdarzeń pygame.event.get(). Na razie jest tak, że oba pliki muszą być odpalane oddzielne co jest bez sensu. Robię jedną grę a nie dziesięć. Dlatego moim celem na ten czas jest zrefaktoryzowanie kodu i stworzenie prostego „silnika”.
Główna pętla gry i pętla zdarzeń będzie tylko jedna a klasy „konkretne” takie jak menu będą czymś co się określa scenami- każda taka klasa będzie się mogła łatwo komunikować z innymi scenami poprzez wspólny interfejs klasy bazowej.
Plik scene.py zawiera już zapowiedź tego co nadejdzie w przyszłości, także stay tuned :-)

Miłego!
PS. Link do repozytorium wrzucę gdzieś, żeby był na stałe na blogu, na razie będę go dodawał do postów.

I to formatowanie kodu w poście jakieś lepsze skombinuję, żeby składnię pokolorowało itd.

ADRES REPOZYTORIUM, KLIKAĆ I TAK NIE MA TAM NIC CIEKAWEGO (na razie) 

Brak komentarzy:

Prześlij komentarz