

honux
Campones-
Total de itens
71 -
Registro em
-
Última visita
Tudo que honux postou
-
Olá, Estou com um projeto pessoal de criar um jogo MMORPG 2D, estilo Tibia, e por isso estou começando a procurar uma equipe para me ajudar. Como estou sozinho como programador ( E não estou procurando nenhuma ajuda no momento ), o desenvolvimento do jogo está indo conforme eu consigo levar e para manter o projeto em pé, programo cerca de 4~8 horas todos os dias úteis. Não é muito, porém o cliente está da seguinte maneira: Como vocês podem perceber, o design do cliente está horrível e por este motivo estou aqui! Procuro um designer para fazer o estilo do cliente e um Spriter para fazer os sprites do jogo! Caso você se ache apto para o cargo, por favor poste neste tópico: Sobre o Designer O Designer tem o objetivo exclusivo de criar o estilo do jogo, como botões, estilo dos boxes, texturas e imagens a serem utilizadas no jogo. Exemplos: Algumas perguntas que já foram perguntadas quando eu postava aqui com mais freqüência: Tenho uma equipe que também está fazendo um jogo, já temos X sprites, Mapa, tudo! Só falta o programandor, quer entrar na nossa equipe? - Não, muito obrigado. Qual a previsão de lançamento do jogo? - Pretendo ter algo onde você possa pelo menos andar para um lado / outro e conversar com os amigos até o final de fevereiro, porém não é nada garantido, já em relação ao jogo 100% pronto, espero que até o final do ano ele esteja online. Nossa, sempre quis aprender a programar, como você fez para aprender? Você pode me ensinar? - Li sozinho e não dou aulas particulares, Google será seu pai.
-
@Fusion a máquina não entende a nossa forma de escrita, portanto existe uma linguagem específica da máquina e essa máquina é através do número binário. TUDO que você digita é convertido para o número binário, desde os números até as letras! As letras são convertidas para os números binários através da tabela de códigos ASCII. Claro que o computador tem a sua própria maneira de diferenciar um número de uma letra e assim vai, mas não vamos entrar neste detalhe aqui, né? @Topic Existe uma maneira que pelo menos eu acho mais simples... Multiplique o número da casa ( 0 ou 1 ) por 2 elevado ao número da casa correspondente - 1, então vá somando! Exemplo: 1010101010 vamos somar da direita para a esquerda... 0x2^0 = 0; 1x2^1 = 2; 0x2^2 = 0; 1x2^3 = 8; 0x2^4 = 0; 1x2^5 = 32; 0x2^6 = 0; 1x2^7 = 128; 0x2^8 = 0; 1x2^9 = 512; 2 + 8 + 32 + 128 + 512 = 682 O número binário '1010101010' corresponde ao número 682. Apesar de que só vou utilizar isso lá pra frente... já é importante saber =P
-
E eu dedico esse tutorial a mais um copy e paste do Nostradamus. Este tutorial é de FelipeMorais, usuário do fórum iEvolution. Link para o post original. Ahh, eu posso não entender de PHP e posso estar falando coisa errada... Porém Nostradamus, quem não usa DB utilizar um arquivo que guarda todas as senhas seria burrice, não? E este sistema é completamente 'hackiavel', já que ele pega o 'ok' do cookie, sendo que não há criptografia, código de segurança nem nada. Então pq não adicionar um cookie como home depois edita-lo para como se tivesse vindo de sua page com esse ok? é triste ver você falhando novamente nostra...
-
Boa kra ^^ mais já existe um programa que faz download ._. PS Não confundam a versão do SVN com a do CVS
-
mais cedo ou mais tarde eu sabia que iam fazer este NPC... Já tenho esse sistema desde que existe o 7.1, a mto tempo antes de alguém liberar... porém meu code esta bem menor e mto mais fácil... Tem várias coisas que ainda podem ser simplificadas e resumidas... como... -- General function for getting the amount of entries in the tablefunction getTableSize(thisTable) local n = 0 local i = 1 while true do if(thisTable[i] == nil) then return n end n = n+1 i = i+1 endend poderia ser simplismente -- General function for getting the amount of entries in the tablefunction getTableSize(thisTable) local n=1 while thisTable[n] do n=n+1 end; n=n-1 return nend só resumi um qualquer de exemplo... porém ainda pode resumir muita coisa...
-
Não sei se conheço esse Tatu Hunter.... Porém ele poderia ter amenizado algumas coisas.... como por exemplo no lugar desse if feio pra ver de qual cidade utilizar um switch.... e ter melhorado essa busca do SQL, ele fez duas sendo que pode ser utilizada somente uma.... porém parabéns...
-
Boas.... Estive estudando um pouco PHP, e aprendi a utilizar a função "mail()", porém ela requer um servidor SMTP, e o hotmail infelizmente não tem suporte ao mesmo, então não consigo enviar o e-mail a uma boa parte da comunidade. Também consegui achar a função "imap_mail()", porém não consegui utilizar a mesma por diversas questões, uma delas porque não consegui configurar o servidor de IMAP direito... Gostaria de saber se alguém sabe como fazer de algum modo enviar um e-mail via Web que cujo mesmo consiga enviar ao hotmail. Grato pela atenção.
-
Só passei aki pq um amigo me deu o link... @up Honestamente... Horrível... Cansei de bancar o bonzinho... Primeiro esse code que eu postei tá horrível... Você pode mto bem fazer uma list das bless, tirar 90% das funções que tem nela e ficar mto melhor... mais como vcs amama copy e paste é o que dá... ngm nunca aprende...
-
Desde quando não me dei bem na moderação? acho que vc não lembrou o ocorrido... Logo que entrei, passou umas 2 semanas e magicamente meu pente de memória queimou. Então com o fato ocorrido, resolvi comunicar a equipe que ficaria ausente por um tempo. Fiquei uns 3 dias sem net, providenciei uma ram fraca para voltar, nem que fosse somente para entrar no fórum, e quando entro não sou mais nada da equipe. Não é que eu não me dei bem, já fui sub em mais 2 fóruns e ambos pedi demissão, em um eu não me dava bem com a equipe e no outro eu simplismente sai por motivos pessoais.
-
@Kakimura Não vale a pena. Muito trabalho para pouca coisa, além do mais que graça teria em refazer algo pronto? Tudo bem que poderiamos diminuir os mem leaks, porém continuo achando que não vale a pena~
-
Mesmo tendo parado com Open Tibia visito aqui diariamente. Essa equipe sempre me acolheu e demonstrou respeito, muito diferente de qualquer outro lugar. ( Desculpe por citar nomes ) Visito o OtFans e o OtservBR ( mais conhecido por mim como otnaubr ) freqüêntemente, porém em nenhum lugar sou tratado como sou aqui, tem a mesma organização que tem aqui, tem o mesmo coração. Aqui se você postar uma dúvida, a equipe esta preparada para te responder, lá ficam dias com a dúvida sem ninguém ajudar. Espero que o Xtibia continue crescendo sem parar, e que um dia ( quem sabe ) ser o Maior e melhor ( já é ) site sobre Open Tibia e quem sabe até sobre Tibia do mundo! ( pois do Brasil já é, não? ) abraços~
-
Nossa... Eu conheci o "Tibiahelp", mais nunca tive interesse nele Então quando lanço o Xtibia eu resolvi me cadastra, ( depois que veio o fórum separado e não mais na página principal ) ai aqui to eu Quem aqui lembra do "Lipe" ? Um outro admin que na época do TibiaHelp tava junto com o Gus? ( que na época era Gusbronha ) Eu lembro de um post ( antigasssooo ) do Lipe, que na época num tinha grana pra compra o .com nem o .com.br ai ainda tava rodando no "xtibia.temtudohost.com" se eu não me engano, era moh engraçado O Gustavo ainda falava com algumas "gírias", como "vc", que hj em dia é raro :PPP Falando nisso, o que aconteceu com o Lipe? Boa gus
-
@Lukus Jhor Bela aula ^^ Agora ensine as pessoas a fazerem documentos de Web com ele... por exemplo ( só sei isso xD ): <?xml version="1.0" encoding="ISO-8859-1"?><?xml-stylesheet type="text/xsl" href="HelloWorld.xsl" ?><text><string>Hallo, naub</string></text>
-
Bom galera, como todo mundo sabe eu não curto a versão liberada pelo Open Tibia Server Team ( mais conhecido como CVS ), então a um tempo, eu resolvi começar um protocolo próprio, porém isso me trouxe problemas e perca de tempo.... Então eu parei, e deixei o projeto descontinuado, então para não ficar ocupando espaço aqui no meu computador, eu resolvi posta-los para vocês aprenderem e verem como eu fiz, quem sabe até continuar certo? O que tem o "Protocolo" : - Versão 7.1 ( prefiri pois não utiliza Criptografia para enviar dados, e sei lá, axo mais romântico ) - Char List; - GameWorld Connect. O que NÃO tem : - Poder "andar" no servidor; - Database ( quer dizer, sempre o mesmo char ); - Ações básicas. Agora vocês me perguntam.... Então, já que não tem nada, porque você liberou? Sei lá, pra vocês terem um conhecimento básico de como mecher com WinSocket... são somente 2 arquivos : main.cpp #include "NetworkMessage.h"#include "main.h"int main() { // Inicializa o Winsock. WSADATA wsaData; int iResult = WSAStartup( MAKEWORD(2,2), &wsaData ); if ( iResult != NO_ERROR ) std::cout << "Error at WSAStartup()\n" << std::endl; // Cria um novo Socket SOCKET m_socket; m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); char Host[128]; hostent *HostEntry = NULL; if(gethostname(Host, 128) == 0){ HostEntry = gethostbyname(Host); if(HostEntry){ unsigned char** addr = (unsigned char**)HostEntry->h_addr_list; // Equivaleria ao IP do config.lua addr = (unsigned char**)HostEntry->h_addr_list; addr++; HosterIP = addr[0][0]+(addr[0][1] << 8) + (addr[0][2] << 16) + (addr[0][3] << 24); } } // Configura o novo Socket sockaddr_in service; service.sin_family = AF_INET; service.sin_port = htons(7171); service.sin_addr.s_addr = INADDR_ANY; if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) { std::cout << "bind() failed.\n" << std::endl; closesocket(m_socket); return 0; } // Tenta ler o Socket if ( listen( m_socket, 1 ) == SOCKET_ERROR ) std::cout << "Error listening on socket.\n" << std::endl; // Aceita Conexões while (true) { // Aceita um novo Socket SOCKET s = accept( m_socket, NULL, NULL ); if(s > 0) // o Socket é válido ClientConect(s); } WSACleanup(); return 0;}int ClientConect(SOCKET s){ NetworkMessage msg; if(!msg.ReadFromSocket(s)) // O Socket enviado num tá correto... MANDEO PARA O INFERNO! return 0; unsigned short ProtocolID = msg.GetU16(); msg.Reset(); // Muda a posição de escrita pra 2 (depois dos 2 bytes da length) if(ProtocolID == 0x0201) // O CVS me deu uma ajudinha aqui :X { msg.AddByte(0x14); std::stringstream motd; motd << "1"; motd << "\n"; motd << "Mensagem"; msg.AddString(motd.str()); msg.AddByte(0x64); // Box da lista de chars msg.AddByte(1); // Número de Chars msg.AddString("Kyo"); msg.AddString("OpenTibia"); msg.AddU32(HosterIP); msg.AddU16(7171); msg.AddU16(999); // Premmy Days /* // Como mandar uma mensagem de erro... msg.AddByte(0x0A); // mensagem de erro ( "Sorry" ) msg.AddString("Conexão Correta."); */ } else if(ProtocolID == 0x020A) // GameWorld Connect { msg.AddByte(0x0A); msg.AddU32(10);//id msg.AddByte(0x32); msg.AddByte(0x00); // Adding the Player to the Map msg.AddByte(0x64); // Position Code msg.AddU16(50); msg.AddU16(50); msg.AddByte(7); for (int x = 0; x < 18; x++) for (int y = 0; y < 14; y++) { msg.AddU16(102); // ID do chão if ((x == 8) && (y == 6)) // Posição do Player { msg.AddByte(0x61); msg.AddByte(0x00); msg.AddU32(0); // ? msg.AddU32(10); // ID do player msg.AddString("Kyo"); // Nome do Player msg.AddByte(50); // Porcentagem de vida msg.AddByte(2); // Direção msg.AddByte(128); // Looktype msg.AddByte(114); msg.AddByte(114); msg.AddByte(114); msg.AddByte(114); msg.AddByte(0x00); // Luz ? msg.AddByte(0xDC); // Luz ? msg.AddU16(300); // Velocidade } if ((x != 18) || (y != 14)) { msg.AddByte(0); msg.AddByte(0xFF); } } // Multi-lvl bytes msg.AddByte(0xFF); msg.AddByte(0xFF); msg.AddByte(0xFF); msg.AddByte(0xFF); msg.AddByte(0xFF); msg.AddByte(0xFF); msg.AddByte(0xFF); msg.AddByte(0xFF); msg.AddByte(0xFF); msg.AddByte(0xFF); msg.AddByte(0xFF); msg.AddByte(0xFF); // World Light Level msg.AddByte(0xE4); // TODO Light level msg.AddByte(0xFF); // TODO Light Color // Status msg.AddByte(0xA0); msg.AddU16(1000); msg.AddU16(1000); msg.AddU16(300); msg.AddU32(100); msg.AddByte(1); msg.AddU16(1000); msg.AddU16(1000); msg.AddByte(100); // Player Light Level msg.AddByte(0x82); //Light Code msg.AddByte(0x6F); //Light Level msg.AddByte(0xd7); //Light Color // Player Inventory msg.AddByte(0xA1); // Skills msg.AddByte(10); msg.AddByte(10); msg.AddByte(10); msg.AddByte(10); msg.AddByte(10); msg.AddByte(10); msg.AddByte(10); msg.WriteToSocket(s); msg.Reset(); // Muda a posição de escrita pra 2 (depois dos 2 bytes da length) } else { // Retorna o Protocolo que foi enviado em Hex std::cout << "Unknow Protocol connect where ID = "; for (int i=2*sizeof(ProtocolID) - 1; i>=0; i--) { std::cout << "0123456789ABCDEF"[((ProtocolID >> i*4) & 0xF)]; } std::cout << std::endl; } // Envia o Socket para o Cliente msg.WriteToSocket(s);} main.h #ifndef _MAIN_H_#define _MAIN_H_#include "winsock2.h"#include <iostream>#include <sstream>int HosterIP;int ClientConect(SOCKET s);#endif E o "NetworkMessage.cpp" e "NetworkMessage.h" vocês podem usar o do CVS team, ou podem aprimora-lo que nem eu fiz ( ty Vitor por tem me ajudado ) Caso alguem pergunte, a única coisa que vai precisar pra compilar é colocar no "Linker" isso : -lwsock32 Kyo~*
-
@Nostradamus Depende muito da aplicação que vc vai fazer, por exemplo. Antes eu utilizava o Borland para fazer programas com interface gráfica, hoje em dia não necessito mais do mesmo pois aprendi a fazer sem precisar do mesmo. @XuXuOt Nunca vi um bug oO
-
Introdução e História A linguagem de programação C++ é na verdade um superconjunto da linguagem de programação C (seu primeiro nome foi “C com Classes”). A razão da linguagem C ter sido chamada de C é simplesmente porque ela foi sucessora de uma linguagem chamada B, desenvolvida por Ken Thompson em 1970 e que rodava em um DEC PDP-7, um computador muito menos potente do que um PC moderno. O sistema operacional UNIX original rodava naquela máquina, e foi ali também onde o B nasceu (o B em si foi o sucessor de uma linguagem chamada BCPL, escrita por Martin Richards). No entanto, o B era um tanto quanto restrito. Em 1972 Dennis Ritchie e Ken Thompson criaram a Linguagem C para aumentar o poder do B. O C não se tornou popular imediatamente após sua criação - na verdade ele permaneceu como um assunto quase esotérico pelos seis anos seguintes. Em 1978, Brian Kernighan e Dennis Ritchie escreveram o famoso “The C Programming Language”. Edição e este livro simplesmente mudou tudo. Com a divulgação do C houve uma explosão de interesse, e a linguagem foi implementada em computadores de 8 bits que rodavam o sistema operacional CP/M. Mas foi o lançamento do IBM PC, em 1981, que realmente deu impulso ao C. Quando a revolução do PC começou, o C estava em uma posição privilegiada para aproveitá-la. À medida que o número de PC’s explodia, também explodia o número de usuários do C. O C libertou-se de seu ambiente UNIX original e tornou-se uma linguagem “popular” para microcomputadores. Vale a pena salientar que ele se tornou popular por uma razão muito boa: os programadores gostaram de usá-lo. Ao contrário de outras linguagens, o C dava ao programador grande controle sobre o computador, tal controle, no entanto, traz também a responsabilidade: há muitas coisas que você pode fazer em C que arruinarão seu programa ou travarão seu computador. Ou seja, você pode fazer em C coisas que outras linguagens jamais permitiriam. Os programadores gostaram disso, imagine quem não gostaria poder fazer praticamente tudo com um computador! O C tornou-se uma ferramenta e não um obstáculo. O C tornou-se a combinação perfeita entre o controle e poder de programação. À medida que a popularidade do C crescia, crescia também o número de aplicativos escritos em C. Depois de certo tempo, os programas em C ficavam cada vez maiores e algumas pessoas começaram a achar que as construções de programação padrão simplesmente não estavam à altura da tarefa. Uma solução seria tornar os programas mais modulares, através do uso de funções. No entanto algumas funções acabavam precisando compartilhar dados, outras precisavam coordenar seu trabalho com outras e, de novo, era possível acabar precisando ter de guardar na cabeça dúzias de coisas ao mesmo tempo. Aí então apareceu o Dr. Bjarne Stroustrup e desenvolveu o C++, inspirado em parte por outras linguagens, como o Simula67, Smalltalk, até hoje considerada uma das mais puras linguagens OO. O trecho de uma entrevista com o Dr. Bjarne Stroustrup: “Inventei C++, escrevi suas definições preliminares e produzi sua primeira implementação. Escolhi e formulei os critérios de projeto para C++, projetei seus principais recursos e era responsável pelo processamento de propostas de extensão no comitê de padrões C++”. Acho que ninguém melhor como referência na linguagem que o Dr. Bjarne. O nome C++ foi criado por Rick Mascitti em 1983, o nome representa um incremento (operador ++ de incremento no C) na linguagem C. A linguagem não foi chamada de D porque é uma extensão da linguagem C. No início não havia documentação de projeto do C++, nem comitê para aprovação dos padrões C++. Em 1987 com a explosão do C++ foi necessário que a padronização formal do C++ acontecesse. Após vários anos e várias propostas de padronizações, em 1995 foi divulgado um projeto de padrão inicial para revisão pública e em 1998 um padrão internacional formalmente aprovado para C++. O que é o C++ ? O C++ é uma linguagem de uso geral, com uma tendência para a programação de sistemas e que: - É uma linguagem C melhorada; - Suporta abstração de dados; - Suporta programação orientada a objetos; - Suporta programação genérica; Compilador Basicamente será o programa utilizado para unir todos os códigos fontes em um único execultável. Existe vários compiladores diferentes, segue uma lista de alguns : Nome - Tipo - Plataforma Turbo C++ - Freeware - DOS DJGPP - Freeware - DOS / DPMI Dev C++ 4.9.9.2 - Freeware - Win32 Microsoft Visual C++ 5.0 / 6.0 - Shareware - Win32 Borland C++ Builder 4.x / 5.x / 6.x - Shareware - DOS / DPMI / Win16 / Win32 Fontes utilizadas : http://www.baboo.com.br/absolutenm/templat...9455&zoneid=170
-
Bom, primeiramente gostaria de parabenizar você que realmente chegou até aqui, leu post por post, entendendo aula por aula, pois eu duvido muito que isso tenha ocorrido com alguém porém tudo bem, a vida continua. Um professor não pode se jogar de um precipício porque um aluno dele não fez a lição de casa ou não entendeu a matéria. No C++ felizmente há um recurso bem interessante, seria poder separar o seu programa em vários arquivos e como conseqüência em outros 2 tipos, headers e Arquivos de bloco de códigos. Respectivamente, headers são arquivos terminados em ".h" ( header ) ou ".hpp" ( header plus plus ) e Arquivos de bloco de códigos são os arquivos terminados em ".c" ou "c++". Bom... vamos ver o meu stack.h : const int maxStack = 16;class IStack{public: IStack () :_top (0) {} void Push (int i); int Pop ();private: int _arr [maxStack]; int _top;}; Até agora nada de novo. A primeira linha declara a variável maxStack com o valor de 16 e fala que o valor dela não mudará durante a execução do programa inteiro ( const ), então é declarada a class IStack, o contructor onde faz a variável _top adiqüirir o valor 0 e então finalmente algo novo. Foi declarado 2 funções porém não foram inicializadas, quer dizer, apenas foi declarado a sua existência. Percebemos isso através da forma da inicialização, 1° porque não tem as chaves que delimitariam a atuação da função; 2° Porque tem parênteses então significa que está esperando argumentos para o início da mesma. Então a declaração da variável _arr com um delimitador que seria maxStack. #include "stack.h"#include <cassert>#include <iostream>using std::cout;using std::endl;void IStack::Push (int i){ assert (_top < maxStack); _arr [_top] = i; ++_top;}int IStack::Pop (){ assert (_top > 0); --_top; return _arr [_top];}int main (){ IStack stack; stack.Push (1); stack.Push (2); cout << "Popped " << stack.Pop() << endl; cout << "Popped " << stack.Pop() << endl; return 0;} Primeiramente vamos ver os includes. Ele inclui o arquivo "stack.h" que dele tiraramos a declaração da class. Depois um novo o "cassert", não vamos aprofundar, basicamente vamos utilizar ele da sua atual forma, como um Debbuger ( para vermos onde foi o erro ), ele retornará onde foi o erro ( linha ) e qual foi o erro na tela caso ocorra um erro. Dpois vimos as funções Pop() e Push (int i), porém com um detalhe novo, o "IStack::" antes, isso significa que as funções pertencem a classe "IStack", então vimos aquela função no qual eu disse que era mágica, ela pertence ao "cassert" e o nome é assert ( condição ). Caso a condição for falsa retorna a mensagem que eu já comentei caso for verdadeira simplismente "ignora" a função. Depois na função main outra coisa interessante, para chamar a função Pop() foi utilizado a instância stack ( previamente declarado ), pois como a função pertence a classe IStack devemos chama-la pela classe, caso não pertencece a classe poderiamos simplismente pelo nome e atributos ( e ela não teria a "CLASE::" antes do nome ). Agora vamos ver um conceito que será trabalhado durante o curso, que é inline e non-inline. Uma função inline é aquela função que ela é feita dentro da classe ( funções de qualquer lição anterior menos a main ), mas o nome não é simplismente por isso. Quando uma função é inline o 'bloco de código' dela é 'adicionado' a função atual, quer dizer há uma redução de espaço e tempo, aumentando a velocidade de execução do programa. E o non-inline é toda função que é declarada fora da classe ( Ex.: Pop () ), para uma função non-inline ser executada a função que a chama para, chama a função non-inline então recebe o resultado então continua a função no qual a chamou. Isso faz um gasto de tempo maior do que gastaria com uma inline. Essa é uma das razões do porque o C++ é melhor e uma das explicações da sua velocidade maior do que outras linguagens de programação. </span>
-
Runa De Fogos De Artifício Muito Animada!
tópico respondeu ao Rikezenho de honux em Actions e Talkactions
@Smaug Não, é apenas a animação. @Rikezenho Porque vc não estudou um pouco de LUA e fez um code muito menor que tem o mesmo efeito? i = 1k = -1j = -1function onUse(cid, item, frompos, item2, topos) while k < 2 do while j < 2 do while i < 20 do fogo = {x=topos.x+(k), y=topos.y+(j), z=topos.z, stackpos=1} doSendMagicEffect(fogo,i) i = i + 1 end i = 0 j = j + 1 end j = -1 k = 1 + k end doChangeTypeItem(item.uid,item.type-1) i = 0 j = -1 k = -1 return 1 end Por mim BEM mais simples e explicativo, sendo a ainda dá pra reduzi mais ainda esse code... Olha eu não testei essa runa, mais só pelos loops que ela faz ( mesmo na original ) dá para perceber que ela fará o server lagar e MTO, então poderá derrubar o servidor com ela. Também acho que a "explosão" que a mesma faz é muito variável ( 20 tipos ) então acaba não tendo graça pois acho que ficaria tudo muito acumulativo. Alguém teste a runa que eu fiz com o while para ver se eu fiz certo. Por favor galera, acho que para ser um Action Maker não é apenas pegar as funções que vcs acham e fazer uma Action, como as Actions são feitas em LUA vcs poderiam pelo menos estudar LUA e fazer uma Action decente... -
Quanto tempo não? ^^ Bom continuando com as aulas, finalmente vamos aprender todos os tipos de variáveis e funções. Tipos bool - Expressa dois tipos de valores true ou false, qualquer valor diferente de 0 é interpretado como true e 0 respectivamente como false. int - Expressa um valor inteiro. double - Expressa um número fracionário ( com casas decimais ). float - Expressa um número fracionário com até 2 casas decimais ( cópia barata do double ). char - Expressa uma cadeia de caracteres ( characters ). void - Expressa um tipo vazio, um "sem tipo". Modificadores short e long - Expressa respectivamente um número pequeno e um número longo ( não sei explicar de outra forma ). unsigned e signed - seria para informar ao compilador se o número contém sinal ou não, unsigned [un ( sem ) signed ( sinal )] e signed ( sinal ). Exemplo : char cVar = 't'; int iVar = 298; float fVar = 49.95; double dVar = 99.9999; bool bVar = (2 > 3); // false bool BVar = false; unsigned long int = 526846864; Assim vai, todos os valores contém um limite, por exemplo o int ( 2 bytes ) sem nenhum adicional pode ter um valor de -32.768 a 32.767. O maior valor que se pode obter é um long double. Asseguir a tabela de todos os limites. <span style='font-size:8pt;line-height:100%'>Fonte : <a href="http://ead1.eee.ufmg.br/cursos/C/aulas/c320.html" target="_blank">http://ead1.eee.ufmg.br/cursos/C/aulas/c320.html</a></span> Perceba que na tabela contém uma coluna que é de uma função "scanf()" que veremos mais para frente. Provavelmente você ficará cansado uma hora de tanto digitar unsigned long, long int, assim vai. Então logicamente você pode utilizar um "atalho" esse atalho é conhecido como typedef. Basicamente é da seguinte forma : typedef TIPO NOME; Ex: typedef unsigned long ulong; Assim toda vez que digitassemos ulong o compilador iria aceitar como se vc tivesse digitado unsigned long. Certas vezes vocês verão em sources de programas coisas que achamos irônicas, do tipo "typedef int INT;", ninguém sabe o porque o programador fez isso neste momento, mas ele fez. </span>
-
Esse tutorial foi feito com algumas partes e com base no Tutorial "noções 3.1", que pode ser encontrado em : ftp://ftp.tecgraf.puc-rio.br/pub/lua/nocoes-3.1.pdf Bom, basicamente lua não necessitará o saber de qualquer outra linguagem. Lua foi uma linguagem produzida com o intuido de ajudar os programadores, sendo muito mais fácil de programar, não tendo finais ( ";" no caso do C++ ) que você tem que colocar no final de toda linha, variáveis não precisam ser declaradas e podem assumir qualquer tipo de string, assim vai. Como lua não é uma linguagem muito complexa ( pelo menos para mim ) irei começar com o tutorial básico e clássico que todos estamos " acustumados ". -- Primeiro programa feito em LUA-- Imprime a mensagem na telaio.write("Ola Companheiro!\n") Vamos olhar linha por linha o nosso programa. Os "--" expressa um comentário, que será ignorado pelo programa quando for executado. Também pode ser expresso um bloco de comentário, onde será utilizado "--[[" e "--]]" respectivamente. Então as 2 primeiras linhas representam um comentário do programa. io.write("Ola Companheiro!\n") Essa linha chama a função que escreve na tela e envia a string "Ola Companheiro!" na tela. Se você já programa em alguma outra linguagem você já deve ter imaginado que o \n é um breakline, quer dizer, uma nova linha. Caso você tenha executado nosso primeiro programa você deverá ter percebido que abriu uma janela e fexou extremamente rápido, não dando para ver nada. Eu criei uma "solução" para esse problema, e a mesma é criar um outro arquivo lua e digitar isso : -- Arquivo feito para rodar um programa constante-- Ele simplismente lê o arquivo alvo e chama a função main dele.dofile("Programa.lua") -- Carrega o arquivo Programa.lua, como conseqüência suas funçõesshow = 0 -- inicializa a variável show com valor inicial igual a 0while 1 do -- cria uma condição constante, então vai ficar rodando o programa e nunca fechar o mesmo. if show == 0 then -- só queremos chamar a função main do arquivo alvo uma vez não? main () -- chama a função main show = 1 -- muda o valor da variável show para não executar novamente. endend Mais para frente vamos saber exatamente o que este arquivo faz. E o arquivo que vamos trabalhar vai ter que ter o nome obrigatório de "Programa.lua" e terá que ser da seguinte forma : -- A execução do programa, agora com uma tela constante.function main () -- Cria a função mainio.write("Ola Companheiro!\n") -- Escreve na telaend Pronto, temos o nosso primeiro programa feito em lua que escreve na tela Ola Companheiro e não fecha. Vamos começar a mecher com variáveis, então conseguir fazer o primeiro programa que faz algo. Variáveis Diferente de várias outras linguagens em lua você não precisa declarar nenhuma variável pelo seu tipo, pois elas são automaticamente declaradas ao inicializar-las. O modo para declarar uma variável é : Variável = Valor A única diferença é que para strings você deverá colocar entre aspas simples ( ' ), aspas ( " ) ou chaves ( [[ e ]] ). Existem basicamente 7 tipos de variáveis : nil, number, string, function, cfunction, userdata e table. Tipo nil Basicamente toda variável não inicializada tem o valor de nil, essas variáveis tem o valor indefinido. Então pode se testar se uma variável foi inicializada igualando o seu valor a nil : a == nil Tipo number O tipo number representa valores numéricos. Lua não faz distinção entre valores numéricos com valores inteiros e reais. Todos os valores numéricos são tratados como sendo do tipo number. Tipo string O tipo string representa cadeia de caracteres. Uma cadeia de caracateres em Lua é definida por uma seqüência de caracteres delimitadas por aspas simples (' ') ou duplas (" "). A seqüência de caracteres deve estar numa mesma linha de código. Dentro de um string, são interpretadas as seguintes seqüências de escape: Tipo function Funções em Lua são consideradas valores de primeira classe. Isto significa que funções podem ser armazenadas em variáveis, passadas como parâmetros para outras funções, ou retornadas como resultados. A definição de uma função equivale a atribuir a uma variável global o valor do código que executa a função. Esta variável global passa a armazenar um dado do tipo function. Assim, adiantando um pouco a sintaxe de definição de funções, o trecho ilustrativo de código abaixo armazena na variável func1 um valor do tipo function: function func1 (...)...end que pode posteriormente ser executada através de uma chamada de função: func1(...) Tipo userdata O tipo userdata permite armazenar numa variável de Lua um ponteiro qualquer de C. Este tipo corresponde ao tipo void* de C e só pode ser atribuído ou comparado para igualdade a outro valor de mesmo tipo em Lua. Este tipo é muito útil para programadores de aplicação que fazem a ligação Lua-C, mas não é manipulado por usuários que programam somente em Lua, pois não é possível criar dados deste tipo diretamente em Lua. Tipo Table O tipo table (tabela) é o tipo mais expressivo da linguagem. Este tipo implementa os chamados vetores associativos, que permitem indexação por valores de qualquer outro tipo, com exceção do tipo nil. As tabelas em Lua permitem a construção de vetores convencionais, listas e records numa mesma estrutura. Tabelas devem ser explicitamente criadas. Adiantando a sintaxe de criação de uma tabela, o código a = { } cria uma tabela vazia e armazena em a este valor. Novos campos podem ser adicionados posteriormente a esta tabela. Futuramente estudaremos a fundo tabelas. </span>
-
Site oficial : http://www.lua.org/ Download : http://www.lua.org/download.html FAQ ( Inglês ) : http://www.lua.org/faq.html Quando você fazer download você irá perceber que o download vem apenas uma source, que a mesma será utilizada para fazer o seu executável. Lua não é necessário compilar ( após adquirir o seu executável ), pois você rodará os programas feitos em lua diretamente deles mesmos. Caso você não consiga fazer ( compilar ) seus próprios executáveis, faça download deles aqui ( Plataforma Windows ) : http://luaforge.net/frs/download.php/1420/...in32_bin.tar.gz Para executar um arquivo Lua, apenas abra o mesmo, então abrirá uma tela preta ( equivalente a do DoS ) que executará o seu programa. Intrudoção - ( Retirada do Site Oficial ) Lua é uma linguagem de programação poderosa e leve, projetada para estender aplicações. Lua também é frequentemente usada como uma linguagem de propósito geral. Lua combina programação procedural com poderosas construções para descrição de dados, baseadas em tabelas associativas e semântica extensível. Lua é tipada dinamicamente, interpretada a partir de bytecodes, e tem gerenciamento automático de memória com coleta de lixo. Essas características fazem de Lua uma linguagem ideal para configuração, automação (scripting) e prototipagem rápida. Um conceito fundamental no projeto de Lua é fornecer meta-mecanismos para a implementação de construções, em vez de fornecer uma multidão de construções diretamente na linguagem. Por exemplo, embora Lua não seja uma linguagem puramente orientada a objetos, ela fornece meta-mecanismos para a implementação de classes e herança. Os meta-mecanismos de Lua trazem uma economia de conceitos e mantêm a linguagem pequena, ao mesmo tempo que permitem que a semântica seja estendida de maneiras não convencionais. Ter uma semântica extensível é uma das características mais marcantes de Lua. Lua está implementada como uma pequena biblioteca de funções C, escritas em ANSI C, que compila sem modificações em todas as plataformas conhecidas. Os objetivos da implementação são simplicidade, eficiência, portabilidade e baixo impacto de inclusão em aplicações.
-
Desde o começo das aulas, viemos mandando escrever na tela através da função std::cout << e pegando valores através da função std::cin >>, como conseqüência vocês já devem estar cansados de tanto escrever "std::", então vamos aprender como omitir isso, é bem simples, da seguinte forma : using std::cout; Você pode utilizar o mesmo método para o cin, porém há um modo de omitir todos os "std::" ( em futuras funções que poderemos utilizar ), é da seguinte forma : using namespace std; Utilizando somente um seria o suficiente para todos os stds que iriamos utilizar, assim será necessário utilizar apenas "cout << " e não mais " std::cout << ". Seguindo a aula vamos ver esse programa e estuda-lo. #include <iostream>using std::cout;using std::cin;class InputNum{public: InputNum () { cout << "Coloque um numero "; cin >> _num; } int GetValue () const { return _num; } void AddInput () { InputNum aNum; // pega mais um valor ( adiciona uma nova instance ) _num = _num + aNum.GetValue (); } private: int _num;};int main(){ InputNum num; cout << "O valor e " << num.GetValue() << "\n"; num.AddInput(); cout << "Agora o valor e " << num.GetValue() << "\n"; return 0;} Realmente essa parte é mais prática, para compreendermos... Vamos apenas olhar a função main, depois o que ela chama. InputNum num; Decalra uma nova instance como conseqüência, chama o constructor da classe InputNum, que por sua vez gera uma mensagem na tela e pega um valor e o adiciona a variável _num ( que pertence a instance num ). cout << "O valor e " << num.GetValue() << "\n"; manda uma mensagem na tela e pega o valor de _num através da função que montamos. num.AddInput(); Chama a função AddImput como " dono " o instance num. Então vamos para a função AddImput(); void AddInput () { InputNum aNum; // pega mais um valor ( adiciona uma nova instance ) _num = _num + aNum.GetValue (); } Pelo começo da função já vemos que não vai retornar nada, e também já que não há um const sabemos que modifica o valor de algo. Na primeira linha do conteúdo da função já vemos que ele cria uma nova instance chamada "aNum", que envia a mensagem e pega o valor digitado pelo usuário. Na segunda e última linha do code vemos que ele dá um novo valor a _num, que é o valor de _num somado com o valor da variável _num da instance aNum ( aNum._num ). Então seguindo com a função main ele manda uma mensagem do novo valor de _num de instância num. então o return da função como 0. Agora vamos ( finalmente ) aprender os Operadores que se pode utilizar em C++. Provavelmente vocês devem estar com dúvidas sobre esse Divisão Modular, é bem simples, ele retorna o "resto" da divisão, por exemplo 10 % 3 = 1. O Unário positivo não serve para nada ( se pensarmos ), pois se a = 2, e utilizarmos -a ficará a = -2, se utilizarmos -a novamente voltará a = 2, porém existe este unário. Agora vamos a um programa novo : #include <iostream>using std::cout;using std::cin;class InputNum{public: InputNum (char msg []) { cout << msg; cin >> _num; } int GetValue () const { return _num; } void AddInput (char msg []) { InputNum aNum (msg); _num = GetValue () + aNum.GetValue (); } private: int _num;};const char SumString [] = "A soma e ";int main(){ InputNum num ("Coloque um numero "); num.AddInput ("Outro numero "); num.AddInput ("Outro "); cout << SumString << num.GetValue () << "\n"; return 0;} Primeiro vamos aprender o que é string. String é um conjunto de caracteres. Resumindo, toda palava, frase, é um string. Agora olhe o programa, apareceu um declarador novo, ele é o char. O char declara strings com 8 bits ( pelo menos na maioria dos computadores ) e sempre termina com um zero. Quer dizer, a string "Oi" contém 3 caracteres, "O" "i" e 0, isso quer dizer que 0 envia um término de string, porém vc pode escrever 0 em suas string normalmente, não terá nenhum problema. Para enviar um término a string utilize \0, assim omitirá o que vier a frente da string. Ex.: "Bla Bla \0 Ble" irá exibir "Bla Bla " Utilizamos \n para uma quebra de linha, uma nova linha, porém tambem podemos utilizar endl também, a sintase de execução é : std::cout << std::endl; Como endl pertence a uma lib standard você também pode utilizar a definição ( using std::endl; ) para utilizarmos somente endl, ou se utlizado o using namespace std;, não seria necessário o using. Repare um detalhe no programa, utilizamos a função GetValue() 2 vezes seguidas na função AddInput, porém repare que uma é do objeto aNum e outra é do objeto que foi criado primeiro ( num ). Felizmente isso não faz nenhum gasto de memória a mais do que se utilizarmos simplismente _num ( que nem no primeiro programa de hoje ) e também utilizamos a função para não termos manutenções futuras. </span>
-
Bom, começamos as nossas aulas definindo o que é classe, instance, brincamos de construir e destruir instances, aprendemos a mecher com constructors, destructors, aprendemos muita coisa já, porém não é nem um milésimo do que ainda vamos aprender pela frente. Afinal, instances não servem apenas para fazermos essa brincadeira, senão seria realmente inútil existir essa funcionalidade no C++. Então a partir de agora vamos dar o início do trabalho com funções, e como conseqüência começar a trabalhar com objetos e funções ao mesmo tempo. Para isso vamos rever 2 conceitos já apresentados, eles são o int e o double. int, declara uma variável que aceita somente número inteiro; double, declara uma variável que aceita números inteiros até números com casas decimais. Agora vamos aprender somente o básico de mais 2 conceitos, que são eles o void e o return. void, declara algo que não retornará nada como resposta ao término de uma função específica e ou uma condição. return VALOR;, retorna um valor como resposta da função, esse "VALOR" pode ser uma variável, pode ser verdadeiro ou falso ( true e false ), assim vai. Agora vamos começar a trabalhar com o aprendido. Olhem esse programa : #include <iostream>class InputNum{public: InputNum () { std::cout << "Entre um numero "; std::cin >> _num; } int GetValue () const { return _num; }private: int _num;};int main(){ InputNum num; std::cout << "O valor e " << num.GetValue() << "\n"; return 0;} Vamos separar ele em 3 partes, para poder ver melhor. Includes, Classes e Função Main. Includes Nada de novo. Classes Agora vemos uma função nova, ela é a "std::cin", ela pega o valor digitado pelo usuário e o coloca na variável, no caso do nosso programa ele pega o valor digitado e adiciona a variável private _num ( sabemos que é private por causa do underline antes da variável, como já havia dito que ia usar para variaveis privates ). então seguindo em frente, achamos nossa primeira função. int GetValue () const { return _num; } Uma função basicamente é declarada da seguinte forma : Tipo Nome (Variáveis) Atributos{} Lembrando que as variáveis serão declaradas ( como no preamble ) e os atributos serão os atributos da função. Seguindo a rotina que passei, sabemos mais sobre a função. int, é o tipo da função, retornará um valor inteiro; GetValue, é simplismente o nome da função; (), significa que não utilizaremos qualquer variável nessa função, não precisaremos pegar nenhuma informação externa quando a função é chamada ( durante a função talvez possamos precisar, por isso apenas quando é chamada ); const, é o atributo da função, diferente de preambles não precisa dos dois pontos após as variáveis, com isso podemos ver que a função é constante, quer dizer, não será aceita nenhuma mudança de valor enquanto a função estiver em andamento. Agora nosso conceito definido no começo vai ser utilizado, o return. Ele simplismente retorna um valor como resposta a quem o chama, é equivalente a uma conversa, fulano chama ciclano ( main chama função ) como resposta ciclano percebe e responde ao chamado ( retorna um valor ). return _num; essa linha de código diz que quando a função for chamada o valor de _num será enviado como resposta private: int _num; Vamos aprofundar apenas mais um pouco em relação a private e public, public significa que qualquer momento qualquer função poderá modificar o seu valor, diferente de private, private é privado, reservado, quer dizer somente a classe poderá mudar e acessar o seu valor ( lembre-se de que quando eu digo a classe não digo ela em si, mais sim talvez até funções contidas dentro da classe ). Função Main No começo dela vemos a declaração de uma instance, a chamada "num", com essa mesma instance é chamada uma função ( num.GetValue() ), como já vimos anteriormente a função GetValue retorna o valor da variável _num, então seria um simples _num, mas como não é uma variável global e sim uma variável específica do nosso instance num colocamos um ponto para acessar algo dela, assim num._num, assim retornaria o valor de _num, porém não retorna porque _num é private ( privado ) e somente quem está dentro da classe pode ver e ou modificar o seu valor, então criamos uma função para retornar o valor dela que é a GetValue() e chamamos ela para retornar o valor de _num. Repare que _num não pode ser declarado como constante ( const ) no preamble, porque durante a execução do programa o seu valor é modificado ( se quiser tente declarar para ver o erro! ) Agora vamos criar uma função para modificar o valor de _num. Vamos lembrar que _num é private, então somente uma função de dentro da classe no qual ela pertence pode modifica-la. Como não vamos retornar nenhum valor quando a função for chamada vamos utilizar o novo termo, o void. A função espera uma variável para colocarmos o valor de _num igual a essa variável, então não se esqueça de declarar as variáveis que iremos utilizar. Fazendo essa função ficará mais ou menos dessa forma : void SetValue (int i) { _num = i; } vocês já devem saber onde ela deve ficar, e saber como chamá-la ( caso não, "instance.SetValue (VALOR)" onde VALOR seria equivalente a qualquer número inteiro ), lembre que nunca poderemos colocar essa função como constante ( const ), pois ela modifica um valor, então como vamos modificar um valor e manteremos a função const ( funções const não aceitam nenhuma modificação durante a execução de sua função ). Wow, aula grande e complicada lembrando apenas... </span>
-
Inheritance - Relações entre Objetos ( Parte 2 ) Basicamente, inheritance é uma classe que é uma outra classe mais utiliza atributos da classe base. Um bom exemplo seria os carros. Um carro ( class Carros ) contém obrigatóriamente porta, motor, rodas, motorista, etc., agora uma marca Ferrari ( class Ferrari ), continua sendo um carro, então utilizaremos os atributos da classe Carros sem precisar declaralos novamente. Outro exemplo. Um corpo Celestial, contém massa, e as estrelas, a estrela é um corpo Celestial, porém tem alguns stributos próprios mais todos os atributos normais de um corpo Celestial. Para utilizar um inheritance, é simples, após a declaração da classe utilize : ( publico, privado ) Classe_Basse Exemplo : #include <iostream>class CorpoCelestial{public: CorpoCelestial (double massa) : _massa (massa) { std::cout << "Criando um corpo celestial de massa " << _massa << "\n"; } ~CorpoCelestial () { std::cout << "Destruindo um corpo celestial de massa " << _massa << "\n"; }private: const double _massa;};class Estrela: public CorpoCelestial // Estrela é um CorpoCelestial{public: Estrela (double massa, double brilho) : CorpoCelestial (massa), _brilho (brilho) { std::cout << "Criando uma estrela de brilho " << _brilho << "\n"; } ~Estrela () { std::cout << "Destruindo uma estrela de brilho " << _brilho << "\n"; }private: const double _brilho;};int main (){ std::cout << " Entrando em Main.\n"; Estrela umaEstrela ( 1234.5, 0.1 ); std::cout << " Saindo de Main.\n";} A linha: class Estrela: public CorpoCelestial // Estrela é um CorpoCelestial fala ao compilador que a Estrela é um CorpoCelestial, se a classe CorpoCelestial contém um atributo de nomeado _massa, então toda e qualquer estrela também terá um atributo nomeado _massa. Repare agora em uma coisa interessante, eu coloquei "public CorpoCelestial", isso significa que todos os atributos que contém a classe CorpoCelestial será imposto da mesma forma, se uma variável é pública, era será publica e se uma variável é private ela continuará a ser private. Se você colocasse "private" no lugar de public, todas as variáveis ( até as publicas ) se tornariam privadas. Como na aula anterior, também a uma forma de representar graficalmente. Utiliza-se "is-a" para Inheritances. O gráfico deve ser da seguinte Forma : </span>
-
Embedded Objects - Relações entre Instâncias A cada aula que eu coloco aqui será necessário o saber da lição anterior, então caso você não compreendeu algo, pergunte para mim no MSN, acho que esta aula é a primeira aula complexa que teremos, se não entender, leia e releia até compreender, não há outra forma. Basicamente, embendded é encaixar, encaixado. Quer dizer, um bloco de códigos encaixado no outro, por alguma forma. No nosso caso vamos chamar o código a ser encaixado através do preamble. Uma classe, criada vai ter um constructor que por sua vez vai ter um preamble que por sua vez vai ter uma variável que vai chamar uma outra classe que por sua vez vai executar seu bloco de código e seguir adiante. #include <iostream>class Universo{public: Universo (int id) : _identidade(id) { std::cout << " Universo " << _identidade << " criado\n"; } ~Universo () { std::cout << " Universo " << _identidade << " destruido\n"; }private: const int _identidade;};class Planeta{public: Planeta (int id) : _identidade (id), _universo (_identidade) // inicialidando Embenddings { std::cout << "Ola do mundo " << _identidade << ".\n"; } ~Planeta () { std::cout << "Tchau do mundo " << _identidade << ".\n"; }private: const int _identidade; const Universo _universo; // Instance Embendded do Tipo Universo};Planeta oUniverso (1);int main (){ Planeta MeuPlaneta (2);} Repare que o preamble é parecido com declaração de variáveis, porém ele não termina com ponto e vírugla ( ; ). Repetindo toda a história do começo, agora seguindo o exemplo dado. É criado a instance oUniverso com variável 1, então ele executa seu preamble que por sua vez executa a classe Universo e cria uma outra instance que executa o seu constructor que então retorna a onde havia parado na classe anterior. Lembrando que é necessário ter cuidado na ordem que a classe é escrita, pois ela é executada na ordem que ela é escrita. Somente retomando, a primeira instance será a última a ser destruída, a segunda a penúltima, assim sucesivamente. Agora uma parte simples, como representar gráficamente. Essa classe é mais conhecida como "Embedded", provavelmente vou começar a chamar dela mais dessa forma. Caso você for fazer uma imagem, um gráfico, já existe uma forma correta de como fazer e falar, é utilizando o "has-a", Universo has-a Planeta. E o gráfico é dessa forma : </span>
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.