the sartrean knight é uma curta história interativa que mistura fantasia medieval com filosofia existencialista. inspirado nas obras de Jean-Paul Sartre, o jogo convida você a navegar por uma jornada reflexiva sobre significado, liberdade e as consequências de suas escolhas.
você joga como um cavaleiro cansado diante de um guardião misterioso. através de diálogos e memórias, você determinará seu próprio caminho e conclusão, com múltiplos finais únicos e suporte completo para português e inglês.
eu desenvolvi o the sartrean knight em uma semana, durante a fase inicial da minha experiência na Apple Developer Academy. o projeto foi uma oportunidade de explorar narrativa interativa e design de escolhas significativas.
pude aprender bastante sobre o uso de JSON para construir a estrutura narrativa de um jogo, além de aprimorar minhas habilidades em SwiftUI e Combine. foi também uma forma rudimentar de implementar a localização para um aplicativo, que abriu caminho para aprender posteriormente sobre o uso de catálogos de strings.
design choices
palette
mist#F1F1F1ink#000000paper#FFFFFF
typography
MedievalSharp/antiguidade e autenticidade
Zebras jogam xadrez com o velho faquir
Jacquard 24/toque decorativo gótico
Zebras jogam xadrez com o velho faquir
rationale
o design do the sartrean knight foi inspirado na estética dos manuscritos medievais, refletindo o tema filosófico e histórico da narrativa.
a escolha das fontes MedievalSharp e Jacquard 24 visa evocar a sensação de antiguidade e autenticidade, enquanto a paleta de cores suaves e texturas de papel antigo complementam a atmosfera contemplativa do jogo.
em termos do desenvolvimento da história, a escolha por incluir imagens a cada etapa da narrativa foi feita para enriquecer a experiência do jogador, proporcionando um contexto visual que ajuda a imergir na ambientação medieval.
as imagens foram criadas para refletir os temas e emoções presentes em cada parte da história, reforçando a conexão entre o jogador e o enredo.
a moldura das imagens foi projetada para se assemelhar a uma ilustração decorada que poderia ser vista em um livro antigo.
as imagens em si não seguem um estilo artístico específico, embora tenham certa tendência gótica, mas buscam capturar a essência do cenário e dos personagens de maneira evocativa.
tech stack
SwiftUI
framework de UI
Combine
estado reativo
JSON / Codable
motor de narrativa
Icon Composer
criação de assets
code snippets
Otimização de carregamento de dados da história
swift
private func loadStory() { guard let url = Bundle.main.url(forResource: "story", withExtension: "json"), let data = try? Data(contentsOf: url) else { return } do { let decoded = try JSONDecoder().decode(StoryData.self, from: data) for page in decoded.screens { pages[page.id] = page } orderedPages = decoded.screens currentPageID = decoded.screens.first?.id } catch { print("Failed to decode story.json: \(error)") }}
Analisador de tipografia personalizado
swift
func parseFigureSegments(_ input: String) -> [FigureSegment] { var segments: [FigureSegment] = [] let parts = input.components(separatedBy: "[figure]") for part in parts { if part.contains("[/figure]") { let subParts = part.components(separatedBy: "[/figure]") if subParts.count >= 1 { segments.append(FigureSegment(text: subParts[0], isFigure: true)) if subParts.count > 1 && !subParts[1].isEmpty { segments.append(FigureSegment(text: subParts[1], isFigure: false)) } } } else if !part.isEmpty { segments.append(FigureSegment(text: part, isFigure: false)) } } return segments}
Sistema de localização reativo
swift
class AppLanguage: ObservableObject { enum Language: String { case english = "en" case portuguese = "pt" } @Published var current: Language = .english func toggle() { current = (current == .english) ? .portuguese : .english }}