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) 

piątek, 4 marca 2016

Trudne początki



Projekt, który będę tu realizował w ramach akcji „Daj się poznać”, ma być grą. Grą od której wybuchną wasze mózgi, grą którą IGN oceni na 11/10 a w TVP zrobią o niej pozytywny (sic!) materiał, w którym redaktor płaczliwym głosem stwierdzi, że gry są nowym lekarstwem na raka.

No dobra tak naprawdę to nie będzie tak różowo, bo grę, którą chcę (z)robić ma być grą hakerską, trochę w klimatach gry Uplink (fantastyczna produkcja Introversion Software, polecam!)  czy też mniej znanego No hackers sky. W zasadzie ta druga gra zakiełkowała w moim umyśle ten pomysł- również polecam ten tytuł, zwłaszcza, że jest darmowy. Rozgrywka ma też nawiązywać do „hakowania” w filmach.
Więc w zasadzie gra raczej nie będzie się (taką mam nadzieję) traktowała zbyt serio.


Tru 1337 h4xor


(chociaż w takim Matrix: Reaktywacja pokazali atak na hosta który przypomina coś rzeczywistego- scena z Trinity w elektrowni)

Stare gry z lat 80 i 90 miały w sobie ten taki „pierwiastek szaleństwa” takiej dziecinnej niedorzeczności np. głupawe power upy w Carmaggedonie, które powodowały, że nasz pojazd skakał albo przechodnie byli dwa razy więksi.
I żeby nie zrzędzić- wiele nowych gier wraca do tych rozwiązań i obecnie powstaje całkiem dużo totalnie odjechanych gier.

Chciałbym, żeby docelowo moja gra właśnie taka trochę głupkowata- bo prawdę powiedziawszy nie znam się za bardzo na hakowaniu oraz zabezpieczeniach, jakieś tam pojęcie mam ale naprawdę nieduże.

Ale odchodzę od tematu.

Nazwa, którą sobie wymyśliłem to B4B3L, nie pytajcie mnie dlaczego- rozwinę ten pomysł gdzieś po drodze. Tak, tak- założenia nie są jeszcze do końca gotowe- póki co mam dość mglistą wizję tego co chcę zrobić.

Ale z drugiej strony mam ustabilizowane elementy (nawet mam trochę kodu) co do których jestem pewien.

Przede wszystkim- link do repozytorium na githubie
W katalogu docs znajdują się dwa pliki: b4b3l_zalozenia.odt w którym (jak nazwa wskazuje) znajdują się założenia projektowe gry.
Co do założeń- na razie to jeden wielki bajzel ale staram się zapisywać każdy nawet najdurniejszy pomysł. Stan obecny jest taki, że są tam jeszcze stare pomysły, gdy kombinowałem, żeby to połączyć jakoś z wykopem ( ͡° ͜ʖ ͡°) ale w końcu uznałem, że to zbyt głupie i hermetyczne.
Drugi plik (TODO) zawiera bieżące sprawy, niektóre luźno związane z prowadzeniem projektu.
Przewiduję, że przeniosę się z czasem na githubowe wiki oraz issues bo to będzie o wiele bardziej czytelne- wszystko będzie w jednym miejscu. No i inni ludzie też będą mogli rozwijać projekt :-)
Githuba będę się starał utrzymywać w języku angielskim, bloga jakoś wygodniej mi pisać w języku ojczystym :-)

Technologia
  • Python 2.7
  • framework Pygame w wersji 1.9.1
  • Linux

Muszę się wytłumaczyć z takiego wyboru- bo to wybór nieco nietypowy jeśli chodzi o tworzenie gier.
Obecnie bardzo popularne stało się tworzenie gier przy użyciu bardzo złożonych narzędzi takich jak Unity czy Construct, które umożliwiają na szybkie tworzenie gier na wiele różnych platform, zdejmując z barków programisty ogrom prac jakich musiałby się podjąć, żeby tylko dostarczyć grę na wymarzone urządzenia . Istnieją nawet narzędzia, które umożliwiają na dość proste tworzenie gier bez znajomości języków programowania! Takim narzędziem jest Game Maker, powstało w nim m.in. zjawiskowe „Hotline Miami”.

Jednakże licznym deweloperom nie podoba się „wysokopoziomowa” natura gotowych rozwiązań więc decydują się pisać grę / silnik samodzielnie od podstaw. Najczęstszym wyborem jest język C++, który z jednej strony dostarcza mechanizmy umożliwiające na bardzo dużą kontrolę nad kodem i pisanie bardzo wydajnych rozwiązań a z drugiej strony dostarcza paradygmat obiektowy, który jest bardzo naturalny w przypadku tworzenia gier.
Niemal każdy znaczący silnik do gier jest napisany w C++.

