thegoodfellas/blogset-br huggingface dataset:
versoes do alfabeto latino. Cada versao pode possui uma ou mais letras do que outra, ou pode possuir diacriticos (simbolos, acentos, etc) diferentes. Entao mesmo que o alfabeto seja o latino, procure descobrir quais sao todas as letras usadas para escrever o idioma, incluindo os diacriticos. Nao se preocupe tanto em aprender a pronuncia por enquanto, pois isso sera estudado em seguida. Primeiro familiarize-se com o sistema de escrita.Partindo daqui, espera-se que voce tenha a habilidade de reconhecer este idioma sempre que vir um texto escrito nele. Se voce nao conseguir isso, entao ainda nao esta familiarizado o suficiente. Repita este passo ate que seja capaz disso.3 - FonologiaFonologia e o nome dado a um ramo especifico da Fonetica, que por sua vez e um ramo especifico em Linguistica Geral. O termo "fonologia" remete a algum idioma em particular, e refere-se ao conjunto de todos os sons utilizados para falar um determinado idioma. E neste passo que e importante lembrar do sistema de escrita. Estude como se pronuncia cada um dos caracteres do sistema. Se for um alfabeto, voce precisa saber qual e o som de cada letra. Lembrando que muitos idiomas empregam o que se conhece por "digrafos", grupos de duas ou mais letras que representam um unico som. Outro ponto importante e que existe uma constraste entre alfabetos foneticos e nao-foneticos. Em alfabetos foneticos como o do espanhol, cada letra ou grupo de letras representa um unico som. Em alfabetos nao-foneticos, como o do portugues e ingles, cada letra ou grupo de letras pode representar um ou varios sons diferentes, baseado geralmente em sua posicao dentro de palavras especificas. Lembre-se tambem dos diacriticos (simbolos ou acentos em cima ou embaixo das letras). Em linguas como o ingles, diacriticos sao extremamente raros. Em outras linguas como o romeno e o portugues, eles existem em abundancia. Os diacriticos alteram ou complementam de alguma forma o som de uma letra ou grupo de letras. Outro detalhe importante e que algumas linguas sao tonais. Uma lingua tonal e um idioma no qual, basicamente falando, o tom de voz ou "contorno do tom" usado para pronunciar uma palavra faz com que ela tenha um significado completamente diferente de outra palavra que se escreve e se fala quase do mesmo jeito. O chines e um exemplo tipico de lingua tonal.Entao voce precisa se familiarizar com todos os sons do idioma. Importante lembrar, que nao basta apenas escutar pessoas falando este idioma. Voce precisa aprender a pronunciar os sons. Qual e o segredo para isso? Treino. Muito treino. Minha dica mais valiosa para voce neste passo e a seguinte: escute e cante muita musica. Nada facilita mais o aprendizado dos sons de um idioma do que cantar. Posso ate afirmar que esse e o maior segredo para a fluencia em um idioma. Partindo daqui, espera-se que voce reconheca este idioma quando ouvir alguem falando e que seja capaz de ler qualquer palavra neste idioma, mesmo sem saber o significado. Se voce nao conseguir isso, repita este passo ate que seja capaz.4 - VocabularioVocabulario refere-se a um conjunto
dizia o velho ditado: "uma imagem vale mais que mil palavras". Assim, voce pode fazer uma brincadeira educativa: coloque no Google Imagens a palavra no idioma que voce quer saber o significado. O Google trara fotos ou imagens diversas que mais tiverem relacao com a palavra que voce pesquisou. Isso geralmente se resume a fotos e desenhos do objeto cujo nome e aquela palavra. Por esse motivo essa brincadeira funciona mais com palavras representando objetos. No caso de voce pesquisar por algo que nao seja concreto, como "amor" ou "odio", voce vera imagens relacionadas mas que nem sempre sao traducoes adequadas. No caso de procurar por palavras que sao particulas, preposicoes, adverbios, conjuncoes, ou outras classes de palavras que nao trazem um significado concreto, o resultado e muito menos instrutivo. Por exemplo, ao procurar por "amor" voce pode acabar se deparando com fotos romanticas de casais, com desenhos de coracoes, ou ate com algumas imagens pornograficas. Por isso eu recomendo que voce use este recurso com bastante cuidado. Ao ver as imagens relacionadas com a palavra que voce nao sabe o significado, automaticamente o seu cerebro comeca a associar a palavra com as imagens. Por via das duvidas, depois de ver as imagens e tentar adivinhar o significado, procure a traducao dela e veja se acertou e se era aquilo mesmo.Uma ultima dica, e isso serve para acompanhar a sua evolucao e para fixar o aprendizado do vocabulario, e o seguinte: crie uma planilha e coloque o nome de "Vocabulario do Idioma tal" (ou qualquer outro nome que preferir). Pode ser no Excel mesmo, ou se preferir algo online que esteja sempre disponivel em qualquer lugar, crie no Google Docs. Nessa planilha, voce vai listar as palavras que voce ja conhece naquele idioma. Numa coluna, coloque a palavra na lingua estrangeira, e na coluna ao lado coloque a traducao ou traducoes. Voce pode inserir expressoes idiomaticas tambem e do lado colocar a adaptacao para o portugues ou outra expressao equivalente. Eu recomendo fazer essas inclusoes na planilha periodicamente, e nao abandona-la. Por exemplo, voce pode atualizar a planilha ao final do dia antes de ir dormir, colocando la todas as palavras que voce aprendeu no dia. Nao recomento incluir na planilha imediatamente apos aprender a palavra. Se voce fizer isso algum tempo depois, o efeito e melhor, pois voce vai precisar lembrar do significado que voce aprendeu, e essa forca que voce fizer tentando se lembrar ajuda muito na memorizacao. E realmente impressionante como todo esse processo vai te ajudar. Sempre me ajudou, e com voce isso nao sera diferente. Apos atualizar a planilha, eu recomendo revisa-la inteira, desde a primeira palavra incluida. Algo interessante e ocultar (ou apagar mesmo) a coluna com as traducoes e tentar lembrar tudo denovo. O segredo por tras disso e que a forca que voce faz para lembrar das coisas faz o cerebro fixar elas. As coisas que voce memoriza na vida, voce memoriza depois de repetir por varias vezes e tentar lembrar delas todas as vezes, ate o ponto em que voce nao consegue mais
esquecer. A partir do momento em que voce vir a palavra e imediatamente saber o significado sem precisar pensar nem forcar a memoria, considere que ela ja e parte integrante do seu vocabulario. A planilha te ajuda tambem a acompanhar a sua evolucao no aprendizado do idioma. Voce vai vendo ela crescer, a cada dia com mais palavras, e isso te motiva a continuar estudando para que ela continue crescendo cada vez mais. E realmente um instrumento valiosissimo.O aprendizado do vocabulario e praticamente constante, voce vai estar fazendo isso sempre, pois sempre vai ter aquela palavra rara que voce ainda nao conhece ou nunca tinha ouvido antes. A tendencia e que depois de muitos anos construindo um vocabulario, a necessidade de adquirir novas palavras diminua, de forma que voce conseguira ler, entender e escrever a grande maioria dos tipos de texto sem precisar de ajuda do dicionario, sera algo fluente. Seu maior desafio sera o proximo passo, onde voce precisara colocar todas essas palavras em um contexto, e formar frases e escrever textos, seguindo as regras especificas do idioma.5 - GramaticaA Gramatica e, basicamente falando, um ramo da Linguistica onde se estudam as regras dos idiomas, tratando dos seguintes topicos por exemplo: como construir frases colocando as palavras na ordem correta, como conjugar verbos, como flexionar palavras para concordar em genero, numero e grau, etc. A Gramatica e na maioria dos casos a parte mais dificil no aprendizado de um novo idioma. Tudo bem, voce ja sabe o alfabeto, ja sabe os sons das palavras, ja preencheu sua planilha e seu cerebro com centenas ou milhares de palavras, mas ainda nao consegue escrever um texto gramaticalmente correto, seja por nao saber conjugar os verbos, por nao saber declinar os substantivos, por nao saber formar o plural, ou por varios outros motivos. E neste passo que voce precisa sanar todas essas duvidas. Gramatica e um topico muito amplo, e depende principalmente de qual idioma esta sendo estudado. Alguns idiomas tem uma gramatica extremamente simples, outros tem uma gramatica extremamente complexa beirando o impossivel. O ingles por exemplo possui uma gramatica relativamente facil. Ja o portugues e tao complexo que nem a maioria dos brasileiros o falam corretamente, mesmo sendo a lingua nativa. O grego moderno eu posso assegurar que e, em varios aspectos, muito mais complexo ate do que o portugues. O grego antigo, mil vezes mais. Se voce estiver estudando uma lingua com sistema de declinacao nominal, como o romeno ou grego, voce precisa aprender os casos e como declinar as palavras de acordo com cada caso. Se o idioma possui um sistema de conjugacao de verbos, voce precisa aprender quais sao os tempos e modos verbais, e como se conjuga os verbos em cada combinacao de modo, tempo e pessoa, quando for o caso. A gramatica e um topico tao complexo que e dificil ate mesmo uma discussao clara e generica sem referencia a um idioma em particular. Cada lingua tem a sua gramatica especifica e em geral as regras dela se aplicam exclusivamente aquele idioma em particular. Mas basicamente o
fazer e conseguir amigos que falem este idioma que voce esta estudando. Talvez seja dificil no Brasil encontrar alguem que fale outra lingua alem do proprio portugues. Mesmo o ingles que e a lingua mais estudada no mundo, poucos brasileiros tem dominio deste idioma. No caso de nao encontrar alguem proximo, procure na internet e faca amigos virtuais mesmo. Se voce fala ingles, e muito facil encontrar amigos virtuais para praticar. Mesmo que voce esteja falando uma lingua pouco conhecida, muita gente ao redor do mundo fala ingles, ate um certo nivel, e voce pode inicialmente conversar em ingles com alguem que fale este idioma e aos poucos ir tentando falar naquela lingua. Como a pessoa e falante nativo, ela pode ajudar a corrigir seus erros.Existem sites especializados no ensino de idiomas, e o que e melhor, gratuitamente. Eu recomendo muito o site Livemocha, e algo como uma rede social (tipo Facebook) voltada ao estudo de idiomas. La voce encontra uma comunidade enorme de falantes nativos de muitas linguas diferentes ao redor do mundo. Voce pode fazer os cursos gratuitos e praticar com falantes nativos, membros da comunidade. Voce pode tambem ajudar estudantes de portugues a falar o nosso idioma nativo, corrigindo exercicios, etc. Basta fazer o seu cadastro e comecar um curso, gratuitamente. Acesse http://livemocha.com/ e treine bastante!7 - ConclusaoTodo esse processo de aprendizado de um novo idioma e algo constante, e como falei anteriormente, o passo-a-passo nao tem uma ordem rigida. Voce nao necessariamente comeca com o alfabeto, vai pra fonologia, passa pelo vocabulario e termina com a gramatica. Voce pode precisar inverter os passos, e repetir muitas vezes muitos deles, alternando ou praticando varios ao mesmo tempo. Tudo depende do seu ritmo de estudo, da sua vontade e da sua capacidade de aprendizado. Apesar dessa falta de rigidez na ordem dos estudos, voce certamente tera que estudar todos estes topicos, seja la em que ordem for, porque praticamente todas as linguas do mundo possuem quase todas estas caracteristicas. E lembre-se sempre: treino, treino e mais treino!Espero sinceramente que este artigo tenha auxiliado nos seus estudos de algum idioma estrangeiro. Quaisquer duvidas, sugestoes ou correcoes, deixe seus comentarios abaixo.Ate breve!
tambem desenvolvido por mim, chamado XTiles, que e uma especie de encapsulamento (wrapper) da SDL que eu utilizo para desenhar graficos primitivos muito mais facilmente. Desta forma, em todo o codigo do jogo nao se encontra chamadas a funcoes da SDL, mas sim as funcoes de XTiles. O unico lugar que utiliza diretamente a biblioteca SDL sao os arquivos de implementacao de XTiles. A vantagem disso e que, caso seja necessario mudar a biblioteca grafica, digamos, trocar SDL por Allegro, basta mudar o codigo em XTiles para encapsular as chamadas de funcao da Allegro ao inves de SDL. Para mais informacoes sobre XTiles voce pode visitar o blog dedicado a este projeto, que a proposito e open-source: www.xtiles.blogspot.com.2. Classe Object, a "pedra fundamental" da engineDiferente de Java, em C++ nao existe uma classe Object da qual herdam todos os outros. Por isto, eu resolvi criar uma classe Object. No entanto, esta classe nao tem descendentes, ou seja, ninguem herda dela. Isto porque o sistema foi concebido para ser o mais simples possivel, e incorporar o conceito de heranca dentro da engine aumentaria em muito a complexidade, uma vez que existem muitos tipos diferentes de objetos no jogo e ter uma classe para cada objeto herdando de Object seria desnecessario. Pode parecer falta de Engenharia de Software, porem a prioridade nesse caso foi a simplicidade.Mas entao, como o sistema sabe os tipos dos objetos sendo que so existe a classe Object mas ninguem herda dela? Simples. A classe Object encapsula uma enumeracao de "tipos" de objeto, e contem um campo "tipo" que referencia um valor dessa enumeracao, de forma que e possivel definir ou obter o tipo de um objeto atraves de funcoes acessoras (ex: getType() e setType()). A informacao de tipo do objeto e usado pela engine para determinar o que fazer ao manipular algum objeto no campo do jogo.Alem de encapsular a informacao do proprio tipo, os objetos (instancias de Object) contem outras informacoes importantes para o sistema, que sao: o parametro, o indice do caractere grafico que representa o objeto na area do jogo, as cores deste caractere, e tres flags indicando certos estados do objeto - se esta ativo, se esta visivel e se e solido.O parametro do objeto e um codigo de 0 a 255 cujo significado depende exclusivamente do tipo. Por exemplo, um dos tipos de objeto e PUSHABLE, que significa algo como "empurravel", "que se pode empurrar". Este tipo de objeto foi criado para implementar pedras, ou quaisquer outros objetos que podem ser empurrados dentro da area do jogo. O parametro deste tipo de objeto indica a resistencia do objeto em ser empurrado. Um outro exemplo seria o tipo ITEM, que representa um item que o jogador pode pegar na area do jogo. O parametro deste tipo de objeto indica o tipo de item que ele representa. Para poucos tipos de objeto, o parametro e ignorado por ser desnecessario. Por exemplo, existe um (pseudo-)tipo chamado VOID, que representa um objeto nulo (um espaco vazio num mapa), cujo parametro nao faz diferenca nenhuma.O indice do caractere grafico
do objeto e um codigo de 0 a 255 que indica qual e o caractere que representa esse objeto, trata-se basicamente de uma referencia a um caractere no conjunto de caracteres de XTiles, para que ele possa ser desenhado na area do jogo. As cores tambem sao armazenadas como codigos de 0 a 255 que referenciam indices dentro da paleta de cores de XTiles.Por fim, temos as tres flags que indicam certos estados do objeto: ativo, visivel e solido. Um objeto inativo e ignorado pela engine ao detectar colisoes e em outras situacoes envolvendo outros objetos. Um objeto invisivel nao e desenhado pela engine no campo do jogo, e um objeto solido serve como obstaculo ao jogador e a outros objetos moveis pois a engine proibe que determinados tipos de objetos ultrapassem a area de objetos solidos durante o movimento.Uma das funcionalidades dos objetos e escrever e ler os seus dados de um arquivo, e essas informacoes sao em formato binario. Mais adiante apresentarei mais funcionalidades da classe Object.3. Classe Map, um mapa do jogoA classe Map implementa cada uma das centenas de mapas do jogo, sendo que ela basicamente encapsula duas matrizes de objetos (instancias de Object) e outras informacoes que cada mapa precisa armazenar. A matriz de objetos foi concebida de forma que cada linha da matriz correspondesse a coordenada Y dos personagens e cada coluna correspondesse a coordenada X. Obviamente, cada posicao na matriz so pode conter um unico objeto, refletindo a ideia de que dois corpos nao podem ocupar o mesmo espaco.Um detalhe importante e que as matrizes nao armazenam ponteiros para objetos, mas sim os proprios objetos, de forma que nao e possivel ter uma posicao "vazia" (com NULL), propriamente dita, de forma que todas as posicoes de todos os mapas contem objetos validos. Para contornar esse problema, foi criado o tipo de objeto VOID que indica um "objeto nulo", o que para a engine significa uma posicao vazia no mapa que pode ser ocupada por objetos de outros tipos e que nunca e desenhada na area do jogo independente de qualquer coisa.Voce deve ter se perguntado, por que existem DUAS matrizes de objetos? Porque cada mapa e composto de duas camadas: camada de fundo ou de baixo (BOTTOM) e camada do topo ou de cima (TOP). A camada de baixo e geralmente reservada para tipos de objetos imoveis e nao-solidos (especialmente os que representam terreno como agua, solo, etc). A camada de cima e geralmente reservada para os objetos moveis, ou objetos imoveis que podem ser removidos pela engine por algum motivo. A engine trata de desenhar primeiro os objetos da camada inteira de baixo, e em seguida, desenha por cima os objetos da camada inteira de cima. Lembrando que objetos do tipo VOID e objetos invisiveis nao sao desenhados, ou seja, quando na camada de cima ha um objeto do tipo VOID ou invisivel, ao inves dele fica aparecendo o objeto da camada de baixo naquela posicao, como se fosse algo transparente.A movimentacao dos objetos no mapa se da pela substituicao dos tipos dos objetos
nas matrizes. Por exemplo, para mover um objeto para cima, copia-se o objeto para a linha de cima na mesma coluna, e remove-se o objeto original da posicao anterior. Quando digo "remover", significa definir o tipo do objeto como VOID, pois como citado anteriormente, nao e possivel ter uma posicao no mapa sem um objeto. Definir um objeto como sendo do tipo VOID efetivamente elimina ele do mapa. Para a engine ele deixa de existir na posicao original, porem a copia permanece na nova posicao.Agora uma curiosidade: Uma vez que os objetos no jogo nao tem nocao de coordenadas, o mapa e responsavel por mover os objetos de uma posicao a outra. Isso acontece pois as coordenadas dos objetos que estao no mapa sao a linha e coluna da matriz onde eles estao inseridos. Em outras palavras, a posicao de um objeto (X/Y) e mapeada aos indices (coluna/linha) de uma das matrizes do mapa. Portanto, se um objeto esta na linha 10 e coluna 20 da matriz do mapa, significa que as coordenadas dele sao Y=10 e X=20.Alem das matrizes de objetos, a classe Map tambem encapsula outras informacoes usadas pela engine, que sao: id e nome. O id de um mapa e um codigo exclusivo que o identifica no mundo. O nome e o titulo que aparece na interface para indicar onde o jogador esta num determinado momento do jogo. Uma das funcionalidades desta classe e escrever e ler mapas de um arquivo. Escrever e ler um mapa nada mais e do que iterar por todos os objetos das duas matrizes e chamar o metodo para escrever ou ler cada um deles no arquivo.Para finalizar, um mapa no jogo e a area visivel do jogo num determinado momento e sempre contem 475 objetos (mesmo que sejam do tipo VOID). O jogador so consegue visualizar e interagir com os objetos que estiverem no mesmo mapa que ele. O mundo do jogo e apresentado em mapas, sendo que somente um mapa e visivel de cada vez. Detalhe: O mundo completo do jogo contem 1024 mapas.4. Classe World, o mundo inteiro esta aquiA classe World apenas encapsula uma matriz de mapas. A matriz encapsulada e de tamanho 32x32, ou seja, o mundo contem 1024 mapas no total. Considerando que cada mapa contem 475 objetos, chega-se a conclusao de que o mundo inteiro do jogo sempre contem no total 486.400 objetos, sejam eles VOID ou nao. E muita coisa!Atraves da classe World e possivel manipular o mundo inteiro do jogo como uma coisa so, e isso facilita muito o trabalho em algumas situacoes. Fora isso, essa classe tem metodos para escrever e ler o "mundo" de um arquivo. Estes metodos apenas iteram por todos os mapas chamando em cada um o seu metodo para escrever ou ler em arquivo, de forma que "escrever o mundo" num arquivo significa "escrever todos os mapas" um por um no arquivo.5. O editorComo citado anteriormente, o projeto de Rhye's Quest e dividido em duas grandes partes: uma e o editor e a outra e a engine. Uma vez que
loop basicamente trata de executar as seguintes rotinas: mudar para o proximo frame das animacoes, desenhar o mapa atual, desenhar o jogador, desenhar os inimigos, desenhar as informacoes atuais, atualizar a tela, verificar se condicoes como a de "game over" sao satisfeitas, detectar colisoes, executar o turno dos objetos e inimigos, e aguardar o jogador pressionar uma tecla para fazer alguma coisa, e repetir tudo isso desde o comeco.9. Movimentacao e deteccao de colisoesComo citado anteriormente, a movimentacao de objetos no mapa se da por substituicao dos elementos nas matrizes de objetos.No entanto, a engine realiza a movimentacao de objetos de duas maneiras. A forma citada e como a engine move os objetos comuns, isto e, as instancias de Object. A outra forma e como ela move os objetos que herdam de Fighter, como Player e Enemy. A instancia de Player e um singleton, ou seja, so existe 1 unico objeto do tipo Player no sistema, que representa o unico jogador. Ao mover este objeto no jogo, a engine manipula as coordenadas X e Y de acordo com a direcao, se o movimento for permitido.Como a engine sabe se o movimento e permitido e quais sao os criterios? Antes de efetivamente mover o jogador, a engine primeiro analisa se a direcao para a qual o jogador deseja se mover esta livre ou se e possivel naquele momento ir naquela direcao. Para isto, a classe Player e dotada de metodos diversos utilizados para "observar" o mapa atual e descobrir que objetos estao ao redor do jogador. Por exemplo, se o objeto que estiver na direcao desejada for solido, o movimento deve ser proibido, portanto a engine nao move o jogador. Os metodos implementados na classe Player sao capazes de determinar o tipo do objeto que se encontra em qualquer direcao e a qualquer distancia do jogador, de forma que antes de mover o jogador e possivel "olhar adiante" para saber o que tem na frente dele.E interessante discutir a implementacao do comportamento de alguns tipos de objeto (instancias de Object). A classe Object implementa um metodo diferente para cada tipo existente. Por exemplo, o tipo PUSHABLE e implementado pelo metodo DoPushable(), o tipo QUICKSAND e implementado pelo metodo DoQuicksand() e assim por diante. Sempre que o jogador efetivamente se move para outra posicao, a engine trata de verificar qual e o tipo do objeto que se encontra atualmente colidindo com o jogador, isto e, qual objeto esta na mesma linha e coluna da matriz do mapa que as coordenadas Y e X do jogador, respectivamente. Entao dependendo do tipo, a engine invoca o metodo correspondente. Por exemplo, se for do tipo PUSHABLE, o metodo DoPushable() e invocado. Desta forma, o jogo "reage" de diferentes formas a cada passo do jogador, a depender do objeto sobre o qual este se encontra. Alguns dos metodos que implementam o comportamento dos diversos tipos de objetos recebem parametros, sendo que o mais importante e geralmente o parametro do proprio objeto.Ao manipular determinados tipos de objetos comuns (instancias de Object) tambem pode ser necessario saber os tipos de