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 :-)
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.
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
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()
# -*- 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)