ALE… Gdybym chciał się uczyć C++ to tworzyłbym grę w C++. Gdybym chciał poznać Unity, to tworzyłbym w Unity :-)
Od jakiegoś czasu chciałem poznać i zrozumieć o co chodzi w Pythonie
Wiadomo- komuś może nie spodobać się wybór starego już Pythona 2.7, którego odradza się w przypadku tworzenia nowych projektów. Jednak najwięcej materiałów i pomocy jest wciąż robiona pod „starego węża” więc na razie trzymam się starej wersji. Jednakże w planach mam przejście na nowszą wersję- potraktuję to jako dodatkowe wyzwanie. Gdy projekt się rozwinie przepiszę go na Pythona 3- co pozwoli mi na poznanie różnić pomiędzy tymi dwoma wersjami języka.
Ten projekt chcę traktować jako poligon do różnych zbrodniczych eksperymentów (muhahaha!)

Uważam, że nie ma lepszego sposobu na naukę programowania niż praktyczne zastosowanie wiedzy i douczanie się w trakcie. Jasne- czytanie książek, tutoriali itd. jest bardzo ważne, ale ma to znaczenie dopiero wtedy, kiedy możemy użyć tego w praktyce. I stąd ten wybór.

Pygame samo w sobie jakimś cudem nie jest. Od dłuższego czasu nie jest nawet rozwijane, ale to nie jest jakiś wielki problem bo jest dokumentacja która jest całkiem niezła a użytkownicy wciąż są aktywni (reddit i stackoverflow). Pygame tak naprawdę jest nakładką na SDL- jest to bardzo popularna biblioteka (nie silnik!) do tworzenia gier w C++. Ponieważ SDL został przeniesiony na różne platformy (podobnie jak Python) teoretycznie nie powinno być problemu z przenoszeniem gry z Linuksa na Windowsa czy Maca (w praktyce nigdy nie jest tak różowo, wiem z doświadczenia :-], zwłaszcza gdy rośnie złożoność projektu- trzeba pamiętać, że Winda trochę inaczej traktuje drzewo katalogów itd.).
Jeszcze się zastanawiam, czy nie robić tylko na Windowsie z prozaicznego powodu- lepszego kompa mam z Windowsem :D Zobaczymy, na razie „trzaskam” na Linuksie.

Z racji tego, że trochu się już rozpisałem, zapowiadam, że następny wpis będzie wreszcie merytoryczny i będzie zawierał mięso tzn. jakiś kod. Jeszcze nie wiem jak się wrzuca na blogspocie kod źródłowy (buuuuuuuuuu! Noob!) ale mam nadzieję, że sobie z tym poradzę.
No i opiszę założenia pierwszego etapu ("kamienia milowego") :-)

PS. Był kiedyś taki blog gościa który się nazywał „Leniuch” i on tam miał taką tradycję, że na końcu wpisu linkował do jakiegoś utworu muzycznego. Takoż robię i ja.
Heh w sumie do kogo ja piszę, i tak nikt tego nie czyta, oprócz botów Google i ciebie Adamie :P

Miłego!



EDIT: i zapomniałem o najważniejszym: nie dodałem linka do repozytorium na GitHubie, bo założyłem, że jak ktoś tu wchodzi to zna już ten link. Oto i on:
https://github.com/Nicramus/b4b3l_the_hacker_game


czwartek, 3 marca 2016

Daj się poznać


To mój pierwszy wpis na tym blogu, trochę się stresuję, więc proszę cię, szanowny czytelniku o daleko posuniętą wyrozumiałość.

Jeżeli tu trafiłeś to pewnie zastanawiasz się co tu robi Samuel L. Jackson z wężem. Otóż, jest to kadr z filmu klasy C pod tytułem „Węże w samolocie”. Ponadto ja jako autor tego blogaska hobbistycznie programuje w języku Python. Stąd nazwa bloga „Węże w kodzie”

Skoro w końcu to trafiłeś to być może nazywasz się Maciej Aniserowicz (serdecznie pozdrawiam, mój blog jest najśliczniejszy!!! ;-)) jeżeli nie, to totalnie nie ma w tym nic złego bo być może jesteś osobą, która śledzi tag #dajsiepoznac albo po prostu jesteś kimś z mojej rodziny lub znajomym (siema! :D)

Właśnie- o co chodzi z tym #dajsiepoznac? Już wyjaśniam- jest to konkurs programistyczny, który ma na celu zmotywować osoby w nim uczestniczące do zrobienia czegoś fajnego oraz pokazania się w internecie.

Aby uczestniczyć w konkursie należy:
a) zgłosić się (rejestracja została przedłużona do 13 marca!)
b) prowadzić projekt, który musi być open-source na GitHubie
c) prowadzić bloga

Cały regulamin można przeczytać na tej stronie http://www.maciejaniserowicz.com/daj-sie-poznac/regulamin/

A oto link „główny” do strony konkursu: http://www.maciejaniserowicz.com/daj-sie-poznac/

Mam nadzieję, że następny wpis będzie nieco bardziej techniczny :-)