programação de jogos em php

397
Programação de jogos em PHP © 2004 Premier Press, uma divisão da Course Technology. Todos os direitos reservados. Nenhuma parte deste livro pode ser reproduzida ou transmitida de qualquer forma ou por qualquer meio, eletrônico ou mecânico, incluindo fotocópia, gravação, ou por qualquer armazenamento de informação ou sistema de recuperação sem permissão por escrito do Curso PTR, exceto para a inclusão ofATT breves citações em uma revisão. O logotipo da Premier imprensa e trade dress relacionados são marcas registradas da Premier Imprensa e não podem ser utilizadas sem autorização escrita. Paint Shop Pro 8 é uma marca registrada da Software Jasc. PHP Coder é uma marca comercial da phpIDE. Todas as outras marcas são de propriedade de seus respectivos proprietários. Importante: Curso de PTR não pode fornecer suporte de software. Entre em contato linha do fabricante do software apropriado de suporte técnico ou Web site para obter assistência.Curso de PTR e autor tentou ao longo deste livro para distinguir marcas proprietárias de termos descritivos, seguindo o estilo de capitalização usada pelo fabricante. Informações contidas neste livro tem sido obtido por Curso PTR a partir de fontes consideradas confiáveis. No entanto, devido a possibilidade de erro humano ou mecânico por nossas fontes, PTR Curso, ou outros, o Publisher não garante a exatidão, adequação ou a completitude de qualquer informação e não é responsável por quaisquer erros ou omissões ou os resultados obtidos com uso de tais informações. Leitores deve estar particularmente ciente do fato de que a Internet é uma everchanging entidade. Alguns fatos podem ter mudado desde que este livro foi para imprensa. Estabelecimentos de ensino, empresas e organizações interessadas em múltiplos cópias ou licenciamento deste livro deve contatar o editor para informações desconto de quantidade. Manuais de formação, CD-ROMs, e porções deste livro também estão disponíveis individualmente ou podem ser adaptados para necessidades específicas. ISBN: 1-59200-153-X Biblioteca do Congresso Número do cartão de Catálogo: 2004090731 Impresso nos Estados Unidos da América 04 BH 05 06 07 08 10 9 8 7 6 5 4 3 2 1 Curso PTR, uma divisão de Tecnologia de Curso 25 Place Thomson Boston, MA 02210 http://www.courseptr.com SVP, do Curso Profissional, Comércio, Grupo de referência: Andy Shafran Editora:

Upload: eng-cassio-de-souza

Post on 02-Jan-2016

206 views

Category:

Documents


43 download

TRANSCRIPT

Page 1: Programação de jogos em PHP

Programação de jogos em PHP

© 2004 Premier Press, uma divisão da Course Technology. Todos os direitos reservados. Nenhuma parte deste livro pode ser reproduzida ou transmitida de qualquer forma ou por qualquer meio, eletrônico ou mecânico, incluindo fotocópia, gravação, ou por qualquer armazenamento de informação ou sistema de recuperação sem permissão por escrito do Curso PTR, exceto para a inclusão ofATT breves citações em uma revisão. O logotipo da Premier imprensa e trade dress relacionados são marcas registradas da Premier Imprensa e não podem ser utilizadas sem autorização escrita. Paint Shop Pro 8 é uma marca registrada da Software Jasc. PHP Coder é uma marca comercial da phpIDE. Todas as outras marcas são de propriedade de seus respectivos proprietários. Importante: Curso de PTR não pode fornecer suporte de software. Entre em contato linha do fabricante do software apropriado de suporte técnico ou Web site para obter assistência.Curso de PTR e autor tentou ao longo deste livro para distinguir marcas proprietárias de termos descritivos, seguindo o estilo de capitalização usada pelo fabricante. Informações contidas neste livro tem sido obtido por Curso PTR a partir de fontes consideradas confiáveis. No entanto, devido a possibilidade de erro humano ou mecânico por nossas fontes, PTR Curso, ou outros, o Publisher não garante a exatidão, adequação ou a completitude de qualquer informação e não é responsável por quaisquer erros ou omissões ou os resultados obtidos com uso de tais informações. Leitores deve estar particularmente ciente do fato de que a Internet é uma everchanging entidade. Alguns fatos podem ter mudado desde que este livro foi para imprensa. Estabelecimentos de ensino, empresas e organizações interessadas em múltiplos cópias ou licenciamento deste livro deve contatar o editor para informações desconto de quantidade. Manuais de formação, CD-ROMs, e porções deste livro também estão disponíveis individualmente ou podem ser adaptados para necessidades específicas. ISBN: 1-59200-153-X Biblioteca do Congresso Número do cartão de Catálogo: 2004090731 Impresso nos Estados Unidos da América 04 BH 05 06 07 08 10 9 8 7 6 5 4 3 2 1 Curso PTR, uma divisão de Tecnologia de Curso 25 Place Thomson Boston, MA 02210 http://www.courseptr.com SVP, do Curso Profissional, Comércio, Grupo de referência: Andy Shafran Editora: Stacy L. Hiquet Gerente de Marketing Sênior: Sarah O'Donnell Gerente de Marketing: Heather Hurley Editor da Série: André LaMothe Gerente de Serviços Editorial: Heather Talbot Editor de Aquisições sênior: Emi Smith Gerente de Marketing Associado:

Page 2: Programação de jogos em PHP

Kristin Eisenzopf Editor do projeto e editor de cópia: Dan Foster, Tribe Scribe Revisor Técnico: João Freitas Coordenador de Mercado de Varejo: Sarah Dubois Divisões: Marian Hartsough Cover Designer: Steve Deschene CD-ROM Produtor: Brandon Penticuff Indexador: Kelly Talbot Revisor: Estelle Manticas Para Jenai. Obrigado.

Agradecimentos T aqui são tantas pessoas que tornaram este livro possível para mim. Em primeiro lugar eu gostaria de agradecer a André LaMothe por me dar esta oportunidade. Eu também gostaria de agradecer ao meu editor, Dan Foster, por todo seu trabalho duro. Eu também preciso agradecer aos meus empresa, DATA Inc. (www.datausa.com) para a compreensão de minha agenda rigorosa. Agradecer você Mike Gesner (Presidente e CEO), Michael Melson (Diretor Técnico), Randy Chong (Director de Design Game), Wesley Potter (Designer do jogo), e Jonathan Shusta (Diretor de Arte) de Dragonfly Game Design (www.dragonflygamedesign.com) para fazer o MMO possível. Sem vocês este livro não teria sido tão legal quanto é. Eu também gostaria de agradecer Jenai por ser meu apoio constante e colocando-se com as minhas horas ímpares, humor ímpar, e estranheza geral em toda a criação de todo este livro.

Sobre o Autor M ATT R UTLEDGE ([email protected]) é desenvolvedor líder em DATA, Inc. (www.datausa.com), uma empresa de visualização Denver, Colorado digital baseado especializada em animação por computador 3D e desenvolvimento web. Matt tem 7 anos de experiência no mundo multimídia. Ele desenvolveu diversas aplicações de telecomunicações antes de se mudar para o reino da Desenvolvimento web. Matt especializada em banco de dados orientado e aplicações interativas online. Matt também activamente escreve artigos para asp101 (www.asp101.com) e do MSDNAA (Www.msdnaa.net).

Page 3: Programação de jogos em PHP

Sobre o Editor da Série A L Ndre A outr M, CEO, Xtreme Games LLC, foi envolvido na indústria de computação por mais de 25 anos. Ele escreveu seu primeiro jogo para o TRS-80 e tem sido ligado desde então! Sua experiência inclui gráficos 2D/3D, AI pesquisa da NASA, compilador design, robótica, realidade virtual, e telecomunicações. Seus livros são vendidos em o gênero de programação do jogo, e sua experiência é repetida no jogo de Imprensa Premier Livros de desenvolvimento.

Carta do Editor da Série Ao longo dos últimos cinco anos ou mais, um pequeno pedaço de software chamado PHP tem gerado uma série de novidades e tem subido rapidamente a partir de um único programador projeto paralelo para a linguagem de programação web. Agora na versão 5, PHP (uma abreviatura recursiva para PHP Hypertext Preprocessor) é praticamente sinônimo de desenvolvimento de sites dinâmicos e conteúdos flexíveis. Mas o que poucos sabem é que ele é capaz de muito mais do que apenas tornar os sítios Web em verdade, ele está mostrando potencial sério para fazer jogos! Com o aumento da popularidade da Web baseados em jogos e aplicativos como Habbo Hotel, o conselho do Yahoo cartão, e jogos de puzzles, e até mesmo The Sims, não há nunca foi um melhor momento para se envolver no desenvolvimento de jogos online. E com PHP, uma ferramenta completamente livre, ele nunca foi mais barato ou mais fácil! Isso é que é tão emocionante sobre PHP programação de jogos. Matt Rutledge tomou as tarefas formidável de ensino, tanto de desenvolvimento de jogos e da linguagem PHP e condensado-los em um fácil de ler o texto que faz tudo parecer fácil. Mas o que torna este livro tão especial é que não é apenas significou para os desenvolvedores de jogos, qualquer um que quer aprender PHP vai achar que este livro ensina-lo de uma forma divertida que é muito mais envolvente do que os inúmeros livros de PHP outros nas prateleiras. Afinal de contas, fazer jogos é muito mais divertido do que classificar os registros de empregados! Mas não pense que este livro tem tudo a ver brincadeiras. Do Capítulo 1, você obter uma educação de PHP hardcore que começa no trincheiras, com tudo que você precisa saber sobre a configuração do servidor e configuração. Uma vez que você está trancado e carregado, você completa uma turnê da própria linguagem, abrangendo todas as construções de grandes e funcionalidades.

Page 4: Programação de jogos em PHP

Sintaxe PHP é muito semelhante às línguas como C, C + + e Java, e se você já está familiarizado com um desses, em seguida, este material será muito fácil de absorver. Finalmente, toda a metade final do livro é dedicados a temas programação séria de jogo, de gráficos para algoritmos de xadrez para dinâmica terrenos campo de batalha. Em conclusão, não será muito antes de tudo, desde seus sapatos para sua geladeira tem uma conexão com a Internet e jogos on-line são certamente liderando o caminho para o mundo ultra-conectado do futuro. Muitos programadores encontram-se deixando linguagens como C ou C + + para trás em favor das línguas com built-in rede recursos como Java, Perl e PHP. Com uma ferramenta de desenvolvimento tão poderoso e acessível como PHP, esta é sua chance de transformar suas idéias de jogos online em uma realidade! Atenciosamente, André LaMothe Series Editor, Premier Series Desenvolvimento de Jogos

Conteúdo Introdução. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii Parte I Introdução ao Mundo do PHP. . . . . 1 Capítulo 1 Então o que é todas essas coisas Server? . . . . . . . . . . . . . . . . . . . . . 3 Capítulo 2 Travando a Guerra de configuração. . . . . . . . . . . . . . . . . . . . . . 23 Compreender a relação cliente / servidor. . . . . . . . . . . . . . . . . . . 3 Web Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Sessões e variáveis de sessão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 TCP / IP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Instalando o Servidor Web IIS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Instalação no Windows 2000/XP Professional. . . . . . . . . . . . . . . . . . 15 Instalação no Windows 98. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Instalando o Apache Web Server no Windows ME / XP. . . . . . . . . . . 18 Instalando o Servidor Web Apache em UNIX. . . . . . . . . . . . . . . . . . . . 19 As plataformas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Construção e Instalação de PHP em UNIX. . . . . . . . . . . . . . . . . . . . . . . . . 24 Instalação em Windows para IIS / Apache. . . . . . . . . . . . . . . . . . . . . . . 26 Instalar as extensões de Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Testando a instalação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 viii www.baixebr.org

Page 5: Programação de jogos em PHP

Contentsix Capítulo 3 Eu venci o Server, Let Me no Código! . . . . . . 31 O Básico da Tag HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 O Todo-Poderoso Documento HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 O Corpo HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Gráficos e HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Os formatos de arquivo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Usando a formatos de arquivo no seu documento. . . . . . . . . . . . . . . . . . . . . 39 Tabelas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Layouts, tabelas e gráficos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Criando formulários para entrada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Parte II Digite o idioma. . . . . . . . . . . . . . . . 53 Capítulo 4 Diga Olá para PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Capítulo 5 Operadores, instruções e funções. . . . . . . . . . . . . . . . 77 Criando uma página PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Tipos de dados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Tipo de Casting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Variáveis variáveis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Constantes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Convenções de nomenclatura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Funções para variáveis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Funções para Strings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 printf () e sprintf (). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 Expressões Regulares e casamento de padrões. . . . . . . . . . . . . . . . . . . . . 66 Usando as Funções de Expressões Regulares. . . . . . . . . . . . . . . . . . . . . . . 68 Processamento de formulários com PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Operadores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Operadores aritméticos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Operadores de comparação. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Operadores lógicos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Operador ternário. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Operadores bit a bit. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Atalhos Atribuição variável. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Operação Precedência. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 x Conteúdo Declarações. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 se Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 A declaração switch. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 tempo e fazer ... enquanto Loops. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 O para Loop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Funções. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Passando parâmetros para uma função. . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 Recursão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 A Magia da Incluindo arquivos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Arrays parte III, jogos e gráficos. . . . . . . 101

Page 6: Programação de jogos em PHP

Capítulo 6 Matrizes! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Capítulo 7 Jogando com Xadrez e bancos de dados. . . . . . . . . . . . . . . . . . 133 Inicializar matrizes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 Usando cordas para índices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Loop através Arrays seqüencial. . . . . . . . . . . . . . . . . . . . . . . . . 106 Loop através Non-Sequential Arrays. . . . . . . . . . . . . . . . . . . . . 108 Multi-Dimensional Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Classificação Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 Seu Jogo PHP First. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 Não-bancos de dados relacionais. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Criando e Abrindo um banco de dados. . . . . . . . . . . . . . . . . . . . . . . . . . 134 Looping através do banco de dados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Inserindo uma entrada em seu banco de dados. . . . . . . . . . . . . . . . . . . . . . . 137 Atualizar uma entrada em seu banco de dados. . . . . . . . . . . . . . . . . . . . . . . . 139 Excluindo uma entrada do banco de dados. . . . . . . . . . . . . . . . . . . . . . . 140 Programação de xadrez: Uma Visão Geral. . . . . . . . . . . . . . . . . . . . . . 140 Iniciando o jogo de xadrez. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 Trabalhar com as peças. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Recebendo a entrada do usuário e modificar o banco de dados. . . . . . . . . . . . 151 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 Contentsxi Capítulo 8 GD Resumo Graphics. . . . . . . . . . . . . . . . . . . . . . . . . . . 157 O que é GD?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Instalação de GD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 Criando e usando uma nova imagem. . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Como utilizar as cores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Alocação de cores para uma imagem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Preenchimento da Imagem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 Definição de sua cor transparente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 Convertendo uma imagem true-color para uma imagem de paleta. . . . . . . . . . . . . 165 Cores contagem em uma imagem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Recuperando uma cor em um ponto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 Desenhando formas básicas em sua tela vazia. . . . . . . . . . . . . . . . . . 167 Pixels e linhas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 De Linhas de retângulos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 De retângulos de polígonos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 A partir de polígonos para Arcos e Elipses. . . . . . . . . . . . . . . . . . . . . . . . . . 174 Criando Imagens com Texto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Salvar suas imagens. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 Usando imagens existentes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 Capítulo 9 Criando Battle Tank e usando Terrain dinâmico. . . . . . . 193 Planejamento Battle Tank. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Criando a Graphics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Criando a lógica do jogo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

Page 7: Programação de jogos em PHP

Criando Terrain dinâmico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Parte IV Extras e Projetos Final. . . . . . . . . 211 Capítulo 10 PHP e Sockets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Basics soquete. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Criando um servidor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 Criando o cliente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 Integração com Sockets Battle Tank. . . . . . . . . . . . . . . . . . . . . . . . 224 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 Conteúdo xii Capítulo 11 Kiddy Cartel-Criando seu próprio MMO. . . . . . . . . . . . . 229 Instalando o MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 Bancos de dados relacional: um rápido resumo. . . . . . . . . . . . . . . . . . . . . 231 Kiddy Cartel: as normas e especificações. . . . . . . . . . . . . . . . . . . . 233 Ações criando a sua base. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 Criação de um comando com Sub-Comandos. . . . . . . . . . . . . . . . . . . 240 Criação de um Comando sem Sub-Comandos. . . . . . . . . . . . . . . . . 245 Olhe para todos os comandos ... e agora? . . . . . . . . . . . . . . . . . . . . . 248 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Capítulo 12 Construindo suas habilidades PHP. . . . . . . . . . . . . . . . . . . . . . . . . . 257 PHP e Ming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 Como criar um filme Flash. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 Desenho para seu filme Flash. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 Objetos com enchimento Ming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 Adicionando animação ao seu filme Flash. . . . . . . . . . . . . . . . . . . . . . 271 Adicionando o ActionScript a sua parte Flash. . . . . . . . . . . . . . . . . . . . . . 275 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Parte V Apêndices. . . . . . . . . . . . . . . . . . . . . . 281 Apêndice A Referência de linguagem HTML. . . . . . . . . . . . . . . . . . . . . . . . 283 . . . . . . . . . . . . . . . . . . . . . . . . . . 309 . . . . . . . . . . . . . . . . . . 329 Apêndice B Referência da Linguagem PHP Apêndice C Apoio Debugging Applications- Apêndice D GD Referência de linguagem SDK. . . . . . . . . . . . . . . . . . . . . . 341 Erros de sintaxe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 Erros de semântica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 Erros de lógica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332 PHP e Relatório de erros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Manipulando erros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 Aplicação e problemas de instalação. . . . . . . . . . . . . . . . . . . . . . . 335 Índice. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 Introdução O ver os últimos anos da World Wide Web tem crescido tremendamente. Desde a sua estágios bebê quando uma página da Web não era nada mais do que o texto com HTML

Page 8: Programação de jogos em PHP

dinâmico, robusto, extensível, rico conteúdo multimídia. Cinco anos atrás você nunca pensou em jogar um jogo na web, mas hoje, com linguagens de script atual, você pode fazer exatamente isso. PHP transformou a Web como a conhecemos. PHP fornece rápido, dinâmico, em tempo real, ferramentas para trazer vida para Web sites. PHP (também conhecido como o pré-processador de hipertexto) estourou na cena em 1994, quando Rasmus Lendorf lançou um pacote de "Personal Home Page" ferramentas para o público. Como mais interesse para estas ferramentas cresceu, Rasmus decidiu criar seu próprio mecanismo de script para analisar entrada de um formulário HTML. A primeira versão do PHP nasceu, foi chamado de PHP / FI. A comunidade cresceu rapidamente programação de PHP / FI, PHP e logo se tornou o API como você sabe que hoje em dia. Se você conhece C / C + + ou Java então aprender as construções básicas PHP será extremamente fácil. PHP é uma ferramenta maravilhosa, com rápida, on-the-fly, compilação. Ele também oferece-lhe uma tonelada de bibliotecas para trabalhar com a criação de gráficos, peças Flash, conexões com bancos de dados e conexões para outros computadores. O foco principal deste livro é levar todas essas ferramentas e dar-lhe o conhecimento e poder de criar por sua vez baseado em jogos na Internet. xiii xiv Introdução Por que PHP? Você pode perguntar, por que PHP? Qual é a diferença entre PHP e outro embutido linguagem de script como ASP? A principal diferença entre essas línguas é, obviamente, sintaxe. Mas, além disso PHP oferece-lhe toneladas de bibliotecas, tudo de graça. A interpretação dos código é mais rápido que ASP, e se conectar a um banco de dados requer apenas duas a três linhas de código. A melhor parte do PHP é que é uma linguagem orientada a objetos, o que dá inerentemente Você dá uma grande flexibilidade em seus jogos. Quem deve ler este livro? Este livro é para quem quer implementar nenhum jogo Web-based. Uma compreensão de HTML seria útil. Eu incluí, no entanto, uma secção dedicada ao ensino você algumas noções básicas de HTML. Conhecimento de seu sistema operacional será muito útil. Desde PHP é uma linguagem multi-plataforma que pode cobrir somente tanto na maneira de instalar o PHP.

Page 9: Programação de jogos em PHP

Se algo der errado durante a instalação ele vai ajudar se você souber o seu sistema operacional. Este livro não é para alguém com conhecimentos avançados em PHP. O que está no CD? ■ Todo o código fonte no livro ■ O instalador do PHP para Windows e UNIX ■ PHP bibliotecas ■ Avaliação edição do Jasc Paint Shop Pro 8 PHP ■ ST Software Ambiente de Desenvolvimento Integrado ■ MySQL 4.0 Como este livro está organizado Eu pretendia este livro para ser lido em ordem seqüencial. Se você é um novato e esta é a sua primeira exposição ao PHP eu sugiro que você leia o livro desta maneira. No entanto, se você já ter um conhecimento de PHP você pode se sentir livre para pular em torno de capítulo para capítulo. Este livro é dividido em quatro partes principais. A primeira parte deste livro percorre configuração do PHP e servidor Web. A segunda parte apresenta o PHP em si. No terceira parte deste livro que você começar a criar seu próprio Web PHP baseado em jogos. No quarta parte deste livro você dar uma olhada em todas as coisas legais PHP pode fazer. Lembre-se que todo o código que é mostrado neste livro é fornecido por você na incluído CD. Há também várias aplicações incluídas no CD para ajudá-lo a desenvolver seus jogos PHP. Introdução xv ■ Capítulo 1-Então o que é todas essas coisas Server?. Este capítulo fornece uma visão geral da arquitetura do servidor e como a Web funciona normalmente. Você também vai aprender a instalar um servidor IIS e um servidor Web Apache. ■ Capítulo 2-travando a guerra de configuração. Depois de ter instalado o seu Web servidor, este capítulo o guiará através das etapas de instalação do CGI PHP Intérprete. Este capítulo também irá mostrar-lhe alguns dos princípios básicos para a configuração PHP. ■ Capítulo 3-Eu venci o Server, Let Me no Código! Este capítulo ensinar-lhe os conceitos básicos de HTML. Ele também inclui uma breve explicação de como as imagens trabalho no World Wide Web. ■ Capítulo 4-Diga Olá para PHP. Este capítulo apresenta a linguagem PHP em si. Você vai aprender os pontos básicos de PHP, por exemplo, como criar uma página PHP, como declarar variáveis em PHP, e como usar expressões regulares.

Page 10: Programação de jogos em PHP

■ Capítulo 5-operadores, instruções e funções. Neste capítulo você vai aprender sobre aritmética, lógica e operadores bit a bit. Você também vai aprender como criar declarações de lógica e funções. ■ Capítulo 6-Arrays! Este capítulo lhe ensinará como alocar e usar arrays em PHP. Depois que você aprendeu todos os melhores pontos de matrizes que você vai criar o seu primeiro jogo. ■ Capítulo 7 Jogando com Xadrez e bancos de dados. Neste capítulo você vai aprender sobre a não-bancos de dados relacionais. Você também vai criar um simples jogo de xadrez que utiliza um não-relacionais de banco de dados para rastrear movimentos. ■ Capítulo 8-GD Resumo Graphics. Este capítulo apresenta GD Boutell de gráficos biblioteca. Você vai aprender como criar gráficos, manipular gráficos, e adicionar texto dinâmico para seus gráficos. ■ Capítulo 9-Criação de Battle Tank e usando Terrain dinâmico. Neste capítulo, você vai criar primeiro um remake do jogo Scorched Earth chamado Battle Tank. Depois de ter criou o jogo inicial você irá adicionar terreno dinâmico. ■ Capítulo 10-PHP e Sockets. Este capítulo apresenta a programação de soquetes com o PHP. Ele descreve como enviar e receber dados através de sockets. ■ Capítulo 11-Kiddy Cartel-Criando seu próprio MMO. Aqui você vai criar o seu muito jogo MMO própria. Neste jogo você vai controlar a sua própria vizinhança. É basicamente como atender as crianças da máfia. xvi Introdução ■ Capítulo 12 Construindo suas habilidades PHP. Neste capítulo final você vai dar uma olhada aplicações adicionais para PHP, como o uso de Ming para criar Flash dinâmico filmes. ■ Apêndice Referência da Linguagem A-HTML ■ Apêndice B-Referência da Linguagem PHP ■ Apêndice C-Apoio Debugging Applications- ■ Apêndice D-GD SDK Referência da Linguagem Introdução para o Mundo de PHP Capítulo 1 Então o que é todas essas coisas Server? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0,3 Capítulo 2 Travando a Guerra de configuração. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0,23 Capítulo 3 Eu venci o Server, Let Me no Código! . . . . . . . . . . . . . . 0,31 PARTE I

Page 11: Programação de jogos em PHP

Esta página foi intencionalmente deixada em branco capítulo 1 Assim que é todo Este material Server? ■ Como a relação cliente / servidor Obras ■ O servidor Web ■ Sessões e Session Variables ■ TCP / IP ■ Instalar o IIS Web Server ■ Instalar o Apache Web Server em Windows ■ Instalar o Servidor Web Apache em UNIX B ntes de chegar à configuração e instalação de PHP, é importante saber como um servidor Web e um navegador Web trabalham juntos. Assim, este capítulo cobrem cerca de arquitetura de servidor básico e discutir alguns pontos que vão mudar a maneira de projetar suas aplicações. Se você sente que você já conhece esses conceitos, você pode pular esta seção e ir para a seção de instalação. Compreender a relação cliente / servidor Quando você fala sobre a exibição de uma página PHP, você está se referindo a uma página Web. Quando você vai para uma página Web uma série de eventos ocorrer. Estes eventos começam no cliente com o pedido, vá a um servidor para obter a página, e no fim de volta ao cliente para visualização. Dê uma olhada nestes eventos, conforme listado abaixo e mostrado na Figura 1.1. 1. O computador cliente se conecta à Internet. 2. O cliente abre um navegador da Web. 3 4 Capítulo 1 Então o que é todas essas coisas Server? 3. O cliente solicita uma página de um site. Quando você fizer isso, uma mensagem é enviada através da Internet para um servidor de nome, eo nome do servidor, em seguida, direciona para o servidor que hospeda a página da Web. 4. O servidor que hospeda a página da Web recebe o seu pedido e recupera a solicitado página. 5. Se a página é uma página de script, como uma página PHP, o servidor compila a página através de um compilador just-in-time que gera HTML. 6. O servidor então transmite o HTML concluída volta para o cliente (o navegador). 7. O navegador da Web recebe o código HTML e exibe uma interpretação da página. Tudo isso é bastante simples, é quase como mágica. Há apenas um catch-de navegador para navegador, suas páginas da Web não são exibidos de forma idêntica. É por isso que dizemos que o navegador interpreta a página. Por exemplo, quando o Internet Explorer recebe uma página que

Page 12: Programação de jogos em PHP

inclui tabelas aninhadas, ambos com alturas de 100%, o Internet Explorer interpreta a altura da tabela interna em relação à altura da tabela externa. No entanto, no Netscape Navigator, o navegador vai fazer tanto interna e externa da mesa a altura do browser janela. Isto coloca um problema se você quiser uma página para a mesma aparência em vários navegadores. Fica pior quando você alternar entre as plataformas OS. Vamos dizer que você tem uma página de texto, e por alguma razão, o texto determina o layout da página, e você terá que olhar perfeito em uma plataforma Windows. Quando você então ver a página em um Macintosh, a fonte é Recebido pedido Reqest Página Recebido HTML A Página de Internet Sent Servidor Web Web Client / Browser Figura 1.1 O processo de cliente / servidor. Sessões e Sessão Variables5 prestados de forma muito diferente. O kerning (espaço entre os caracteres) e do (líder espaço entre linhas) é totalmente diferente. Na verdade, a fonte em si pode ser alterado para um diferente font completamente. Folhas de estilo podem atenuar alguns destes problemas, mas você ainda vai executar em questões de layout. O ponto é que o que o navegador exibe não é uma fotografia, por isso, se você quer seus jogos para trabalhar em vários navegadores diferentes você tem que ter cuidado com os tipos de elementos (texto e gráficos) que você usa. O servidor Web Agora que você tem uma compreensão geral de como uma relação de cliente / servidor funciona, você pode dar uma olhada no coração da besta: o servidor Web em si. Um servidor Web é executado o que é chamado de daemon HTTP. Este daemon controla todas as pedidos recebidos em uma porta particular. O daemon HTTP vai ouvir duas portas-port 80 e 443. Porta 80 é a porta Web geral (http://). A porta 443 é o padrão para secure socket (https://). Um servidor Web é também dito ser apátridas. Isto é, não permanente conexão é mantida entre o cliente eo servidor. Isso é extremamente importante de entender. Isso fará com que a depuração ou a resolução de certos problemas muito mais fácil, e, mais importante, esse conceito vai mudar completamente a maneira de projetar seus jogos. Ele não será tão fácil como fazer uma biblioteca de funções ou um motor simples e chamar funções.

Page 13: Programação de jogos em PHP

Você precisará desenvolver uma maneira de manter o estado. Pense nisso por um minuto. O que isso realmente significa? Bem, isso significa que cada vez um determinado evento acontece no seu jogo de PHP, por exemplo, o usuário digita as coordenadas e os cliques o botão de fogo navegador da Web irá reabrir a conexão com o servidor, reenvie o pedido para o servidor, eo servidor irá processar a página e enviá-lo de volta. Agora você necessidade de recarregar todas as suas variáveis / estados e atualizar a página apropriadamente. Caso contrário todo o jogo iria começar de novo, e que não seria divertido. Não me interpretem mal-lá são algumas linguagens client-side script, como JavaScript, que você pode usar para clientside processamento de eventos. No entanto, que está além do escopo deste livro, que se concentra em como fazer jogos com PHP. Então, como exatamente você faz isso? Sessões e Session Variables Para manter o estado que você precisa para utilizar variáveis de sessão. Toda vez que você bater um site que você começar a uma sessão, e esta sessão é identificada por um GUID exclusivo (Globally Unique Identifier). A sessão é definida como o período de tempo durante o qual um usuário interage com um único Web aplicação. Como o programador, você pode armazenar variáveis na sessão. Este é um extremamente útil ferramenta. Você não tem que manter o controle de cada usuário e seu estado; você só tem que referenciar a sessão. Vou discutir como fazer referência a sessões mais tarde. 6 Capítulo 1 ■ Então o que é todas essas coisas Server? Quando se trabalha com sessões há algumas coisas importantes para lembrar. Se você tem um executando o servidor fazenda, uma sessão do usuário não segui-lo como ele se move através de um servidor para servidor. Em outras palavras, uma sessão só é válido em um único servidor. A sessão é um processo dependente. Isto significa que se o servidor Web precisa ser reiniciado e não são atuais sessões ativas, em seguida, as sessões serão perdidos. Uma característica única de sessões em PHP é que eles não são dependentes de cookie. Portanto, se um cliente não aceita cookies HTTP, o cliente pode ainda aproveitar as sessões. Existem actualmente dois métodos suportados para a passagem de sessões em PHP4: ■ Cookies ■ O parâmetro URL

Page 14: Programação de jogos em PHP

Cookies são, naturalmente, o método preferido, mas desde que eles não estão sempre disponíveis você pode passar o id da sessão ao longo da cadeia de consulta como um parâmetro de URL. Aqui está um exemplo de como você pode passar o id de sessão ao longo da seqüência de consulta em PHP. <? Php if (! session_is_registered ('nCount')) { session_register ('nCount'); $ NCount = 1; } outro { $ NCount + +; } ?> <p> Olá, você tem visto esta página <php echo $ nCount;?>. vezes </ p> <p> Para continuar, <a href = somepage.php "<? php echo strip_tags (SID )?>"> clique aqui (sompage.php? <? php echo strip_tags (SID )?>)</ A> </ p> Neste exemplo, vamos verificar para ver se o nCount variável de sessão é registrado. Se não está registrado que registrá-lo e inicializá-lo. Caso contrário, adicionar 1 ao contar e mostrar a nossa mensagem para o usuário. A saída desta página pode ser algo como você vê na figura 1.2. Nota URLs não relativas são assumidos para apontar para sites externos e não é adicionado o SID, como seria um risco de segurança. Sessões e Sessão Variables7 Figura 1.2 Um exemplo de saída de passar um id de sessão. Esse número longa no final do link, ada6906d1e4bf2d0c753f91edc585b80, é a sessão id. PHP armazena essas sessões na pasta sessiondata, geralmente C: \ PHP \ sessiondata. Se você olha nesta pasta você verá os arquivos que começam com sess_ e terminam com um GUID longa como o da final da URL. Isto é como o PHP em si se mantém informado dos dados da sessão. Quando você iniciar a depuração você provavelmente fazem referência a esta pasta, muitas vezes, porque você pode abrir esses arquivos e ver se as variáveis de sessão definidas são armazenados. Se eles são não sendo armazenado, então você terá que verificar o seu arquivo php.ini para fazer sessões de certeza são habilitado. Agora que você tem um conhecimento geral de como as sessões de trabalho em PHP, dê uma olhada no

Page 15: Programação de jogos em PHP

opções de configuração disponíveis para você eo que cada um deles significa. Há 21 opções configuráveis para as sessões em PHP (ver Tabela 1.1) e cada um destes comportamentos é configurável no arquivo php.ini. Todas estas opções, exceto user_trans_sid, pode ser colocado em qualquer lugar usando o ini_set () função. 8 Capítulo 1 ■ Então o que é todas essas coisas Server? Opções de Configuração da sessão Nome da Opção save_path "tmp /" nome "PHPSESSID" save_handler "files" auto_start 0 serialize_handler "php" gc_probability 1 gc_dividend 100 gc_maxlifetime 1440 cookie_path "/" cookie_domain "" cookie_secure "" use_cookies 1 use_only_cookies 0 cookie_lifetime 0 referer_check "" entropy_file "" 0 entropy_length cache_limiter "nocache" cache_expire 180 user_trans_sid 0 url_rewriter.tags "a = href área, = href, frame = src forma, a entrada src = = fakeentry" Tabela 1.1 Valor padrão Aqui está uma visão geral de cada uma destas opções de sessão configurável. session.save_handler session.save_handler define o nome do manipulador que é usado para as sessões gerenciamento de dados. session.save_path session.save_path Este é o lugar onde as sessões são armazenados se session.save_handler está definido aos arquivos. Há um argumento N opcional para esta opção que determina o número de níveis de diretório que suas sessões serão armazenados em. Por exemplo, a definição a opção save_path a 5;. / temp, onde 5 é o argumento opcional, irá resultar em uma diretório algo estrutura como esta:

Page 16: Programação de jogos em PHP

./tmp/5/c/4/e/1/sess_ ada6906d1e4bf2d0c753f91edc585b80. Sessões e Sessão Variables9 Se o argumento é usado N você deve criar a estrutura de diretórios mesmo. Além disso, se você usar o argumento N você deve colocar o session.save_path entre aspas porque a vírgula também é usada para comentários no arquivo php.ini. Para nossos propósitos, Eu não recomendo usar esta opção. session.name session.name especifica o nome da sessão que é usada para fazer referência ao sessionid em cookies. Isto deve levar apenas caracteres alfanuméricos. session.auto_start session.auto_start especifica se o módulo da sessão deve iniciar automaticamente. Se você use session.auto_start então você não pode colocar objetos em suas sessões, pois a definição de classe deve ser carregada antes de iniciar a sessão. session.serialize_handler session.serialize_handler é o nome do manipulador que é usado para serializar ou desserializar dados na sessão. Atualmente, apenas os formatos internos "php" e "WDDX" são válidos. WDDX está também disponível apenas se o PHP é compilado com WDDX apoio. session.gc_probability e session.gc_dividend session.gc_probability especifica a probabilidade quando o processo de coleta de lixo deve começar. Isto é calculado usando gc_probability / gc_dividend. session.gc_maxlifetime session.gc_maxlifetime é o número de segundos em que os dados da sessão é visto como lixo e limpeza. session.cookie_path session.cookie_path é o caminho para o qual o cookie é válido. session.cookie_domain session.cookie_domain é o domínio para o qual o cookie é válido. session.cookie_secure session.cookie_secure diz os cookies se eles devem ser enviados através de conexões seguras apenas. session.use_cookies session.use_cookies especifica se o módulo da sessão deve armazenar os ids de sessão sobre o lado do cliente. 10 Capítulo 1 ■ Então o que é todas essas coisas Server? session.use_only_cookies session.use_only_cookies diz o módulo da sessão que só deve usar cookies para

Page 17: Programação de jogos em PHP

armazenar os ids de sessão. Isso evita que ataques de variáveis de sessão sendo passada ao longo da URL. session.cookie_lifetime session.cookie_lifetime especifica o tempo de vida do cookie em segundos. O padrão valor 0 significa esperar até que o navegador for fechado para expirar o cookie. session.referer_check session.referer_check contém uma string para o qual você quer checar para cada HTTP referer. Se o PHP não encontrar este substring, a id de sessão embutida será marcada como inválida. session.entropy_file session.entropy_file dá um caminho para um arquivo externo que será usado como um complemento na criação da id da sessão. O arquivo externo contribuirá para a aleatoriedade na criação sessão. session.entropy_length session.entropy_length especifica o número de bytes que serão lidos a partir do session.entropy_file variável. Quando ajustado para o valor padrão de 0, ele desabilita o opções de entropia. session.cache_limiter session.cache_limiter especifica o método de controle de cache para usar. Opções válidas para isso são nenhum, nocache, privado, private_no_expire e público. session.cache_expire session.cache_expire é a hora de viver para páginas de sessão em cache em minutos. Este opção não tem efeito se session.cache_limiter está definido para nocache. session.user_trans_sid session.user_trans_sid especifica se ou não suporte a sid transparente está habilitado. url_rewriter.tags url_rewriter.tags especifica quais tags HTML deve ser reescrito para incluir a sessão id se session.user_trans_sid é definido como 1. Wow, há uma série de opções de configuração para as sessões. PHP é muito original e personalizável. Você não precisa especificar todas essas opções no arquivo php.ini, como uma questão de fato, PHP dá-lhe várias funções que expor essas opções para seu código. Então, se você necessidade de alterar qualquer uma destas em aplicações específicas que você pode chamar as funções listadas na Tabela 1.2. Sessões e Sessão Variables11 Funções para Sessão Argumentos da função Nome Descrição

Page 18: Programação de jogos em PHP

session_cache_expire [new_cache_expire int] session.cache_expire é substituído por session_cache_limiter [string cache_limiter] retorna o nome da configuração atual para session_decode session_encode vazio retorna uma string codificada com o conteúdo do sessão atual. vazio session_destroy destrói a sessão atual e todos os dados associados com a sessão atual. session_get_cookie_params vazio retorna uma matriz com o cookie sessões atuais session_id deve chamar isso antes de session_start (). session_is_registered session_module_name em seu lugar. session_name [nome string] especificado, ele define o nome da sessão atual. vazio session_regenerate_id vai gerar o ID de sessão e substituir o actual id da sessão com o id de sessão recém-gerado. session_register] argumentos podem ser uma string contendo o nome de um esse nome na sessão atual. session_save_path [path string] retorna o caminho do diretório atual onde caminho atual é substituído com o caminho. session_set_cookie_params vida int [, string path] [, Domínio string] Tabela 1.2 retorna a configuração atual para session.cache_expire. Se new_cache_expire é especificado, a corrente new_cache_expire. session.cache_limiter. Se cache_limiter é especificado, o nome do session.cache_limiter está definido para cache_limiter. cadeia val decodifica a sessão de dados na variável val. da informação. A matriz contém os seguintes itens: caminho de vida, domínio, e seguro. [String val] retorna o id da sessão atual. Se val for especificado ele será substituir o id de sessão atual. Se você é especificado val cadeia val retorna true se há uma variável global com uma nome especificado no val. [String val] retorna o nome do módulo da sessão atual. Se val for especificado, esse módulo será usado retorna o nome da sessão atual. Se o nome é nome misturado [, mixed ... aceita um número variável de argumentos; qualquer uma dessas variável ou um array de nomes de variáveis ou outras matrizes. Para cada um dos nomes especificados, session_register () registra uma variável global com sessões estão sendo armazenados. Se o caminho for especificado, a define os parâmetros do cookie, vida, caminho, domínio

Page 19: Programação de jogos em PHP

e seguro. [, Bool seguro] 12 Capítulo 1 ■ Então o que é todas essas coisas Server? Funções sessão (continuação) Argumentos da função Nome Descrição session_set_save_handler define a funções de sessão de armazenamento utilizado para armazenar e vazio session_start é tudo com base no id de sessão atual. session_unregister vazio session_unset session_write_close vazio isso vai acabar a sessão atual e armazenar a sessão Tabela 1.2 corda aberta, perto de cordas, cadeia de ler, escrever string, recuperação de dados. Você usaria isso quando você queria cadeia de destruir, string gc para criar a sua própria sessão funções de manipulação. cria uma sessão ou retoma a sessão atual. Este var string cancela o registro de variáveis globais com o nome especificado na var. Isso libera todas as variáveis da sessão atualmente registradas. de dados. Você não precisa chamar explicitamente esta função. Eu sei que você está dizendo para si mesmo: "Que diabos eu vou fazer com todos isso? "Para dizer a verdade, você não vai usar metade dessas funções para o que você será fazendo. Só porque você não irá utilizá-los nos exemplos não significa que você não vai usar -los em alguns de seus jogos. Como para as funções que você vai usar, aqui está um exemplo PHP script que define algumas variáveis de sessão. Não se preocupe com a sintaxe de todos os códigos de direito Agora, vou cobrir isso no Capítulo 4. Por agora, basta olhar para como eu estou usando as funções listadas na Tabela 1.2. <? Php / / Use $ _SESSION, em vez de session_register devido a problemas de segurança session_start (); $ Turn = $ _SESSION ['virar']; if (! isset ($ de volta)) { $ Turn = 1; $ _SESSION ['Turn'] = $ turno; } printf ("valor atual por sua vez:" + $ _SESSION ['turn']); unset ($ turno); session_destroy (); ?>

Page 20: Programação de jogos em PHP

Agora dar uma olhada e ver o que este pequeno exemplo está fazendo. Primeiro você inicia a sessão com session_start (). Em seguida, tentar obter uma variável chamada voltar da sessão. Se a virada $ variável não é definida, então você ainda não começou realmente a sessão e você precisa TCP / IP 13 para inicializar a variável. Depois de inicializar a variável, ele define a variável de sessão para transformar tudo o que é no turno $ variável. Então, o valor atual é impresso, a variável está em branco, ea sessão é destruída. Não se preocupe se você não está confortável com tudo isso ainda. Você estará usando sessões em todos os projetos neste livro, por isso vai fazer mais sentido quando você vê as sessões sendo usado em um contexto real. Se você estiver sentindo um pouco sobrecarregado este provavelmente seria um bom momento para fazer uma pausa. Se você está pronto para mais, continuar com a discussão de como as negociações para o servidor Web cliente com TCP / IP. Depois disso, você irá instalar e configurar um IIS (Internet Information Server) do servidor Web e um servidor Web Apache. TCP / IP TCP / IP (Transmission Control Protocol / Internet Protocol) é simplesmente uma comunicação protocolo que os computadores usam para falar uns com os outros. O que os diferentes componentes da TCP / IP faz? ■ TCP. Este é responsável por verificar a entrega correta dos dados de um cliente para um servidor ou um servidor para um cliente. TCP foi construído com verificação de erros e irá desencadear transmissões até que os dados com sucesso, chegou ao seu destino. ■ IP. Este é responsável pela movimentação de pacotes de dados de nó em nó. Encaminha IP esses pacotes com base em um endereço de destino de quatro bytes (endereço IP). Assim como todos os protocolos de outras comunicações, TCP / IP é construída em camadas, no entanto, cada uma das camadas no TCP / IP é lógico, em vez de física. Todo o tráfego de rede se move através destas camadas à medida que viajam através do hardware. Aqui estão as camadas e um pouco bit de informação sobre cada um. ■ Camada de Aplicação. Esta camada lida com tudo o que não é TCP / IP. O Web browser, no nosso caso, é a camada de aplicação.

Page 21: Programação de jogos em PHP

■ Camada de Transporte. Esta camada lida com todos os roteamento e entrega de dados. Esta camada também inclui o controle de erros e verificação de seqüência. ■ Camada de Internet. Esta é a camada responsável pela transmissão de dados de endereçamento, fragmentação de pacotes e pacotes de remontagem. ■ Camada de Acesso à Rede. Esta camada lida com a transmissão dos dados através da rede, incluindo a determinação como acessar o hardware. Como tudo isso funciona? Antes de enviar dados através da rede, TCP / IP estabelece uma conexão com a máquina de destino, enviando o que chamamos de pacotes de gestão. Depois TCP / IP estabelece esta conexão, os dados podem ser enviados gratuitamente. Uma vez que o aplicativo que foi usando TCP / IP para enviar dados é acabado de transmitir, ele envia pacotes para uma gestão mais a máquina do cliente para dizer-lhe para fechar a conexão. TCP / IP também controla a vazão de 14 Capítulo 1 ■ Então o que é todas essas coisas Server? os dados para alcançar a taxa de câmbio de dados máxima, evitando congestionamentos e perda de pacotes. TCP / IP tenta também pacote de dados, tanto em um pacote possível. Para sustentar uma taxa de transferência de dados aceitáveis, evitando sobrecarga na rede, TCP / IP contém quatro algoritmos: Slow Start, Congestion Avoidance, Fast retransmitir, e rápida recuperação. O algoritmo Slow Start evita injeção de vários segmentos na rede durante o transmissão. A razão para isso é se houver roteadores e links mais lento entre os emissor eo receptor você começa a perder pacotes e você abrandar a sua conexão. Assim o algoritmo Slow Start permite TCP / IP para apenas enviar dados a uma taxa que os reconhecimentos são retornados. O algoritmo Congestion Avoidance faz o que o nome diz-que evita congestionamentos. Congestionamento da rede geralmente ocorre quando uma grande quantidade de dados é enviado para fora de um grande tubo e recebidos em um tubo menor. Congestionamento também pode ocorrer quando múltiplos fluxos de dados chegam em um roteador cuja saída capacidade é menor, então a soma dos insumos. O algoritmo Fast retransmitir é acionado quando o fim receptor envia uma duplicata reconhecimento. Isso ocorre quando um segmento fora-de-ordem é recebida, um ACK duplicado é recebida, ou um pacote é perdido. Quando isso ocorre, o TCP / IP irá retransmitir o pacote que

Page 22: Programação de jogos em PHP

foi exceção. O algoritmo de recuperação rápida é acionado após o Fast retransmitir envia os desaparecidos segmento de pacotes. Isto permite que o TCP / IP para se recuperar do segmento em falta e ainda evitando congestionamento da rede. Se a recuperação rápida não estava disponível, o usuário pode ver uma significativa diminuição da transmissão de dados. Agora que você sabe como TCP / IP funciona, você está definida com o conhecimento que você precisa para continuar a marcha. O próximo passo é instalar o servidor Web. Seguem-se orientações de instalação para o IIS e Apache. Instalando o IIS Web Server IIS (Internet Information Server) é incluído com o disco de instalação do Windows 2000. PWS (Personal Web Server), uma versão de IIS aparadas para baixo, está disponível com o Windows 98 disco de instalação. As diferenças entre o IIS eo PWS são relativamente pequenas, o maiores diferenças são: ■ PWS não pode hospedar vários sites em uma única máquina. ■ PWS não pode log para um banco de dados compatível com ODBC. ■ PWS não pode restringir o acesso por endereço IP. ■ PWS não pode executar a indexação. ■ PWS não pode isolar processos. Instalando o IIS Web Server 15 Felizmente para nós, nada disso afeta o nosso desenvolvimento. Basicamente, PWS não se destina a ser um servidor de produção. Então, se você quiser executar seus próprios sites além de apenas o desenvolvimento você precisará instalar o IIS. C Aution IIS / PWS não é suportado no Windows ME ou Windows XP Home Edition, então você vai precisar instalar Apache Web Server para Windows. Antes de instalar o IIS, se houver qualquer outros servidores Web em execução em sua máquina, você vai precisa desinstalá-los. Se o IIS ou PWS já está instalado em sua máquina, por favor, pule para a Capítulo 2 para configurar o PHP. Instalação no Windows 2000/XP Professional IIS / PWS, que eu só vou referir como IIS a partir daqui, é um componente do Windows, assim você precisará ter o seu disco de instalação do Windows pronto. Para iniciar a instalação, clique em Iniciar> Configurações> Painel de Controle e clique duas vezes no ícone Adicionar / Remover Programas como mostrado na Figura 1.3. Figura 1.3 O Painel de Controle do Windows.

Page 23: Programação de jogos em PHP

16 Capítulo 1 ■ Então o que é todas essas coisas Server? C Aution Seu painel de controle pode ser diferente daquele na Figura 1.3. Agora clique na aba de componentes do Windows (se você estiver usando o Windows XP, clique no Adicionar / Remover Componentes do Windows botão) no lado esquerdo e desça até você vê o Internet Information Services (IIS). Clique em Internet Information Services (IIS), em seguida, clique no botão Detalhes no canto inferior direito da janela. Você deverá ver uma tela semelhante a Figura 1.4. Agora você pode selecionar os componentes que deseja instalar com o IIS. Por padrão, Common Arquivos, Internet Information Services snap-in, Personal Web Manager, e World Wide Servidor Web deve ser selecionada. No Windows XP, você não verá o Personal Web Manager opção. Além disso, o World Wide Web Servidor é realmente Serviços World Wide Web em Windows XP. Se estes não forem selecionados, então você deve selecioná-los e clique em OK. Para instalar, clique no botão Avançar. Depois que o Windows é terminar de instalar o IIS para C: \ Inetpub, haverá diversos novos itens em seu computador. Em C: \ Inetpub há cinco pastas: AdminScripts, iissamples, Scripts, webpub e wwwroot. A pasta wwwroot é o lugar onde o site padrão para a vida IIS. Você estará trabalhando principalmente com esta pasta e virtual diretórios. T ip Um diretório virtual pode viver em qualquer lugar em seu computador, mas ele mostra-se sob o site padrão. Isto é extremamente útil se você não quiser manter seus arquivos de Web sob o diretório C: \ Inetpub. Figura 1.4 A guia de componentes do Windows. Instalando o IIS Web Server17 É isso aí! IIS agora está instalado em sua máquina. Com esta instalação você pode executar HTML e ASP páginas. Agora é hora de adicionar o Intérprete CGI PHP para a sua instalação do IIS. Você pode nem continue a ler para ver como este processo está concluído para Windows 98/ME e do Apache Web Server, ou você pode simplesmente pular direto para o capítulo 2 para aprender a instalar o PHP. Instalação no Windows 98 Para instalar o PWS no Windows 98 você terá que inserir o disco de instalação e navegar

Page 24: Programação de jogos em PHP

ao add-ons \ pws pasta. Quando chegar ao add-ons \ pws pasta, clique duas vezes sobre o setup.exe ícone. Isto irá iniciar o instalador PWS. Você será presenteado com uma tela com três botões: mínima, típica, personalizada e. Clique em Personalizar. Você deverá ver uma tela que se parece com a Figura 1.5. Assim que chegar a esta tela certifique-se o seguinte são verificados: ■ Arquivos de programas comuns ■ FrontPage 98 Server Extensions ■ Microsoft Data Access Components ■ Personal Web Server (PWS) ■ Transaction Server Depois de ter selecionado as opções, clique no botão Next e verifique se a instalação diretório para o serviço WWW é definido para C: \ Inetpub \ wwwroot, como mostrado na figura 1.6. Figura 1.5 O PWS Instalação de instalação-Custom tela. 18 Capítulo 1 ■ Então o que é todas essas coisas Server? Figura 1.6 O PWS-instalação de tela WWW Service. Clique em Avançar para concluir a instalação. Quando a instalação estiver completa, você pode pular para Capítulo 2 para instalar o interpretador CGI PHP. Instalando o Apache Web Server no Windows ME / XP Instalando Apache no Windows ME ou Windows XP Home Edition é muito fácil. Tenho incluiu o Apache 2.0.46 instalador msi no CD no diretório do Apache. Se uma nova versão está disponível no momento em que você lê este, você pode baixá-lo em www.apache.org. Para instalar o Apache, dê um duplo clique no apache_2.0.46-win32-x86-no_src.msi na Apache diretório no CD que acompanha este livro. Assim que a instalação começa ele vai pedir-lhe algumas coisas. ■ Domínio de Rede. Isto é onde você entra no domínio DNS para o qual o servidor será registrado. Basta digitar mydomain.com. ■ Nome do servidor. Este é o nome do seu servidor de domínio totalmente qualificado. Digite server.mydomain.com. Endereço ■ Administrador E-Mail. Basta digitar o seu endereço de e-mail aqui. ■ Para quem instalar o Apache. Selecione para todos os usuários, na porta 80, e como um serviço. Sua tela deve agora olhar como figura 1.7. Instalando o Servidor Web Apache em Windows ME/XP19 Figura 1.7 O instalador MSI Apache.

Page 25: Programação de jogos em PHP

Depois de ter todas as informações que entraram, clique no botão Avançar. Selecione Instalação típica, e clique em Avançar. Clique em Avançar mais uma vez para aceitar o diretório padrão, C: \ Program Files \ Apache Group. A instalação irá criar um subdiretório no diretório padrão chamado Apache2-este é o lugar onde todos os arquivos para o Apache vai viver. É isso aí! Não foi assim tão fácil? Agora você pode passar para o capítulo 2 e instalar o PHP CGI Intérprete. Instalando o Servidor Web Apache em UNIX A primeira coisa que você precisa fazer é obter o código fonte para o servidor Apache. Eu incluí versão 2.0.46 no CD no diretório do Apache. Pode haver uma versão mais recente fora quando você ler este livro, se você gostaria de verificar, você pode baixar a versão mais recente de www.apache.org. Há um período de dois requisitos básicos que você precisa instalar o Apache. ■ Espaço em disco. Você precisa de pelo menos 50 megabytes de espaço em disco temporário livre disponível. Depois Apache é instalado, ele ocupa 10 megabytes. ■ Compiler. Você deve ter o compilador C ANSI-instalado. Você pode obter o GNU C Compiler (GCC) para livre de www.gnu.org / software / gcc / gcc.html. 20 Capítulo 1 ■ Então o que é todas essas coisas Server? Agora que você sabe os requisitos e tem os arquivos fonte do Apache, você precisa extraí-los a partir do tarball. Para fazer isso, digite o seguinte no prompt de comando: $ Gzip-d httpd-2.0.46.tar.gz $ Tar xvf httpd-2.0.46.tar Isso irá criar um novo diretório em seu diretório atual de trabalho, contendo o código fonte da distribuição. Você vai precisar de cd para o diretório antes de compilar o servidor. $ Cd httpd-2.0.46 Agora você precisa configurar a árvore de fonte do Apache. Isso é feito usando o configure script que está no diretório raiz da distribuição que você acabou de extrair. Antes de executar este script, existem várias variáveis de ambiente e bandeiras que o script configure pode tomar. As variáveis de ambiente estão listadas na Tabela 1.3 e aparecem sempre antes da configurar comando. Dependendo da configuração do seu computador, você precisará definir algumas destas ambiente variáveis. Um exemplo do comando configure poderia ser algo como o seguinte:

Page 26: Programação de jogos em PHP

$ CC = "gcc". / Configure-prefix = / sw / pkg / apache Para uma lista completa das opções de configuração, execute. / Configure-help. Depois de configurar foi executado, ele irá levar alguns minutos para testar a disponibilidade de recursos em sua máquina e para terminar de construir o Makefiles. Depois que o script configure terminar a execução você pode construir a distribuição digitando fazer no prompt de comando. Isto irá criar os arquivos de instalação. Seja paciente com este processo, que normalmente demora cerca de 3 minutos para terminar. Poderia ser ainda mais dependendo do número de módulos que você selecionou. CC = CPPFLAGS = CFLAGS = LDFLAGS = LIBS = informações sobre a localização da Biblioteca. INCLUI = TARGET = SHLIB_PATH = Tabela 1.3 Variáveis Ambiente Descrição Nome da variável O nome do compilador C. Vários opções do compilador C pré-processador. Depuração e otimizações para o compilador C. Opções para o linker. Cabeçalho de diretórios de busca de arquivos. Nome do executável que será construída. O padrão é httpd. Opções que especificam caminhos biblioteca compartilhada para o compilador eo linker. Instalando o Servidor Web Apache em INIX21 Assim que o script faz é terminado, você pode instalar o pacote Apache Web Server. Para fazer isso, basta digitar make install no prompt de comando. Depois que o script de instalação for concluído, Apache está instalado e pronto para ir. Há algumas personalizações que você pode fazer editando o arquivo httpd.conf. Existem toneladas de opções neste arquivo-demasiadas para ir por aqui neste livro. Então, eu dirigi-lo com a documentação on-line no Apache http://httpd.apache.org/docs-2.0/. Depois que você terminar de personalizar a instalação do Apache, você deve ter para iniciar o servidor. Durante a instalação, o Apache colocar um script de inicialização em seu diretório bin chamado apachectl. Para iniciar o servidor basta digitar o seguinte: $ / Apache / bin / apachectl start Agora você deve ser capaz de solicitar uma página Web através de uma URL (http://localhost/). Se você alguma vez

Page 27: Programação de jogos em PHP

necessidade de parar o servidor, você digita: $ / Apache / bin / apachectl stop É isso aí! Agora você deve ter o servidor Web Apache instalado e funcionando. Agora você pode seguir em frente e instalar o interpretador PHP CGI e avançar em PHP. Esta página foi intencionalmente deixada em branco Capítulo 2 Travando o Configuração da Guerra ■ As plataformas ■ Construção e Instalação de PHP em UNIX ■ Instalação em Windows para IIS / Apache ■ Testando a instalação P HP é uma linguagem muito versátil e vem com uma infinidade de opções. PHP suporta várias centenas de APIs e interfaces para outras ferramentas de programação. Por isso, valeria a pena considerar o que você quer PHP para fazer e instalar apenas os módulos que você precisa. Você será configurar o interpretador PHP com alguns módulos extras, um dos quais é GD Boutell da biblioteca (GD SDK). O SDK do GD permite gerar e manipular imagens na mosca, que eu considero ser muito importante no desenvolvimento de jogos. Se você gostaria de instalar outros módulos, sinta-se livre. A maioria das instalações são muito semelhantes. Vamos a isso! Plataformas Desde o PHP não é dependente de sistema operacional que irá instalar e configurar o PHP para UNIX e Windows. Quando se fala em UNIX, o servidor Web Apache é de escolha. Você pode configurar o PHP de duas maneiras diferentes quando você instalar no Apache. ■ Como intérprete CGI. ■ Como um módulo Apache. 23 24 Capítulo 2 ■ travando a guerra Configuração Nota Você só pode configurar o PHP como um módulo do Apache com o servidor Apache. Quando o PHP é compilado como um módulo do Apache, ele é executado no mesmo espaço de memória como o Servidor Apache. Isto significa duas coisas para você: 1) você recebe um aumento de performance ao interpretar páginas, mas 2) você se ferrar se uma página dá errado. Se uma de suas páginas PHP vai haywire quando executado no mesmo espaço de memória como o servidor Apache, o servidor Apache

Page 28: Programação de jogos em PHP

será interrompido. Isto significa que você está morto nas páginas de água não será servido até que seja reiniciado. No entanto, se você configurar o PHP como um intérprete a evitar toda a questão completamente. A desvantagem é, obviamente, um impacto na performance menor, mas é insignificante. Do outro lado da moeda é o Microsoft Windows com o IIS (Internet Information Server) ou PWS (Personal Web Server). Distribuições de PHP estão disponíveis a partir do IIS 3 até IIS 5; Eu incluí o instala o IIS e Apache no CD fornecido com o livro. Construção e Instalação de PHP em UNIX Se você vai instalar o PHP em uma plataforma Windows, você pode continuar para a próxima seção, a menos que este tema é realmente de seu interesse. A instalação em sistemas UNIX-like é bastante simples. Você precisa para gerar o fazer arquivos, executando os scripts autoconf e depois realizar um fazer e instalar. Vou apenas fazer a cobertura como instalar o PHP como um CGI Intérprete para simplificar. Vamos começar. O primeiro passo é descompactar a distribuição e extrair os arquivos. $ Gzip-cd php-4.2.3.tar.gz | tar xvf - Agora você deve alterar para o diretório onde a distribuição foi descompactado e execute o configure script para gerar os arquivos de tornar necessário. Você pode passar outras opções para contar a configure script módulos que deseja instalar. Por exemplo: $. / Configure - with-gd = / usr/src/gd-2.0.4 - enable-gd-ttf-natal - enable-gd-imgstrttf - -With-jpeg-dir = / usr - with-png-dir = / usr O-with-gd opção é um exemplo de como você pode especificar em tempo de compilação módulos que gostaria de instalar. Alguns desses extras ou add-on módulos são detectados automaticamente; outros add-ons que você pode precisar especificar especificamente no script configure. Se você tiver qualquer dúvida de que o módulo não será instalado automaticamente, você deve especificá-lo na opções. Consulte a Tabela 2.1 para uma lista dos módulos e seus comandos. Construção e Instalação de PHP em UNIX25 Add-Ons configuração Argumento Add-On Descrição do Módulo Verificação de redirecionamentos internos - enable-force-cgi-redirect Localização do arquivo de configuração - with-config-file-path = DIR Especifica o local do php4.ini arquivo de configuração.

Page 29: Programação de jogos em PHP

Diretório de arquivos executáveis - com-exec-dir = DIR Quando o PHP é executado em modo de segurança do executáveis são escolhidos apenas a partir do diretório especificado pela DIR. Escapando citações de dados - enable-magic-quotes dados colocados em um banco de dados pode ter escapa estas citações com uma barra invertida. - - With-ldap = DIR Mcrypt apoio - with-mcrypt = DIR suporte à criptografia mcrypt. Biblioteca de expressão regular - with-system-regex Remoto include () - enable-url-includes Tags curtas - <? Php> disable-short-tags scripts PHP são delimitados por Destaque de sintaxe - disable-sintaxe-hl Desativa o comportamento padrão do destaque de sintaxe PHP. - XML suporte - with-xml Ativa o suporte para XML. BC funcionalidade matemática - enable-bcmath Adiciona suporte para Calculadora Bench Depurador - enable-debugger GD - with-gd = DIR Tabela 2.1 Recurso ou Configurar Este verifica se uma determinada solicitação foi um redirecionamento interno com respeito para o servidor. citações na mesma. Ativar essa opção Variáveis GPC enable-track-vars GPC-GET, POST variáveis a partir de formas são enviados para o servidor. Se estiver habilitado o servidor vai controlar essas variáveis. Suporte LDAP Ativa o suporte para a Light-Weight Directory Access Protocol. PHP permite utilizar o SO base do biblioteca de expressão regular. Isto permite que inclui desde HTTP e Locais FTP. etiquetas ou o <forma curta? ?>. Este opção irá desativar o último. Avisos enable-mantenedor modo Liga compilador e dependência avisos. funções matemáticas. Permite o suporte para interno do PHP depurador. Permite o suporte para GD. DIR aponta para o diretório para GD. * Esta é uma pequena lista das opções de add-on. Para mais, execute configure-help. 26 Capítulo 2 ■ travando a guerra Configuração

Page 30: Programação de jogos em PHP

Agora, se o script de configuração anterior foi executado com êxito deve existir um arquivo chamado fazer no diretório. Este é o arquivo que irá construir a distribuição. Para executá-lo, digite o seguinte: $ Make Se você ver um fracasso tempo de ligação, você é mais provável faltando uma referência a uma biblioteca. Se uma biblioteca está em um local não-padrão você terá que especificar o caminho para a biblioteca e re-run a fazer arquivo novamente. $ Export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: / var / otherlibdir $ Make Depois de todos os arquivos de origem têm sido compilado com sucesso e ligado você pode instalar o distribuição. Para fazer isso você deve ter privilégios de root. Estou supondo que você está instalar como root, se você não for você terá que assumir que o usuário super. T ip Para assumir o super usuário, ou o usuário root a partir de uma linha de comando, basta digitar su no prompt de comando e digite a senha. Para instalar a distribuição, basta digitar o seguinte comando: $ Make install É isso aí. Agora você deve ter o PHP instalado em seu sistema. A única coisa que resta a fazer é Apache dizer o que fazer com páginas PHP. Navegue até a pasta onde sua configuração do Apache vidas arquivo (normalmente httpd.conf), abri-lo e digite as seguintes linhas: AddType application/x-httpd-php4. Php4. Php AddType application/x-httpd-php4-source. Phps Ação application/x-httpd-php4 / cgi-bin/php DirectoryIndex index.html index.shtml index.php index.cgi index.php4 AddIcon / icons script.gif /. Conf. Sh. Shar. Csh. Ksh. Tcl. Php4. Php. Phps Finalmente, você precisará reiniciar o servidor Web Apache. Isso é tudo que você precisa fazer- Você acabou de configurar PHP e Apache. Agora provavelmente seria um bom momento para fazer uma quebrar e começar outro Mountain Dew. . . . Próximo passo: testar! Instalação em Windows para IIS / Apache O pessoal da www.php.net fizeram a instalação para o Windows extremamente simples. Você pode baixar os binários já compilados, que eu incluí para você no CD, ou você pode baixar o código fonte e compilá-la. Eu não vou passar por cima de como compilar Instalação em Windows para IIS/Apache27 a fonte em uma máquina Windows, mas se você realmente gostaria de aprender isso, não é maravilhoso documentação em www.php.net. Para iniciar a instalação do PHP, dê um duplo clique no arquivo php-4.3.2-installer.exe no CD.

Page 31: Programação de jogos em PHP

Isso fará com que o assistente de instalação. Vá em frente e clique no botão Avançar e concorda o contrato de licença. Certifique-se que o tipo de instalação é definida como padrão e clique em no botão Avançar. Se o diretório C: \ PHP é onde você quer a instalação, clique em Avançar; de outra forma alterar o diretório. Agora você será presenteado com uma tela para inserir o seu SMTP servidor e do endereço para a função mail. Basta deixá-las como elas são (SMTP Server = localhost, e de address = [email protected]), e clique em Avançar. Você deverá ver uma tela parecida com a Figura 2.1. Isto é onde você irá selecionar a Web servidor que você instalou no Capítulo 1. Se você instalou o IIS para o Windows 2000/XP irá deseja selecionar Microsoft IIS 4 ou superior. Se você instalou o PWS para Windows 98 você vai deseja selecionar PWS Microsoft Windows 9x. Se você instalou o Apache para o Windows ME você vai querer escolher Apache. Depois de ter selecionado seu servidor Web, clique em Avançar para iniciar a instalação. Se você for solicitado para selecionar nós de script para adicionar mapeamentos para PHP, clique em Selecionar tudo e clique em em OK. Após a instalação estiver concluída, você pode adicionar os módulos que você precisa. Figura 2.1 Selecione o seu servidor web. 28 Capítulo 2 ■ travando a guerra Configuração Extensão de nome de DLL Extensão Extensão Descrição Bzip2 Compression php_bz2.dll funções Funções de Calendário ClibPDF Rachadura php_crack.dll Permite testar a força de uma senha. CURL php_curl.dll DataBase (dbm-style) php_dba.dll DBase DBX php_dbx.dll DOM XML php_domxml.dll Permite operar em um documento XML. Leia EXIF FDF Permite-lhe lidar com formas em um documento PDF. GD php_gd2.dll php_gettext.dll Iconv IIS Gestão php_iisfunc.dll IMAP InterBase Multi-Byte php_mbstring.dll Cordas Mhash php_mhash.dll Expõe algumas funções usadas para hash. Ming php_ming.dll

Page 32: Programação de jogos em PHP

mSQL php_mSQL.dll MSSQL php_mssql.dll Oráculo Php_openssl.dll Open SSL Expõe funções OpenSSL para criptografar / descriptografar. PDF Impressora W32api php_w32api.dll XML-RPC php_xmlrpc.dll php_xslt.dll php_yaz.dll Zip ZLib Tabela 2.2 Disponível Extensões PHP php_calendar.dll php_cpdf.dll Permite criar arquivos PDF. CType Character php_ctype.dll e funções string. Biblioteca URL cliente. Funções para acessar bancos de dados estilo Berkley DB. Funções php_dbase.dll para acessar bancos de dados dbase estilo. Permite que você acesse todas as bases de dados suportadas. php_exif.dll Lê os cabeçalhos EXIF de um arquivo JPEG. php_fdf.dll GD Boutell do SDK. Permite a manipulação de imagem. Obter texto Permite que você para internacionalizar suas aplicações PHP. Hyperwave php_hyperwave.dll Acesso às funções Hyperwave. php_iconv.dll Permite converter strings de caracteres entre várias sets. Permite o gerenciamento do IIS através de código. php_imap.dll IMAP, POP3, NNTP e funções. php_interbase.dll Permite o acesso ao banco de dados InterBase. Java php_java.dll Integra suporte Java ao PHP. LDAP php_ldap.dll Lightweight Directory Access Protocol. Lida com conjuntos de caracteres japoneses. Permite criar filmes em Flash on the fly. Permite o acesso ao banco de dados mSQL. Permite o acesso ao banco de dados MS SQL. php_oracle.dll Permite o acesso ao banco de dados Oracle. Mais funções php_pdf.dll PDF. php_printer.dll Expõe funções para uma impressora. Sockets php_sockets.dll acesso a sockets. Acesso à API Win32 a partir de PHP. Permite que você escreva XML-RPC servidores e clientes. XSLT Expõe funções para trabalhar com XSLT. YAZ Permite PHP para interface com o kit de ferramentas YAZ. php_zip.dll somente leitura o acesso a arquivos zip. php_zlib.dll Permite ler e gravar arquivos gzip. * Mais informações sobre essas extensões podem ser encontradas em www.php.net / manual / en / install.windows.php Teste Seu Installation29

Page 33: Programação de jogos em PHP

Instalar Extensões como fazer o Windows Agora que você tem PHP instalado, você pode adicionar extensões para a instalação. Tabela 2.2 fornece uma lista de extensões disponíveis para Windows. Adicionando uma extensão é muito fácil de tudo que você precisa fazer é copiar as dlls que você quer e editar o arquivo php.ini. Primeiro crie um diretório chamado extensões na pasta onde você instalou o PHP (geralmente C: \ PHP). Agora extraia o arquivo php-4.3.2-win32.zip que está incluído no CD. Vá para o diretório que o arquivo zip e extraído para copiar todos os dlls fora do dlls diretório e colá-los em C: \ WINNT \ system32, se você está em um Windows 2000 máquina; C: \ WINDOWS \ system32 se em uma máquina Windows XP, ou se você estiver em um Windows 98 máquina, C: \ WINDOWS \ system. Agora volte para a pasta onde o arquivo zip extraídos para e copiar todas as dlls da pasta extensões e cole-os na extensões pasta que você criou. Agora que você tem a dlls em seus devidos lugares, abra o seu arquivo php.ini. DEVE-SE localizado na pasta C: \ <Windows diretório \ php.ini. Depois de ter o arquivo aberto, vá para o "Caminhos e diretórios" e olhar para extension_dir = ". /". Nós queremos definir esta para C: \ PHP \ extensions \. Agora vá para o "Dynamic Extensions" e descomente a seção seguintes linhas: 1. extension = php_dbase.dll 2. extension = php_gd2.dll 3. extension = php_sockets.dll Nota É importante que você coloque a barra invertida em C: \ PHP \ extensions \ Vá em frente e salve seu arquivo php.ini e sair. Agora você tem instalado as extensões e o interpretador PHP. Tudo o que resta a fazer é testar a instalação para ter certeza que está analisando Páginas PHP. Testando a instalação PHP deve estar instalado e funcionando em sua máquina. Vá em frente e testá-lo. Abra seu editor de texto favorito e digite o seguinte: <? Php phpinfo (); ?> 30 Capítulo 2 ■ Travando a Guerra Configuração Em seguida, salvar esse arquivo como teste.php e movê-lo para um lugar onde você será capaz de batê-lo. SE VOCÊ

Page 34: Programação de jogos em PHP

estão no Windows, você pode colocá-lo em C: \ Inetpub \ wwwroot test.php \; se você estiver no UNIX você pode colocá-lo em / usr / web / teste / php. Abra um navegador Web e digite http://localhost/test.php e você deve ver algo semelhante à da Figura 2.2. Figura 2.2 Os resultados do teste de sua instalação nova do PHP. Capítulo 3 Eu venci o servidor, Deixe-me ao Código! ■ O Básico da Tag HTML ■ O Todo-Poderoso Documento HTML ■ O Corpo HTML ■ Gráficos e HTML ■ Tabelas ■ Criando formulários para entrada Ongratulations C; se você está aqui, então você tem sucesso instalado e configurado o servidor Web e do intérprete PHP CGI. Neste capítulo vou cobrir HTML (Hyper Text Markup Language). HTML é muito importante para nós, porque sem que não seríamos capazes de mostrar qualquer coisa para o nosso usuário. Isso não seria um jogo muito divertido não é? Se você se sentir confortável com HTML você pode pular direto para o Capítulo 4 e iniciar o serviço em PHP. No entanto, se você sente que precisa de uma reciclagem em HTML, pegue alguns snacks, abrir uma Mountain Dew, em seguida, abra seu editor de texto favorito e vamos começar. O Básico da Tag HTML Tags HTML são simples de entender. Você tem uma marca de início e um fim tag. Em outras palavras, cada tag tem dois elementos que são colocados juntos. O início tag parece <tag_name> ea marca final parece </ tag_name>. A única diferença entre essas duas marcas é a barra na tag final. Quase todos os tag em HTML 31 32 Capítulo 3 ■ Eu venci o Server, Let Me no Código! tem atributos. Para usar estes atributos a sua tag ficaria assim: <tag_name attribute1 = "someValue"> </ tag_name>. As tags apenas em HTML que não têm atributos que pode definir na tag são <HTML> </ HTML> <HEAD>, </ HEAD>, e <TITLE> </ TITLE>. Todas as outras marcas têm um ou mais atributos que podem ser aplicadas a eles. Agora que você sabe o básico de uma tag HTML, dê uma olhada nas diferentes elementos de uma Documento HTML e como ela é estruturada. O Todo-Poderoso Documento HTML Um documento HTML normalmente tem uma extensão de htm ou html;.. No entanto, desde que você

Page 35: Programação de jogos em PHP

ser codificação em PHP em um futuro próximo você deve apenas adquirir o hábito de salvar seu HTML documentos com a extensão. php. Para começar, consulte a Tabela 3.1, que contém o quatro marcas básicas que compõem o início de um documento HTML. Como você pode imaginar, tudo o que acontece em seu documento HTML será cercado por as tags <HTML> e qualquer coisa que você deseja exibir vai entre as tags <BODY>. As tags são importantes <HTML>; embora a maioria dos navegadores lá fora, pode lidar com um documento sem as tags HTML, ainda há uma chance de que sua página será mal interpretado. É mais seguro para incluí-los. Nota Cada tag começa com <name_of_tag> e termina com </ name_of_tag>. A seção head do documento HTML (<HEAD> </ HEAD>) é como uma espécie de referência rápida para navegadores. Que fornece o título do documento, contém dados META, e estabelece relações entre documentos HTML e diretórios de arquivos. Para a maior parte, você não vai estar lidando com todos esses em sua aplicação. A tag só você realmente precisa se preocupar é sobre o <TITLE> </ TITLE> tag. Todos tag isso faz é dar a sua página um título e exibi-lo em na barra de título da janela, como na Figura 3.1. Descrição <HTML> </ HTML> Cria um documento HTML. <HEAD> </ HEAD> <TITLE> </ TITLE> Define o título do documento. <BODY> </ BODY> Contém a área visível do documento. Tabela 3.1 Palavras-chave para o início Etiqueta Contém o título do documento e outras informações que não é exibido na web. O Todo-Poderoso HTML Document33 Figura 3.1 Uma tag title exemplo. Eu sugiro fortemente que você dê suas páginas nomes lógicos para aliviar a confusão quando você editar -los mais tarde, não use nomes de páginas como "Página 1". Da mesma forma, não fazem seus títulos extremamente tempo. Uma boa regra de ouro é, se o seu título é mais do que 3-5 palavras, então é muito tempo. Vamos em frente e passar para o âmago da questão de HTML. Se você não está muito claro sobre como todas essas marcas se encaixam, não se preocupe, vou mostrar um exemplo em breve. O Corpo HTML Tabela 3.2 mostra os atributos tag BODY.

Page 36: Programação de jogos em PHP

Tudo o que exibe em sua página HTML acontece dentro do <BODY> </ BODY> tags. Quando Eu digo "tudo" eu quero dizer tudo o que é visível para o usuário. Que inclui imagens, texto, tabelas, links, cores de fundo, cores de texto, cores dos links, formulários e botões. A maioria do que iremos utilizar em nossos jogos lidar com layouts, formulários, imagens, e alguns formatação de texto. Não haverá que a formatação de texto muito porque a maioria dos nossos jogos serão as imagens e formas, mas você pode querer criar uma seção de ajuda para o seu jogo com aparência profissional, então dê uma olhada no tags de formatação de texto disponível. 34 Capítulo 3 ■ Eu venci o Server, Let Me no Código! Descrição atributo Bgcolor # RRGGBB Texto # RRGGBB Link # RRGGBB Vlink # RRGGBB Alink # RRGGBB Define a cor do link quando o usuário está clicando sobre ela. URL para a imagem de fundo Topmargin n º de pixels Leftmargin n º de pixels Marginheight n º de pixels Marginwidth n º de pixels Tabela 3.2 Atributos Tag BODY Valores Define a cor para o valor HEX especificado. Define o texto para a cor especificada. Define o link para a cor especificada. Define os estados visitados de links para a cor especificada. Define o fundo do documento a uma imagem especificada. Define o valor da margem superior do documento em Internet Explorer. Define o valor da margem esquerda do documento na Internet Explorer. Define o valor da margem superior do documento no Netscape. Define o valor da margem esquerda do documento em Netscape. * Uma lista completa de marcas está incluída no Apêndice A. Na maioria das vezes você só quer fazer o texto se destacam um pouco mais, talvez por um cabeçalho ou algo assim. Por exemplo, você pode querer rotular um campo de entrada ou apenas fazer parágrafos para dar instruções. Assim, estaremos usando o <H3> </ H3>, </ B> <P>, </ P> e Tags <BR> a maioria do tempo. Dê uma olhada em um exemplo de um documento HTML com estes elementos na mesma. <HTML>

Page 37: Programação de jogos em PHP

<HEAD> Exemplo de código <TITLE>> </ TITLE> </ HEAD> <BODY Bgcolor="#FFFFFF"> <H3> Bem-vindo! </ H3> <p> <b> Instruções </ b> <br> Para dominar a arte de programação PHP jogo você precisa ser fluente em HTML. Se não o fizer um será capaz de ver o seu jogo. </ p> </ BODY> </ HTML> O Todo-Poderoso HTML Document35 Descrição <pre> </ pre> Cria um bloco de texto pré-formatado. <h1> </ h1> <h2> </ h2>, <h3> </ h3>, <h4> </ h4>, <h5> </ h5>, <h6> </ h6>. <h6> </ h6> <b> </ b> Texto Bolds. <i> </ i> coloca em itálico o texto. <u> </ u> Sublinha o texto. <tt> </ tt> </ strong> Texto Bolds. </ p> Cria um parágrafo. Insere <br> uma quebra de linha. <blockquote> </ blockquote> <dl> </ dl> Cria uma lista de definições. <dt> </ dt> Cria um termo de definição. <dd> </ dd> Cria uma definição. <ol> </ ol> Cria uma lista numerada. <ul> </ ul> Cria uma lista com marcadores. <li> </ li> Precede cada item da lista e adiciona um número ou uma bala, dependendo do tipo de lista. </ div> com uma folha de estilo. Tabela 3.3 Formatação de texto Tag Etiqueta Cria o maior título que o HTML oferece. Há seis título tamanhos disponíveis: cria o menor tamanho de título. Cria Teletype ou máquina de escrever estilo de texto. Travessões texto de ambos os lados. Isto é usado para formatar grandes blocos de HTML. É geralmente usado em conjunto * Uma lista completa de marcas está incluída no Apêndice A. Dê uma olhada no código. Observe que o documento inteiro vive entre o <HTML> </ HTML> tags. Ao descermos a nossa linha seguinte, iniciar o cabeçalho do documento, colocando o

Page 38: Programação de jogos em PHP

início <HEAD> tag. Desde o nosso título vai na cabeça do documento em que colocamos nossa <TITLE> </ TITLE> tag, com o nosso título, e fechar a nossa </ HEAD> tag. Você está percebendo um padrão ainda? Deixe-me repetir: tudo está indo sempre no meio tags. 36 Capítulo 3 ■ Eu venci o Server, Let Me no Código! Em seguida, você iniciar o <BODY> do documento. Observe o atributo BGCOLOR = "# ffffff". Tudo isso faz é definir a cor de fundo do documento para branco. Para o resto dos atributos associado ao <BODY> </ BODY> tag consulte a Tabela 3.2. Em seguida, você vai usar uma da rubrica tags. Eu costumo usar <H3> </ H3> para uma tag posição, porque não parece muito grande ou muito de pequeno porte. Novamente, o texto que eu quero exibido vai entre as tags de abertura e fechamento. Agora você vai começar um novo parágrafo. A palavra em negrito em primeiro lugar, voltar para a próxima linha, e insira o texto. T ip A tag <BR> em HTML é exatamente a mesma coisa que colocar em um n \ ou \ n \ r no C / C + +. Dê uma olhada nos resultados, que deve ser semelhante à Figura 3.2. Ver, o quão fácil foi isso? Ok, agora que você pode dominar qualquer texto que possa vir a maneira vamos adicionar alguns gráficos para ele e fazê-la bonita. Gráficos e HTML Atualmente, existem três tipos de formatos de imagem que suporta HTML:. Jpg, gif, png e... Cada formato tem suas próprias especificações e nuances. Há, naturalmente, vantagens e desvantagens de usar cada um. Vamos dar uma olhada nesses formatos e ver as suas capacidades. Figura 3.2 Os resultados do código HTML exemplo. Gráficos e HTML37 Os formatos de arquivo O formato de arquivo. Jpg, pronuncia-se "jay-peg", é melhor usado quando você quer mostrar as fotos porque suporta uma paleta de cores de 24 bits. É um algoritmo de compressão "lossy", o que significa que o algoritmo que comprime o crunches informação de cor do arquivos em tamanho, mas a qualidade da imagem leva um golpe. Na maioria das vezes você não consegue ver a diferença na qualidade da imagem, a menos que você estiver imprimindo o gráfico numa setter imagem profissional, que não estamos indo fazer. O. Gif (Graphics Interchange Format) é projetado para lidar com uma de 256 cores

Page 39: Programação de jogos em PHP

paleta. Quando um gif. Comprime uma imagem que utiliza um algoritmo de compressão "lossless". Este significa que a compressão torna o arquivo menor de tal forma que a imagem original pode ser reconstruído bit a bit. Para isso, remapeia as cores de uma imagem, usando o que é chamado de cor Look Up Table (CLUT) para novas cores em uma paleta de 256 cores. Em seguida, a imagem é compactado usando Run Length Encoding (RLE). RLE não é uma forma eficiente para comprimir imagens se há muitas mudanças de cor através de uma linha de pixels, mas ele faz um trabalho estrondo-up quando uma linha de pixels tem muitos pixels da mesma cor. . Gifs também suportam transparência. Você pode fazer isso através da definição de uma das cores na CLUT para ser uma cor transparente. Em seguida, os pixels na imagem que são mapeados para que determinado cores tornam-se transparentes. Isto é muito útil para a criação de imagens em cima de outras imagens ou ter uma única imagem que pode ser mostrado com diversas formações diferentes. Transparências também permitem que você faça de forma estranha imagens, como setas ou círculos, que não mostram uma moldura retangular. Não só. Transparências apoio gif, mas ele também suporta múltiplas imagens. Significado que você pode ter várias imagens e quadros compactados em um mesmo arquivo. Isso significa que que você pode criar pequenas imagens animadas. T ip Ao escolher uma cor para uma transparência, use roxo brilhante, rosa brilhante, verde brilhante ou uma vez que estes cores normalmente não aparecem em uma imagem. O formato final é compatível com imagens. Png (Portable Network Graphics), pronunciado "Ping". Este formato foi desenvolvido para substituir os antigos e mais simples. Formato gif. . Png tem quatro principais vantagens sobre o formato gif:. canal alfa suporte, correção gama, melhor entrelaçamento e melhor compressão. No entanto,. Png não suporta animação frames, então se você quiser uma imagem animada que você deve usar. gif. . Png foi desenvolvido para ser um imagem única único formato. Compressão. Png é excelente porque suporta true color, escalas de cinza, paleta e baseado em imagens. . Jpg suporta os dois primeiros, e. Gif suporta a terceiros. . Pngs normalmente recebe 5% a 25% melhor compressão de arquivos. gif. 38 Capítulo 3 ■ Eu venci o Server, Let Me no Código!

Page 40: Programação de jogos em PHP

C Aution Se os seus arquivos. Png são salvos usando o modo de cores verdadeiras, muitas vezes eles vão ser maiores do que o esperado. Fazer se você usar o modo de paleta baseada ao salvar imagens simples. . Png suporta transparências gosta. Gif faz, mas ele faz isso de uma maneira diferente. Em vez de especificando uma cor na CLUT, você especifica um canal alfa ou um canal de máscara. Todos os três . Tipos de imagem png (cor verdadeira, em tons de cinza, e paleta) pode armazenar um canal alfa. Então, o que que isso significa? Bem, onde. Gif armazena um valor de 3-bit RGB para a cor de transparência para cada pixel,. png armazena um valor de 4 bits RGBA para cada pixel. Você pode estar se perguntando por que isso é diferente da transparência gif.. Quando um gif. É colocado sobre um fundo e tem valores de transparência, você pode ver algumas arestas irregulares ao redor da imagem onde ela encontra o fundo. Mas quando um transparente. Png é colocado sobre um fundo, não artifacting ocorre. Um grande exemplo disso é quando você tem uma imagem com uma sombra, como na Figura 3.3. Agora que você ver a diferença entre as imagens que eu sei que você está se perguntando: "Ok parece melhor, mas ele disse que armazenado um bit extra de informação. Não esta tornar o arquivo tamanho maior? "E a resposta é sim, mas só se você usar o canal alfa em uma excessiva caminho. Então, se você tiver um. Png paleta de alfa e você quer quatro níveis de transparência, você tem usar quatro entradas de paleta diferente. Mas desde que para a maioria dos casos, você vai precisar de apenas um nível de transparência, este não será um problema eo png. sairá sempre a um nível comparável tamanho. Agora que todos esses formatos gráficos estão disponíveis para você, como você vai saber que um de usar? A resposta é muito simples:. Jpgs use se você estiver exibindo algo com um total paleta de cores que tem muitas cores em mudança. Uso. Gif se você quer fazer uma pequena animação ou transparência. Uso. Png se você não deseja usar. Gif, desde que você pode obter os mesmos resultados com. pngs como você pode com. gifs. Figura 3.3. Gif versus. Transparência png. Gráficos e HTML39 Usando os formatos de arquivo em seu documento Todos saúdem a tag de imagem. Sim, isso mesmo, a tag de imagem. Ele permite que você exibir imagens em

Page 41: Programação de jogos em PHP

sua página. O que é que lhe parece? Aqui está uma repartição da tag de imagem: <img> accessKey - Define ou recupera a chave de acessibilidade. align - Define o alinhamento da imagem, os valores possíveis são absbottom, absmiddle, fundo base, esquerda, centro, direita, texttop, top. alt - O texto alternativo da imagem. Esta será exibido se a imagem não é mostrado ou se alguém tem o seu conjunto browser não mostrar imagens. fronteira - A quantidade de fronteira, em pixels, que você quer em torno de sua imagem. id - Define o ID da imagem. altura - Define a altura da imagem. nome - Define o nome da imagem. src - Esta é a localização e origem da imagem. usemap - Define a URL para usar como um mapa de imagem do lado do cliente. width - Define a largura da imagem. O verdadeiro coração da marca é o atributo src. SRC é a fonte da imagem. Pode ser um parente caminho ou um caminho absoluto. Um caminho relativo é relativo a onde você está no seu diretório estrutura. Se você especificar um caminho absoluto que não importa onde você está no estrutura de diretório. Por exemplo, um caminho relativo seria algo parecido com isso: <img src = "... / images / someimage.gif" border = "0">, onde um caminho absoluto pode ficar assim: <img src="http://www.somewhere.com/images/someimage.gif" border="0">, ou como isto: <img border="0"> "src="/images/someimage.gif. Você estará usando todos os caminhos relativos por duas razões: 1) ele faz a sua aplicação mais escalável, e 2) que torna a sua aplicação auto-contido. Se você tivesse que usar caminhos relativos ea imagem no somewhere.com desapareceu, você teria agora uma imagem quebrada. Mas, se você manter tudo dentro do seu aplicação que você não terá esse problema. A única maneira que você irá obter uma imagem quebrada é se você não referenciá-lo corretamente. Você deve tornar-se muito familiar com a tag de imagem. Você poderá usá-lo muitas vezes, e saber como ajustar os atributos da tag lhe dará controle sobre a soberba aparência da página. Dê uma olhada em um exemplo usando a tag de imagem. <html> <head> <title> Exemplo Imagem </ title> </ Head>

Page 42: Programação de jogos em PHP

<body bgcolor="#FFFFFF"> <img src="images/someimage.gif" border="0" align="right" alt="some image"> 40 Capítulo 3 ■ Eu venci o Server, Let Me no Código! Aqui está uma imagem com a imagem alinhada à direita do texto. <img src="images/someimage.gif" border="0" alt="some image"> Aqui está uma imagem sem a tag align nele em tudo. <img src="images/someimage.gif" border="0" width="100" height="100" alt="some image"> Aqui é a mesma imagem, mas realmente grande. <img src="images/someimage.gif" border="0" width="10" height="10" alt="some image"> Aqui é a mesma imagem, mas muito pequeno. </ Body> </ Html> A tag de imagem é muito fácil de entender e usar. No exemplo de código, repare que o tag de imagem não tem um fim tag-este é um outro caso especial em HTML. Temos basicamente quatro imagens exibidas na tela, um está alinhada à direita de algum texto. Isso foi feito usando o atributo align. Você pode querer brincar com o atributo align um pouco para ver o que cada uma das propriedades pode fazer à sua imagem. Isto é muito útil se você desejar que o texto envolver em torno de uma imagem. A imagem seguinte é apenas colocada na tela sem nenhum atributo align. Isto é como você vai usar a tag de imagem com mais freqüência. As duas próximas imagens usar a largura e atributos altura. Estes sistemas permitem alterar a largura e altura de uma imagem. Um deles é maior, então a imagem original e uma é muito menor do que a imagem original. Dê uma olhada a Figura 3.4 para os resultados da nossa amostra de código pouco. Figura 3.4 O resultado da imagem do exemplo de código. Gráficos e HTML41 Agora que você sabe quase tudo o que há para saber sobre as imagens, você pode se concentrar imposição de um quadro para os seus jogos. Para fazer isso você deve compreender como as tabelas de trabalho. Eu não posso forçar bastante como isso é importante para o layout e para manter o seu jogo juntos. Tabelas Acredite ou não, as tabelas são seus melhores amigos. Você vai usar tabelas para controlar onde as coisas acabam até na sua página. Você pode fazer tabelas espalhar-se e ocupam a página inteira, não importa quão grande é a janela do navegador é, ou você pode fazer a tabela muito rígida e ocupar apenas uma parte

Page 43: Programação de jogos em PHP

da tela. O primeiro passo é saber com as tabelas que você pode fazer com eles. Qualquer coisa que você pode colocar para fora em uma grade deveria ser definido em tabelas. Se você tiver uma imagem que é curvy, coloque uma grade sobre ele e descobrir onde você pode fazer fatias para criar uma tabela. (Eu vou cobrir este com mais detalhes posteriormente.) Há três elementos muito básicos em uma tabela: não é a própria tabela, uma linha da tabela, e uma célula da tabela. As tags para estes são <table> </ table>, <tr> </ tr> e <td> </ td>, respectivamente. Você pode se perguntar: "Por que é a tag para uma célula de tabela <td> </ td>?" Bem, "td" realmente significa tabela de dados, então se eu falar sobre os dados da tabela Refiro-me a célula da tabela. Para fazer uma tabela, você inicia o tag da tabela, iniciar uma tag linha da tabela, iniciar uma tag dados da tabela, encerrar uma tabela de marcas de dados, acabar com a tag linha da tabela, e então terminar a tag table. Como este: <table border="1"> <tr> <td> Célula 1 </ td> <td> Célula 2 </ td> <td> Célula 3 </ td> </ Tr> </ Table> Faz sentido? Para cada célula que você precisa colocar uma <td> </ td> tag entre o <tr> </ tr> tags. Para cada linha que você precisa colocar uma <tr> </ tr> tag entre o <table> </ table> tags. Basta lembrar que você pode ter uma célula de células abranger vários, e você pode ter uma extensão de múltiplas linhas linhas, mas você não pode ter uma célula sem um palmo de uma linha de baixo mais larga do que qualquer linha acima dele. Lembre-se que ele tem que ser uma grade. Dê uma olhada os atributos da tabela, linha da tabela, e dados marcas de tabela. <table> </ table> Fronteira - Define a quantidade de borda que você quer em torno de sua mesa. Se o valor for 0 então nenhuma borda será exibida. O valor padrão de fronteira é 0. Cellspacing - Define a quantidade de espaço, em pixels, entre as células. O padrão valor é 2. 42 Capítulo 3 ■ Eu venci o Server, Let Me no Código! Cellpadding - Define a quantidade de espaço, em pixels, entre a borda da célula e sua conteúdo. O valor padrão é 2. Width - Define a largura da tabela. Pode ser um número, em pixels, ou um per -

Page 44: Programação de jogos em PHP

percentual. A porcentagem é baseada em quão grande ou pequena janela do cliente é. Altura - Define a altura da tabela. Ele também pode ser um número ou uma porcentagem, apenas como a propriedade de largura. Align - Define o alinhamento da tabela. Valores possíveis são esquerda, centro e direita. Por padrão, as tabelas serão alinhadas à esquerda. Bgcolor - define a cor de fundo da tabela. <tr> </ tr> Align - Define o alinhamento da linha da tabela. Valores possíveis são o centro, justificar, à esquerda, e à direita. Por padrão, para a esquerda é selecionado. Bgcolor - define a cor de fundo da linha da tabela. Isso substitui o bgcolor em a marca de tabela para a linha especial que é especificado em. Width - Define a largura da linha da tabela. Altura - Define a altura da linha da tabela. Valign - Define o alinhamento vertical da linha da tabela. Possíveis valores são de meia, linha de base, inferior, superior e. Por padrão, o meio é selecionado. <td> </ td> Align - Define o alinhamento dos dados ea justificação do texto na célula da tabela. Pos - veis valores são o centro, justificar, esquerda e direita. Por padrão, para a esquerda é selecionado. Bgcolor - define a cor de fundo da célula da tabela. Isso substitui o bgcolor em a marca de linha da tabela para a célula em particular que é especificado em. Colspan - Define o número de colunas ou células, que esta célula será instalada. Rowspan - Define o número de linhas que esta célula será instalada. Width - Define a largura da célula. Altura - Define a altura da célula. Nowrap - Define se o navegador irá executar automaticamente a quebra de texto em da célula. Valign - Define o alinhamento vertical de dados e de texto na célula da tabela. Valores possíveis são de meia, de base, inferior e superior. Por padrão, o meio é selecionado. Antes de continuar, eu quero te mostrar o que essas opções podem fazer. Vamos criar uma tabela com uma borda de 1, não cellpadding, três linhas, três células em cada linha com um múltiplo abrangendo colunas, e as cores de fundo em algumas células. Gráficos e HTML43 <html> <head> <title> Exemplo de tabela </ title> </ Head> <body bgcolor="#FFFFFF">

Page 45: Programação de jogos em PHP

<table border="1" cellpadding="0" cellspacing="0" width="450"> <tr height="25"> <td align="left" valign="top"> Alinhados esquerda e superior </ td> <td align="center" valign="middle"> Alinhados centro e meio </ td> <td align="right" valign="bottom"> Alinhados direita e inferior </ td> </ Tr> <tr height="25"> <td align="left" valign="top" colspan="2"> Este abrange duas células de dados </ td> <td align="left" valign="top" rowspan="2"> Note que isto é tão grande quanto o de células acima dela. Esta célula também abrange duas linhas </ td> </ Tr> <tr height="25"> <td align="left" valign="top" cor # cccccc bgcolor="#cccccc"> </ td> <td align="left" valign="top" Cor bgcolor="#999999"> # 999999 </ td> </ Tr> </ Table> </ Body> </ Html> Este código deve ser algo como a Figura 3.5. Figura 3.5 Exemplo de código resultados depois de usar a tabela de mesa, linha, e as tags dados da tabela. 44 Capítulo 3 ■ Eu venci o Server, Let Me no Código! Ver todas as coisas legais que você pode fazer com tabelas? Uma vez que você pegar o jeito de as tabelas e os maneira que o fluxo pode começar tabelas de nidificação dentro de outras tabelas para obter diferentes efeitos. Para futuros jogos neste livro, você vai começar com uma tabela base que será chamado o quadro mesa. Esta tabela inclui os cinco elementos principais para uma página: um cabeçalho, uma barra à esquerda, um painel de conteúdo, uma barra direita, e um rodapé. Então, dentro de cada um desses você pode ter alguns conteúdo, um menu, ou nada. Mas você sempre começar com esta tabela base básicos: <table border="0" cellpadding="0" cellspacing="0" width="750"> <tr> <td align="left" valign="top" colspan="3"> HEADER </ td> </ Tr> <tr> <td align="left" valign="top" width="100"> ESQUERDA </ td> <td align="left" valign="top" JOGO width="550"> GOES AQUI </ td> <td align="left" valign="top" width="100"> DIREITO </ td> </ Tr> <tr> <td align="left" valign="top" colspan="3"> FOOTER </ td> </ Tr> </ Table>

Page 46: Programação de jogos em PHP

Para o propósito deste livro, seus jogos será composta de várias tabelas ou formulários que são formatados com tabelas, e eles vão entrar no painel de conteúdo. Você vai escrever seu cabeçalho, esquerda, direita, e painéis de rodapé com PHP em si. Mas não vamos ficar à frente de nós mesmos; Vou cobrir tudo isso no próximo capítulo. Por agora, começar alguma prática com a imposição tabelas com vários gráficos para fazer uma interface boa aparência. Layouts, tabelas e gráficos Como prometido, você está indo fazer uma interface boa aparência. Você pode usar esta interface em seus jogos se você gosta ou você pode criar o seu próprio. Pelo tempo que você terminar com esta seção você será um mestre em colocar para fora tabelas. Ao dispor de gráficos para trabalhar com ele é útil para ter um aplicativo gráfico, como Photoshop ou Paint Shop Pro. Estes programas permitem criar os gráficos para a Web e eles vão fazer o corte de gráficos muito mais fácil. Eu incluí o Paint Shop Pro no CD, mas você pode usar qualquer aplicativo gráfico que você preferir, desde que ele pode salvar . Gifs ou. Jpgs. Gráficos e HTML45 Ao dispor de uma mesa, começam sempre no canto superior esquerdo da imagem e fazer o seu caminho através do topo em colunas. Isso é o que chamamos de esquerda para a direita da ordem. Construção de uma tabela desta forma será melhor permitir que você veja o layout final table no código. Tenho incluída uma imagem no CD no diretório chamado Capítulo 3 interface.pcx. Continuar e abra a imagem que você possa criar um layout de tabela com gráficos. Agora você tem que tomar a imagem e dividi-lo em colunas. Eu costumo criar três colunas em uma tabela. Isto parece dar flexibilidade muito bom em como o produto final se transforma para fora não para mencionar que ele se encaixa em nosso layout cinco painel muito bem. Para criar as colunas e linhas que você vai precisar de arrastar as linhas de grade em sua imagem. No Paint Shop Pro isso é feito simplesmente arrastando o mouse da régua para a imagem. Criar duas linhas verticais da grade na imagem. Iniciar a linha primeira grade logo à direita da mão esquerda bar e trabalhar sua maneira transversalmente. Coloque sua linha de segunda grade vertical, diretamente para o esquerda da barra direita. Criar uma linha de grade horizontal logo acima da barra inferior. Agora criar

Page 47: Programação de jogos em PHP

uma linha de grade horizontal logo abaixo da barra superior do gráfico. Seus resultados deve ser semelhante Figura 3.6. Figura 3.6 Criando o primeiro conjunto de linhas de grade. 46 Capítulo 3 ■ Eu venci o Server, Let Me no Código! Perceba como você pode começar a ver um layout de tabela aparecendo. A parte superior da imagem torna-se uma linha e três colunas. Assim, o layout da tabela geral em HTML será parecido com este: <table border="0" cellpadding="0" cellspacing="0"> <tr> <td align="left" valign="top"> <img src="images/topLeft.gif" border="0"> </ td> <td align="left" valign="top"> <img src="images/center.gif" border="0"> </ td> <td align="left" valign="top"> <img src="images/topRight.gif" border="0"> </ td> </ Tr> </ Table> Você não necessariamente tem que fatiar sua imagem como este que, existem várias opções disponíveis para você. Uma alternativa seria a fatia a imagem de topo como um gráfico grande assim que você teria, então, uma única linha com uma única coluna na mesma. Se você precisava topo linha para abranger várias colunas você apenas colocar um colspan nos dados da tabela. C Aution Apenas uma fatia fora as imagens como imagens grandes se não houver uma grande quantidade de informações de cor em si. Caso contrário você vai acabar com arquivos muito grandes e os tempos de carregamento muito longo. Agora você deve ter todas as linhas de grade no lugar e ter uma boa idéia de como criar a sua tabela. A única coisa que resta a fazer antes de deixar o reino gráficos e cabeça de volta ao código é para cortar as imagens e guardá-las em um formato que podemos usar. Para cortar fora uma imagem, basta clicar sobre a ferramenta Selecionar e arrastar o cursor entre as linhas de grade. A seleção deve pressão para as linhas de grade. Depois de ter uma seção da imagem selecionado, copiar a seleção, iniciar uma nova imagem do tamanho da seleção que você fez, e cole a seleção para a nova imagem. Depois de ter feito isso, você vai precisar salvar a imagem como gif. ou um jpg.. Uma vez que temos um pouco de informação de cor que precisamos vamos utilizar o formato de arquivo. jpg por todas as razões descritas anteriormente.

Page 48: Programação de jogos em PHP

Depois de ter cortado fora e salva todas as imagens, você pode criar a tabela. Ao fazer layouts com imagens de recriar um olhar específico, você não quer ter qualquer fronteiras, cellpadding, cellspacing ou na sua mesa. Se você tinha cellpadding ou cellspacing na sua tabela, então quando você coloca as imagens em que eles não butt-up uns contra os outros. Isto acabaria com o efeito que você está tentando alcançar. Lembre-se, tudo que você está tentando fazer é criar um shell para o seu jogo, você não está tentando mostrar alguma planilha do Excel onde você precisaria de fronteiras e de preenchimento para torná-lo legível. Gráficos e HTML47 Uma vez criada, a tabela deve ser algo como o seguinte:

Teste Uma vez criada, a tabela deve ser algo como o seguinte: <table border="0" cellpadding="0" cellspacing="0" width="750"> <tr> <td align="left" valign="top"> <img src="images/topleft.jpg" border="0"> </ td> <td align="left" valign="top"> <img src="images/topcenter.jpg" border="0"> </ td> <td align="left" valign="top"> <img src="images/topright.jpg" border="0"> </ td> </ Tr> <tr> <td align=left" valign="top"> <img src="images/leftbar.jpg" border="0"> </ td> <td align="left" JOGO valign="top"> GOES AQUI </ td> <td align=left" valign="top"> <img src="images/rightbar.jpg" border="0"> </ td> </ Tr> <tr> <td align="left" valign="top"> <img src="images/btmleft.jpg" border="0"> </ td> <td align="left" valign="top"> <img src="images/btmcenter.jpg" border="0"> </ td> <td align="left" valign="top"> <img src="images/btmright.jpg" border="0"> </ td> </ Tr> </ Table> Depois de tudo isto loucura você vai acabar com algo que se parece com a Figura 3.7, quando você bater com seu navegador. Figura 3.7 Resultados de criar sua tabela com gráficos. 48 Capítulo 3 ■ Eu venci o Server, Let Me no Código!

Page 49: Programação de jogos em PHP

Grande, agora você entender quando usar os diferentes tipos gráfico e como lay out tabelas simples ou complexas. A única coisa que resta é ficar de entrada em seu jogo. Este é o lugar onde formas vêm dentro Forms dar o seu usuário uma maneira de entrar na informação que eles querem. Criando formulários para entrada Criação de um formulário para entrada é bastante simples. É como usar cada tag HTML outros. A forma essencialmente consiste em três elementos: a forma em si, os campos do formulário, e alguns elemento para enviar o formulário. Dê uma olhada os atributos da tag Form. <form> </ form> Ação - Define o URL ao qual o formulário é lançado para o processamento. Pode ser um parente ou o caminho absoluto, ou um mailto para processar o formulário via email. Enctype - Define o tipo de codificação MIME do formulário. Isso geralmente é usado somente quando o upload de arquivos para o servidor. Método - Define como o formulário vai ser recuperada pela página de processamento. Possível valores para isso são POST (irá postar as informações para o servidor) e GET (Vai colocar os pares nome-valor do formulário na string de consulta). Name - Define o nome do formulário. Nota Quando você usa um formulário nos exemplos neste livro que você irá utilizar o valor para o método POST. A principal razão para isto é que quando você usa o método POST você não está limitado na quantidade de dados que podem ser enviados para o servidor HTTP. O método GET limita a duração máxima de uma URL, que atualmente é 2048 bytes. 2048 bytes não é um monte de informações, você poderia preencher esse up com apenas um poucos campos de texto. Para permitir que o usuário insira informações que você deve dar-lhes uma maneira de digitar essas informações. HTML oferece controles de formulários diversos para que você possa fazer isso. <INPUT> Name - Define o nome deste elemento. Tipo - Define o tipo de elemento de entrada. Valores possíveis para este atributo são TEXT, Button, CheckBox, RADIO, de Arquivo de Imagem, HIDDEN, RESET, enviar e PASSWORD. Width - Define a largura em caracteres do campo de entrada, se for do tipo texto, outras - sábio define a largura do controle em pixels. Value - Define o valor inicial do campo de entrada, se for do tipo, rádio caixa de texto, ou arquivo. Esse atributo é opcional, exceto para o elemento rádio.

Page 50: Programação de jogos em PHP

Criando Formulários para Input49 Verificados - Se esse elemento é de tipo checkbox ou radio ele irá selecionar este elemento. Accept - Define os tipos de conteúdo deste elemento irá aceitar, se é de tipo de arquivo. Readonly - Define este elemento para ser somente leitura. Tabindex - define a ordem em que este elemento será selecionado se o usuário acessa a tecla Tab. <TEXTAREA> </ TEXTAREA> Name - Define o nome deste elemento. Linhas - Define o número de linhas em caracteres para esta caixa de área de texto. Cols - Define o número de colunas em caracteres para esta caixa de área de texto. Tabindex - Define a ordem em que este elemento será selecionado se o usuário acessa a tecla Tab. Wrap - Define como o texto no elemento será ajustado. Valores possíveis são macios, duros, e desligado. Agrupamento de palavras suaves significa que o texto será exibido com quebra - ping mas apresentados sem retornos de carro. Texto significa rígido é exibido com agrupamento de palavras e enviado com retornos de carro. Off significa quebra de linha é desativada. Há mais um controle que precisa ser coberto: o controle SELECT. Este é um especial controle por dois motivos: 1) ela tem o seu próprio filho controles, opções chamadas, e 2) ele pode criar um drop-down ou uma caixa de lista. T ip A lista drop-down é um elemento que permite que você selecione um único item de uma caixa drop-down. Uma lista caixa é um elemento que permite que você selecione vários itens em uma lista. Dê uma olhada no exemplo de código abaixo para ver como usar o controle SELECT. <SELECT Name="dropDownList"> <OPTION Elemento value="1"> 1 </ option> <OPTION VALUE="2" selecionada> Elemento 2 </ option> <OPTION VALUE="3"> Elemento 3 </ option> </ SELECT> <SELECT Name="listBox" size="4" multiple> <OPTION Elemento value="1"> 1 </ option> <OPTION Elemento VALUE="2"> 2 </ option> <OPTION VALUE="3"> Elemento 3 </ option> </ SELECT>

Page 51: Programação de jogos em PHP

50 Capítulo 3 ■ Eu venci o Server, Let Me no Código! Dê uma olhada rápida no primeiro elemento SELECT. É apenas uma lista drop-down com três valores nele. Para especificar os valores na lista drop-down que você simplesmente usar a tag OPTION. A tag OPTION tem apenas dois atributos que podem ser usados: VALOR e selecionado. VALOR define o valor para esse elemento, e SELECIONADOS especifica o elemento que está inicialmente selecionado quando o formulário é carregado. O texto entre as tags OPÇÃO é exatamente o que o usuário verá. Não há muita diferença entre o primeiro elemento SELECT eo segundo SELECT elemento. As principais diferenças são o atributo SIZE eo atributo MULTIPLE. O Atributo SIZE diz a caixa de seleção quantos itens para mostrar de uma vez, enquanto o MULTIPLE atributo diz a caixa de seleção que o usuário tem permissão para selecionar vários itens. Lá você tem! Esses são todos os controles de formulário que você pode ter em uma forma para permitir que o usuário insira dados. Só para ter certeza que você entender como tudo funciona em conjunto, dar uma olhada no seguinte exemplo de código: <HTML> <HEAD> <TITLE> Exemplo Form </ TITLE> </ HEAD> <BODY Bgcolor="#FFFFFF"> <FORM Name"frm_Example" action="#" method="post"> <b> Caixa de Texto </ b> <input type="text" name="txtSingleLine" width="25"> <br> <b> Text Area </ b> <textarea name="txtArea" rows="10" cols="15"> </ textarea> <br> <b> Check Box </ b> <input type="checkbox" name="chkBox" value="1"> <br> <b> Radio Button </ b> <input type="radio" name="rbButon" value="1"> <input type="radio" name="rbButton" value="2" checked> <br> Gota <b> de Down List </ b> <SELECT Name="dropDownList"> <OPTION Elemento value="1"> 1 </ option> <OPTION VALUE="2" selecionada> Elemento 2 </ option> <OPTION VALUE="3"> Elemento 3 </ option> </ SELECT> <br> <b> Box List </ b> <SELECT Name="listBox" size="4" multiple> <OPTION Elemento value="1"> 1 </ option> <OPTION Elemento VALUE="2"> 2 </ option> <OPTION VALUE="3"> Elemento 3 </ option> </ SELECT>

Page 52: Programação de jogos em PHP

</ FORM> <p> É isso aí ... olhe que p !!!</ form> </ BODY> </ HTML> Conclusion51 Figura 3.8 O formulário de exemplo. Agora você deve ter algo parecido com a Figura 3.8. Há muito mais que você poderia fazer com esta forma para torná-la melhor e leia mais claramente. Um dos maiores passos que você pode tomar para melhorar essa forma é colocá-lo em uma tabela layout para que todos os seus rótulos e linha de elementos de formulário para cima. Você também pode organizar a forma elementos de forma diferente na tabela. Conclusão Que era um monte de informações para tomar polegadas Você tem feito um pouco neste capítulo e deve estar muito orgulhoso de si mesmo. Você aprendeu a estrutura básica do documento HTML, como formatar o texto, como trabalhar com tabelas para criar layouts, como usar gráficos em um Página web, como usar gráficos e tabelas em conjunto para criar um olhar realmente grande e sentir o seu jogo, e como criar um formulário para tirar a entrada do seu usuário. No entanto, há uma última coisa antes de passar para combinar o seu HTML newfound conhecimento com PHP. Este capítulo forneceu uma visão limitada do HTML, assim vivamente incentivá-lo a investigar HTML mais e aprender mais sobre ele. Use a Web e outros recursos para aprender sobre DHTML, JavaScript e CSS (Cascading Style Sheets). Todos destes elementos permitirá que você controle supremo da sua página Web. Agora sobre PHP! Esta página foi intencionalmente deixada em branco Digite o Linguagem Capítulo 4 Diga Olá para PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0,55 Capítulo 5 Operadores, instruções e funções. . . . . . . . . . . . . . . . . . . . . . . . 0,77 PARTE II Esta página foi intencionalmente deixada em branco capítulo 4 Diga Olá para PHP ■ Criar uma página PHP ■ Tipos de Dados ■ Tipo Fundição ■ Variáveis Variável ■ Constantes ■ Convenções de Nomeação

Page 53: Programação de jogos em PHP

■ Funções de Variáveis ■ Funções para Cordas ■ Expressões Regulares e Pattern Matching ■ Processamento de formulários com PHP W chapéu PHP pode fazer por você? PHP pode criar aplicações dinâmicas que podem ser entregues através da Internet. Em comparação, HTML só pode criar conteúdo estático porque o navegador Web interpreta a página quando ela é solicitada, o servidor não faz nada, mas enviar a página para o navegador. Mas quando uma página PHP é solicitada no servidor, o próprio servidor processa o código que está no delimitadores adequada e envia os resultados finais para o navegador Web. Isso permite que você puxar o conteúdo diferente na página cada vez que é solicitado. Isto é muito útil para você, porque agora você pode criar um interativo jogo que é atualizado a partir da entrada do usuário. 55 56 Capítulo 4 ■ Diga Olá para PHP Criando uma página PHP Criação de uma página PHP é muito semelhante à criação de uma página HTML, mas há dois grandes diferenças. Primeiro, sua extensão página será. Php em vez de. Html e, segundo, você vai também tem um código PHP. Para iniciar um bloco de código PHP que você use os delimitadores a seguir:? <Php, que irá iniciar o bloco de código PHP e>, que terminará o bloco de código PHP. Dê uma olhada na página PHP a seguir: <HTML> <HEAD> <TITLE> Página PHP Primeiro </ TITLE> </ HEAD> <BODY Bgcolor="#FFFFFF"> <? Php echo ("Este texto foi escrito por PHP"); ?> </ BODY> </ HTML> Nota Em ASP, os delimitadores para blocos de código são <%%>. Se você gosta destes melhor, você pode configurar o PHP intérprete para usá-los em vez de <? php?> delimitadores. Tudo isso faz é simplesmente imprimir o texto "Este texto foi escrito por PHP" no navegador. Você também pode imprimir tags HTML na declaração echo, assim: echo ("<p> <b> Este texto está em negrito e escrito por PHP </ b> </ p>");

Page 54: Programação de jogos em PHP

Isto é muito importante manter em mente. Por quê? Bem, se você precisasse de algum código do lado do cliente que as variáveis usadas do lado do servidor, você pode escrever o código do lado do cliente com o PHP. Eu não vou cobrir qualquer das línguas do lado do cliente como JavaScript, mas ainda é importante para manter em mente. Outra nota muito importante é o fim de uma linha de código PHP. Termina com o ponto e vírgula (;). Se você não tem isso, seu código não irá funcionar corretamente. Se você não tiver sido codificação em C / C + + ou Java, então você precisa adquirir o hábito de colocar ponto e vírgula no final do seu código. Estes são os princípios de criar uma página PHP. Agora você pode se mover ao longo dos tipos de dados disponíveis para PHP. Dados Types57 Tipos de Dados PHP tem muitos dos tipos de dados que uma linguagem como C / C + + tem. Ele usa o básico de três tipos: integer, double, string e. PHP também usa constantes, matrizes e objetos. A única parte do PHP é que você não declarar explicitamente o tipo para a variável em PHP. A razão para isso é que o PHP converte as variáveis em tempo real para o tipo apropriado. Isto é chamado de type juggling. Aqui está um exemplo de criação de variáveis usando os três tipos básicos: $ Var1 = 1; / integer / $ Var2 = 2,0; / / double $ Var3 = "21"; / / string T ip Todas as variáveis começam com um $, e deve, então, começar com um caractere não-numérico. É uma boa prática para declarar todas as suas variáveis antes de usá-los, embora isso não seja necessário, faz que o código um pouco mais clara para quem está lendo. Você deve ter notado que o tipo Boolean não foi mencionado. Isso é porque PHP não apoiá-lo. Em vez disso, PHP avalia o verdadeiro eo falso, como C / C + + faz. Qualquer inteiro que é igual a 0 vai avaliar para false e qualquer coisa que é diferente de zero irá avaliar para true. Com strings, qualquer seqüência que está em branco ("") irá avaliar para false, e qualquer string com um caractere em que irá avaliar a verdade. Variáveis em PHP também são case sensitive. Isso significa que US $ somevar não é o mesmo que

Page 55: Programação de jogos em PHP

$ SomeVar. No entanto, built-in funções e estruturas não são case sensitive. Então, é o eco mesmo que o ECHO. Para esclarecer o conceito de type juggling, confira os seguintes exemplos: $ Somevar = 1; / / Este é definido como um inteiro. Somevar $ = 2,67; / / Agora é definido para um casal. $ Somevar = "String 123A" / / Agora é definida como uma string. $ X = 1; / / Este é um número inteiro. / / Este ainda é um número inteiro. Após a adição do valor é agora 126. $ X = 3 + $ somevar; Veja como isso funciona? Ele pode vir a calhar em alguns casos porque ele corta para trás no número de variáveis que você vai precisar. No mesmo sentido ele pode ficar muito louco se você está tentando para depurar um código e é malabarismo tipos em você. Quando o PHP é strings tipo de malabarismo, ele segue algumas regras básicas. Se a string começa com uma inteiro válido, a string será avaliada a esse valor. Se a string inclui um inteiro e não é no começo, a corda vai avaliar a 0. Uma seqüência será lançado como um tipo de casal se e somente se o valor da string é o dobro. Assim, a string "1.10" avaliará a um 58 Capítulo 4 ■ Diga Olá para PHP dupla com o valor de 1.10. Mas uma string com o valor de 88,5 por cento será avaliada como um inteiro com um valor de 88. Fundição tipo PHP também oferece uma forma explicitamente fundido tipo de suas variáveis. A principal razão para isso seria se você precisasse certifique-se de que você estava comparando um inteiro para um inteiro. if ((int) $ somvar1 = = (int) $ somevar2) { echo ("Estes são os mesmos"); } Dê uma olhada na Tabela 4.1 para os disponíveis Tipo de lança. Variáveis variáveis PHP também suporta variáveis variáveis. Na maioria dos casos, as variáveis têm valores dinâmicos (ou seja, eles mudam). Mas variáveis variáveis tornar o nome da variável dinâmica. Variáveis variáveis não são muito práticas e criar um pouco de confusão, mas eles são muito legal. Dê uma olhada no que eles podem fazer: $ Somevar = "Gun1"; $ $ Somevar = "Gun2"; echo ($ Gun1) / / imprime Gun2 echo ($ $ somevar) / / imprime Gun2

Page 56: Programação de jogos em PHP

Veja o que eu quero dizer? É muito confuso, mas muito legal. Aqui está o que está acontecendo. O primeiro linha de código cria uma variável do tipo string chamada $ somevar. A segunda linha de código usa o valor da primeira variável ($ somevar) para criar o nome da nova variável. Assim, a nova variável é chamada $ Gun1. Quando você imprimir essas duas variáveis que você acabar com exatamente o mesmos resultados. Constantes Constantes são valores em seu aplicativo que nunca vai mudar. Por exemplo, em vez de incluindo o literal "Game My Cool" string, você cria uma constante e de referência a constante todo o seu código. Isso faz com que o seu código muito mais fácil de atualizar. Em vez de mudar centenas de linhas de código onde "Game My Cool" existe, basta alterar a constante. Resultado (Int) (Inteiro) (Duplo) (Float) (Real) (Matriz) (Objeto) Tipo tabela 4.1 Casts Elenco tipo Lança a variável para um inteiro. Lança a variável para um inteiro. Lança a variável para um casal. Lança a variável para um casal. Lança a variável para um casal. Lança a variável para um array. Lança a variável para um objeto. * Estas alterar o tipo de dados de uma variável Naming Conventions59 Para definir uma constante em PHP você usa a função define (). define ("GAME_TITLE", "My Game Cool"); A função define () tem dois parâmetros. O primeiro é o nome da constante, e os segundo é o valor da constante. Para fazer referência a esta constante posteriormente no seu código você simplesmente usar o que você entrou como o primeiro parâmetro. echo (GAME_TITLE); Você também pode dizer se uma constante é definida usando a definição (função). Isso irá retornar um se a constante é definida e 0 se o constante não é definida. if (defined (GAME_TITLE)) { echo (GAME_TITLE);

Page 57: Programação de jogos em PHP

} PHP também inclui várias constantes internas que estão disponíveis para você. PHP tem definido TRUE como 1 e FALSE como 0. Você pode recuperar a versão do PHP você está usando, fazendo referência o php_version constante. PHP_OS vai dizer o que OS PHP está sendo executado. Você pode recuperar o arquivo que está sendo analisado eo número da linha atual, fazendo referência as constantes _file_ e _line_. Além disso, PHP dá acesso a algumas constantes de relatórios de erros, tais como E_ERROR, E_PARSE, e E_WARNING. Você também pode acessar diversas variáveis que são predefinidos. Você pode descobrir o que essas variáveis são, usando a função phpinfo (). Você utilizou esta função ao testar a sua instalação do PHP no Capítulo 2. Convenções de nomeação Agora você e eu sabemos que tipo PHP lança todos os de suas variáveis. No entanto, eu ainda gostaria de prefixo minha variáveis e formam os nomes dos elementos com o que eu vou usá-los para. Por exemplo, se eu vou estar usando o elemento do formulário como uma string eu prefixo o nome com str. Se eu fosse usar a variável como um inteiro Gostaria de prefixo a variável com um n. Você não tem que fazer isso em tudo, mas faz a leitura código muito mais fácil, especialmente com todo o tipo elenco malabarismo que o PHP faz. Ela ajuda a manter coisas retas. Se você ainda não tem uma nomeação convenção para variáveis, vem com um. Tabela Inteiro n f flutuar dupla dbl string str char c caractere sz série conjunto arr classe C m_ Tabela 4.2 Prefixos Variável Prefixo de dados Tipo variável de membro 4.2 mostra as notações eu uso com mais freqüência. 60 Capítulo 4 ■ Diga Olá para PHP Esses são apenas alguns dos prefixos que eu uso. Novamente, você não tem que usá-los em tudo, mas eu faço Recomendamos que você venha com algum tipo de convenção de nomenclatura. Realmente ajuda para fora quando você voltar a um pedaço de código depois de um tempo, ou quando alguém está lendo seu código.

Page 58: Programação de jogos em PHP

Como você pode ter notado, é nada mais do que a notação húngara. Se você estiver familiarizado com programação do Windows, então você provavelmente está muito confortável com Húngaro notação. Funções para variáveis Agora você sabe quais os tipos de variáveis PHP pode manipular e como usar a maioria dos -los. (Vou cobrir objetos e arrays mais tarde.) Agora, dê uma olhada nas funções built-in que o PHP nos dá para trabalhar com variáveis. gettype () gettype () determina que tipo de dados de uma variável. gettype () retorna um string. Possível retornar valores para gettype () são: integer, double, string array, objeto e tipo desconhecido (e desde PHP 4: Boolean, recursos e NULL). if (gettype ($ somevar) == "string") { echo ($ somevar); } settype () settype () define explicitamente o tipo de dados de uma variável. O tipo é passado como uma string. Valores possíveis são: integer, double, string, array ou objeto. Se o tipo é sucesso definido, então settype () retorna verdadeiro, caso contrário ele retorna falso. If (settype ($ somevar, "inteiro") { echo ("definir o tipo de sucesso para um número inteiro"); } isset () isset () é usado para determinar se uma variável foi atribuído um valor. Se a variável foi dado um valor, então isset () retorna verdadeiro, caso contrário ele retorna falso. if (isset ($ somevar)) { echo ("A variável tem um valor"); } Funções para Strings61 unset () unset () é usado para remover uma variável, ou destruí-lo. Isto essencialmente libera toda a memória que está associado a essa variável. unset ($ somevar); if (isset (($ somevar)) { echo ("Este texto não será impresso!"); } empty ()

Page 59: Programação de jogos em PHP

empty () é exatamente o oposto do isset () função. Ele irá retornar true se a variável não foi definido, e false se tiver sido definido. Isso seria o mesmo que dizer: if (! isset ($ somevar)) is_datatype () is_int (), is_integer (), e is_long () todos fazem exatamente a mesma coisa. Eles dizem para você se a variável em questão é um inteiro. O tipo de dados dupla também tem três funções: is_double (), is_float (), e is_real (). O is_string () função lhe diz a variável é uma string, ea is_array () e is_object () funções funcionam da mesma caminho com os seus respectivos tipos de dados. $ Somevar = "esta é uma string"; if (* is_string $ somevar)) { echo ("A variável é uma string"); } Funções para Cordas Compreensão de como manipular strings em PHP irá ajudá-lo tremendamente. Permitirá você para validar entrada do usuário e extrair dados de arquivos de texto de uma maneira eficiente. PHP dá você um enorme número de funções para manipular strings, dê uma olhada no Quadro 4.3. A maioria das funções são bastante auto-explicativo, como strlen (). Mas outros precisam de um pouco . pouco mais de atenção printf () e sprintf () são bons exemplos destes, vamos tomar uma análise mais olhar para estas duas funções. 62 Capítulo 4 ■ Diga Olá para PHP Funções para String Descrição da função addslashes string (string) Adiciona barras de escape para uma string. bin2hex string (string) cortar string (string) Remove o espaço em branco à direita de uma string. chr string (ASCII) chunk_split string ([chunklen], Inserções cadeia de acabar com a seqüência de caracteres em cada chunklen na [End]) string especificada. convert_cyr_string (string, string Converte a seqüência especificada de um caractere cirílico de, para) cypt (string) string DES-criptografa a string. echo void (string) Imprime a string especificada. explodir série (string separador,) flush () void get_meta_tags (filename Array, [Use_include_path]) htmlentities string (string) Converte os caracteres da seqüência de caracteres especificada para o seu

Page 60: Programação de jogos em PHP

htmlspecialchars string (string) Converte todos os caracteres especiais na string a sua implode (string delimitador, array) Usa o delimitador a unir-se cada elemento em uma matriz em uma string. ltrim string (string) Tiras o espaço em branco do início da string. md5 string (string) Calcula o hash MD5 da seqüência especificada. Insere nl2br (string) string a tag <BR> antes de toda a linha de quebra na string. ord (string) int a cadeia. parse_str void (string) vazio de impressão (string) Imprime a string especificada. printf (string, [arg]) void Mostra uma string formatada. quoted_printable_decode string (string) Converte uma string quoted printable para uma string de 8 bits. Quotemeta string (string) Escapa os caracteres meta na cadeia. Tabela 4.3 Retorno Tipo de dados Converte uma string binário em hexadecimal ASCII. Retorna o caractere especificado para o código ASCII. conjunto para outro. Divide a seqüência de caracteres especificada em um array. Libera tudo o que está esperando no buffer de saída. Retorna uma matriz de todas as tags <META> na arquivo especificado. Equivalente HTML. Equivalente HTML. Retorna o valor ASCII especificado da primeira letra do Analisa a string em variáveis como se fosse uma seqüência de consulta. Funções para Cordas 63 Funções String (continuação) Descrição da função rawurldecode string (string) Decodifica uma string URL-codificado. rawurlencode string (string) Codifica uma string para uma string URL-codificado. setlocale string (categoria, local) Define as informações de localização de funções no similar_text (string1, string2, int Calcula a similaridade entre string1 e string2. [Por cento]) string (string) soundex sprintf (formato, [args]) string Retorna uma string formatada. str_replace (string, Substitui todas as ocorrências do padrão com substituição string de substituição), na string. strchr (string1, string2) string strcmp int (string1, string2) Compara string1 string2 contra. strcpsn int (string1, string2) Retorna o número de caracteres no início de string1 que não corresponde a nenhum dos personagens em string2.

Page 61: Programação de jogos em PHP

strip_tags string (string) Tiras todas as tags HTML e PHP a partir do especificado string. stripslashes string (string) Tiras de todas as barras de escape caracter da cadeia. strlen int (string) strpos (stirng1, string2) int strrev string (string) strrpos (string1, string2) int strstr (string1, string2) string strtok (sring1, string2) string strtolower string (string) strtoupper string (string) strtr string (string, de, para) substr (string, início, [length]) Retorna a cadeia de caracteres na cadeia desde o início especificado ponto. ucfirst string (string) ucwords string (string) Tabela 4.3 Retorno Tipo de dados categoria especificada. Calcula a chave soundex para a cadeia. Encontra a primeira ocorrência de string2 em string1. Retorna o comprimento da corda em caracteres. Encontra a primeira ocorrência de string2 em string1. Retorna a seqüência especificada na ordem inversa. Localiza a última ocorrência de string2 em string1. Encontra a primeira ocorrência de string2 em string1. Tokeniza string1 em segmentos separados por string2. Converte todos os caracteres na string para minúsculas. Converte todos os caracteres na string para maiúscula. Substitui todas as ocorrências de partir na cadeia com a. Converte o primeiro caractere da string para maiúsculas. Converte o primeiro caractere de cada palavra em maiúsculas. 64 Capítulo 4 ■ Diga Olá para PHP printf () e sprintf () Cada uma destas funções produz uma string formatada. Printf () imprime o string formatada para a página, enquanto sprintf () retorna a string formatada sem imprimi-lo. Tomar uma olhada na função sprintf (): string (string formato, misturado [args] ...) sprintf; Nota Em PHP, printf () e sprintf () funcionam como printf () e sprintf () em C / C + +. A cadeia de formato indica como cada um dos argumentos deve ser formatado. Há 10 diferentes argumentos de formatação. d inteiro decimal b Binary integer

Page 62: Programação de jogos em PHP

o inteiro octal x inteiro hexadecimal com letras minúsculas X inteiro Hexadecimal com letras maiúsculas Personagem c cujo código ASCII é o valor inteiro do argumento f Duplo e duas vezes usando a notação exponencial s String Um sinal de porcentagem% literal A cadeia de formato usa esses argumentos para criar uma string. Por exemplo: / / A linha a seguir obtém uma string para posterior impressão $ StrFormatted = sprintf ("Você disparou sua arma% d vezes", $ numFired); Veja como isso funciona? Basta criar uma string, e depois colocar no argumento apropriado onde você quer uma de suas variáveis para aparecer. Todos os argumentos começam com um sinal%. Então, para imprimir o sinal de porcentagem literal, a seqüência ficaria assim: printf ("Este é de 40 %%"); Note como o sinal de porcentagem não tem quaisquer argumentos adicionais. Você também pode adicionar preenchimento ou formatação de números para a seqüência. O delimitador para adicionar padding é um único quote (') e, em seguida, o elemento de preenchimento especificada. Por exemplo, para adicionar uma seqüência de períodos a uma linha depois de uma série que você use '.' como argumento padding. Argumentos são de preenchimento não exigido, e por padrão, eles são um único espaço. Dê uma olhada no exemplo de código abaixo para ver como usar o argumento de padding. "O número, título $, $," printf ("%'.-% 80.80s "0,3% d s <BR>"); Funções para Strings65 Dê uma olhada os argumentos para esta cadeia. Ele consiste de três directivas: uma string, um inteiro, e uma corda. O primeiro argumento,% ',-80.80s, mostra que os períodos devem ser utilizados, o hífen indica a seqüência a ser alinhados à esquerda, e estabelece o mínimo eo máximo larguras de 80. O segundo argumento produz um direito-justificado, período acolchoada, integer elemento com uma largura máxima de três caracteres. O argumento final é simplesmente uma string que você especificar para colocar em um <BR> HTML. Se você tivesse especificado os valores para o título e variáveis número, a saída seria algo parecido com isto: Apêndice .................... 456 Anterior, mencionei a possibilidade de formatar números também. Este é o mesmo princípio do estofamento em uma string. Você simplesmente especifica quantos dígitos você gostaria de ver. Se você especificar uma largura para um número inteiro, você verá apenas caracteres que muitos, e se você especificar uma largura

Page 63: Programação de jogos em PHP

para um flutuador que irá especificar quantos dígitos aparecerão após o ponto decimal. Dê uma olhada na amostra de código seguinte: Someint $ = 4,356; $ Dólares = 20; printf ("% 3d% .2 f", $ someint, $ dólares); / / A saída se parece com 435 20,00 No exemplo acima, os limites de 3d% que o argumento de imprimir três personagens. O% .2 f argumento especifica que é um número de ponto flutuante, e que ela deve imprimir mais dois caracteres depois do ponto decimal. Se isso não for suficiente controle sobre sua formatação de números, PHP oferece-lhe um número função de formatação chamado number_format (). cadeia number_format (float num, int precisão, string dec_point, string thousands_sep) O number_format () função pode levar até quatro argumentos e retorna um string. Olhar para o seguinte exemplo: $ Num = 987654321.1234567; echo (number_format ($ num)); echo (number_format ($ num, 2)); echo (number_format ($ num, 7, chr (44), "")); A saída do código anterior parecido com este: 987654321 987,654,321.12 987 654 321,1234567 Agora que você tem controle total sobre a formatação ea maioria das funções para manipulação de string, eu vou passar para expressões regulares. 66 Capítulo 4 ■ Diga Olá para PHP Expressões Regulares e Pattern Matching Expressões regulares são usados para fornecer strings avançado e manipulação. A padrão em uma expressão regular é nada mais do que um conjunto de caracteres que descreve o natureza de uma string. Por exemplo, você poderia encontrar uma string literal ou validar o que a entrada do usuário digitou foi realmente um endereço de e-mail. Expressões regulares têm uma mini-linguagem de seus próprios. Uma vez que você aprende, você pode aplicá-la a muitas outras línguas, além de PHP. Você vai usar expressões regulares com moderação em seus jogos. Maior parte do tempo será para simplesmente validar que a entrada inseriu é na forma que você espera-lo, o que é muito importante, não é? Examine o padrão de expressão regular a seguir: ^ Criar

Page 64: Programação de jogos em PHP

O carat (^) neste padrão diz ao motor de expressões regulares que só deve corresponder este padrão no início de strings. Assim, a string "Criar um novo personagem" se reuniria os critérios para o jogo, mas "Para criar um novo personagem" não satisfazem os critérios. Expressões regulares também oferecer-lhe um sinal de dólar personagem ($) para comparar strings que terminam com o padrão. Se você pegar o exemplo anterior de ^ criar e transformá-la na string criada $, então ele não mais encontrar uma combinação em "Criar um novo personagem", mas seria encontrar uma correspondência na "Seu personagem foi criado." E se você combinar o carat (^) eo sinal de cifrão ($) juntos assim: ^ Criar $ agora você pode corresponder a uma palavra exata. Assim, "Para criar um novo personagem" seria agora atender as critérios do padrão. Você não está limitado a correspondência em personagens literal quer. Você pode Também jogo em caracteres especiais, como uma nova linha ou uma guia. Para fazer isso, você poderia simplesmente use o caractere de escape adequada, na sua string. Por exemplo, para combinar com um guia na início de uma linha que você faria isso: ^ \ T Para combinar em uma nova linha, um retorno de carro, ou um avanço de formulário você usaria o respectivo caracteres de escape \ n, \ r ou \ f. Para sinais de pontuação você também escapar do caráter; por exemplo, um período literal seria \. e uma barra invertida literal seria \ \. Até agora você sabe como combinar literais apenas, mas você precisará de uma maneira de descrever o padrão mais frouxamente. Você pode descrever esse padrão com classes de personagens. Criando um personagem classe é muito simples: você simplesmente colocar o conteúdo entre colchetes. Por exemplo, se você queria corresponder a todos os vogais que você criaria uma classe de personagem que se parece com isto: [AaEeIiOoUu] Expressões Regulares e Padrão Matching67 Você também pode especificar intervalos em classes de seu personagem usando um hífen, assim: [Az] / / encontrou nenhum letra minúscula [AZ] / / encontrou nenhum letra maiúscula [0-9] / / encontrou nenhum dígito [\ F \ t \ r \ n] / / partida qualquer espaço em branco Digamos que você queira criar uma classe de caracteres de proibir um dígito de ser o primeiro caractere

Page 65: Programação de jogos em PHP

em uma string. Para fazer isso você poderia usar novamente o carat (^). Dentro de uma classe de personagem do carat (^) significa "não" em vez de o início da string. ^ [^ 0-9] [az] $ Isso irá corresponder a qualquer strings como "all23" ou "U47". Mas não vai coincidir com strings como "7all" ou "8teen". PHP tem diversas destas classes de personagens já construídos dentro Dê uma olhada na Tabela 4.4. Para permitir maior flexibilidade em seus padrões, você pode usar chaves ({}) para coincidir com múltiplos casos de caracteres ou classes de personagens. Então, para corresponder exatamente x número de ocorrências do ano anterior caráter ou carácter de classe que você faria algo como isto: ^ A {1,5} $ / / jogos: a, aa, aaa, aaaa, ou aaaaa Character Classes PHP Caráter Descrição da classe [[: Alpha:]] [[:: Digit:]] Corresponde a qualquer dígito. [[: Xdigit:]] Corresponde a qualquer dígito hexadecimal. [[: Alnum:]] Corresponde a qualquer carta ou qualquer dígito. [[: Space:]] [[: Upper:]] [[: Lower:]] [[: Punct:]] Corresponde a qualquer sinal de pontuação. Tabela 4.4 Corresponde a qualquer letra. Corresponde a qualquer espaço em branco. Corresponde a qualquer letra maiúscula. Corresponde a qualquer letra minúscula. * Estas classes são definidas em PHP e pode não funcionar corretamente se você tentar usá-los em outras línguas. Você também pode encontrar uma string com x ou mais ocorrências de um caractere ou classe de personagem. Para exemplo: ^ B {2} Isso irá corresponder a uma corda com dois ou mais b nele. Por isso, iria encontrar um jogo em bbooo, ou bbblood, etc Há cinco personagens mais especiais em expressões regulares você deve saber sobre. Eles são: período. ponto de interrogação? * estrelas mais +

Page 66: Programação de jogos em PHP

tubos |

Teste Capítulo 70 4 ■ Diga Olá para PHP Os resultados do exemplo anterior são: [email protected] é um endereço de e-mail válido Nome de usuário: ruts Domínio: datausa Nível superior: com Então o que fazer exatamente isso? Depois ereg () verificaram o padrão, a string original foi armazenada no primeiro índice do array. Então a primeira substring parênteses do padrão é armazenadas no segundo índice da matriz. Primeira substring entre parênteses, é claro, ser o nome de usuário, ruts. Em seguida, ele correspondeu ao símbolo "@" e passou a corresponder a terceira argumento no padrão. Depois de ter encontrado uma correspondência para o terceiro argumento que criou outra índice no array contendo o nome de domínio, datausa. Finalmente, correspondeu ao nível mais alto nome de domínio, com, e criou o índice final do array. ereg () também tem uma irmã chamada função eregi (). eregi () funciona exatamente da mesma ereg () mas ignora, quando se atenta para os padrões correspondentes. Agora dar uma olhada nas duas funções para procurar e substituir strings: ereg_replace () e eregi_replace (). Ambas estas funções para pesquisar um determinado padrão e substituir todos os ocorrências desse padrão com a nova string que você especificar. eregi_replace () faz exatamente a mesma coisa que ereg_replace (), mas não é case sensitive. Cada uma destas funções recebe três argumentos: cadeia ereg_replace (string, troca de string, fonte string); Você especificar um padrão que você gostaria de procurar um substituto para quaisquer ocorrências de que o padrão, ea fonte que você está procurando. Estas funções não têm uma argumento de matriz opcional, mas eles têm algo semelhante. Qualquer substring entre parênteses no padrão serão armazenadas em um buffer que você pode acessar referenciando-o como \ \ 1. Lá São nove faixas que você pode acessar, (\ \ 1 ... \ \ 9). Dê uma olhada no seguinte exemplo: $ StrSource = "Games são grandes"; $ StrModified = ereg_replace ("G (AME) s", "g \ \ 1S", $ strSource); echo ($ strModified); Este exemplo assume a string, "Games são grandes", e procura por um padrão de "G (AME) s", onde se encontra uma correspondência no início da string e substitui o jogo com "jogos",

Page 67: Programação de jogos em PHP

e retorna a string modificada. Os resultados assim: jogos são grandes Você pode fazer referência a "ame" personagens usando o \ \ 1, porque é uma substring entre parênteses. Se o padrão foram quebradas como, "G (am) (es)", depois "am" seria referenciado como \ \ 1, e "es" seria referenciada como \ \ 2. Processamento de formulários com PHP71 A quinta e última função que usa expressões regulares é o split () função. O split () função de busca em uma palavra de origem de um padrão e quebra a cadeia de origem em uma matriz com base em jogos do padrão. A grande utilidade da função split é se você está leitura de uma lista separada por vírgulas e necessidade de quebrar as cordas para que possa trabalhar com eles. $ StrSource = "e1, d4, e5, e6"; $ Arr = split (",", $ strSource); echo ("$ arr [0] <br> $ arr [1] <br> $ arr [2] <br> $ arr [3]"); O exemplo acima divide a string de origem no caráter literal "," e cria uma matriz com cada seqüência em seu próprio índice. Os resultados assim: e1 d4 e5 e6 Ao contrário de ereg_replace () e eregi_replace, split () tem um terceiro argumento opcional. Você pode especificar um limite de quantos elementos você gostaria de dividir. Aqui é a separação completa função: dividir array (cadeia de caracteres padrão fonte string,, int [limite]); Formas de processamento com PHP No capítulo 3, você aprendeu como criar um formulário com HTML. Agora é hora de aprender para obter os dados de forma que você possa usá-lo. Obter os dados em PHP é muito fácil. Quando um formulário é enviado para o servidor usando um método de GET, cada elemento do formulário cria uma variável PHP. Quando um formulário é enviado com um método de POST, você precisa acessar a matriz global $ _POST PHP. Quando usar GET, o valor da variável criada é o conteúdo do elemento de formulário. Ao usar o POST, o índice para a matriz é o elemento do formulário nome. Este é o lugar onde o valor do elemento de formulário está armazenado. Dê uma olhada no seguinte exemplo: <-! Htmlform.php -> <HTML>

Page 68: Programação de jogos em PHP

<HEAD> <TITLE> Processamento de formulário de exemplo </ TITLE> </ HEAD> <BODY Bgcolor="#FFFFFF"> <FORM Name="frmSample" action="htmlform.php" method="post"> <b> Qual é o nome do seu personagem? </ b> <br> <input type="text" name="strCharacter"> 72 Capítulo 4 ■ Diga Olá para PHP <input type="submit" value="Submit"> </ FORM> <? Php if (isset ($ _POST ["strCharacter"])) { echo ("Welcome",. $ _POST ["strCharacter"]. "!"); } ?> </ BODY> </ HTML> Se você estava usando o método GET, o exemplo ficaria assim: <-! Htmlform.php -> <HTML> <HEAD> <TITLE> Processamento de formulário de exemplo </ TITLE> </ HEAD> <BODY Bgcolor="#FFFFFF"> <FORM Name="frmSample" action="htmlform.php" method="get"> <b> Qual é o nome do seu personagem? </ b> <br> <input type="text" name="strCharacter"> <input type="submit" value="Submit"> </ FORM> <? Php if (isset ($ strCharacter)) { echo ("Welcome",. $ _REQUEST ["strCharacter"]. "!"); } ?> </ BODY> </ HTML> Observe que para cada uma dessas formas é uma ação especificada. Você disse o formulário para ir para "Htmlform.php" para processamento. O formulário é apontando para voltar para a mesma página em que vive para processamento, mas você poderia ter apontou-a para uma página diferente se você quisesse. Os resultados da este exemplo deve ser semelhante à Figura 4.1. Na maioria das vezes você irá sempre apontar a página de volta para si mesmo para processamento. Desde que você está desenvolvimento de jogos, você precisa de quase tudo para ocorrer em uma página. Há exceções

Page 69: Programação de jogos em PHP

para isso, no entanto, por exemplo, se você estivesse desenvolvendo um Massive Multiplayer On-line Game (MMORPG), que discutirei no Capítulo 12, você usaria várias páginas para processo de construção de unidades e estruturas. Uma boa regra de ouro para desmantelar formas é, "fazê-lo em seções." Isto significa acabar com o seu jogo em seções. Se você está simplesmente Processamento de formulários com PHP73 Figura 4.1 Exemplo de formulário de processamento utilizando o método GET. levando-se em coordenadas para um jogo de xadrez, então todo o processamento deve ser feito em um página. Mas se você estiver indo para uma seção de seu jogo para gerenciar unidades e um completamente seção diferente de gerir edifícios, então a sua unidade de processamento inteiro deve ser feito em uma página e todo o seu processamento edifício deve ser feito em outro. Basicamente, mantenha tudo modular. Agora, dê uma olhada em um exemplo mais complexo que você possa ver como processar todos os da forma elementos. <-! Allformelements.php -> <HTML> <HEAD> <TITLE> Processing Elements Todos Form </ TITLE> </ HEAD> <BODY Bgcolor="#FFFFFF"> <FORM Name="frm_Example" action=" allformelements.php" method="post"> <table border="0" cellpadding="2" cellspacing="0"> <tr> <td align="left" valign="top"> <b> nome do personagem </ b> </ td> <td align="left" valign="top"> <input type="text" name="strCharacter"> </ td> </ Tr> <tr> <td align="left" valign="top"> Valor <b> A partir de Ouro </ b> </ td> 74 Capítulo 4 ■ Diga Olá para PHP <td align="left" valign="top"> <select name="dblGold"> <option value="1000"> 1000 </ option> <option value="2000"> 2000 </ option> <option value="3000"> 3000 </ option> </ Select> </ Td> </ Tr> <tr> <td align="left" valign="top"> <b> Começando Localização </ b> </ td> <td align="left" valign="top"> <input type="radio" name="strLocation" value="mountains"> Montanhas

Page 70: Programação de jogos em PHP

<input type="radio" name="strLocation" value="plains" checked> Plains <input type="radio" name="strLocation" value="swamp"> Pântano </ Td> </ Tr> <tr> <td align="left" valign="top"> <b> Equipamentos </ b> </ td> <td align="left" valign="top"> <input type="checkbox" name="nEquipmentID[]" value="1" Espada checked> <input type="checkbox" name="nEquipmentID[]" value="2" Chain Mail checked> <input type="checkbox" name="nEquipmentID[]" value="3" checked> Escudo <input type="checkbox" name="nEquipmentID[]" Bow Cruz value="4"> <input type="checkbox" name="nEquipmentID[]" value="5"> Arrows </ Td> </ Tr> <tr> <td align="left" valign="top" colspan="2"> <input type="submit" value="Submit"> </ td> </ Tr> </ Table> </ FORM> <? Php if ($ _POST) { StrCharacter $ = $ _POST ['strCharacter']; DblGold $ = $ _POST ['dblGold']; StrLocation $ = $ _POST ['strLocation']; echo ("Você escolheu: <BR> $ strCharacter <BR> $ dblGold <BR> $ strLocation <BR>"); Listvals $ = $ _POST ['nEquipmentID']; Processamento de formulários com PHP75 for ($ i = 0; $ i <count ($ _POST ['nEquipmentID']);$ i + +) echo "ID Equipamento $ i =" $ listvals [$ i] "<br> \ n"..; } ?> </ BODY> </ HTML> Os resultados devem parecer com a Figura 4.2. Há uma nuance da seguinte forma: a nomeação de as caixas de seleção. Observe como os nomes são todos iguais e no final do nome, "nEquipmentID", eu tenho dois colchetes []. Isto é simplesmente para fazer este elemento forma uma matriz. Sem os dois colchetes no final da nome do elemento forma você não seria capaz de acessar os elementos do formulário corretamente. Outros Fora isso, você acessar a outros elementos de formulário como discutido antes, usando a variável global

Page 71: Programação de jogos em PHP

$ _POST. Para acessar os elementos individuais da caixa de seleção ", nEquipmentID", uma matriz chamado "listvals" é criado, solicitando o elemento de formulário apropriado. Então você passa por cada elemento da "listvals" array e imprimir o valor. Você vai aprender mais sobre matrizes no Capítulo 6. Figura 4.2 exemplo forma de processamento utilizando o método POST. 76 Capítulo 4 ■ Diga Olá para PHP Conclusão Muito legal, hein? Bem, bem, eu tenho certeza que ele poderia ser muito mais frio, mas não se preocupe, você está vai fazer um monte de coisas legais no futuro próximo. Next up você estará aprendendo como controlar o fluxo do seu código, os operadores básicos que você tem acesso, e como fazer todo o seu código modular usando funções. Agora provavelmente seria um bom momento para você fazer uma de suas próprias formas e processo de os dados usando todo o seu conhecimento recém-descoberto. Se você ainda estiver sentindo um pouco abalada com tudo desta, não se preocupe, a prática torna perfeito. Acredite, você vai ter muita prática. Mãos à obra! capítulo 5 Operadores, Declarações, e Funções ■ Operadores Aritméticos ■ Operadores Logic ■ Operadores bit a bit ■ Instruções condicionais ■ Loops ■ Funções ■ Arquivos Incluindo Eu n Neste capítulo você vai aprender os operadores PHP, como criar expressões lógicas em PHP para controlar o fluxo do seu código, e como criar funções para ajudá-lo em código reutilização. Este é o último dos princípios básicos do PHP. Após isso, você estará pronto para criar a sua primeiro jogo! Operadores Um operador é usado para determinar um valor através da realização de uma operação em um ou mais valores. Sem operadores você não seria capaz de comparar os valores das variáveis, execute operações matemáticas, strings concatenar, manipular bits, ou mesmo atribuir um valor a uma variável. Que não deixa muita coisa que você pode fazer, não é? Nota

Page 72: Programação de jogos em PHP

Operadores em PHP são semelhantes aos de outras linguagens como C / C + +. 77 78 Capítulo 5 ■ operadores, instruções, e Funções Operadores Aritméticos Tabela 5.1 Operadores Aritméticos Assim como todas as outras linguagens de programação, PHP usa o operador matemático básico operadores (ver Tabela 5.1). + Você provavelmente já viu tudo isso antes; - o único que pode ser estranho para você é * o operador módulo. Todos os modulus o / Operador% faz é calcular o restante do uma operação. Por exemplo: $ X = 7% 2; / / Set $ x para 1 Operação realizada Adição Subtração Multiplicação Divisão Módulo No exemplo acima, 7 é dividido por 2 eo restante, que neste caso é 1, é definida como o valor da variável $ x. Como você deve ter notado por agora, você atribui as variáveis com o sinal de igual. Isso é chamado o operador de atribuição. Digamos que você queria criar uma variável com um valor negativo de 1. Aqui está como você fazer isso: $ X = -1; Todos bastante simples? Agora, dê uma olhada no expressões utilizadas para comparar valores. Operadores de Comparação Operadores de comparação são usados para testar uma condição. Os resultados de uma operação de comparação será sempre um valor booleano ou seja, verdadeiro ou falso. $ I = 350; echo ($ i == 250); Aqui uma variável, $ i, é definido como um número, em Neste caso 350. Então a variável é comparado Tabela 5.2 Operadores de Comparação para outro valor, 250. Porque os dois Operação val-Operador Interpretada ues não são iguais, a exemplo imprime falsa == para a tela. Dê uma olhada na Tabela 5.2 para um! = lista de todos os operadores de comparação dis-<> capaz de PHP. < > <= Eu gostaria de salientar uma palavra de cautela aqui: ao usar o equals (==) operador ser

Page 73: Programação de jogos em PHP

cuidado para se certificar que você use dois é igual a> = É igual a Não é igual a Não é igual a Menor que Maior do que Menor ou igual a Maior ou igual a Operators79 sinais. Caso contrário, a variável será atribuído ao que você pensou que estava comparando que ele. $ I = 25; / / Isso vai atribuir 350 para o / / Variável $ i e sempre ser verdadeiro if ($ i = 7) echo ("É igual a 7"); / / Isto irá imprimir cada vez A atribuição de uma declaração, se é perfeitamente legal em PHP. No exemplo acima, em vez de verificar o valor da variável com 7, ela simplesmente atribuída a 7 de valor para a variável e avaliados como true, dando os resultados que foram totalmente inesperados. Eu não posso forçar bastante a importância do uso adequado dos operadores. Uma maneira muito simples de resolver o problema seria colocar o valor literal na mão esquerda lado do operando, assim: if (350 = $ i) Isso irá gerar um erro porque o valor não pode ser atribuído a um literal. No entanto, você ainda tenho o mesmo problema se você está comparando duas variáveis. Se você encontrar o seu código não é trabalhar como você pensou que seria, verifique se você está usando o operador adequado. Operadores lógicos Os operadores lógicos são usados para combinar con Tabela-5.3 Operadores lógicos ções, por isso várias expressões podem ser avaliadas em uma única instrução. Dê uma olhada na Operação Operador Interpretada Tabela 5.3 para uma lista completa da lógica & & E operadores |. | Ou Observe que há dois operadores para a "Lógico e" e os operadores "ou lógico". Estes operadores dar o resultado final mesmo mas têm diferentes ordens de execução. O e ou xor ! E

Page 74: Programação de jogos em PHP

Ou Ou exclusivo Não ampersands dupla será executado antes do "E", e os tubos de duplo será executado antes do "ou". Eu recomendo escolher um ou o outros e usá-lo de forma consistente. Não só este vai ajudar a legibilidade do código, ele vai também ajudá-lo quando tentar resolver problemas que possam ocorrer. 80 Capítulo 5 ■ operadores, instruções, e Funções Só para ter certeza de que tudo é claro, dar uma olhada em alguns exemplos: $ X = 2; $ Y = 5; $ Z = 0; if ($ x == 2 & & $ y == 5 & & $ z == 0) { echo ("Este texto será impresso, porque todas as declarações avaliar a verdade."); } Neste exemplo, a declaração vai imprimir na tela, pois todas as declarações avaliar a verdade. Se qualquer uma dessas declarações avaliado para false, a string nunca iria imprimir para a tela. if ($ x == 3 | | $ z == 0) { echo ("Este texto será impresso para o navegador"); } O texto neste exemplo será impresso para o navegador, mesmo que a instrução $ x == 3 avalia para false. A razão para isto é o lógico ou operador, se uma das condições avaliada como verdadeira, a declaração inteira é verdadeira. if (($ x == 2 | | $ z == 3) xor ($ x == 5 | | $ y == 3) xor ($ x == 1 | | $ z == 1)) { {echo "Esse texto será impresso para o navegador); } Este exemplo é um pouco mais complexa do que os exemplos anteriores. Cada entre parênteses primeira expressão é avaliada para determinar se ela é verdadeira ou falsa. Uma vez determinada a ser verdade ou falso, esse valor é usado na instrução xor geral. Porque a primeira declaração nesse expressão é avaliada como verdadeira, toda a expressão é avaliada como verdadeira, e por sua vez, o texto é impresso para o navegador. E basicamente é isso para os operadores lógicos. Em seguida, você terá um olhar para o operador ternário. Operador Ternário

Page 75: Programação de jogos em PHP

Todos os operadores lógicos que acabaram de ser discutido são considerados operadores binários, o que significa que eles desempenham a sua lógica usando dois operandos. O operador ternário é especial. Ele usa três operandos para realizar uma única operação. O operador ternário é usado para rápida de uma linha se declarações. Você pode ter visto isso antes, mas se parece com isso: $ X == 0? echo ("sim"): echo ("não") 81 operadores A primeira das três partes do operador ternário é uma condição Boolean antes da pergunta interrogação (?). A segunda das três partes é uma afirmação entre os? E do cólon (:), Que é executado se a condição na frente do avaliado como verdadeiro, e um valor depois? o cólon, que é retornado se a condição for avaliada como falsa. Nota Para aqueles de vocês que estão familiarizados com C / C + +, o operador ternário em PHP age exatamente como o operador ternário em C / C + +. Como mencionado anteriormente, o operador ternário é um atalho para uma instrução if ... else. Dê uma olhada em como o seguinte, se ... instrução else é convertido para o uso do operador ternário: if ($ nKingStatus == 1) { echo ("check"); } outro { echo ("= ir para a" $ de "", $ para...); } / / Agora, a mesma declaração usando o operador ternário $ NKingStatus == 1? echo ("check"): echo ("move =" $ de "", $ para...) Veja como muito mais curto que é isso? Você obtém os mesmos resultados de uma linha de código que você fez a partir de quatro linhas de código. No entanto, o operador ternário não faz muito para facilitar a leitura, assim é completamente até você a forma como você gostaria de usá-lo. Há uma pequena coisa que eu gostaria de mencionar. Como você deve ter notado nos últimos capítulos e no exemplo anterior, eu coloquei um ponto (.) entre as cordas na exemplo. Tudo isso faz é juntar as cordas juntos. O período, quando usado no meio strings, é chamado de operador de concatenação de string. Nota Concatenação é apenas uma palavra chique para se juntar, ou adicionando, dois objetos.

Page 76: Programação de jogos em PHP

Vamos passar para os operadores bit a bit e depois para alguns atalhos atribuição de variável que vai lhe poupar algum digitação. 82 Capítulo 5 ■ operadores, instruções, e Funções Operadores bit a bit Antes de entrar os próprios operadores, Eu quero lhe dar uma pequena lição de representação binária, e como o computador armazena números na memória. Caso contrário nada do que eu estou indo mostrar-lhe vai fazer sentido. Um número binário usa apenas 1s e 0s compõem um número. Cada 1 e 0 é referido como um bit. Supõe-se que ao armazenar um 32-bit inteiro na memória que é a utilização de quatro bytes. Há 8 bits para um único byte. Utilização esses 1s e 0s você pode criar qualquer número. Dê uma olhada na Tabela 5.4. Dê uma olhada na Figura 5.1 para ver como você contagem de um número binário. Como você pode ver, você realmente contar da direita para a esquerda, passando por múltiplos de 2. Assim, o primeiro pouco sobre o lado direito é 1, então o próximo é 2, depois 4, 8, 16 e assim por diante. Agora que você tem uma compreensão básica do representações binárias, dê uma olhada no operadores bit a bit você pode usar em PHP. Há seis operadores bit a bit todos juntos, quatro dos eles permitem que você compare bits, e dois deles permitem que você mudar os bits tanto para a esquerda ou para a direita. Dê uma olhada na Tabela 5.5 para todos os seis operadores bit a bit. Uma das maiores razões para entender operadores bit a bit é de que eles são usados todos os tempo na programação de jogos de tabuleiro. No próximo capítulo você irá criar um jogo de xadrez que usa placas-bit. Se você não eram claros sobre como usar operadores bit a bit, você não entender como o programa vai funcionar. Número binário Representações Binário Integer número 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7

Page 77: Programação de jogos em PHP

1000 8 1001 9 1010 10 1011 11 1100 12 1101 13 1110 14 1111 15 Tabela 5.4 Correspondente * Para simplificar, usei apenas 4 bits, ou 1 byte, para representar números neste exemplo. Figura 5.1 Como contar números binários. Operators83 Operadores bit a bit Nome do operador E operador E 11 (1011) e 13 (1101) = 9 (1001) | Ou operador de 11 (1011) | 13 (1101) = 15 (1111) ^ Exclusiva ou 11 (1011) ^ 13 (1101) = 6 (0110) Não operador ~ ~ 11 (1011) = -12 (1000000000001100) >> Shift bits para a direita por 11 (1011)>> 2 = 2 (0010) <<Shift bits para a esquerda por 11 (1011) <<2 = 44 (101100) Tabela 5.5 Exemplo rápida Tudo o que os operadores bit a bit fazer é realizar operações análogas à lógica e, ou, xor, e não em cada conjunto de bits. Imagine que os bits estão alinhados um em cima do outro. Quando você "e" dois bits juntos, se ambos forem 1 (true & & true), o resultado é verdadeiro, ou o bit lógico 1. Dê uma olhada na Figura 5.2. Veja como o bit menos significativo em ambos os números é definido como 1. Quando eles são "anded" em conjunto o resultado é verdadeiro, ou 1. Mas quando os bits seguintes são "anded" juntos, o resultado é falsa, ou 0, porque ambos os bits são falsos, para começar. Agora fazer a mesma coisa exata com o "|" Operador para ver as diferenças. Figura 5.3 mostra os resultados. Neste exemplo você pode ver que o "|" operador é avaliada como verdadeira qualquer momento um pouco verdade aparece no valor. Assim, quando o bit menos significativo em ambos os números (1 e 1) é "or'ed" a expressão lógica seria: true ou verdadeiro, o resultado é verdadeiro. Mas quando os bits seguintes são Figura 5.2 Usando o operador "&" bit a bit. 84 Capítulo 5 ■ operadores, instruções, e Funções Figura 5.3 Usando o "|" operador bit a bit. "Or'ed" juntos (0 e 0) a expressão lógica seria falso ou falso, então o resultado é

Page 78: Programação de jogos em PHP

falsa. Os atos operadora exclusiva ou (^) como o "|" operador mas vai avaliar a verdade só se um dos bits é definido como 1 eo bit outro é definido como 0. Portanto, a expressão 1 ^ 1 avalia a 0, mas a expressão 1 ^ 0 avalia a 1, porque a expressão só pode ser verdade uma maneira. O operador "~" (não) é muito original porque não funciona em dois bits. Em vez disso, opera em apenas um bit por vez. Lembre-se o exemplo na Tabela 5.5 para o operador "~"? ~ 11 (1011) = -12 (1000000000001100) Isto está levando o número binário 1011 (11 em números reais) e fazendo com que cada bit do número oposto e tornando-o negativo. Tem o mesmo efeito de multiplicação de um decimal número em um negativo (-1) e subtraindo 1. A razão para isso é porque o mais pouco significativo em um valor de 32 bits diz o número se é ou não é negativo. O "~" operador não será usado tanto assim, mas é útil para saber. Os dois últimos operadores bit a bit que suporta PHP são a mudança à esquerda (<<) e deslocar o direito (>>) Operadores. Cada um destes operadores assumir dois valores: o valor à esquerda é o número que você quer mudar os bits, e o segundo valor é o número de pedaços que você vai mudar o primeiro valor por. Por exemplo: 11 <<2 - Operators85 Isso levará o número decimal 11, que é o número binário 1011, e transferi-lo por dois bits para a esquerda. Para tornar este exemplo mais claro que vou ampliar o número de 11-16-bits. 0000000000001011 <<2 = 000000000101100 Ver como ele mudou todos os bits para a esquerda por dois, e depois dois zeros à direita foram adicionados ao o número binário? Qualquer bits para além do valor de 32 bits cair do lado esquerdo e se perdem, mantendo o número um valor de 32 bits. O operador de deslocamento para a direita executa o equivalente a esquerda mudança de operador, mas o caminho oposto. 0000000000001011>> 2 = 0000000000000010 Neste caso zeros foram adicionados ao início do valor e os bits no lado direito caiu o número. Atalhos variável Atribuição Assim como em C / C + +, PHP tem operadores de atalho para comandos de atribuição, onde o primeiro

Page 79: Programação de jogos em PHP

operando é a variável eo resultado é armazenado na mesma variável. Dê uma olhada neste exemplo: $ A = $ a + 25; $ A + = 25; / / Esta é a mesma declaração exata como a linha acima. Dê uma olhada na Tabela 5.6 para obter uma lista dos atalhos de atribuição de variável disponível em PHP. Equivalente Exemplo de atalho + = $ X + $ i = $ x = $ x + $ i -= X -= $ $ i $ x = $ x - $ i *= $ X *= $ i $ x = $ x * $ i / = $ X / $ i = $ x = $ x / $ i % = $ X% = $ i $ x = $ x% $ i & = $ X & = $ i $ x = $ x & $ i | = $ X | = $ i $ x = $ x | $ i ^ ^ = $ X = $ i $ x = $ x ^ $ i .= $ X .= $ i >> = $ X>> = $ i $ x = $ x>> $ i <<= $ X <<= $ i $ x = $ x <<$ i + + + + $ X $ x = $ x + 1 $ X - $ x = $ x - 1 Tabela 5.6 Variável Atalhos Atribuição $ X = $ x. $ I 86 Capítulo 5 ■ operadores, instruções, e Funções O operador de incremento + + eo operador de decremento - pode aparecer antes das variáveis, da mesma forma que pode aparecer após as variáveis. A colocação do operador pode mudar o ordem dos eventos. Por exemplo, se a + + é colocado antes da variável, o valor é incrementado eo novo valor é retornado. Mas se o + + é colocado após a variável, então o variável é pré-incrementado e, em seguida, o valor é atribuído. / * Quando usado por si só, o operador de incremento tem o mesmo efeito se ele aparece antes ou depois da variável * / $ X = 10; $ X + +; / / x = 11 $ X = 10; + + $ X / / x = 11 $ X = 10; $ Y = $ x + +; / / y = 10 e x = 11 $ X = 10; $ Y = + + $ x; / / y = 11 e x = 11 C Aution Isso pode afetar seus loops, por isso certifique-se de compreender a ordem das operações que ocorrem aqui. Antes de passar às declarações, vou cobrir a operação precedência. Eu tenho mencionado várias vezes antes e só quero ter certeza de que você sabe o que isso significa. Operação Precedência

Page 80: Programação de jogos em PHP

Precedência é simplesmente a ordem em que as operações irão ocorrer, assim como no anterior exemplo onde o operador de incremento foi antes ou depois da variável. Precedência pode alterar o valor do resultado esperado. Cada operador em PHP tem certa precedência; Tabela 5.7 mostra cada operador com maior precedência em primeiro lugar. Declarações Quais são as declarações? Declarações fornecer a estrutura lógica da sua aplicação. Condicional declarações e loops dar seus programas a capacidade de tomar decisões baseadas em regras limitado. 87 declarações Operação Precedência Operação operador () O estabelecimento de precedência instanciação de objetos novos [] O índice da matriz de acesso ! Lógica não ~ Não Bitwise O incremento + + - Decrementation @ Supressão de erro funcional * Multiplicação / Divisão Modulus% Adição + - Subtração . Concatenação <<Shift esquerda bit a bit >> Mudança Bitwise direito <Menor que <= Menor ou igual a > Maior que > = Maior ou igual a == Igual a ! = Não igual a & & Bitwise ^ XOR bit a bit | Ou Bitwise & & E lógico | | OU lógico ? = + = -= *= / =% = .= & =! = ~ = <<=>> = Atribuição e lógico e xor XOR Múltiplas ou OU lógico , Tabela 5.7

Page 81: Programação de jogos em PHP

Operador condicional ternário Avaliação múltiplas 88 Capítulo 5 ■ operadores, instruções, e Funções Demonstrações se A declaração se é provavelmente uma das mais importantes características de cada programação linguagem. Ele permite que você execute linhas de código apenas quando as condições especificadas forem verdadeiro. Lembre-se de todos os operadores lógicos discutido anteriormente neste capítulo? Este é o lugar onde você começa a colocá-las em bom uso. Você pode fazer se declarações tão complexa e tão simples como você gostaria. Eu recomendo o que os torna bastante simples de ler, caso contrário, quando você vai volta para o seu código de um mês mais tarde isso pode levar um tempo para descobrir o que está acontecendo. Dê uma olhada no seguinte exemplo: <? Php $ BInitialized = 1; if ($ bInitialized == 1) { ?> <table border=1 cellpadding=0 cellspacing=0 width=256 height=256> <tr> <td align="left" valign="top" bgcolor="#FFFFFF"> </ td> <td align="left" valign="top" bgcolor="#000000"> </ td> <td align="left" valign="top" bgcolor="#FFFFFF"> </ td> <td align="left" valign="top" bgcolor="#000000"> </ td> <td align="left" valign="top" bgcolor="#FFFFFF"> </ td> <td align="left" valign="top" bgcolor="#000000"> </ td> <td align="left" valign="top" bgcolor="#FFFFFF"> </ td> <td align="left" valign="top" bgcolor="#000000"> </ td> </ Tr> </ Table> <? Php } echo ("Este impressa uma linha de alternância blocos coloridos, pois a instrução if avaliada como true "); ?> Você pode criar condições muito ramificada, o que significa que se uma das declarações avalia como false, você pode cair em outro bloco de código a ser executado. Isso é realizado por usando o se ... instrução else. Aqui está um exemplo: <? Php $ BInitialized = 1; if ($ bInitialized == 1) { ?> <table border=1 cellpadding=0 cellspacing=0 width=256 height=256>

Page 82: Programação de jogos em PHP

<tr> Statements89 <td align="left" valign="top" bgcolor="#FFFFFF"> </ td> <td align="left" valign="top" bgcolor="#000000"> </ td> <td align="left" valign="top" bgcolor="#FFFFFF"> </ td> <td align="left" valign="top" bgcolor="#000000"> </ td> <td align="left" valign="top" bgcolor="#FFFFFF"> </ td> <td align="left" valign="top" bgcolor="#000000"> </ td> <td align="left" valign="top" bgcolor="#FFFFFF"> </ td> <td align="left" valign="top" bgcolor="#000000"> </ td> </ Tr> </ Table> <? Php echo ("Este impressa uma linha de alternância blocos coloridos, pois a instrução if avaliada como true "); } outro { echo ("Desculpe o programa não é inicializado"); } ?> Você também pode testar várias condições, se uma das declarações avalia a falsa usando o elseif palavra-chave, como esta: <? Php if ($ bInitialized == 1) { echo ("O programa é inicializado"); } elseif ($ bInitialized == 2) { echo ("jogo de partida"); } elseif ($ bInitialized == 3) { echo ("O jogo está em execução); } outro { echo ("Desculpe o programa não é inicializado"); } ?> 90 Capítulo 5 ■ operadores, instruções, e Funções Nota Certifique-se que, ao usar a palavra-chave elseif você não colocar um espaço entre os mais e os if. É tudo uma palavra em PHP, ao contrário de outras linguagens como C / C + +. PHP também oferece uma sintaxe alternativa para a instrução se, se: ... endif;. Que normalmente

Page 83: Programação de jogos em PHP

usar essa sintaxe se você fosse a impressão de grandes blocos de HTML entre blocos de código PHP. Embora você poderia fazer as mesmas coisas com a sintaxe C / C + +-like. Dê uma olhada no seguinte exemplo: <? Php $ BInitialized = 1; if ($ bInitialized == 1): ?> <table border=1 cellpadding=0 cellspacing=0 width=256 height=256> <tr> <td align="left" valign="top" bgcolor="#FFFFFF"> </ td> <td align="left" valign="top" bgcolor="#000000"> </ td> <td align="left" valign="top" bgcolor="#FFFFFF"> </ td> <td align="left" valign="top" bgcolor="#000000"> </ td> <td align="left" valign="top" bgcolor="#FFFFFF"> </ td> <td align="left" valign="top" bgcolor="#000000"> </ td> <td align="left" valign="top" bgcolor="#FFFFFF"> </ td> <td align="left" valign="top" bgcolor="#000000"> </ td> </ Tr> </ Table> <? Php endif; ?> É isso para a instrução if. Agora você pode passar para a declaração se o irmão, o interruptor de declaração. A instrução switch A razão de eu chamar a instrução switch do se irmão declaração é porque o switch atua declaração como um bando de se .... ... elseif. else. Tomar as seguintes if ... elseif ... else declaração por exemplo: <? Php if ($ bInitialized == 1) { echo ("O programa é inicializado"); } Statements91 elseif ($ bInitialized == 2) { echo ("jogo de partida"); } elseif ($ bInitialized == 3) { echo ("O jogo está em execução"); } outro { echo ("Desculpe o programa não é inicializado"); }

Page 84: Programação de jogos em PHP

?> Neste exemplo, você está verificando repetidamente a variável $ bInitialized para um determinado valor, embora o valor de US $ bInitialized não muda de linha para linha. Para fazer esta mais eficiente que você gostaria de verificar o valor de US $ bInitialized apenas uma vez. Você pode fazer que, com a instrução switch. Aqui está como você pode converter o exemplo acima em um instrução switch: <? Php switch ($ bInitialized) { case 1: { echo ("O programa é inicializado"); break; } case 2: { echo ("Jogo de partida"); break; } case 3: { echo ("O jogo está em execução"); break; } default: { echo ("Desculpe o programa não é inicializado"); } } ?> Teste Capítulo 70 4 92 Capítulo 5 ■ operadores, instruções, e Funções A instrução switch irá comparar os valores de cada caso com o valor da variável, assim como se você usou uma declaração if ... elseif ... else, mas assim que ele encontrar uma correspondência que executa só bloco que de código. Se o switch não encontrar uma correspondência, em seguida, caso o padrão é executado. Observe a quebra no final de cada caso. Estes são muito importantes porque se você não usar uma pausa, então o código irá cair até o próximo caso. Todos quebrar o faz é dizer o código para parar de executar o bloco e passe para a próxima instrução. Se você estiver familiarizado com outras linguagens, como C / C + + ou Java, você será muito familiar

Page 85: Programação de jogos em PHP

com a declaração switch. Na verdade, a sintaxe é exatamente o mesmo. No entanto, switch do PHP declaração é muito mais flexível, por duas razões principais: 1) Cada caso não tem que ser um valor-it escalar pode ser qualquer valor, e 2) Você pode usar variáveis em cada um de seus casos. O exemplo a seguir demonstra o uso de variáveis em uma instrução caso: <? Php switch (_SESSION ["GAME_STATE"]) { caso $ bInitialized: { echo ("O programa é inicializado"); break; } bStarting caso $: { echo ("Jogo de partida"); break; } caso $ Brunning: { echo ("O jogo está em execução"); break; } default: { echo ("Desculpe o programa não é inicializado"); } } ?> Nota Os únicos tipos de variáveis que não são válidos em um comunicado caso são matrizes e objetos. Statements93 Neste exemplo, há uma variável na sessão de dados global chamado GAME_STATE. Quando o instrução switch executa ele irá verificar o valor de cada uma das variáveis processo contra o GAME_STATE variável e quando encontra um valor que corresponda, ele irá executar o bloco de código. tempo e fazer ... enquanto Loops Um loop while é o mais simples loop em PHP; age semelhante a uma declaração if. Um loop while avalia uma expressão booleana. Se a expressão for verdadeira, então o código dentro do loop é executados. Para sair de um loop while você tem que fazer a expressão booleana que está

Page 86: Programação de jogos em PHP

teste para avaliar como falso, ou explicitamente usar o comando break. Caso contrário você vai acabar em um loop infinito, que não é bom. <? Php $ I = 0; while ($ i <8) { if (($ i% 2)! = 1) $ Color = "# ffffff"; outro $ Color = "# 000000"; echo ("<td align=left valign=top bgcolor=" $color ."> </ td>."); $ I + +; } ?> Nota O loop while também oferece uma sintaxe alternativa exatamente como a declaração se faz. <? Php while:> HTML AQUI <? Php endwhile;> Digamos que você deseja que o código do bloco a ser executado na primeira vez, e se um Boolean expressão é avaliada como verdade que você gostaria de executar o bloco de código novamente. Você pode fazer isso com o fazer ... enquanto loop. A fazer ... while sempre executar o loop pelo menos uma vez. Então, se a expressão booleana avalia a verdade, ele vai executar o loop até que a expressão booleana avalia a falsa. <? Php $ I = 0; echo ("<SELECT NAME=level>"); fazer { echo ("<OPTION value=" $i Nível ">.." $ i "</ option>"..); 94 Capítulo 5 ■ operadores, instruções, e Funções } While (+ + $ i <$ nLevels); echo ("</ SELECT>"); ?> Neste exemplo a opção, Nível 0, sempre será impresso mesmo que a variável $ nLevels é igual a 0. Uma vez que a variável $ i é igual a $ nLevels o loop while irá parar e seguir em frente e imprimir a última linha da demonstração HTML select. Para o laço O laço for tem três expressões separadas por ponto e vírgula. A primeira expressão é um declaração de atribuição para inicializar a variável do laço controle, o segundo é um booleano expressão. Enquanto a expressão booleana avalia para true, o loop será executado.

Page 87: Programação de jogos em PHP

A expressão terceira e última é qualquer declaração que será executado no final de cada iteração do loop. Nota O laço for em PHP tem a mesma sintaxe exata como em C / C + +. Agora pegue o fazer ... while usado no exemplo anterior e convertê-lo em um loop for. <? Php echo ("<SELECT NAME=level>"); for ($ loopCount = 0; $ loopCount <$ nLevels; $ loopCount + +) { echo ("<OPTION value=" $loopCount Nível ">.." $ loopCount "</ option>"..); } echo ("</ SELECT>"); ?> Isto produz os mesmos resultados como o do ... while, mas em menos linhas de código. Você pode usar qualquer loops que você se sinta confortável com, mas eu geralmente uso um loop while quando o número de loops é desconhecida, e um laço for quando o número de loops são conhecidos. Nota O laço for também oferece uma sintaxe alternativa como a declaração se eo loop while. ? <Php for ($ i = 0; $ i <10; $ i + +):?> Alguns <HTML php endfor;>? Funções O que é uma função? Uma função é um bloco de código que podem ser definidas uma vez e reutilizadas em várias partes do programa. Esta é uma ferramenta muito útil para um programador de ter. Com funções 95 as funções que você seria forçado a reescrever grandes pedaços de seu programa de cada vez você precisava para repetir uma operação. Sem funções que você seria mais provável ir insano ou pelo menos você não seria a codificação. Muitas vezes assumem funções de vários parâmetros, um parâmetro é nada mais que uma localizada variável que a função irá operar. Esses parâmetros permitem transmitir dados e fora de suas funções. Mas uma função não tem que tomar todos os parâmetros em tudo. Supor você tem uma função para escrever o cabeçalho do documento HTML, que ficaria algo como isto: WriteHTMLHeader function () { echo ("<HTML> \ n"); echo ("<HEAD> <TITLE> My Application </ TITLE> </ HEAD> \ n"); echo ("<BODY bgColor=#ffffff> \ n");

Page 88: Programação de jogos em PHP

} Você declara funções usando a função de palavra-chave, seguido do nome que você deseja para a função. No exemplo acima, o nome da função é WriteHTMLHeader. Tecnicamente esta função não vai fazer nada até que você chamá-lo de outro ponto na código. Para chamar uma função, basta chamá-lo pelo nome seguido por quaisquer parâmetros que ele tem. Se a função não tem nenhum parâmetro, basta deixar os parênteses em branco. Aqui é um exemplo de chamar a função WriteHTMLHeader. / / Algum código aqui WriteHTMLHeader (); Código / / mais Você poderia chamar essa função várias vezes em uma fileira, se você gosta e que iria imprimir o mesmo HTML cabeçalho para o browser de cada vez. Passando parâmetros para uma função Passando parâmetros para uma função é extremamente simples. Tudo que você precisa fazer é declarar uma variável para cada parâmetro que você deseja receber. Por exemplo, digamos que você quer uma função que aparece uma mensagem de erro JavaScript com a mensagem que você passa para ele. ErrorPopup função ($ msg) { / / Criar um alerta de JavaScript echo ("<SCRIPT LANGUAGE='JavaScript'> \ n"); echo ("<!- \ n "); echo ("alert (\" $ msg \ "); \ n"); echo ("//-> \ n "); echo ("</ SCRIPT> \ n"); } 96 Capítulo 5 ■ operadores, instruções, e Funções Agora, quando você invocar esta função que você vai escrever a seguinte linha de código: ErrorPopup ("Esta é uma mensagem de erro!"); Como você pode ver, neste momento, quando você chamou a função que você passou um parâmetro. Quando a função foi chamada, o valor da função msg $ variável foi definida para a cadeia: "Este é uma mensagem de erro! ", então qualquer momento você faz referência a $ msg na função de seu valor será o que você passou dentro No exemplo anterior a variável foi passada por valor, o que significa que qualquer coisa feita para a variável na função não afetou o valor do que foi passado para ele. Por exemplo: <? Php quadrados de função ($ num)

Page 89: Programação de jogos em PHP

{ $ Num *= $ num; return $ num; } $ SomeNum = 6; echo ("Variable antes de ir para a função =" $ someNum.); $ Resultados = quadrado ($ someNum); echo (Variable "<br> depois de ir para o = função ". $ SomeNum. "Resultados <br> = função "$ resultados).; ?> Os resultados deste pedaço de código semelhante à Figura 5.4. Veja como o valor de US $ someNum não foi afetada pelas operações que o quadrado da função () fez? Suponha que você queira a função para alterar o valor da variável que você está passando a. Como você faria isso? Você deve passar a variável em referência. Para passar uma variável em uma função por referência é preciso ter um e comercial (&) na frente do parâmetro. Vamos dar o mesmo exemplo de cima e fazer a mudança de função do valor da variável por passá-lo por referência. <? Php função quadrado (& $ num) { $ Num *= $ num; } $ SomeNum = 6; echo ("Variable antes de ir para a função =" $ someNum.); quadrados ($ someNum); echo ("Variable <br> depois de ir para a função =" $ someNum.); ?> Functions97 Figura 5.4 Resultados de passar variáveis por valor. Figura 5.5 Resultados de passar variáveis por referência. 98 Capítulo 5 ■ operadores, instruções, e Funções Veja como o valor de US $ someNum mudou? Seu valor é o resultado das operações dentro a função. Passando variáveis por referência é uma forma muito útil para retornar resultados de vários variáveis, pois uma função pode retornar apenas um valor se você estiver usando o retorno palavra-chave. Recursão Funções PHP também suporta a recursividade. Recursão é simplesmente quando uma função chama a si mesma. Uma das maneiras mais fáceis de explicar a recursividade é apenas para mostrar a você, tome este, por exemplo: poder de função ($ base, $ expoente) {

Page 90: Programação de jogos em PHP

if ($ expoente) { return $ base de poder * ($ base, $ expoente - 1); } return 1; } Observe como a instrução de retorno está chamando a função de potência, mas é uma subtração expoente da variável $ a cada vez que for chamado. Eventualmente $ expoente vai chegar a zero ea if não será executado. Neste ponto é quando a recursão termina. Tome uma profundidade em ver como isso funciona. echo (alimentação (2,3)); 1. O poder função é chamada com o conjunto de base para o expoente 2 e definido para 3. 2. Em seguida, o expoente $ é testado, já que ele é diferente de zero se bem-sucedido e procede-se à linha seguinte. 3. A instrução de retorno chama a função de poder de novo, só que desta vez a base é 2 eo expoente é também 2. 4. A variável $ expoente é testado novamente. Ainda é um valor não-zero. 5. Energia é chamada novamente com o valor 2 como a base e 1 como o expoente. 6. A variável expoente é testado novamente, mas ainda é um valor diferente de zero. 7. Energia é chamado pela última vez com o valor 2 como base e 0 como o expoente. 8. Desta vez o teste falhar ea função retorna 1 para a invocação terço dos função. 9. 1 agora é multiplicado pela base ea invocação terceiro da função retorna 2 para a segunda chamada da função. A Magia da Incluindo Files99 10. 2 está agora multiplicado pelo valor base, dando-nos 4, e 4 é retornado para o primeiro invocação da função de potência. 11. 4 está agora multiplicada pela base, dando-nos o valor final, de 8, e 8 é devolvido da função de potência de volta ao seu programa. Bastante confuso, né? Recursão pode ser uma besta desagradável, mas você pode fazer algumas muito legal coisas com ele. A Magia da Incluindo arquivos Agora que você tem todo esse conhecimento legal sobre como fazer funções, você precisa de uma maneira para incluir as bibliotecas (por assim dizer) em suas páginas PHP. Basicamente o que você pode fazer é fazer uma arquivo completo de funções comuns que você usa todo o tempo e colocá-los em todos os seus jogos.

Page 91: Programação de jogos em PHP

Por exemplo, se você der uma olhada no CD, eu incluí um arquivo PHP (common.php) que tem algumas funções de base que será usado em todos os jogos neste livro. PHP oferece duas maneiras para incluir arquivos no seu aplicativo. Você pode usar a instrução requerem ou o include. Quando o interpretador PHP encontros da instrução require ele coloca o arquivo no código e é agora geralmente disponíveis para sua página. O include declaração avalia e executa o código cada vez que a instrução include é encontrado. Isto permite-lhe ter dinâmica inclui em seus arquivos. Por exemplo: for ($ loopCounter = 0; $ loopCounter <5; $ loopCounter + +) { include ("arquivo" $ loopCounter "php"...); } Se você fez o exemplo acima com a declaração exige, então, o único arquivo que seria incluídas seria file4.php. Em vez de se preocupar com o que é melhor eu apenas sempre usar a instrução include. Não há nenhum impacto no desempenho e você pode ser muito mais flexível em sua codificação. Nota PHP assume os arquivos incluem estão no diretório especificado pela diretiva include_path no arquivo php.ini. Se os seus arquivos incluem não estão no diretório que você precisa especificar o caminho completo junto com o nome do arquivo para incluí-lo. 100 Capítulo 5 ■ operadores, instruções, e Funções Conclusão Você cobriu uma tonelada de informações neste capítulo. Você já sabe tudo sobre operadores e como controlar o fluxo do seu código com a lógica de som. Você também sabe como criar blocos de código reutilizáveis usando funções. Você nem sabe como fazer uma mini-biblioteca e incluí-lo em todas as suas páginas PHP. Próximo passo: matrizes, e depois o seu jogo PHP em primeiro lugar! Matrizes, Games, e Imagens Capítulo 6 Matrizes! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0,103 Capítulo 7 Jogando com Xadrez e bancos de dados. . . . . . . . . . . . . . . . . . . . . . . . . . . 0,133 Capítulo 8 Resumo GD Graphics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0,157 Capítulo 9 Criando Battle Tank e usando Terrain dinâmico. . . . . . . . . . . . . . . 0,193 PARTE III Esta página foi intencionalmente deixada em branco

Page 92: Programação de jogos em PHP

capítulo 6 Matrizes! ■ Inicializando Matrizes ■ Usar Cordas para índices ■ Looping através Arrays Sequential ■ Looping por meio não-sequencial Arrays ■ Multi-Dimensional Arrays ■ Arrays Classificando ■ O Jogo PHP Primeiro Eu n capítulo 4, quando você estava fazendo o exemplo de processamento do formulário, as caixas de seleção foram nomeados nEquipmentID []. Os dois suportes de dizer que é um array. Um array consiste de vários elementos, cada um dos quais tem um valor. Você pode acessar cada elemento na matriz usando um índice. Em PHP o índice pode ser tanto um integer ou uma string, que permite uma grande flexibilidade em seu código. Nota Como em C / C + +, arrays no PHP são base zero, o que significa que o primeiro índice no array começa em 0. Dê uma olhada na Figura 6.1. Esta representação deve deixar claro como uma matriz armazena seus de dados. 103 104 Capítulo 6 ■ Arrays! $ Bordo [0] $ bordo [1] $ bordo [2] $ bordo [3] "A" "B" "C" "D" Figura 6.1 Como um array armazena dados. Neste caso a matriz é chamada $ bordo, e tem quatro elementos. O primeiro elemento da array, $ bordo [0], é igual a "A". O segundo elemento do array, $ bordo [1], é igual a "B", e assim por diante. Assim como você criar matrizes? Arrays inicializar Existem várias maneiras que você pode inicializar matrizes. Você poderia simplesmente lista a variável com o valor que você gostaria de adicionar à matriz, assim: $ Bordo [] = "A": $ Bordo [] = "B": $ Placa [] = "C": $ Bordo [] = "D": Porque você não especificar um índice, os elementos são adicionados automaticamente em seqüencial da ordem. Você também pode ter sido especificado o índice que você gostaria que o elemento apareça em, como este: $ Bordo [0] = "A": $ Bordo [1] = "B": $ Bordo [5] = "C":

Page 93: Programação de jogos em PHP

$ Bordo [7] = "D": Este é mais prático, mas válida a mesma coisa. Normalmente, quando a atribuição de elementos para um matriz que você deve fazê-lo em uma ordem seqüencial. Desta forma não há confusão sobre onde o elemento é. No entanto, há momentos em que você vai querer criar uma chave de hash e usar que para o índice. Se você alguma vez atribuir itens em uma ordem não seqüencial e depois adicionar um elemento para o array sem especificar o índice que deve aparecer, então o elemento será automaticamente adicionado ao índice mais elevado seguinte. Por exemplo: $ Bordo [0] = "A": $ Bordo [1] = "B": Usando cordas para índices 105 $ Bordo [60] = "C": $ Bordo [] = "D": / / "D" serão acrescentados ao índice de 61 não, 2. A última maneira de declarar um array é usar o array () função. Você simplesmente passar os valores você quer na matriz como parâmetros para a função. $ Board = array ("A", "B", "C", "D"); Isto irá criar uma matriz exatamente como o primeiro exemplo fez. "A" é o primeiro elemento na array com um índice de 0. "B" é o segundo elemento da matriz com um índice de 1, e assim em. Se você deseja mudar o índice de um elemento usando o array () função, você pode fazer assim como este: $ Board = array (1 => "a", "b", 7 => "c", "d"); No exemplo acima, "a" será no índice 1, "b" será localizado no índice 2, "c" será localizada no índice 7, e "d" será localizado na posição 8. Você pode colocar o operador => antes qualquer elemento da matriz para mudar seu índice. Usando cordas para índices Como mencionado anteriormente neste capítulo, você pode usar strings como índices para suas matrizes. O _SESSION variável global no PHP usa cordas como seus índices. A sintaxe para acessar um matriz que usa strings como um índice parecido com este: _SESSION ["GTurn"]; Criação de uma matriz que usa cordas de um índice é muito simples. Lembre-se do primeiro exemplo que eu usado para inicializar uma matriz com elementos em um índice específico. $ Bordo [0] = "A": $ Bordo [1] = "B": $ Bordo [5] = "C": $ Bordo [7] = "D":

Page 94: Programação de jogos em PHP

Em vez de usar um inteiro como um índice que você simplesmente substituí-lo com uma corda, como o exemplo a seguir demonstra: $ Bordo ["element1"] = "A": $ Bordo ["elemento2"] = "B": $ Bordo ["element3"] = "C": $ Bordo ["element4"] = "D": 106 Capítulo 6 ■ Arrays! Você também pode usar o operador => juntamente com o array () função para criar uma matriz com strings como índices. $ Bordo = array ("element1" => "A", "elemento2" => "B", "Element3" => "C", "element4" => "D"); Se você usar strings como índices em sua matriz, você tem que acessar a matriz com o especificado índices string. Em outras palavras, se você digitou o seguinte código: <? Php $ Bordo = array ("element1" => "A", "elemento2" => "B", "Element3" => "C", "element4" => "D"); echo ($ bordo ["element1"]); echo ($ bordo [0]); ?> Você teria um erro quando o interpretador PHP tentou imprimir a última linha, echo ($ bordo [0] "), que se parece com a Figura 6.2. Loop através Arrays Sequential A maneira mais fácil para percorrer arrays seqüencial é usar o loop for. Sei que você está provavelmente pensando: "Como eu sei quantos elementos estão na matriz?" Você pode acessar Figura 6.2 Tentando acessar uma matriz de seqüência indexada com um número inteiro. Loop através Arrays Sequential 107 o número de elementos na matriz usando a função count (). Seu loop para deve parecido com o seguinte: <? Php $ Board = array ("a", "b", "c", "d"); for ($ index = 0; $ index <count ($ placa); $ index + +) { / / Imprime cada elemento em sua própria linha echo ("Índice =" $ index ", Element =" $ bordo [$ index] "<BR>"....); } ?> Primeiro você inicializar a matriz com todos os elementos que você precisa. Em seguida, na primeira declaração do loop for, você inicializa a variável de indexação ($ index). A segunda declaração do loop for é a sua expressão booleana. Isto diz o loop quando parar, neste caso o de ciclo vai parar quando atinge um a menos que o número total de elementos na matriz

Page 95: Programação de jogos em PHP

$ Bordo. Por que você não especificar a parar quando o loop alcança a contagem total dos elementos? Porque você tem que lembrar que o PHP usa um índice inicial de zero para arrays. Se você foi para a contagem total dos elementos que se obtém um erro quando você tentou imprimir o valor, porque esse índice não existe na matriz. A terceira e última declaração do loop for simplesmente incrementa a variável de indexação é reiniciado cada vez que o loop. O resultados deve ser semelhante a Figura 6.3. Figura 6.3 Resultados de looping através de uma matriz seqüencial. 108 Capítulo 6 ■ Arrays! Loop através da matriz com um loop for é perfeito, desde que você sabe que a matriz é baseado em zero e ordenadas seqüencialmente. Assim como você percorrer uma matriz que não é ordenadas seqüencialmente? Loop através Non-Sequential Arrays Este é um momento perfeito para usar um loop while. Claro, você estará usando o loop while em juntamente com três outras funções: reset (), list () e each (). A função de reset sets o índice atual da matriz de volta para o primeiro elemento disponível. Ele leva um argumento, e que é a matriz que você gostaria de reinicializar. reset ($ someArray); A função lista tem dois parâmetros: uma variável para armazenar o índice do elemento e um variável para armazenar o valor do elemento. list ($ índice, $ value); A função each () recebe um argumento, e que é a matriz que deseja iterar por diante. each ($ someArray); Dê uma olhada no seguinte exemplo de como usar essas três funções juntos em um while loop para iterar através de uma matriz não-seqüencial. <? Php $ Board = array ("a", 7 => "b", 25 => "c", 50 => "d"); reset ($ placa); while (list ($ índice, $ value) = each ($ placa)) { echo ("Índice =" $ index ", Element =" $ valor "<BR>"....); } ?> Os resultados do exemplo acima aparecer exatamente como na Figura 6.3, embora os índices nesta matriz em particular não estão em uma ordem seqüencial. Chamar o reset () função neste

Page 96: Programação de jogos em PHP

exemplo é completamente desnecessário porque, desde a matriz acaba de ser criado, a corrente índice é, obviamente, o primeiro elemento disponível. Mas é uma boa prática para entrar, porque você pode acabar tentando percorrer um array e ele poderia estar começando no meio dele, e que não seria bom. Loop através Non-Sequential Arrays 109 PHP também oferece várias outras funções para operar sobre matrizes, como a current (), key (), next (), e prev (), para citar apenas alguns. Para uma lista completa de funções que o PHP suporta, consulte o Apêndice B. Dê uma olhada no exemplo a seguir e Figura 6.4 para ver o que funções a chave () e corrente () fazer: <? Php $ Board = array ("a", "b", "c", "d"); $ Index = chave ($ placa); $ Valor = corrente ($ placa); echo ("Índice =" $ index ", Element =" $ valor "<BR>"....); ?> Nota Chave e índice significa exatamente a mesma coisa; a função em PHP é chamado de chave () em vez de index (). Figura 6.4 Um exemplo da chave () e corrente () funções. 110 Capítulo 6 ■ Arrays! Anterior, mencionei next () e prev (). Estas duas funções são uma outra maneira de navegar através de uma matriz. Como você pode imaginar, next () vai para o próximo índice disponível no array, e retorna o elemento. prev () faz a mesma coisa, mas em vez de ir para o próximo índice disponível, ele vai para o índice anterior. Dê uma olhada no seguinte loop: <? Php $ Board = array ("a", "b", "c", "d"); reset ($ placa); for ($ i = 0; $ i <4; $ i + +) { $ Index = chave ($ placa); $ Valor = corrente ($ placa); next ($ placa); echo ("Índice =" $ index ", Element =" $ valor "<BR>"....); } Isto irá imprimir os mesmos resultados para o navegador como Figura 6.3 fez, mas faz isso de uma forma diferente caminho. Mas tenha cuidado se você usar o next () e prev () funções. Lembro que eu disse que retorna o valor do elemento do próximo índice na matriz? Bem, e se o valor é 0? Dê uma olhada neste exemplo:

Page 97: Programação de jogos em PHP

<? Php Conselho $ array = (3, 0, 2, 4); fazer { $ Index = chave ($ placa); $ Valor = corrente ($ placa); echo ("Índice =" $ index ", Element =" $ valor "<BR>"....); } While (next ($ placa)); ?> Este loop irá parar quando ele chega ao segundo elemento da matriz porque a instrução while irá avaliar para false. Então, ter muito cuidado se você usa o next () e prev () funções. Se Você já executado em um loop que está parando de repente, dar uma olhada para se certificar de que o seu Expressão booleana não está sendo avaliada para falso. Multi-Dimensional Arrays Te Criando arrays multi-dimensionais em PHP é muito semelhante à criação de multi-dimensional arrays em C / C + +. Em C / C + + você tem suporte para matrizes unidimensionais, mas criar um array multi-dimensional por uma matriz de nidificação como um elemento em uma matriz pai. Isto é Multi-Dimensional Arrays 111 exatamente como você criar multi-dimensional arrays em PHP. Você faz uma matriz que contém um array. <? Php $ Board = array ("linha1" => array ("a", "b"), "linha2" => array ("c", "d", "e")); echo ($ bordo ["linha1"] [0]); / / Imprime "a" echo ($ bordo ["linha2"] [2]) / / Imprime "e" ?> Um grande utilidade para multi-dimensional arrays é que você pode representar um tabuleiro de jogo utilizando uma matriz bidimensional. Em seguida, coloque cada um no tabuleiro de jogo, no local dizem e1, seria realizar um valor que lhe diria se há uma parte em que quadrado ou não. Ou você poderia usar um loop, como no exemplo a seguir, para imprimir o tabuleiro de jogo: <? Php $ Bordo = array (array ("r", "k", "b", "q", "k", "b", "k", "r"), array ("p", "p", "p", "p", "p", "p", "p", "p"), array ("", "", "", "", "", "" "" ""), array ("", "", "", "", "", "" "" ""), array ("", "", "", "", "", "" "" ""), array ("", "", "", "", "", "" "" ""),

Page 98: Programação de jogos em PHP

array ("p", "p", "p", "p", "p", "p", "p", "p"), array ("r", "k", "b", "q", "k", "b", "k", "r")); echo ("<table border=1 cellpadding=2 cellspacing=0 width=250>"); for ($ yIndex = 0; $ yIndex count <($ placa); $ yIndex + +) { echo ("<tr>"); for ($ xIndex = 0; $ xIndex <count ($ bordo [$ yIndex]); $ xIndex + +) { echo ("<td align=center valign=middle>". $ Bordo [$ yIndex] [$ xIndex]. "</ Td>"); } echo ("</ tr>"); } echo ("</ table>"); ?> Os resultados deste ciclo parecido com a Figura 6.5. 112 Capítulo 6 ■ Arrays! Figura 6.5 Resultados de looping através de uma matriz multi-dimensional. Classificação Arrays PHP fornece toneladas de funções com o qual você pode manipular as matrizes. Alguns dos handiest são as funções de classificação. Dê uma olhada na Tabela 6.1 para ver a lista de classificação funções. Funções de classificação Nome Descrição da função sort () asort () rsort () arsort () ksort () krsort () usort () A função de classificação personalizada. uasort () uksort () Tabela 6.1 Classifica arrays em ordem alfabética. Classifica arrays em ordem alfabética, sem índices mudando. Classifica matrizes na ordem inversa. Classifica matrizes na ordem inversa sem índices mudando. Classifica arrays por valores-chave. Classifica arrays por valores-chave na ordem inversa. A função de classificação personalizada que mantém índices de string. A função de classificação personalizável que classifica por chave. * Uma lista completa das funções do PHP está disponível no Apêndice B. Classificação Arrays 113 Agora, dê uma olhada em cada uma dessas funções de ordenação. O sort () função ordena os elementos na matriz por ordem numérica e alfabética. Números vêm em primeiro lugar, em seguida,

Page 99: Programação de jogos em PHP

sinais de pontuação e, finalmente, as letras. Enquanto a função é de classificação, que atribui novamente a índices para refletir a nova ordem. <? Php $ Items = array ("Espada", "Medpac", "Advanced Medpac", "Armor", "Blaster", "Shotgun"); / / Imprime os itens não separados for ($ index = 0; $ index <count ($ itens); $ index + +) { echo ("Index =" index $ "," $ items [índice $] "<BR>"....); } / / Imprime os itens classificados sort ($ itens); for ($ index = 0; $ index <count ($ itens); $ index + +) { echo ("Index =" index $ "," $ items [$ index] "<BR>"....); } ?> Os resultados deste exemplo deve parecer com a Figura 6.6. Figura 6.6 A função sort () em ação. 114 Capítulo 6 ■ Arrays! Dê uma olhada no que acontece quando você tem um array com índices especificado quando você usa a função de ordenação. <? Php $ Items = array ("Item1" => "Espada", "Item2" => "Medpac", "Item3" => "Advanced Medpac", "Item4" => "Armor", "item5" => "Blaster", "item6" => "Shotgun"); / / Imprime os itens não separados while (list ($ índice, $ value) = each ($ itens)) { echo ("Índice =" $ Índice "," $ valor "<BR>"....); } echo ("<br>"); / / Imprime os itens classificados sort ($ itens); while (list ($ índice, $ value) = each ($ itens)) { echo ("Índice =" $ Índice "," $ valor "<BR>"....); } ?> Se você usar a função de classificação com índices especificados, como no exemplo acima, perderá seus índices. Dê uma olhada na Figura 6.7 para ver os resultados. Figura 6.7 A função sort () com índices especificados. Matrizes de classificação 115 Para evitar perder a sua índices seqüência de caracteres especificada que você precisa para usar o asort () função. Isso vai classificar a matriz e seus elementos, sem tirar os índices de sua string. Se você quisesse classificar

Page 100: Programação de jogos em PHP

esta matriz em sentido inverso você usaria o rsort () função. No entanto, o rsort (função) vai também perdem índices de seqüência de caracteres especificada, de modo a ordenar um array na ordem inversa, com índices de string que você precisa usar o arsort () função. Você também pode classificar por índices sua string usando ksort (). <? Php $ Items = array ("item6" => "Espada", "item5" => "Medpac", "Item3" => "Advanced Medpac", "Item4" => "Armor", "Item2" => "Blaster", "Item1" => "Shotgun"); / / Imprime os itens não separados while (list ($ índice, $ value) = each ($ itens)) { echo ("Índice =" $ Índice "," $ valor "<BR>"....); } echo ("<br>"); / / Imprime os itens classificados ksort ($ itens); while (list ($ índice, $ value) = each ($ itens)) { echo ("Índice =" $ Índice "," $ valor "<BR>"....); } ?> Os resultados deste exemplo parecido com a Figura 6.8. Figura 6.8 O ksort () função em ação. 116 Capítulo 6 ■ Arrays! Nota Você pode classificar na ordem inversa pela chave, usando o krsort () função. A última das funções de ordenação de arrays tem que ser o mais legal. Com usort () você pode organizar suas matrizes como quiser. O usort () função recebe dois argumentos: o primeira é a matriz que você gostaria de classificar, eo segundo é um nome de uma função que contém sua lógica própria classificação. usort (someArray, someFunction); O exemplo a seguir irá classificar o array $ itens pelo comprimento de cada string: <? Php SortByLength função ($ element1, $ elemento2) { $ LengthOfElement1 = strlen ($ element1); $ LengthOfElement2 = strlen ($ elemento2); if ($ lengthOfElement1 == $ lengthOfElement2) return 0; return ($ lengthOfElement1 <$ lengthOfElement2)? -1: 1; } $ Items = array ("item6" => "Espada", "item5" => "Medpac", "Item3" => "Advanced Medpac", "Item4" => "Armor", "Item2" => "Blaster", "Item1" => "Shotgun");

Page 101: Programação de jogos em PHP

/ / Imprime os itens não separados while (list ($ índice, $ value) = each ($ itens)) { echo ("Índice =" $ Índice "," $ valor "<BR>"....); } echo ("<br>"); / / Imprime os itens classificados usort ($ items, 'SortByLength'); while (list ($ índice, $ value) = each ($ itens)) { echo ("Índice =" $ Índice "," $ valor "<BR>"....); } ?> Os resultados do exemplo acima são mostrados na Figura 6.9. Seu Jogo PHP First 117 Figura 6.9 O usort () função em ação. C Aution Certifique-se de passar o nome da função para usort () como uma string, caso contrário você terá uma tela de aviso no meio de sua página. Seu Jogo PHP Primeiro Agora é hora de programar o seu primeiro jogo em PHP! Você vai começar com um simples jogo de tic-tac-toe. Este jogo irá utilizar todos os aspectos que você aprendeu em todos os anteriores capítulos. Ele contém as variáveis de sessão, arrays, funções e trabalhando em conjunto com PHP HTML. O primeiro passo você precisa tomar para criar um novo jogo é criar um diretório para ele dentro seu servidor web. IIS para o diretório será C: \ Inetpub \ wwwroot, e se você estiver usando um servidor Web Apache o diretório seria / usr / web. Se você estiver em Windows, o Apache diretório seria algo parecido com C: \ Apache, dependendo de onde você instalou o Apache. Você pode nomear o diretório que você quiser. Vou nomeá-lo tictactoe. 118 Capítulo 6 ■ Arrays! Agora que você tem um diretório configurado você pode criar um novo arquivo PHP. Eu recomendo seguir um esquema de nomenclatura regular. A página padrão em um diretório deve ser nomeado index.php ou default.php. Você pode usar o que você gosta. Desde que o jogo será apenas em um arquivo só vou nomeá-lo index.php. O próximo passo você precisa tomar é definir todas as suas constantes e variáveis globais, e incluem as funções comuns de arquivos que você usa em todos os seus jogos. O primeiro conjunto de constantes que

Page 102: Programação de jogos em PHP

você precisa é de quatro estados do jogo. O primeiro dos quatro estados é dizer-lhe quando o jogo é de partida, o segundo permite que você saiba quando o jogo está em jogo, o terceiro diz-lhe se alguém ganhou o jogo, eo quarto e último estado diz que se alguém perdeu o jogo. / / Inclui include ("common.php"); / / Jogo Estados define ("GAME_START", 0); define ("GAME_PLAY", 1); define ("GAME_WIN", 2); define ("game_over", 3); Para tic-tac-toe, os dois únicos outros define necessários são um para o "X" da imagem e um para o "O" da imagem. / / Imagens define ("X_IMAGE", "imagens / X.gif"); define ("O_IMAGE", "imagens / O.gif"); A única razão para você definir esses é porque torna mais fácil se você quiser alterar o imagens mais tarde, mais ele economiza a digitação quando você criar a função de tornar para mostrar o seu conselho para o navegador. Você também vai precisar de três variáveis globais para todas as suas funções de usar. As primeiras lojas que estado o jogo se encontra, as lojas segundo o estado do bordo, e as lojas o terceiro nível de dificuldade da AI computador / / Globals global $ gGameState; gBoard $ global; gDifficulty $ global; Agora que as informações globais para o jogo é definido, você irá definir o quadro HTML para o jogo. O quadro de HTML é a forma que você usará para obter entrada do usuário para seu jogo. A seguir está todo o HTML você vai precisar para o jogo: <Doctype html público! "- / / W3C / / DTD HTML 4.0 / / EN"> <html> Seu Jogo PHP First 119 <head> <title> Tic-Tac-Toe </ title> <link rel="stylesheet" href="style.css" type="text/css"> </ Head> <body> <form action="index.php" method="post"> <Input type = name "escondida" = "turn" value = "<? printf ($ turno)> "> <Php WriteTableHeader ();?> <div align="center"> <input type="submit" name="btnNewGame" value="New Game"> <b> Nível de Dificuldade </ b>

Page 103: Programação de jogos em PHP

<select name="dlDifficulty"> <option value="1"> Fácil </ option> <option value="2" selecionada> normal </ option> value="3"> <option Não-Likely </ option> </ Select> <br> <? Php / / Render o jogo Render (); ?> </ Div> <Php WriteTableFooter ();?> </ Form> </ Body> </ Html> Nota Lembre-se que todo este código é fornecido para você no CD. O quadro para o jogo é muito simples: o formulário está redirecionando de volta para si mesmo. Em seguida, o cabeçalho para o layout da tabela legal é escrito. Depois disso, alguns elementos do formulário são criados. Um permite que o usuário iniciar um novo jogo, ea caixa de drop-down é usado para escolher a dificuldade nível da AI computador Depois de tudo isso, a função de processamento é chamado. Porque você ainda não têm uma função de render, você precisa criar uma agora. A função de tornar precisa para determinar o estado do jogo é no usando o jogo global variável de estado que foi declarado anteriormente. Se o estado do jogo está começando, então, tornar o função precisa começar um novo jogo e mudar o estado a jogar. Se o estado do jogo 120 Capítulo 6 ■ Arrays! está desempenhando a função tornar precisa de ter a entrada do usuário, processá-lo, calcule o mover para o computador e atualizar o quadro. Se um dos jogadores ganhou o jogo, o tornar as necessidades função para informar ao usuário que ele ou ganhou ou perdeu o jogo. Como você pode ver, a função de tornar precisa fazer uma tonelada de trabalho. Para realizar todas essas tarefas a função de tornar vai precisar de algumas funções auxiliares. Você vai precisar de uma função para começar um novo jogo, uma função para desenhar o tabuleiro, uma função para verificar se há uma vitória, uma função para verificar se a placa está cheia, e, finalmente, uma função para terminar o jogo e sem o seu sessão. Vamos começar com a função de tornar-se e depois continuar com a criança funções que render () será chamada. Renderização function ()

Page 104: Programação de jogos em PHP

{ global $ gGameState; gBoard $ global; gDifficulty $ global; switch ($ gGameState) { GAME_PLAY caso: { / / Pega o movimento se o usuário fez uma if ($ _POST ['btnMove']! = "") { $ GBoard [$ _POST ['btnMove']] = "x"; $ _SESSION ['GBoard'] = $ gBoard; } / / Check para uma vitória if (CheckWin () == "X") { $ GGameState = GAME_WIN; Render (); retorno; } / / Verifique se a placa está cheio if (CheckFull () == 1) { $ GGameState = game_over; Render (); retorno; Seu Jogo PHP First 121 } / / Calcula mover o computador, se ainda podemos passar if ($ gGameState == GAME_PLAY & & $ _POST ['btnMove']! = "") { if ($ gDifficulty == 1) { ComputerRandomMove (); } elseif ($ gDifficulty == 2) { $ ComputerMove ComputerMove = (); if ($ computerMove == "") { ComputerRandomMove (); } outro { [ComputerMove $] $ gBoard = "o"; $ _SESSION ['GBoard'] = $ gBoard; } } elseif ($ gDifficulty == 3)

Page 105: Programação de jogos em PHP

{ $ ComputerMove ComputerMove = (); if ($ computerMove =='') { if ($ gBoard [4] =='') $ ComputerMove = 4; elseif ($ gBoard [0] =='') $ ComputerMove = 0; elseif ($ gBoard [2] =='') $ ComputerMove = 2; elseif ($ gBoard [6] =='') $ ComputerMove = 6; elseif ($ gBoard [8] =='') ComputerMove $ = 8; if ($ computerMove =='') ComputerRandomMove (); } } 122 Capítulo 6 ■ Arrays! } / / Check para uma vitória if (CheckWin () == "O") { $ GGameState = game_over; Render (); retorno; } / / Verifique se a placa está cheio if (CheckFull () == 1) { $ GGameState = game_over; Render (); retorno; } / / Desenha a placa DrawBoard (); break; } GAME_WIN caso: { Endgame (); printf ("<br> <br> <img src = \" images / youWin.jpg \ " border = \ "0 \ ">"); break; } game_over caso: { Endgame (); printf ("<br> <br> <img src = \" images / gameOver.jpg \ " border = \ "0 \ ">");

Page 106: Programação de jogos em PHP

break; } } / / Atualizar o nosso estado do jogo $ _SESSION ['GGameState'] = $ gGameState; } Seu Jogo PHP First 123 if ($ _POST ['dlDifficulty']! = "") { $ _POST GDifficulty = $ ['dlDifficulty']; Endgame (); $ GGameState = GAME_START; StartGame (); } if ($ gGameState == GAME_START) { StartGame (); } / / Verifique se o usuário está começando um novo jogo if ($ _POST ['btnNewGame']! = "") { Endgame (); $ GGameState = GAME_START; StartGame (); } Como você pode ver, uma instrução switch é usada para determinar o estado do jogo. Você também pode ter notado que não há um estado para o jogo de partida, isto é porque todos os jogos começam os eventos têm lugar fora da função render. O jogo faz uma verificação para ver se o New Jogo botão foi clicado ou se o nível de dificuldade foi alterada cada vez que o página é carregada. Isso é o que os três se declarações que vivem fora da função de tornar são usados. Aqui está uma lista completa das funções que ainda precisam ser criados. ■ StartGame () ■ EndGame () ■ DrawBoard () ■ CheckWin () ■ CheckFull () ■ ComputerRandomMove () ■ ComputerMove () 124 Capítulo 6 ■ Arrays! O StartGame () e EndGame () funções de controle das variáveis de sessão. O StartGame () função cria todas as variáveis que serão armazenados na sessão e muda o jogo Estado de jogar. O fim do jogo () função simplesmente unsets todas as variáveis e destrói o ativo sessão.

Page 107: Programação de jogos em PHP

StartGame função () { global $ gGameState; gBoard $ global; if ($ gGameState == GAME_START) { $ GGameState = GAME_PLAY; } / / Use $ _SESSION, em vez de session_register devido a problemas de segurança session_start (); $ Turn = $ _SESSION ['virar']; if (! isset ($ de volta)) { $ Turn = 1; $ GBoard = array ("","","","","","","","",""); $ _SESSION ['GGameState'] = $ gGameState; $ _SESSION ['GBoard'] = $ gBoard; $ _SESSION ['GDifficulty'] = $ gDifficulty; $ _SESSION ['Turn'] = $ turno; } / / Recuperar o estado bordo $ GBoard _SESSION = $ ['gBoard']; / / Pega o nível de dificuldade $ GDifficulty _SESSION = $ ['gDifficulty']; } EndGame função () { global $ gGameState; gBoard $ global; $ GGameState = game_over; unset ($ gBoard); Seu Jogo PHP First 125 unset ($ gGameState); unset ($ turno); session_destroy (); } As primeiras linhas do StartGame () função dizer-lhe que a função irá usar variáveis globais. Em seguida, a função altera o estado do jogo e começa a sessão. Iniciando a sessão cria um novo arquivo no diretório onde as sessões são armazenados, o que é especificado na arquivo php.ini. Após a sessão é iniciado ele verifica se a variável de transformar $ foi definido. Se ele tem, então ele não se preocupa em criar variáveis nova sessão, mas se não tiver sido definida, em seguida, a função cria a matriz para a placa, uma variável de sessão para armazenar o estado do jogo, um

Page 108: Programação de jogos em PHP

variável de sessão para armazenar o estado da placa, e uma variável de sessão para armazenar a dificuldade nível e, finalmente, ele define a transformar $ variável. As primeiras linhas do EndGame () função também dizer o que variáveis globais a serem usados. Então a função altera o estado do jogo para jogo. Após o estado do jogo foi alterado, que unsets todas as variáveis e destrói a sessão. DrawBoard () simplesmente chama a bordo. Fantástico, não é? Ele usa HTML e PHP em conjunto para escrever a placa adequada para o navegador. DrawBoard function () { gBoard $ global; / / Inicia a tabela printf ("<table border=0 cellpadding=0 cellspacing=0>"); $ ILoop = 0; for ($ IRow = 0; $ IRow <5; $ IRow + +) { printf ("<tr> \ n"); for ($ iCol = 0; $ iCol <5; $ iCol + +) { if ($ IRow == 1 | | $ IRow == 3) { printf ("<td width = \" 12 \ "height = \" 5 \ " align = \ "center \" valign = \ "meio \" bgcolor = \ "# 000000 \"> </ td> \ n "); } outro { if ($ iCol == 1 | | $ iCol == 3) { 126 Capítulo 6 ■ Arrays! printf ("<td width = \" 12 \ "height = \" 115 \ "align = \" center \ " valign = \ "meio \" bgcolor = \ "# 000000 \"> </ td> \ n "); } outro { printf ("<td width = \" 115 \ "height = \" 115 \ " align = \ "center \" valign = \ meio "\ ">"); if ($ gBoard [$ iLoop] == "x") { printf ("<img src=\"" X_IMAGE "\">.."); } elseif ($ gBoard [$ iLoop] == "o") { printf ("<img src=\"" O_IMAGE "\">.."); } outro { printf ("<input type = \" submeter \ "name = \" btnMove \ "\ = valor \" ".

Page 109: Programação de jogos em PHP

$ ILoop. "\ ">"); } printf ("</ td> \ n"); $ ILoop + +; } } } printf ("</ tr> \ n"); } / / Fim da mesa printf ("</ table>"); } O DrawBoard () função usa apenas um global-o próprio conselho. Tem dois loops aninhados; o primeiro ciclo é o número de linhas na tabela que devem ser prestados, ea segunda loop é o número de colunas em cada linha que deve ser prestado. Se a contagem de US $ iCol é 1 ou 3, então ele chama o divisor entre as praças, caso contrário ele verifica para ver se há é uma peça no tabuleiro em que determinada linha e coluna particular. Se há um pedaço torna-lo para o browser, caso contrário ele coloca em um botão. As próximas duas funções, CheckFull () e CheckWin (), verifique se a placa está cheia ou se alguém já ganhou o jogo. Seu Jogo PHP First 127 CheckFull function () { global $ gGameState; gBoard $ global; $ GGameState = game_over; for ($ iLoop = 0; $ iLoop <count ($ gBoard); $ iLoop + +) { if ($ gBoard [$ iLoop] == "") { $ GGameState = GAME_PLAY; return 0; } } return 1; } CheckWin função () { global $ gGameState; gBoard $ global; $ Leitor = 1; while ($ leitor <= 2) { if ($ leitor == 1)

Page 110: Programação de jogos em PHP

$ Telha = "o"; outro $ Telha = "x"; if ( # Horizontal ($ GBoard [0] gBoard telha == $ & & $ [1] telha == $ & & $ GBoard [2] == $ telha) | | ($ gBoard [3] == gBoard telha $ $ & & [4] telha == $ & & $ GBoard [5] == $ telha) | | (GBoard $ [6] == gBoard telha $ $ & & [7] telha == $ & & $ GBoard [8] == $ telha) | | # Verticais ($ GBoard [0] == gBoard telha $ $ & & [3] telha == $ & & $ GBoard [6] == $ telha) | | (GBoard $ [1] == gBoard telha $ $ & & [4] telha == $ & & $ GBoard [7] == $ telha) | | (GBoard $ [2] == gBoard telha $ $ & & [5] telha == $ & & $ GBoard [8] == $ telha) | | 128 Capítulo 6 ■ Arrays! # Diagonal ($ GBoard [0] == gBoard telha $ $ & & [4] telha == $ & & $ GBoard [8] == $ telha) | | (GBoard $ [2] == gBoard telha $ $ & & [4] telha == $ & & $ GBoard [6] == $ telha)) { retorno strtoupper ($ telha); } $ Jogador + +; } } O CheckFull (função) começa assumindo que o jogo está terminado. Em seguida, loops através de cada casa do tabuleiro de verificação para ver se há um quadrado branco. Se o CheckFull (função) encontra um quadrado em branco que define o estado do jogo de volta para jogar. O CheckWin () função verifica três peças em uma linha para cada jogador. Ele primeiro checa para ver se há três telhas horizontal em uma linha com o mesmo marcador neles. Ele faz o mesmo procedimentos exatos para três azulejos vertical numa fila e por três peças em uma linha diagonal. Se houver destes testes para avaliar a verdade, então a telha vencedora é retornado para a função render. O acordo final com duas funções do computador AI ComputerRandomMove () e ComputerMove () ambos calcular onde o computador deve colocar a sua peça. ComputerRandom- Move () é usado para o nível de dificuldade mais fácil e ComputerMove () é usado para o normal e impossível níveis de dificuldade.

Page 111: Programação de jogos em PHP

ComputerRandomMove função () { gBoard $ global; ComputerMove $ = ""; srand ((double) microtime () * 1000000); while ($ computerMove == "") { $ Teste = rand (0, 8); if ($ gBoard [$ teste] == "") { ComputerMove $ = $ teste; [ComputerMove $] $ gBoard = "o"; $ _SESSION ['GBoard'] = $ gBoard; } } } Seu Primeiro Jogo PHP 129 ComputerMove function () { gBoard $ global; ComputerMove $ = ""; for ($ leitor = 0; $ jogador <= 1; $ player + +) { if ($ leitor == 0) { $ Telha = "o"; } outro { $ Telha = "x"; } if ($ gBoard [0] gBoard telha == $ & & $ [1] telha == $ & & $ GBoard [2] =='') $ ComputerMove = 2; if ($ gBoard [0] == gBoard telha $ $ & & [1] ==''& & $ gBoard [2] == $ telha) $ ComputerMove = 1; if ($ gBoard [0] ==''& & $ gBoard [1] telha == $ & & $ GBoard [2] == $ telha) $ ComputerMove = 0; if ($ gBoard [3] == gBoard telha $ $ & & [4] telha == $ & & $ GBoard [5] =='') $ ComputerMove = 5; if ($ gBoard [3] == gBoard telha $ $ & & [4] ==''& & $ GBoard [5] == $ telha) $ ComputerMove = 4; if ($ gBoard [3] ==''& & $ gBoard [4] telha == $ & & $ GBoard [5] == $ telha) $ ComputerMove = 3; if ($ gBoard [6] == gBoard telha $ $ & & [7] telha == $ & & $ GBoard [8] =='')

Page 112: Programação de jogos em PHP

ComputerMove $ = 8; if ($ gBoard [6] == gBoard telha $ $ & & [7] ==''& & $ GBoard [8] == $ telha) ComputerMove $ = 7; if ($ gBoard [6] ==''& & $ gBoard [7] telha == $ & & $ GBoard [8] == $ telha) $ ComputerMove = 6; 130 Capítulo 6 ■ Arrays! if ($ gBoard gBoard [0] telha == $ & & $ [3] telha == $ & & $ GBoard [6] =='') $ ComputerMove = 6; if ($ gBoard gBoard [0] telha == $ & & $ [3] ==''& & $ GBoard [6] == telha $) $ ComputerMove = 3; if ($ gBoard [0] ==''& & $ gBoard [3] telha == $ & & $ GBoard [6] == telha $) $ ComputerMove = 0; if ($ gBoard [1] == gBoard telha $ $ & & [4] telha == $ & & $ GBoard [7] =='') ComputerMove $ = 7; if ($ gBoard [1] == gBoard telha $ $ & & [4] ==''& & $ GBoard [7] == $ telha) $ ComputerMove = 4; if ($ gBoard [1] ==''& & $ gBoard [4] telha == $ & & $ GBoard [7] == $ telha) $ ComputerMove = 1; if ($ gBoard [2] == gBoard telha $ $ & & [5] telha == $ & & $ GBoard [8] =='') ComputerMove $ = 8; if ($ gBoard [2] == gBoard telha $ $ & & [5] ==''& & $ GBoard [8] == $ telha) $ ComputerMove = 5; if ($ gBoard [2] ==''& & $ gBoard [5] telha == $ & & $ GBoard [8] == $ telha) $ ComputerMove = 2; if ($ gBoard gBoard [0] telha == $ & & $ [4] telha == $ & & $ GBoard [8] =='') ComputerMove $ = 8; if ($ gBoard gBoard [0] telha == $ & & $ [4] ==''& & $ GBoard [8] == $ telha) $ ComputerMove = 4; if ($ gBoard [0] ==''& & $ gBoard [4] telha == $ & & $ GBoard [8] == $ telha) $ ComputerMove = 0; if ($ gBoard [2] == gBoard telha $ $ & & [4] telha == $ & & $ GBoard [6] =='') $ ComputerMove = 6; Seu Jogo PHP First 131 if ($ gBoard [2] == gBoard telha $ $ & & [4] ==''& & $ GBoard [6] == telha $)

Page 113: Programação de jogos em PHP

$ ComputerMove = 4; if ($ gBoard [2] ==''& & $ gBoard [4] telha == $ & & $ GBoard [6] == telha $) $ ComputerMove = 2; if (computerMove $ <>'') break; } return $ computerMove; } ComputerRandomMove () simplesmente calcula um número aleatório de temporizador do servidor. Uma vez torna-se este número aleatório que testa para ver se esse quadrado é branco. Se o quadrado testado está em branco, o computador coloca a sua peça em que quadrado. Se o quadrado não é testado em branco, ComputerRandomMove () é executado novamente, até uma casa vazia é encontrada. ComputerMove () olha para cada único quadrado no tabuleiro. Se houver duas peças em uma linha com a telha opostas neles, o computador irá colocar a sua telha no terceiro quadrado aberto, assim bloqueio do adversário. Este nível de dificuldade é maior na função de processar com o seguintes linhas: $ ComputerMove ComputerMove = (); if ($ computerMove =='') { if ($ gBoard [4] =='') $ ComputerMove = 4; elseif ($ gBoard [0] =='') $ ComputerMove = 0; elseif ($ gBoard [2] =='') $ ComputerMove = 2; elseif ($ gBoard [6] =='') $ ComputerMove = 6; elseif ($ gBoard [8] =='') ComputerMove $ = 8; if ($ computerMove =='') ComputerRandomMove (); } Primeiro ele calcula mover o computador. Se mover o computador está em branco ele tenta pegar o quadrados em primeiro lugar. Se ele não encontrar uma praça disponíveis, aleatoriamente calcula o movimento. Com estes três métodos de cálculo se move, é quase impossível de vencer. Faz para um grande desafio. 132 Capítulo 6 ■ Arrays! Figura 6.10 Seu jogo PHP em primeiro lugar! Parabéns! Você concluiu com êxito o seu primeiro jogo de PHP. Os resultados

Page 114: Programação de jogos em PHP

de seus esforços deve ser semelhante a Figura 6.10. Nota Neste ponto, você vai querer ir em seu arquivo php.ini e vire display_errors para fora. A razão para isso é porque você só quer mostrar os erros durante a depuração, caso contrário você terá de alerta avisos por todo o lugar que realmente não afetam a jogabilidade. Conclusão Você cobriu seu último conceito básico em PHP-matrizes. Você aprendeu como inicializar matrizes, use cordas para índices, percorrer arrays, criar matrizes multi-dimensionais e classificar suas matrizes. Você também criaram o seu primeiro jogo de PHP. Ele só pode obter mais emocionante a partir daqui. Em seguida, você vai fazer um tour através de bases de dados e criar a sua própria jogo de xadrez. Eu sei que tic-tac-toe foi muito divertido, mas não muito difícil. É hora de realmente testar suas habilidades. capítulo 7 Jogando com Xadrez e bancos de dados ■ Não-Relational Databases ■ Criar e Abrir um banco de dados ■ Looping através de bancos de dados ■ Modificar seu banco de dados ■ Programação Básico de Xadrez ■ Começando seu jogo de xadrez ■ trabalhar com as peças ■ Adicionando o banco de dados W chapéu é um banco de dados? Um banco de dados fornece armazenamento persistente de informação. Existem três tipos de bases de dados: bancos de dados relacionais, bancos de dados não-relacional, e objeto bases de dados orientado. Em um banco de dados relacional os dados são armazenadas em um conjunto de tabelas e as informações são relacionadas entre si por um identificador único. Alguns exemplos de um sistema de banco de dados relacional são mySQL, SQL Server e Oracle. Bancos de dados relacionais costumam usar uma linguagem chamada T-SQL para acessar as informações dentro de uma tabela. Objeto bancos de dados orientados usar objetos para representar muitos dados, como você faria se você estivesse criando classes e objetos para representar os dados internos do seu programa. Objeto bancos de dados orientados são muito novas, por isso os algoritmos de busca não são tão bem definido como um banco de dados relacional,

Page 115: Programação de jogos em PHP

mas este tipo de banco de dados dá uma grande promessa para a comunidade de desenvolvimento orientado a objetos. Alguns dos bancos de dados objeto mais populares são orientados Versant (www.versant.com), Gem- Stone (www.gemstone.com), e ObjectStore (www.odi.com/odilive/). 133 134 Capítulo 7 Jogando com ■ Xadrez e bancos de dados Para os seus propósitos com este livro você irá usar um banco de dados não-relacional. Não-relacionais bancos de dados usam arquivos para armazenar suas informações. Eles são chamados de não-bancos de dados relacionais porque os dados armazenados não está relacionado com quaisquer outros dados. Muito nome lógico, se você me perguntar. Não-bancos de dados relacionais Como mencionado, um banco de dados não-relacional armazena suas informações em arquivos. Então, como ele faz isso? PHP suporta uma coisa chamada DBA. DBA está para abstração de banco de dados, e este pode lidar com vários formatos de banco de dados diferente. Quando um banco de dados não-relacional armazena seus dados, ele armazena em um par chave / valor. Em outras palavras, cada entrada armazenada consiste em um valor com uma chave associada. Estes pares de chave / valor são seqüências simples, não arrays char, para que você possa também armazenar informações binárias nesses bancos de dados. Você não está limitado às teclas que você pode escolher porque as chaves não são estipulados pelo banco de dados. DBA permite criar bases de dados; atualizar bancos de dados existentes; inserir, atualizar e excluir novas entradas, e atravessar o banco de dados inteiro. O maior bônus para você é que não relacionais bases de dados não requerem qualquer software adicional. Tudo que você precisa fazer é permitir o DBA apoio no interpretador PHP editando o arquivo php.ini. Este já deve ser concluída; você passou por esta etapa quando você instalou o interpretador PHP. Criando e Abrindo um banco de dados PHP oferece diversas funções para DBA. A primeira função você deve saber é o dba_open () função. Isso permitirá que você crie um banco de dados, gravar em um banco de dados, ler um banco de dados, ou truncar um banco de dados. int dba_open (string sPath, string sMode, string Shandler, [int nMod]); O primeiro parâmetro do dba_open () função é o caminho para o banco de dados, o segundo parâmetro é o modo em que você deseja abrir o banco de dados. Valores possíveis para isso pode ser qualquer um dos seguintes: ■ r - Abra o banco de dados para leitura. ■ w - Abra o banco de dados para a escrita. ■ c - Criar um novo banco de dados.

Page 116: Programação de jogos em PHP

■ n - truncar um banco de dados. O terceiro parâmetro é o nome do manipulador para o tipo de banco de dados que você gostaria de uso. O terceiro parâmetro pode ser qualquer um dos seguintes valores: ■ dbm - banco de dados Berkley DB-style (obsoleto). ■ ndbm-Uma nova base de dados Berkley DB-estilo. Isto é muito limitada e é também obsoleta. Criando e Abrindo um banco de dados 135 ■ gdbm-O banco de dados GNU. ■ db3 - O kit de ferramentas de banco de dados DB3 de Software Sleepycat. Este será o banco de dados tipo que você irá utilizar em seus projetos. ■ cdb - banco de dados do Qmail. Este formato só permite operações de leitura. O quarto parâmetro opcional especifica o modo em que o banco de dados deve ser aberto. Este não é um parâmetro comumente usado e você não poderá usá-lo em seus jogos. O dba_open () função irá retornar um identificador para o banco de dados se ele foi bem sucedido, caso contrário ele retorna 0 ou false quando ele falhar. Isto permitirá que você para verificar se o banco de dados é aberto. Se a abertura falhar você pode prender por ele e quer imprimir uma mensagem de aviso ou sair do aplicativo completamente. Dê uma olhada no seguinte exemplo de código para ver como usar o dba_open () função. <? Php / / Defina os parâmetros db $ Dbpath = "myDatabase.db"; $ DbType = "db3"; CreateDatabase função ($ thePath, $ theType) { $ Db = dba_open ($ thePath, "c", $ theType); if (! $ db) { printf ("Não foi possível criar o banco de dados"); return 0; } return $ db; } OpenDatabase função ($ thePath, $ theType) { $ Db = dba_open ($ thePath, "r", $ theType); if (! $ db) { printf ("Não foi possível abrir o banco de dados"); return 0; }

Page 117: Programação de jogos em PHP

return $ db; } 136 Capítulo 7 Jogando com ■ Xadrez e bancos de dados capítulo 7 Jogando com Xadrez e bancos de dados ■ Não-Relational Databases ■ Criar e Abrir um banco de dados ■ Looping através de bancos de dados ■ Modificar seu banco de dados ■ Programação Básico de Xadrez ■ Começando seu jogo de xadrez ■ trabalhar com as peças ■ Adicionando o banco de dados W chapéu é um banco de dados? Um banco de dados fornece armazenamento persistente de informação. Existem três tipos de bases de dados: bancos de dados relacionais, bancos de dados não-relacional, e objeto bases de dados orientado. Em um banco de dados relacional os dados são armazenadas em um conjunto de tabelas e as informações são relacionadas entre si por um identificador único. Alguns exemplos de um sistema de banco de dados relacional são mySQL, SQL Server e Oracle. Bancos de dados relacionais costumam usar uma linguagem chamada T-SQL para acessar as informações dentro de uma tabela. Objeto bancos de dados orientados usar objetos para representar muitos dados, como você faria se você estivesse criando classes e objetos para representar os dados internos do seu programa. Objeto bancos de dados orientados são muito novas, por isso os algoritmos de busca não são tão bem definido como um banco de dados relacional, mas este tipo de banco de dados dá uma grande promessa para a comunidade de desenvolvimento orientado a objetos. Alguns dos bancos de dados objeto mais populares são orientados Versant (www.versant.com), Gem- Stone (www.gemstone.com), e ObjectStore (www.odi.com/odilive/). 133 134 Capítulo 7 Jogando com ■ Xadrez e bancos de dados Para os seus propósitos com este livro você irá usar um banco de dados não-relacional. Não-relacionais bancos de dados usam arquivos para armazenar suas informações. Eles são chamados de não-bancos de dados relacionais porque os dados armazenados não está relacionado com quaisquer outros dados. Muito nome lógico, se você me perguntar. Não-bancos de dados relacionais Como mencionado, um banco de dados não-relacional armazena suas informações em arquivos. Então, como ele faz

Page 118: Programação de jogos em PHP

isso? PHP suporta uma coisa chamada DBA. DBA está para abstração de banco de dados, e este pode lidar com vários formatos de banco de dados diferente. Quando um banco de dados não-relacional armazena seus dados, ele armazena em um par chave / valor. Em outras palavras, cada entrada armazenada consiste em um valor com uma chave associada. Estes pares de chave / valor são seqüências simples, não arrays char, para que você possa também armazenar informações binárias nesses bancos de dados. Você não está limitado às teclas que você pode escolher porque as chaves não são estipulados pelo banco de dados. DBA permite criar bases de dados; atualizar bancos de dados existentes; inserir, atualizar e excluir novas entradas, e atravessar o banco de dados inteiro. O maior bônus para você é que não relacionais bases de dados não requerem qualquer software adicional. Tudo que você precisa fazer é permitir o DBA apoio no interpretador PHP editando o arquivo php.ini. Este já deve ser concluída; você passou por esta etapa quando você instalou o interpretador PHP. Criando e Abrindo um banco de dados PHP oferece diversas funções para DBA. A primeira função você deve saber é o dba_open () função. Isso permitirá que você crie um banco de dados, gravar em um banco de dados, ler um banco de dados, ou truncar um banco de dados. int dba_open (string sPath, string sMode, string Shandler, [int nMod]); O primeiro parâmetro do dba_open () função é o caminho para o banco de dados, o segundo parâmetro é o modo em que você deseja abrir o banco de dados. Valores possíveis para isso pode ser qualquer um dos seguintes: ■ r - Abra o banco de dados para leitura. ■ w - Abra o banco de dados para a escrita. ■ c - Criar um novo banco de dados. ■ n - truncar um banco de dados. O terceiro parâmetro é o nome do manipulador para o tipo de banco de dados que você gostaria de uso. O terceiro parâmetro pode ser qualquer um dos seguintes valores: ■ dbm - banco de dados Berkley DB-style (obsoleto). ■ ndbm-Uma nova base de dados Berkley DB-estilo. Isto é muito limitada e é também obsoleta. Criando e Abrindo um banco de dados 135 ■ gdbm-O banco de dados GNU. ■ db3 - O kit de ferramentas de banco de dados DB3 de Software Sleepycat. Este será o banco de dados tipo que você irá utilizar em seus projetos. ■ cdb - banco de dados do Qmail. Este formato só permite operações de leitura.

Page 119: Programação de jogos em PHP

O quarto parâmetro opcional especifica o modo em que o banco de dados deve ser aberto. Este não é um parâmetro comumente usado e você não poderá usá-lo em seus jogos. O dba_open () função irá retornar um identificador para o banco de dados se ele foi bem sucedido, caso contrário ele retorna 0 ou false quando ele falhar. Isto permitirá que você para verificar se o banco de dados é aberto. Se a abertura falhar você pode prender por ele e quer imprimir uma mensagem de aviso ou sair do aplicativo completamente. Dê uma olhada no seguinte exemplo de código para ver como usar o dba_open () função. <? Php / / Defina os parâmetros db $ Dbpath = "myDatabase.db"; $ DbType = "db3"; CreateDatabase função ($ thePath, $ theType) { $ Db = dba_open ($ thePath, "c", $ theType); if (! $ db) { printf ("Não foi possível criar o banco de dados"); return 0; } return $ db; } OpenDatabase função ($ thePath, $ theType) { $ Db = dba_open ($ thePath, "r", $ theType); if (! $ db) { printf ("Não foi possível abrir o banco de dados"); return 0; } return $ db; } 136 Capítulo 7 Jogando com ■ Xadrez e bancos de dados / / Abre o banco de dados, se ele não estiver lá, crie- $ Db = OpenDatabase ($ dbpath, $ dbType); if (! $ db) { $ Db = CreateDatabase ($ dbpath, $ dbType); if (! $ db) { saída; } } / / Se você chegar aqui o banco de dados aberto com sucesso e você pode fazer o que quiser

Page 120: Programação de jogos em PHP

com ele. ?> Looping através do banco de dados Agora que você sabe como criar e abrir um banco de dados não-relacional que seria útil saber como percorrer os dados no banco de dados para exibi-lo. Para percorrer uma registro de banco de dados set você precisa para começar a chave primeiro. PHP oferece dba_firstkey () para obter a primeira chave de um banco de dados especificado. cadeia dba_firstkey (int databaseHandle); Depois de recuperar a primeira chave do banco de dados que você precisa para fazer um loop através de cada registro até não existem mais registros. Para isso, você irá usar um loop while, porque você não vai saber o contagem dos elementos no conjunto de registros. Para obter o valor, você usa o dba_fetch () função. cadeia dba_fetch (string chave, int databaseHandle); O dba_fetch () irá retornar uma seqüência de false se não foi possível obter os dados. Uma vez você recuperou os dados que você terá que unserialize os dados, assim como você terá que serializar os dados para colocá-lo no banco de dados. cadeia unserialize (string someString); Depois de ter feito isso, você pode fazer o que quiser com a corda desserializados. Então você necessidade de recuperar a chave próxima a fim de avançar para o próximo registro. Dê uma olhada no seguinte exemplo para ver como tudo funciona em conjunto: <? Php $ Dbpath = "myDatabase.db"; $ DbType = "db3"; $ Db = OpenDatabase ($ dbpath, $ dbType); Inserindo uma entrada em seu banco de dados 137 if (! $ db) { $ Db = CreateDatabase ($ dbpath, $ dbType); if (! $ db) { saída; } } / / Pega o primeiro registro $ Key = dba_firstkey ($ db); / / Percorre todo o banco de while ($ chave! = false) { $ Valor = dba_fetch ($ key, $ db); $ Entrada = unserialize ($ value); / / Faz alguma coisa com $ entrada

Page 121: Programação de jogos em PHP

$ Key = dba_nextkey ($ db); } dba_close ($ db); ?> Nota Lembre-se sempre fechar o banco de dados você está trabalhando com usando o dba_close () função. Inserindo uma entrada em seu banco de dados Para inserir uma entrada, PHP fornece-lhe com a função dba_insert (). Esta função recebe três argumentos. O primeiro é a chave que você quer dar o registro, o segundo argumento é o valor para a chave, eo terceiro argumento é o identificador para o banco de dados. bool dba_insert (string chave, valor string, int handle); Se a inserção ao banco de dados é bem sucedida dba_insert () retornará true. Se a inserir na banco de dados falhar dba_insert () irá retornar false. Ao inserir um valor no banco de dados fazer se você serializar os dados em primeiro lugar. $ Resultados = dba_insert ($ myKey, serialize ($ myData), $ db); Todos os serialize () função faz é criar uma seqüência serializada de um tipo de dados mistos que você passar para ele, assim você pode passar em uma matriz e os resultados serão uma seqüência serializada. Então quando você recuperar os dados do banco de dados, você unserialize a string usando o 138 Capítulo 7 Jogando com ■ Xadrez e bancos de dados unserialize () função. Dê uma olhada no seguinte exemplo de código para ver como você colocá-lo todos juntos: <? Php $ Dbpath = "myDatabase.db"; $ DbType = "db3"; $ Data = "Meus Dados"; $ Db = OpenDatabase ($ dbpath, $ dbType); if (! $ db) { $ Db = CreateDatabase ($ dbpath, $ dbType); if (! $ db) { saída; } } / / Agora que o banco de dados é aberta, você precisa encontrar a chave disponível seguinte $ NextID = 0; $ Key = dba_firstkey ($ db); while ($ chave! = false) {

Page 122: Programação de jogos em PHP

if ($ key> $ NextID) { NextID $ = $ chave; } $ Key = dba_nextkey ($ db); } $ NextID + + / / Esta é a chave mais próximo disponível $ Result = $ dba_insert ($ chave, serialize ($ data), $ db); dba_close ($ db) if (! $ result) { printf ("Inserir no banco de dados falhou"); } outro { printf ("Adicionado com sucesso"); } ?> Atualizar uma entrada em seu banco de dados 139 Então, qual é este exemplo fazendo, exatamente? Primeiro, ele abre o banco de dados usando as funções que você criou anteriormente neste capítulo. Uma vez que o banco de dados é aberto, você precisa encontrar o próximo ID disponíveis. Isso garante que você está inserindo os dados no final do arquivo. Para fazer isso você precisa pegar a chave em primeiro lugar no banco de dados, em seguida, percorra o banco de dados inteiro até chegar ao fim. Se uma chave for encontrada que é maior que dos atuais US $ NextID então o $ NextID é definida como a maior chave. Uma vez que este laço é terminado, você tem a maior chave na banco de dados, assim que a chave é, obviamente, disponível seguinte $ NextID + 1. Agora você pode inserir gratuitamente seu registro no banco de dados. Depois de ter chamado o dba_insert () função que você precisa verificar para ver se ele é bem sucedido. Isso é tudo que existe para ela. Atualizar uma entrada em seu banco de dados Atualizando registros em seu banco de dados é muito semelhante ao inserir registros, mas em vez de chamar dba_insert () você chama dba_replace (). O dba_replace () função também tem três argumentos. Você consegue adivinhar o que são? É isso mesmo, a chave que você deseja atualizar os dados que você vão atualizar o registro com, e lidar com o banco de dados. bool dba_replace (string chave, os dados string, banco de dados int); Agora, uma vez que você chamar essa função você deve chamar o dba_sync () função, ou então seus dados não serão salvos no banco de dados. Esta pode ser uma dor na bunda para depurar se você perder colocar nessa função pouco.

Page 123: Programação de jogos em PHP

bool dba_sync (banco de dados int); Então, para atualizar um registro você começar exatamente como se você estivesse inserindo um registro que você precisa para abrir o banco de dados. Mas desta vez você não precisa de encontrar o próximo registro disponível porque você já sabe o registro que você deseja atualizar. Se você não sabe o registro que deseja atualizar então você provavelmente não deveria estar atualizando o banco de dados. <? Php função UpdateRecord ($ id, $ value) { dbpath global $, $ dbType; $ Db = OpenDatabase ($ dbpath, $ dbType); dba_replace ($ id, serialize ($ valor), $ db); dba_sync ($ db); dba_close ($ db) } ?> Inserindo uma entrada em seu banco de dados Para inserir uma entrada, PHP fornece-lhe com a função dba_insert (). Esta função recebe três argumentos. O primeiro é a chave que você quer dar o registro, o segundo argumento é o valor para a chave, eo terceiro argumento é o identificador para o banco de dados. bool dba_insert (string chave, valor string, int handle); Se a inserção ao banco de dados é bem sucedida dba_insert () retornará true. Se a inserir na banco de dados falhar dba_insert () irá retornar false. Ao inserir um valor no banco de dados fazer se você serializar os dados em primeiro lugar. $ Resultados = dba_insert ($ myKey, serialize ($ myData), $ db); Todos os serialize () função faz é criar uma seqüência serializada de um tipo de dados mistos que você passar para ele, assim você pode passar em uma matriz e os resultados serão uma seqüência serializada. Então quando você recuperar os dados do banco de dados, você unserialize a string usando o 138 Capítulo 7 Jogando com ■ Xadrez e bancos de dados unserialize () função. Dê uma olhada no seguinte exemplo de código para ver como você colocá-lo todos juntos: <? Php $ Dbpath = "myDatabase.db"; $ DbType = "db3"; $ Data = "Meus Dados"; $ Db = OpenDatabase ($ dbpath, $ dbType); if (! $ db) {

Page 124: Programação de jogos em PHP

$ Db = CreateDatabase ($ dbpath, $ dbType); if (! $ db) { saída; } } / / Agora que o banco de dados é aberta, você precisa encontrar a chave disponível seguinte $ NextID = 0; $ Key = dba_firstkey ($ db); while ($ chave! = false) { if ($ key> $ NextID) { NextID $ = $ chave; } $ Key = dba_nextkey ($ db); } $ NextID + + / / Esta é a chave mais próximo disponível $ Result = $ dba_insert ($ chave, serialize ($ data), $ db); dba_close ($ db) if (! $ result) { printf ("Inserir no banco de dados falhou"); } outro { printf ("Adicionado com sucesso"); } ?> Atualizar uma entrada em seu banco de dados 139 Então, qual é este exemplo fazendo, exatamente? Primeiro, ele abre o banco de dados usando as funções que você criou anteriormente neste capítulo. Uma vez que o banco de dados é aberto, você precisa encontrar o próximo ID disponíveis. Isso garante que você está inserindo os dados no final do arquivo. Para fazer isso você precisa pegar a chave em primeiro lugar no banco de dados, em seguida, percorra o banco de dados inteiro até chegar ao fim. Se uma chave for encontrada que é maior que dos atuais US $ NextID então o $ NextID é definida como a maior chave. Uma vez que este laço é terminado, você tem a maior chave na banco de dados, assim que a chave é, obviamente, disponível seguinte $ NextID + 1. Agora você pode inserir gratuitamente seu registro no banco de dados. Depois de ter chamado o dba_insert () função que você precisa verificar para ver se ele é bem sucedido. Isso é tudo que existe para ela. Atualizar uma entrada em seu banco de dados

Page 125: Programação de jogos em PHP

Atualizando registros em seu banco de dados é muito semelhante ao inserir registros, mas em vez de chamar dba_insert () você chama dba_replace (). O dba_replace () função também tem três argumentos. Você consegue adivinhar o que são? É isso mesmo, a chave que você deseja atualizar os dados que você vão atualizar o registro com, e lidar com o banco de dados. bool dba_replace (string chave, os dados string, banco de dados int); Agora, uma vez que você chamar essa função você deve chamar o dba_sync () função, ou então seus dados não serão salvos no banco de dados. Esta pode ser uma dor na bunda para depurar se você perder colocar nessa função pouco. bool dba_sync (banco de dados int); Então, para atualizar um registro você começar exatamente como se você estivesse inserindo um registro que você precisa para abrir o banco de dados. Mas desta vez você não precisa de encontrar o próximo registro disponível porque você já sabe o registro que você deseja atualizar. Se você não sabe o registro que deseja atualizar então você provavelmente não deveria estar atualizando o banco de dados. <? Php função UpdateRecord ($ id, $ value) { dbpath global $, $ dbType; $ Db = OpenDatabase ($ dbpath, $ dbType); dba_replace ($ id, serialize ($ valor), $ db); dba_sync ($ db); dba_close ($ db) } ?>  140 Capítulo 7 Jogando com ■ Xadrez e bancos de dados Excluindo uma entrada do banco de dados Com o poder de criar, você também precisa do poder de destruir. Para excluir uma entrada a partir do seu banco de dados você usa o dba_delete () função. Nome incrível, não é? O dba_delete () função tem dois parâmetros. O primeiro é o id do registro que você deseja apagar, ea segunda é o identificador para o banco de dados. bool dba_delete (string chave, banco de dados int); Assim como quando você atualizar o banco de dados, você deve chamar o dba_sync () função ou então o seu banco de dados não será atualizado. Dê uma olhada nesta função acessível-dândi. <? Php função deleteRecord ($ id) {

Page 126: Programação de jogos em PHP

dbpath global $, $ dbType; $ Db = OpenDatabase ($ dbpath, $ dbType); dba_delete ($ id, $ db); dba_sync ($ db); dba_close ($ db) } ?> C Aution Lembre-se sempre chamar dba_close () depois de você terminar de operação no banco de dados. E sempre lembre-se de chamar dba_sync () para atualizar seu banco de dados. Programação de xadrez: Uma Visão Geral Antes de começar a programar o seu jogo de xadrez você precisa entender como você ir sobre ele. Dê uma olhada nos requisitos mínimos de software de um jogo de xadrez. ■ Uma maneira de representar um tabuleiro de xadrez na memória. Isto é onde você irá armazenar todo o estado do jogo. ■ Algum tipo de sistema para determinar se um lance ilegal foi feito. ■ algum tipo de interface de usuário para que você possa fazer suas jogadas. Lembre-se estes são os componentes de software mínimo que você precisa para criar um jogo de xadrez. Isto não inclui um sistema de avaliação mover para que o computador pode fazer movimentos. Agora que você tem uma boa direção para ir para começar a programar um jogo de xadrez, dê uma olhada em como você representaria um tabuleiro. Existem várias maneiras de representar um tabuleiro de xadrez, mas a maneira mais óbvia é a utilização de uma espécie de matriz para representar a bordo. Por um array? Porque você quer ter uma vari Começando O jogo de xadrez 141 capaz que você pode percorrer para tornar a bordo, e um conjunto de dados é a mais lógica estrutura. Para fazer um movimento no xadrez você dá a bordo de um dos quadrados (por exemplo, a1) e um para quadrados (por exemplo, a3). Se você estiver usando uma matriz, então você pode percorrer estas colunas e linhas e tirar a placa na tela com bastante facilidade. O ideal seria usar tábuas de bits para representam posições das peças no tabuleiro em si. Uma placa de bit é um array de 64 bytes que contém um pouco. A 1 seria em uma praça, se a praça é tomada e um 0 seria em uma praça, se a praça está livre. Assim, você pode representar um jogo de xadrez toda usando 12 placas bit. Um para a posição de todos os peões brancos, brancos torres, bispos brancos, cavaleiros branco, branco rainha, rei branco, peões pretos, e assim por diante. Com estas placas bit

Page 127: Programação de jogos em PHP

a validação de movimentos e cálculos de movimentos será um lote inteiro mais rápido do que looping através de um array de 64 bytes para todo o conselho. No entanto, PHP não suporta Inteiros de 64 bits para que você não pode usar placas de pouco menos que você tenha um sistema de 64 bits. Esta é uma visão muito rápida de programação de xadrez. Se você quiser obter mais in-depth informações sobre programação de xadrez, confira outros livros sobre o assunto. Vamos começar programação o nosso jogo de xadrez. Iniciando o Jogo de Xadrez O primeiro passo que você deve tomar ao iniciar qualquer jogo é criar o seu jogo e estados globals geral. Para este jogo de xadrez, você terá apenas três estados do jogo. Um diz-lhe quando o jogo está começando, o segundo diz que o jogo está sendo executado, eo terceiro diz quando o jogo acaba. / / Jogo Estados define ("GAME_STARTING", 1); define ("GAME_RUNNING", 2); define ("game_over", 3); / / Globals global $ gGameState; gBoard $ global; gCurrentPlayer $ global; Agora vamos criar a estrutura HTML para o jogo. Não deve ser nada muito extravagante. (Por uma questão de fato, será muito parecido com o jogo tic-tac-toe você criou nos últimos capítulo.) <Doctype html público! "- / / W3C / / DTD HTML 4.0 / / EN"> <html> <head> <title> Chess </ title> <link rel="stylesheet" href="style.css" type="text/css"> </ Head> <body> 142 Capítulo 7 Jogando com ■ Xadrez e bancos de dados <form action="chess.php" method="post"> <Input type = name "escondida" = "player" value = "<? printf ($ gCurrentPlayer)?> "> <Input type = name "escondida" = "turn" value = "<? printf ($ turno)> "> <Php WriteTableHeader ();?> <div align="center"> <input type="submit" name="btnNewGame" value="New Game"> Mova <b> From: </ b> <input type="text" name="fromSquare"> <b> Move To: </ b> <input type="text" name="toSquare"> <br> <? Php

Page 128: Programação de jogos em PHP

/ / Render o jogo Render (); ?> </ Div> <Php WriteTableFooter ();?> </ Form> </ Body> </ Html> Este pequeno pedaço de HTML torna o nosso quadro-a esfriar para iniciar um novo jogo, uma lugar para entrar em seus movimentos, eo resto do jogo. Dê uma olhada na Figura 7.1 para ver uma layout geral do que o jogo será semelhante. Figura 7.1 layout geral do jogo de xadrez. Trabalhando com o Pieces 143 Trabalhar com as peças Agora que você sabe como você geralmente deseja colocar para fora o jogo de xadrez, você pode criar a constantes para as peças e algumas funções para mover as peças. Além disso, você vai querer criar a função de tornar geral para começar o seu jogo. <? Php Renderização function () { global $ gGameState; gBoard $ global; switch ($ gGameState) { GAME_RUNNING caso: { DrawBoard (); } game_over caso: { printf ("Game is Over"); } } / / Atualizar o nosso estado do jogo $ _SESSION ['GGameState'] = $ gGameState; } ?> <!-Pieces.php -> <? Php / / Constantes para definições pedaço define ("peão", 0); define ("Knight", 2); define ("bispo", 4); define ("ROOK", 6); define ("RAINHA", 8); define ("rei", 10);

Page 129: Programação de jogos em PHP

define ("EMPTY_SQUARE", 12); / Coisas / para o bitboards define ("ALL_PIECES", 12); define ("ALL_SQUARES", 64); define ("ALL_BITBOARDS", 14); / / Peças Branco 144 Capítulo 7 Jogando com ■ Xadrez e bancos de dados define ("ALL_WHITE_PIECES", ALL_PIECES); define ("WHITE_PAWN", peão); define ("WHITE_KNIGHT", KNIGHT); define ("WHITE_BISHOP", BISHOP); define ("WHITE_ROOK", ROOK); define ("WHITE_QUEEN", QUEEN); define ("WHITE_KING", KING); / / Peças Preto define ("ALL_BLACK_PIECES", ALL_PIECES + 1); define ("BLACK_PAWN", PENHOR + 1); define ("BLACK_KNIGHT", CAVALEIRO + 1); define ("BLACK_BISHOP", BISPO + 1); define ("BLACK_ROOK", ROOK + 1); define ("BLACK_QUEEN", QUEEN + 1); define ("BLACK_KING", KING + 1); / Peça / Valores $ PieceValues [WHITE_PAWN] = 100; $ PieceValues [WHITE_KNIGHT] = 300; $ PieceValues [WHITE_BISHOP] = 350; $ PieceValues [WHITE_ROOK] = 500; $ PieceValues [WHITE_QUEEN] = 900; $ PieceValues [WHITE_KING] = 2000; $ PieceValues [BLACK_PAWN] = 100; $ PieceValues [BLACK_KNIGHT] = 300; $ PieceValues [BLACK_BISHOP] = 350; $ PieceValues [BLACK_ROOK] = 500; $ PieceValues [BLACK_QUEEN] = 900; $ PieceValues [BLACK_KING] = 2000; StartBoard function () { gBoard $ global; GBoard $ array = ( BLACK_ROOK, BLACK_KNIGHT, BLACK_BISHOP, BLACK_QUEEN, BLACK_KING, BLACK_BISHOP, BLACK_KNIGHT, BLACK_ROOK, BLACK_PAWN, BLACK_PAWN, BLACK_PAWN, BLACK_PAWN, BLACK_PAWN, BLACK_PAWN, BLACK_PAWN, BLACK_PAWN, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, Trabalhando com o Pieces 145 EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE,

Page 130: Programação de jogos em PHP

EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, EMPTY_SQUARE, WHITE_PAWN, WHITE_PAWN, WHITE_PAWN, WHITE_PAWN, WHITE_PAWN, WHITE_PAWN, WHITE_PAWN, WHITE_PAWN, WHITE_ROOK, WHITE_KNIGHT, WHITE_BISHOP, WHITE_QUEEN, WHITE_KING, WHITE_BISHOP, WHITE_KNIGHT, WHITE_ROOK); } / / Coloca uma peça no tabuleiro / / $ Quadrado é o quadrado da peça 0-63 / / $ Peça é a peça que está se movendo PutPiece função ($ square, $ piece) { gBoard $ global; / / Coloque a peça no tabuleiro $ GBoard [$ square] = $ peça; } / / Toma um pedaço fora da placa / / $ Quadrado é o quadrado da peça 0-63 você está removendo TakePiece função ($ quadrado) { gBoard $ global; / / Pegue o pedaço fora da placa bit $ GBoard [$ square] = EMPTY_SQUARE; } / / Isso move uma peça MovePiece função ($ fromSquare, toSquare $, $ piece) { PutPiece ($ toSquare, $ parte); TakePiece ($ fromSquare); } UpdateMoveList função ($ fromSquare, $ toSquare) { $ Data = $ fromSquare + "-" + $ toSquare; 146 Capítulo 7 Jogando com ■ Xadrez e bancos de dados / / Abre o banco de dados $ Db = dba_open ("chess.db", "c", "db3"); if (! $ db) { dba_close (); $ Db = dba_open ("chess.db", "w", "db3"); if (! $ db) { printf ("Impossível abrir o banco de dados."); WriteTableFooter (); } } / / Agora que o banco de dados é aberta, você precisa encontrar a chave disponível seguinte $ NextID = 0; $ Key = dba_firstkey ($ db); while ($ chave! = false)

Page 131: Programação de jogos em PHP

{ if ($ key> $ NextID) { NextID $ = $ chave; } $ Key = dba_nextkey ($ db); } $ NextID + + / / Esta é a chave mais próximo disponível $ Dba_insert ($ NextID, serialize ($ data), $ db); / / Fechar o banco de dados dba_close ($ db); } ?> Primeiro você cria um escudo para o render () função. Isto é bastante simples e nada novo para você. Em seguida, você criar um novo arquivo chamado pieces.php. Isto é o que você vai incluir junto com o arquivo common.php. Em pieces.php será toda a lógica para iniciar uma placa, mover uma peça, e tendo uma peça. Note que em pieces.php você tem várias constantes. Isto torna mais fácil para criar o necessário peças para ambos os lados. Em seguida você cria cada tipo de peça que está na placa usando o constantes que você criou. Se você ainda não adivinhou ainda, o jogador branco é a constante 0 e as pretas é a uma constante. Você pode criar define para estes, se você gosta, e você provavelmente deveria. Trabalhando com o Pieces 147 O StartBoard () função é bastante simples. Ele inicializa todos os fóruns e lugares as peças nos lugares apropriados. Uma vez que você será o jogador branco, você está tecnicamente em parte inferior da placa eo preto está na parte superior do tabuleiro. Uma vez que o preto é no topo da a placa que leva até os locais antes de a matriz e branco ocupa os locais última da matriz. O PutPiece () função tem um quadrado e um pedaço como seus parâmetros. A praça é o quadrados que você gostaria de colocar a peça em, ea peça é a peça que você está colocando em que quadrado. O TakePiece () função simplesmente pega um quadrado que está a tomar um pedaço dos. O MovePiece () função tem um quadrado e um pedaço seguida, chama o PutPiece () função e função do TakePiece (). Agora você tem a lógica básica para colocar uma peça no tabuleiro, tendo uma peça fora do tabuleiro,

Page 132: Programação de jogos em PHP

e começar uma nova diretoria. Além disso, você tem todas as variáveis que você precisa para as placas de bits e todas as variáveis que você precisa para representar as peças. Em seguida, você precisa encontrar uma maneira de tornar o conselho para o navegador para que você possa vê-lo. Pense em como um tabuleiro de xadrez é colocado para fora: é uma placa de 8 8 com cores alternadas para quadrados. O quadrado no canto inferior direito da diretoria e da praça, no canto superior esquerdo da conselho deve ser o quadrado de cor clara. Seu cérebro deve estar dizendo coisas como: "A ciclo seria bom. Mas espere, um 8 8 bordo ... dois loops seria melhor. "É isso mesmo, você precisa de dois loops, um para as oito linhas, e um para o oito colunas na placa. Vamos usar dois tons de marrom para o conselho. Para o uso cor mais clara # E4B578 e para o de cor escura quadrados vamos usar # B88645. DrawBoard function () { gBoard $ global; printf ("<table border=\"0\" cellpadding=\"0\" cellspacing=\"1\"> <td align=\"center\" valign=\"middle\" width=\"300\"> "); / / Start nossa mesa para conter a bordo printf ("<borda da tabela = \" 0 \ "cellpadding = \" 0 \ " cellspacing = \ "1 \" width = \ "240 \ ">"); CurrColor $ = "# E4B578"; for ($ row = 0; $ row <8; $ row + +) { / / Imprime uma linha nova tabela printf ("<tr>"); for ($ coluna = 0; $ col <8; $ col + +) 148 Capítulo 7 Jogando com ■ Xadrez e bancos de dados { / / Pega o pedaço de prestar $ Parte = $ gBoard [$ linha * 8 + $ col]; / / Iniciar uma célula nova tabela para esta peça printf ("bgcolor=$currColor> <td"); / / Coloque a peça no tabuleiro switch ($ parte) { WHITE_PAWN caso: { printf ("<img src = \" images / wp.gif \ " border = \ 0 "\ ">"); break;} caso WHITE_KNIGHT: { printf ("<img src = \" images / wn.gif \ " border = \ 0 "\ ">"); break;} WHITE_BISHOP caso: { printf ("<img src = \" images / wb.gif \ " border = \ 0 "\ ">"); break;}

Page 133: Programação de jogos em PHP

caso WHITE_ROOK: { printf ("<img src = \" images / wr.gif \ " border = \ 0 "\ ">"); break;} caso WHITE_QUEEN: { printf ("<img src = \" images / wq.gif \ " border = \ 0 "\ ">"); break;} WHITE_KING caso: { printf ("<img src = \" images / wk.gif \ " border = \ 0 "\ ">"); break;} BLACK_PAWN caso: { printf ("<img src = \" images / bp.gif \ " border = \ 0 "\ ">"); break;} caso BLACK_KNIGHT: { printf ("<img src = \" images / bn.gif \ " border = \ 0 "\ ">"); break;} BLACK_BISHOP caso: { printf ("<img src = \" images / bb.gif \ " border = \ 0 "\ ">"); break;} caso BLACK_ROOK: { printf ("<img src = \" images / br.gif \ " border = \ 0 "\ ">"); break;} Trabalhando com o Pieces 149 caso BLACK_QUEEN: { printf ("<img src = \" images / bq.gif \ " border = \ 0 "\ ">"); break;} BLACK_KING caso: { printf ("<img src = \" images / bk.gif \ " border = \ 0 "\ ">"); break;} caso EMPTY_SQUARE: { printf ("<img src=\"images/blank.gif\" border=\"0\">"); break;} default: { printf ("<img src=\"images/blank.gif\" border=\"0\">");} } / / End essa célula da tabela printf ("</ td> \ n"); / / Mude a cor if ($ currColor == "# E4B578") { CurrColor $ = "# B88645"; } outro { CurrColor $ = "# E4B578"; } } / / End essa linha da tabela printf ("</ tr> \ n"); / / Mude a cor if ($ currColor == "# E4B578") {

Page 134: Programação de jogos em PHP

CurrColor $ = "# B88645"; } outro { CurrColor $ = "# E4B578"; } } 150 Capítulo 7 Jogando com ■ Xadrez e bancos de dados / / Fim da mesa printf ("</ table>"); printf ("</ td> <td align = \" center \ "valign = \" meio \ " width = \ "100 \"> STUFF DATABASE AQUI </ td> </ tr> </ table> "); WriteTableFooter (); } O DrawBoard () função usa um global: o próprio conselho. Ele contém dois loops: uma é para percorrer as linhas do tabuleiro ea outra é para percorrer as colunas da bordo. Uma vez que você estiver usando uma matriz unidimensional para armazenar o estado do tabuleiro, você necessidade de calcular a linha e coluna. Para fazer isso você multiplicar a linha que você está de pelo número de colunas que você tem, que neste caso é 8. Então você adicionar a coluna que você está atualmente, e isto lhe dará o seu índice adequado para a sua matriz. Uma vez você tem este índice é possível recuperar a peça que está nessa posição e desenhá-la no bordo. Depois de uma coluna é feito, ele muda as cores dos quadrados e repete para todas as linhas e colunas. Os resultados deste deve ser semelhante a Figura 7.2. Figura 7.2 Resultados da sua função render. Recebendo a entrada do usuário e modificar o banco de dados 151 Agora que você tem a shell básico do jogo, vamos dar a entrada do usuário, armazená-lo em um banco de dados, atualizar a placa e as "coisas DATABASE AQUI" seção. Recebendo a entrada do usuário e Modificando o banco de dados Para recuperar movimentos desejados do usuário que você precisa para manter o controle de algumas coisas. Uma delas é que por sua vez do jogador que é. Lembre-se do mundial gCurrentPlayer $ variável que você criou quando começou este jogo? Isso é o que você irá usar para manter o controle do jogador. Você vai querer ter em sua entrada do usuário em um local central para a sua programação, e então você vai deseja atualizar a placa para que o usuário pode ver visualmente o que está acontecendo. função ProcessInput () { gBoard global $, $ gCurrentPlayer; if ($ _POST ['fromSquare'] == "")

Page 135: Programação de jogos em PHP

retorno; / / Pega o de e para a praça $ FromSquare obterCasa = ($ _POST ["fromSquare"]); $ ToSquare obterCasa = ($ _POST ["toSquare"]); / / Pega a peça a ser movida $ Parte = $ gBoard [$ fromSquare]; if (($% pedaço 2)! gCurrentPlayer = 0 & & $ == "branco") { printf ("Não é a sua vez"); retorno; } / / Move a peça MovePiece ($ fromSquare, toSquare $, $ parte); / / Atualiza o banco de dados UpdateMoveList ($ _POST ["fromSquare"], $ _POST ["toSquare"]); / / Muda o jogador atual if ($ gCurrentPlayer == "branco") { $ GCurrentPlayer = "black"; 152 Capítulo 7 Jogando com ■ Xadrez e bancos de dados } outro { $ GCurrentPlayer = "branco"; } / / Loja da placa atualizado na sessão $ _SESSION ['GBoard'] = $ gBoard; $ _SESSION ['GCurrentPlayer'] = $ gCurrentPlayer; } função obterCasa ($ strSquare) { $ Col = substr ($ strSquare, 0, 1); $ Linha = substr ($ strSquare, 1, 1); switch ($ col) { caso "a": {$ coluna = 0; break;} caso "b": {$ coluna = 1; break;} caso "c": {$ col = 2; break;} caso "d": {$ coluna = 3; break;} caso "e": {$ col = 4; break;} caso "f": {$ col = 5; break;} caso "g": {$ col = 6; break;} caso "h": {$ col = 7; break;} } switch ($ row) { caso "8": {$ linha = 0; break;} caso "7": {$ linha = 1; quebrar;} case "6": {$ linha = 2; break;} case "5": {$ linha = 3; break;}

Page 136: Programação de jogos em PHP

"4" caso: {$ linha = 4; break;} case "3": {$ linha = 5; break;} case "2": {$ linha = 6; break;} case "1": {$ linha = 7; break;} } return ($ linha * 8 + $ col); } Recebendo a entrada do usuário e modificar o banco de dados 153 A função ProcessInput () primeiro recupera o quadrado que você está se movendo de e quadrada que você está se movendo para usando o obterCasa () função. O obterCasa (função) Obtém a linha ea coluna que o usuário inseriu usando o substr () função. A coluna é o primeiro caractere na string, ea linha é o segundo personagem na seqüência. Vez que o branco está no fundo e branco sempre se move em primeiro lugar, você precisa virar o tabuleiro para obter os números adequados. Isso é o que as duas declarações são usadas para mudar. O primeiro instrução switch refere uma carta a um número de coluna. A instrução switch segunda inverte a ordem das linhas. A declaração de retorno é o cálculo exato que você usou na o DrawBoard () função. Após a praça de origem e destino da praça são recuperadas você precisa verificar para ver se o usuário atual é ainda permitido mover a peça que ele está tentando se mover. Se não for por sua vez que você deixá-lo saber. Você pode determinar se é a vez de branco ou não, porque a peça número que você definiu no arquivo pieces.php são todos, mesmo para brancos e estranho para negros. Assim se você executar um módulo por dois na peça atual eo resultado é zero, então é por sua vez branco, caso contrário, é a vez de negro. O último passo para fazer uma jogada é mover o peça no tabuleiro, atualizar o banco de dados, switch ligar o leitor atual, e atualizar o dados da sessão. O UpdateMoveList () função recebe dois argumentos: o da praça e os de quadrados. Esta é a função que insere as informações no banco de dados. Dê uma olhada nisso: UpdateMoveList função ($ fromSquare, $ toSquare) { $ Data = $ fromSquare + "-" + $ toSquare; / / Abre o banco de dados $ Db = dba_open ("chess.db", "c", "db3"); if (! $ db)

Page 137: Programação de jogos em PHP

{ dba_close (); $ Db = dba_open ("chess.db", "w", "db3"); if (! $ db) { printf ("Impossível abrir o banco de dados."); WriteTableFooter (); } } / / Agora que o banco de dados é aberta, você precisa encontrar a chave disponível seguinte $ NextID = 0; $ Key = dba_firstkey ($ db); while ($ chave! = false) 154 Capítulo 7 Jogando com ■ Xadrez e bancos de dados { if ($ key> $ NextID) { NextID $ = $ chave; } $ Key = dba_nextkey ($ db); } $ NextID + + / / Esta é a chave mais próximo disponível $ Dba_insert ($ NextID, serialize ($ data), $ db); / / Fechar o banco de dados dba_close ($ db); } A primeira coisa UpdateMoveList () faz é criar uma string com os dados que você deseja inserir para o arquivo. Então ele cria um novo banco de dados chamado chess.db. Se chess.db já existe, então ele abre-o com leitura / gravação. Para inserir os dados no banco de dados que você precisa encontrar a primeira chave disponível. Para fazer isso você deve percorrer o banco de dados e encontrar os últimos chave e adicionar um. Depois de feito isso você pode inserir seu registro e fechar o banco de dados. Agora que você está armazenando as jogadas em um banco de dados você obviamente vai querer mostrar ao usuário a história se mover. Para fazer isso você vai querer usar o <IFRAME> </ IFRAME> tag e aponte o página de origem para uma página PHP nova chamada move.php. Aqui está o arquivo move.php todo: <? Php / / Mostra os movimentos na página $ Db = dba_open ("chess.db", "r", "db3"); / / Pega o primeiro registro $ Key = dba_firstkey ($ db); $ Move = 1; / / Percorre todo o banco de

Page 138: Programação de jogos em PHP

while ($ chave! = false) { $ Valor = dba_fetch ($ key, $ db); $ Entrada = unserialize ($ value); printf ($ movimentar $ entrada "<BR>". ""...); $ Key = dba_nextkey ($ db); $ Move + +; Recebendo a entrada do usuário e modificar o banco de dados 155 } dba_close ($ db); ?> Agora que você tem a página para mostrar os movimentos que você terá de editar o seu DrawBoard () função para escrever as <IFRAME> </ IFRAME> tag. Tudo que você precisa fazer é especificar a fonte página para o quadro de embutidos, a largura ea altura, assim: printf ("<IFRAME src = \" move.php \ "width = \" 200 \ " height = \ "300 \"> Não é possível exibir histórico de movimentação </ IFRAME> ").; Esta linha deve ir para onde você originalmente tinha o "STUFF DATABASE AQUI" linha. O resultados de todas as suas trabalho duro são mostrados na Figura 7.3. Nota Neste ponto, você deve ir em seu arquivo php.ini e vire display_errors para fora. A razão para esta é porque você só quer mostrar os erros durante a depuração, caso contrário você terá de alerta avisos por todo o lugar que realmente não afetam o jogo. Figura 7.3 Resultados de usar o banco de dados. 156 Capítulo 7 Jogando com ■ Xadrez e bancos de dados Conclusão Este jogo está longe de terminar. Há tantos elementos mais você poderia acrescentar, como o computador AI, mover, validação e rede de apoio, os quais seriam grandes recursos para o seu jogo. No entanto, você cobriu uma grande quantidade de informações contidas neste capítulo. Você aprendeu o que um banco de dados não-relacional é, como criar um banco de dados não-relacional, como modificar um banco de dados, algumas noções básicas de programação de xadrez, e, por cima de tudo isso, você criou um jogo de xadrez básico com suporte a banco de dados para mostrar o histórico de movimentação. Embora existam várias elementos que você poderia acrescentar para melhorar o jogo de xadrez, você completou uma fantástica trabalho de criar um jogo de xadrez muito legal básico. Próximo passo: trabalhar com gráficos dinâmicos. capítulo 8 GD Gráficos Visão global

Page 139: Programação de jogos em PHP

■ O que é GD? ■ Instalar GD ■ Criando uma imagem ■ Formas Com base na lona ■ A manipulação da informação da cor ■ Adicionando texto em imagens ■ Redimensionar Imagens GD B outell da biblioteca é uma ótima ferramenta que lhe fornece formas de manipular gráficos em tempo real. Neste capítulo você vai aprender exatamente isso. Você vai começar por aprender a criar imagens e desenhar formas simples na tela. Então você vai aprender a manipular as informações de cor de uma imagem, adicionar texto a uma imagem, e, finalmente, como redimensionar uma imagem. Este conhecimento permitirá que você adicionar gráficos interessantes sobre o voar para o seu jogo on-line. O que é GD? GD é uma biblioteca C gráfica que permite criar e manipular. Jpegs,. Pngs, e . Wbmps. O que você diria? Não há suporte para. Gifs? Isso está correto. Costumava haver um GD biblioteca lá fora ao mesmo tempo que apoiaram o formato de arquivo. gif, mas desde Unisys (empresa que detém a patente sobre LWZ compressão que. utilizar gifs) mudou seu licenciamento acordos, GD parou de apoiar o formato de arquivo. gif. Isso pode mudar nos próximos 157 158 Capítulo 8 ■ GD Gráfica Visão ano, porque Boutell (a empresa que faz a biblioteca GD) é o planejamento para apoiar. gifs assim que a patente expira. Enquanto isso, não tenha medo porque. Pngs suporte todos os recursos de um gif. (como foi discutido no Capítulo 3). Instalação de GD Apenas no caso de você perdeu instalar a biblioteca GD quando você era a criação de PHP, eu vou rapidamente passar por isso novamente. Além disso, vou mostrar-lhe um pedaço pequeno grande de código que você pode usar para carregar a biblioteca dinamicamente. Para instalar o GD em uma instalação Linux ou UNIX você terá que recompilar o PHP com a opção - with-gd. Você também pode compilar a biblioteca GD como um objeto compartilhado para que você possa carregar a biblioteca GD dinamicamente sempre que você precisar. Para fazer isso você usaria a - With-gd = opção compartilhada. Então, para carregar na biblioteca dinamicamente em tempo de execução, você use a seguinte linha de código: dl ('gd.so');

Page 140: Programação de jogos em PHP

Para instalar o GD na plataforma Windows, você precisará copiar o php_gd2.dll que veio com o pacote de instalação para o diretório de extensões especificado no arquivo php.ini. Então você precisará editar o arquivo php.ini e descomente a seguinte linha: extension = php_gd2.dll Isto irá permitir acesso à biblioteca GD. Se você gostaria de carregar a extensão dinamicamente com script poderá fazê-lo com a seguinte linha de código: dl ('php_gd2.dll'); C Aution , A fim de carregar dinamicamente uma extensão, o arquivo de arquivo objeto compartilhado (UNIX) ou a dll (Windows) deve estar no diretório de extensões especificado no arquivo php.ini. Se não for, então o carregamento do extensão falhará e nenhuma das funções estarão disponíveis para o seu jogo. Vamos dizer que você não sabe se o servidor estiver hospedando seus arquivos em um UNIX ou Windows servidor. Você pode criar um script de carga dinâmica que vai funcionar em qualquer plataforma muito facilmente. Basta dar uma olhada no seguinte código: <? Php if (! extension_loaded ('gd')) { if (strtoupper (substr (PHP_OS, 3)) == "WIN") { dl ('php_gd2.dll'); Instalando GD 159 } outro { dl ('gd.so'); } } ?> Este pedaço de código pouco útil funcionará para qualquer exemplo de extensão isto só acontece a ser para a biblioteca GD. O primeiro passo é ver se a extensão já está carregado. Se o extensão é carregada então por que você quer fazer qualquer outra coisa? Se, no entanto, a extensão não é carregada, então você vai precisar determinar qual plataforma você está e carregar o arquivo apropriado. Para determinar o que o script PHP OS está vivendo em você vai precisar usar o PHP_OS constante. Isso retorna as informações sobre o sistema operacional atual. Se você estiver em uma Plataforma Windows os três primeiros caracteres da string será "WIN". Se você não encontrar

Page 141: Programação de jogos em PHP

a string "WIN" no PHP_OS constante é seguro assumir que você está em uma plataforma UNIX. Depois de saber que plataforma você está você pode dinamicamente carregar a extensão que você deseja usando a função dl (). Agora que você tem a extensão carregado corretamente é hora de testar para ver se é realmente ali. A maneira mais fácil de fazer isso é usar a função phpinfo (). Lembra quando você costumava isso no Capítulo 2? Você terá que executar esse script mesmo teste novamente e olhar para uma seção na página que se parece com a Figura 8.1. Figura 8.1 Resultados da função phpinfo (). 160 Capítulo 8 ■ GD Gráfica Visão Criando e usando uma nova imagem Para criar novas imagens, GD oferece duas funções. Ambas estas funções possuem dois argumentos, largura e altura, e ambos retornam um recurso para a imagem. ■ imagecreate (largura, altura) ■ imagecreatetruecolor (largura, altura) GD também oferece funções para criar imagens a partir de arquivos existentes, mas você vai aprender sobre estes mais adiante neste capítulo. Primeiro dar uma olhada no imagecreate () função. Nota Um recurso a uma imagem é apenas o bloco de memória em que a imagem está sendo armazenada. Em PHP você trabalho na memória para manipular imagens em vez de uma GUI, como o Paint Shop Pro. Imagecreate () cria uma nova imagem em branco com o número de largura de pixels de largura, e altura número de pixels de altura. A paleta de cores que imagecreate () usa ao criar uma imagem é uma paleta de cor indexada, o que significa que o número de cores na paleta será 256. Lembre-se no capítulo 3, quando os tipos de imagem e compressões foram discutidos? O indexados paleta de cores utiliza uma tabela de pesquisa de cores para determinar a cor específica. Estes tipos de imagens são realmente bons para as imagens que usam cores planas ou de texto e eles são especialmente bons com formas simples. Você pode salvar estas imagens como. Png arquivos, e se já suporta o GD Formato de arquivo. Gif de novo, você será capaz de salvá-los como arquivos. Gif. C Aution Se você salvar uma imagem de 8 bits (também referida como uma imagem de paleta de cores indexadas) como um jpeg. Você acabar com tamanhos de arquivo muito grande e imagens manchadas. Dê uma olhada em um exemplo para a criação de uma imagem em branco: <? Php

Page 142: Programação de jogos em PHP

if (! extension_loaded ('gd')) { if (strtoupper (substr (PHP_OS, 3)) == "WIN") { dl ('php_gd2.dll'); } outro { dl ('gd.so'); Como utilizar as cores 161 } } $ ImageResource = imagecreate (100, 100); ?> Você tem agora uma imagem na memória que é de 100 pixels de largura e 100 pixels de altura. Agora você pode operar nesta imagem utilizando várias funções fornecidas pelo GD. Antes de entrar nesses funções, no entanto, dar uma olhada muito rápida no imagecreatetruecolor () função. A função imagecreatetruecolor () também tem uma largura e altura e também retorna um recurso a uma imagem na memória. No entanto, tem uma diferença fundamental: ele cria uma imagem com uma paleta de cores verdadeiras em vez de uma paleta de cor indexada. Isso faz com que esta função ideal para a criação de gráficos complexos com muitos elementos diferentes neles. Você usaria esta função para criar imagens. jpeg. Você também pode salvar a imagem como png., Mas será salva como um arquivo png true-color. invés de uma cor indexada. png. Agora que você sabe como criar um recurso de imagem, você vai querer saber como editar este recurso. Como utilizar as cores Antes que você possa realmente começar a desenhar formas geométricas em todo o lugar, é necessário o capacidade de selecionar e usar a cor. Há oito funções básicas para a cor, como se segue: ■ imagecolorallocate (resource image, int vermelho, verde int, int blue) ■ imagefill (resource image, int x, int y, int cor) ■ imagecolortransparent (resource image, cor, int) ■ imagetruecolortopalette (recurso de imagem, bool dither, cores int) ■ imagecolorstotal (resource image) ■ imagecolorat (resource image, int x, int y) ■ imagecolorsforindex (resource image, int index) ■ ImageColorSet (resource image, índice de int, int vermelho, verde int, int blue) Cada uma destas funções tem um recurso de imagem como seu primeiro argumento. Agora dar uma mais aprofundada

Page 143: Programação de jogos em PHP

olhar para cada uma destas funções para ver como você vai ser capaz de usá-las para manipular as cores em sua tela. Cores alocar a uma imagem Imagecolorallocate () recebe quatro argumentos: um recurso de imagem, um valor para a quantidade de vermelho que deveria ser na cor, um valor para a quantidade de verde que deve ser na cor, 162 Capítulo 8 ■ GD Gráfica Visão e um valor para a quantidade de azul que deve ser na cor. Se você nunca usou RGB (Vermelho, verde, azul) valores antes, cada elemento da cor tem uma faixa de 0 a 255; sendo 0 o nível mais baixo e 255 sendo o nível mais alto. Digamos que você queria alocar uma cor que foi completamente preto. Você poderia escrever uma linha de código que é semelhante ao seguinte: $ Preto = imagecolorallocate ($ someImageResource, 0, 0, 0); O que isso significa, essencialmente, é que você vai ser capaz de usar o preto $ variável como uma cor em o recurso de imagem especificada. Se você estava trabalhando com duas imagens simultaneamente, então você não seria capaz de usar a variável $ preto em ambas as imagens. Você pode usar apenas as cores que você atribuir a uma imagem específica. Se isso parece um pouco confuso, dê uma olhada no seguinte exemplo de código e espero que ela vai tornar as coisas um pouco mais claro: <? Php / / Cria duas imagens $ Imagem1 = imagecreate (100, 100); $ Image2 = imagecreate (100, 200); / / Alocar as cores a serem usadas $ Preto = imagecolorallocate ($ image1, 0, 0, 0); / / Isso é legal para fazer ImageRectangle ($ image1, 6, 6, 66, 42, $ preto); / / Isso é ilegal fazer porque o preto não é atribuída à imagem ImageRectangle ($ image2, 6, 6, 66, 42, $ preto); ?> Preenchimento da Imagem O imagefill () função também tem quatro argumentos: um recurso de imagem, um ponto x de partida, imagefill um ponto de partida y, e as cores para preencher. () faz um preenchimento de toda a imagem começando nas coordenadas especificadas. Uma vez que esta função preenche toda a imagem não existe necessidade de especificar qualquer coordenar outros além (0, 0). Dê uma olhada no seguinte exemplo: <? Php $ Imagem = imagecreate (100, 100);

Page 144: Programação de jogos em PHP

$ Vermelho = imagecolorallocate ($ image, 255, 0, 0); Imagefill ($ imagem, 0, 0, $ vermelho); / / Mostra a nossa imagem header ("Content-type: image / png"); Imagepng ($ imagem); Imagedestroy ($ imagem); ?> Dê uma olhada na Figura 8.2 para ver os resultados de usar o imagefill () função. Como utilizar as cores 163 Figura 8.2 Resultados de usar o imagefill () função. Você poderia ter especificado qualquer (x, y) coordenar e você teria recebido exatamente o mesmo resultados. Não se preocupe muito com o código de mostrar agora, que será posteriormente coberto em neste capítulo. Definição de sua cor transparente Se você estiver usando um formato de imagem que suporta transparências, como. Png, você pode definir a cor que você quer aparecer como transparente usando o imagecolortransparent () função . (Figura 8.3) imagecolortransparent () recebe dois argumentos: o recurso de imagem, e a cor que você deseja tornar transparente. Para alocar uma cor para ser transparente você ainda usar o imagecolorallocate () função. Para entender isso melhor, dê uma olhada no código abaixo. No exemplo a seguir um círculo vermelho é desenhado sobre um fundo escuro e depois o cor vermelha é transparente e feito a mesma imagem é desenhada novamente. <? Php $ Imagem = imagecreate (128, 128); $ Preto = imagecolorallocate ($ imagem, 0, 0, 0); $ Vermelho = imagecolorallocate ($ image, 255, 0, 0); / / Faz o fundo preto Imagefill ($ imagem, 0, 0, $ preto); / / Desenha o círculo Imagefilledarc (imagem $, 64, 64, 110, 110, 0, 360, $ vermelho, IMG_ARC_PIE); / / Mostra a nossa Imagem Cheio Imagepng ($ imagem, "redcircle.png"); / / Faz o vermelho transparente Imagecolortransparent ($ imagem, $ vermelho); 164 Capítulo 8 ■ GD Gráfica Visão / / Mostra a nossa Imagem Transparente Imagepng ($ imagem, "transparentcircle.png"); Imagedestroy ($ imagem); ?> <HTML> <HEAD>

Page 145: Programação de jogos em PHP

<TITLE> Teste de Imagem </ TITLE> </ HEAD> <BODY> <img src="redcircle.png"> <img src="transparentcircle.png"> </ BODY> </ HTML> C Aution Você vai precisar para mudar as permissões na pasta que contém redcircle.png, a fim de usar o exemplo. Basta adicionar leitura / gravação de permissões para o usuário IUS_ (MACHINENAME), sob a segurança guia para a pasta. Figura 8.3 Usando cores transparentes. Como utilizar as cores 165 Como isso é legal? Você está rapidamente se tornando um especialista em gráficos em PHP. Novamente, não se preocupe sobre o código de mostrar ainda, eu prometo que você vai chegar a ele mais adiante neste capítulo. Convertendo uma imagem true-color para uma imagem de paleta Converter uma imagem não é tão complicado quanto parece. Por uma questão de fato, isso é muito fácil usando o imagetruecolortopalette () função. imagetruecolortopalette () recebe três argumentos, a primeira das quais é o recurso de imagem. O segundo é um valor Boolean se ele estiver definido para verdade, então dithering será usado, caso contrário dithering não será usado. O terceiro argumento é o número de cores que deve aparecer na paleta de cores da nova imagem. Você pode usar esta função para converter um. Imagem jpeg em imagem de cor indexada, mas o declínio na qualidade da imagem seria muito perceptível. A razão mais lógica para uso esta função seria se você tiver um. imagem png que usa apenas, digamos, 16 cores, mas foi salvos como uma imagem true-color, por algum motivo estranho. Dê uma olhada no seguinte exemplo: <? Php / / Pega a imagem que precisa ser convertido $ Imagem = imagecreatefromjpeg ('truecolorimage.png'); / / Agora converta a imagem, pois é só usando 16 cores que você só precisa especificar 16 cores Imagetruecolortopalette ($ imagem, é verdade, 16); / / Salva a imagem Imagepng ($ imagem, 'convertedimage.png'); ?> Veja, você converteu uma imagem existente de uma imagem true-color para uma imagem de cor indexada

Page 146: Programação de jogos em PHP

e salva-lo como uma nova imagem tudo em três linhas de código. Eu disse que não era tão complicado como parecia. Fazer algumas experiências com esta função em várias imagens diferentes ver os efeitos. Converter um arquivo. Foto jpeg usando dithering, e depois fazer a mesma coisa sem usando dithering para ver as diferenças dramáticas. Cores contagem em uma imagem Para obter o número total de cores em uma imagem, você pode usar imagecolorstotal (). Imagecolorstotal () recebe um argumento: o recurso de imagem para o qual você deseja contar o número de cores. <? Php / / Obtém uma imagem $ Imagem = imagecreatefromjpeg ('somegraphic.png'); / / Agora contar as cores nesta imagem 166 Capítulo 8 ■ GD Gráfica Visão $ TotalColors imagecolorstotal = ($ imagem); echo ("Existem" $ totalColors "cores nesta imagem"..); ?> C Aution O imagecolorstotal (função) funciona apenas com imagens de cores indexadas. Recuperando uma cor em um Ponto O imagecolorat () função recebe três argumentos: o recurso de imagem, um ponto x, e um y ponto. imagecolorat () irá retornar o índice da cor na especificada (x, y) pixel. Uma vez você tem esse índice você pode usar o imagecolorsforindex () função para recuperar o vermelho, componentes verde e azul da cor específica. <? Php $ Imagem = imagecreatefromjpeg ('someimage.jpg'); $ ColorIndex = imagecolorat ($ image, 100, 20); $ ColorArray imagecolorsforindex = ($ imagem, $ ColorIndex); $ Vermelho = $ colorArray ['red']; $ $ ColorArray verde = ["verde"]; $ Azul = $ colorArray ['azul']; echo ("Vermelho:" $ vermelho "<br> Verde:" $ verde "<br> Azul:"..... $ azul); ?> C Aution O imagecolorat () funciona apenas com imagens de cores verdadeiras. O imagecolorsforindex () função recebe dois argumentos: um recurso de imagem e uma cor índice. Em seguida, retorna uma matriz com o vermelho individual, verde, azul e componentes em cada índice. Depois de ter estes componentes você poderia usar o imagecolorallocate () função alocar uma cor para uma imagem, ou você poderia usar o ImageColorSet () para

Page 147: Programação de jogos em PHP

uma mudança de cor em uma imagem. O ImageColorSet () função recebe cinco argumentos. O primeiro é o recurso de imagem que você quer operar, o segundo é o índice da cor que você quiser mudar, o terceiro argumento é o componente vermelho, o quarto é o componente verde, ea quinta e última argumento é o componente azul. Desenhando formas básicas em sua tela Esvaziar 167 Desenhando formas básicas em sua tela vazia Você já sabe como criar uma tela de imagem que você pode desenhar, e você também sabe como alocar, manipular, e contar as cores em uma imagem. Agora você vai aprender a desenhar formas geométricas em sua tela vazia. T ip Se você já trabalhou com DirectX que você pode pensar o recurso de imagem como um tampão que você desenha em. Quando você exibir a imagem que você pode pensar que, como blitting o buffer para a tela. A única diferença é que você não faça isso quadro por. Para desenhar qualquer coisa em suas imagens você precisa de um sistema de coordenadas. GD usa um cartesiano sistema de coordenadas onde o ponto (0, 0) está no canto superior esquerdo da imagem. Movendo para a direita ao longo do eixo x você vai passar na direção x positiva. Em movimento para baixo ao longo do eixo y você vai passar na direção y positivo. Você nunca vai usar um negativo x ou y coordenar quando se trabalha com imagens. Cada uma das oito funções geométricas disponíveis no GD pega um ou mais conjuntos de coordenadas. Você irá rever cada uma das oito funções em detalhes, de modo a poeira fora de todos os aulas de geometria antiga e prepare-se. Aqui estão as oito funções geométricas, a fim de mais fácil para o mais difícil: ■ ImageSetPixel (resource image, int x, int y, int cor) ■ imageline (resource image, int x1, int y1, int x2, int y2, cor int) ■ ImageRectangle (resource image, int x1, int y1, int x2, int y2, cor int) ■ ImageFilledRectangle (resource image, int x1, int y1, int x2, int y2, cor int) ■ imagepolygon (imagem de recursos, pontos de matriz, numberOfPoints int, int cor) ■ ImageFilledPolygon (imagem de recursos, pontos de matriz, numberOfPoints int, int cor) ■ imagearc (recurso de imagem, int centerXPoint, int centerYPoint, int width, int altura, int startDegree, int endDegree, cor int) ■ imagefilledarc (recurso de imagem, int centerXPoint, int centerYPoint, int width, int altura, int startDegree, int endDegree, int cor, estilo, int)

Page 148: Programação de jogos em PHP

Pixels e linhas ImageSetPixel () recebe quatro argumentos: o primeiro é o recurso de imagem, o segundo é o x ponto, o terceiro é o ponto de y, eo quarto argumento é a cor. O ImageSetPixel () função desenha um único pixel no ponto (x, y) na cor especificada. Dê uma olhada no seguinte exemplo: <? Php $ Imagem = imagecreate (320, 200); 168 Capítulo 8 ■ GD Gráfica Visão $ Color = imagecolorallocate ($ image, 254, 254, 254); Imagefill ($ imagem, $ cor); for ($ iLoop = 0; $ iLoop <1000; $ iLoop + +) { $ Color = imagecolorallocate ($ imagem, rand ()% 256, rand ()% 256, rand ()% 256); ImageSetPixel ($ imagem, rand ()% 320, rand ()% 200, $ cor); } header ("Content-type: image / png"); Imagepng ($ imagem); Imagedestroy ($ imagem); ?> Este exemplo gera uma imagem de 320 200, definição de 1000 pixels aleatórios em uma cor aleatória toda a tela. Você usa a função random para gerar um número aleatório e em seguida, executar um módulo em que o número de mantê-lo entre os limites especificados da tela tamanho. Dê uma olhada na Figura 8.4 para ver os resultados do código. Agora que você pode desenhar pixels na tela, vamos lidar com uma função que é um pouco mais prática. O imageline () função desenha uma linha para a tela. Leva seis argumentos. O primeiro é o recurso à imagem à qual você está desenhando a linha. O segundo eo terceiro argumentos são as coordenadas iniciais da linha. O quarto e quinto argumentos são os terminando coordenadas da linha. O argumento final é a cor que você deseja que a linha ser elaborado dentro <? Php $ Imagem = imagecreate (320, 200); $ White = imagecolorallocate ($ image, 255, 255, 255); $ Preto = imagecolorallocate ($ imagem, 0, 0, 0); Imagefill ($ imagem, $ branco); Imageline ($ imagem, 5, 5, 40, 100, $ preto); header ("Content-type: image / png"); Imagepng ($ imagem); Imagedestroy ($ imagem); ?>

Page 149: Programação de jogos em PHP

Neste exemplo, primeiro crie uma imagem que é 320 200 pixels de largura. Então você alocar duas cores, branco e preto. Você enche a tela com a cor branca para a sua tela é agora todos brancos. Então você traçar uma linha do ponto (5, 5) ao ponto (40, 100) em preto e saída a imagem para o navegador. Desenhando formas básicas em sua tela Esvaziar 169 Figura 8.4 Geração de 1000 pixels aleatórios. Figura 8.5 Desenho uma linha. De Linhas de retângulos ImageRectangle () pega os mesmos quatro parâmetros como o imageline () função, exceto em vez do ponto de partida de uma linha e um ponto final de uma linha, é o canto superior esquerdo do retângulo e do canto inferior do lado direito do retângulo. <? Php $ Imagem = imagecreate (320, 200); 170 Capítulo 8 ■ GD Gráfica Visão $ White = imagecolorallocate ($ image, 255, 255, 255); $ Preto = imagecolorallocate ($ imagem, 0, 0, 0); Imagefill ($ imagem, $ branco); ImageRectangle ($ imagem, 5, 5, 100, 100, $ preto); header ("Content-type: image / png"); Imagepng ($ imagem); Imagedestroy ($ imagem); ?> Os resultados deste exemplo são mostrados na Figura 8.5. Mas não seria melhor dar o retângulo de partida (x, y) coordenar e uma largura e uma altura que você gostaria que o retângulo a ser? Você pode criar uma função que faz exatamente isso. <? Php MyRectangle função ($ imagem, $ x1, $ y1, $ largura, $ altura, $ cor) { / / Primeiro você precisa calcular os valores de x2 e y2 $ X2 = $ x1 + $ largura; $ $ Y1 y2 = + $ altura; / / Agora, desenhe o retângulo ImageRectangle ($ imagem, $ x1, $ y1, x2 $, $ y2, $ cor); } $ Imagem = imagecreate (320, 200); $ White = imagecolorallocate ($ image, 255, 255, 255); $ Preto = imagecolorallocate ($ imagem, 0, 0, 0); Imagefill ($ imagem, $ branco); MyRectangle ($ imagem, 5, 5, 95, 95, $ preto); header ("Content-type: image / png"); Imagepng ($ imagem); Imagedestroy ($ imagem);

Page 150: Programação de jogos em PHP

?> Os resultados deste exemplo a aparência da Figura 8.6, mas a função é muito mais intuitiva. Eu recomendo que quando você ver uma maneira de fazer uma função mais simples, criando o seu próprio, então fazê-lo. Qualquer momento que você pode fazer um código que faz mais sentido quando você lê -lo, você deve fazê-lo. Desenhando formas básicas em sua tela Esvaziar 171 Figura 8.6 O ImageRectangle () função. ImageFilledRectangle () funciona exatamente como ImageRectangle (), exceto que ela cria um retângulo preenchido. ImageFilledRectangle () pega os mesmos seis parâmetros como ImageRectangle (). Dê uma olhar para o exemplo de código seguinte para ver o MyFilledRectangle () função: <? Php MyFilledRectangle função ($ imagem, $ x1, $ y1, $ largura, $ altura, $ cor) { / / Primeiro você precisa calcular os valores de x2 e y2 $ X2 = $ x1 + $ largura; $ $ Y1 y2 = + $ altura; / / Agora, desenhe o retângulo ImageFilledRectangle ($ imagem, $ x1, $ y1, x2 $, $ y2, $ cor); } $ Imagem = imagecreate (320, 200); $ White = imagecolorallocate ($ image, 255, 255, 255); $ Preto = imagecolorallocate ($ imagem, 0, 0, 0); Imagefill ($ imagem, 0, 0, $ branco); MyFilledRectangle ($ imagem, 5, 5, 100, 100, $ preto); header ("Content-type: image / png"); Imagepng ($ imagem); Imagedestroy ($ imagem); ?> Os resultados do código acima são mostrados na Figura 8.7. 172 Capítulo 8 ■ GD Gráfica Visão Figura 8.7 O MyFilledRectangle () função. De retângulos de Polígonos Como mencionado anteriormente, os conceitos de cada forma geométrica vai ficar progressivamente mais difícil. No entanto, desenhando um polígono não é tão complicado. A principal diferença entre o desenho de um polígono e desenho de um retângulo é o número de coordenadas do função irá tomar. Até agora você tem lidado apenas com funções que recebem uma coordenada (X, y). O imagepolygon () função recebe as coordenadas múltiplos. Ele também leva o número de

Page 151: Programação de jogos em PHP

pontos que estão em seu polígono. Quando o imagepolygon () função desenha o polígono que conecta cada ponto com uma linha. Imagepolygon () recebe quatro argumentos. O primeiro é, naturalmente, o recurso à imagem. O próximo argumento é um array que contém todas as coordenadas para o ponto do polígono. O O terceiro argumento é um inteiro dizendo imagepolygon () quantas vértices estão em seu polígono. O quarto e último argumento é a cor em que você deseja que o seu polígono a ser desenhado. Digamos que você queria desenhar um triângulo na sua tela. Você precisaria de três conjuntos de coordenadas. Você pode armazenar essas coordenadas em um array, por exemplo: $ Pontos = array (50, 10, 20, 40, 80, 40); Isto dá-lhe cada canto do triângulo. Agora você precisa calcular quantos pontos existem no polígono dado. Com um triângulo é simples, não são, obviamente, três pontos. Mas o que você faria para uma forma mais complexa? Bem, já que há dois elementos no cada ponto, você pode dividir o tamanho da matriz por 2 para obter o número de pontos na polígono. $ Vértices = sizeof ($ pontos) / 2; Desenhando formas básicas em sua tela Esvaziar 173 Lembre-se na última seção que eu disse quando você ver uma maneira de tornar o código um pouco mais simples, fazê-lo. Bem, e se você criou uma função que levou três argumentos em vez de quatro para criar um polígono? Isso seria ótimo, não é? Você poderia economizar fazendo o número de cálculo vértices cada vez que você queria desenhar um polígono. <? Php MyPolygon função ($ imagem, $ pontos, $ cor) { / / Calcula o número de vértices do polígono $ Vértices = sizeof ($ pontos) / 2; / / Desenha o polígono para a tela Imagepolygon ($ imagem, $ pontos, vértices $, $ cor); } ?> Eu sei que não parece muito agora, mas o que se você estivesse constantemente desenhar polígonos e você teve que refazer esse cálculo divisão estúpida a cada vez? Dê uma olhada no seguinte exemplo para ver como desenhar um polígono: <? Php MyPolygon função ($ imagem, $ pontos, $ cor)

Page 152: Programação de jogos em PHP

{ / / Calcula o número de vértices do polígono $ Vértices = sizeof ($ pontos) / 2; / / Desenha o polígono para a tela Imagepolygon ($ imagem, $ pontos, vértices $, $ cor); } $ Pontos = array (50, 10, 20, 40, 80, 40); $ Imagem = imagecreate (320, 200); $ White = imagecolorallocate ($ image, 255, 255, 255); $ Preto = imagecolorallocate ($ imagem, 0, 0, 0); Imagefill ($ imagem, 0, 0, $ branco); MyPolygon ($ imagem, $ pontos, $ preto); header ("Content-type: image / png"); Imagepng ($ imagem); Imagedestroy ($ imagem); ?> Os resultados deste exemplo pode ser visto na Figura 8.8. 174 Capítulo 8 ■ GD Gráfica Visão Figura 8.8 Desenho de um polígono com a Imagepolygon () função. O ImageFilledPolygon () função recebe os mesmos parâmetros que o imagepolygon () função, mas em vez de desenhar um esboço do polígono ele desenha uma versão preenchido da polígono. Aqui é uma função modificada para o ImageFilledPolygon () função: <? Php MyFilledPolygon função ($ imagem, $ pontos, $ cor) { / / Calcula o número de vértices do polígono $ Vértices = sizeof ($ pontos) / 2; / / Desenha o polígono para a tela ImageFilledPolygon ($ imagem, $ pontos, vértices $, $ cor); } ?> A partir de polígonos para Arcos e Elipses Wow, você está rapidamente se tornando um mestre em criar on-the-fly imagens com GD. Depois que você aprender a criar arcos e elipses, você vai passar a colocar texto dinâmico em seu gráficos e, finalmente, você vai dar uma olhada mais aprofundada em como exibir e salvar o seu on-the-fly imagens. GD oferece uma função chamada imagearc () para criar, assim, arcos. Esta função recebe uma gritante oito argumentos. O primeiro é o recurso à imagem. Os próximos dois argumentos são o ponto central x para o arco eo ponto central y para o arco. A quarta e

Page 153: Programação de jogos em PHP

quinta argumentos são a largura desejada do arco, e depois a altura desejada do arco. O sexto argumento é o grau de partida para o arco. O sétimo argumento é o fim grau para o arco. O oitavo e último argumento é a cor que você gostaria que o arco a aparecer dentro Desenhando formas básicas em sua tela Esvaziar 175 Nota O imagearc () função desenha no sentido horário. O imagearc () função coloca 0 graus em três horas, 90 graus às seis horas, 180 graus às nove horas, e 270 graus em doze horas. Apesar de documentação sobre www.php.net diz que o imagearc (função) chama a anti-horário, ele realmente chama no sentido horário. Dê uma olhada em como você usaria o imagearc () função e os resultados. <? Php $ Imagem = imagecreate (320, 200); $ White = imagecolorallocate ($ image, 255, 255, 255); $ Preto = imagecolorallocate ($ imagem, 0, 0, 0); Imagefill ($ imagem, 0, 0, $ branco); Imagearc ($ imagem, 50, 30, 90, 90, 0, 220, $ preto); header ("Content-type: image / png"); Imagepng ($ imagem); Imagedestroy ($ imagem); ?> O exemplo de código acima desenha um arco que é de 90 pixels de largura e 90 pixels de altura, com a sua ponto central em (50, 30). Ela começa na marca de grau 0 e termina na marca de 220 graus. Dê uma olhada na Figura 8.9 para ver os resultados do código acima. Figura 8.9 O imagearc () função. 176 Capítulo 8 ■ GD Gráfica Visão O imagefilledarc (função) se comporta da mesma maneira como a função imagearc (). Ele também chama seu arco a partir de três horas e indo no sentido horário. Mas o Imagefilledarc (função) recebe um argumento adicional. O argumento nono, depois de cor, é o estilo em que o arco deve ser desenhado. Você também pode usar um bit a bit OR para combinar estilos. Dê uma olhada no que os estilos são e como eles afetam o arco. ■ IMG_ARC_PIE. Desenha um gráfico de pizza arco de estilo com linhas contínuas ligando o centro apontam para as bordas do arco. ■ IMG_ARC_CHORD. Desenha um triângulo que liga os pontos inicial e final do arco. ■ IMG_ARC_NOFILL. Se esta opção for usada, ela se comporta como a função imagearc (). ■ IMG_ARC_EDGED. Conecta os pontos finais do arco ao seu centro.

Page 154: Programação de jogos em PHP

Vamos usar cada um destes individualmente em um exemplo de código e ter um olhar para os resultados assim que você saber como cada estilo afeta o resultado do seu arco. <? Php $ Imagem1 = imagecreate (320, 200); $ Image2 = imagecreate (320, 200); $ Image3 = imagecreate (320, 200); $ Image4 = imagecreate (320, 200); $ Branco1 = imagecolorallocate ($ image1, 255, 255, 255); $ White2 = imagecolorallocate ($ image2, 255, 255, 255); $ White3 = imagecolorallocate ($ image3, 255, 255, 255); $ White4 = imagecolorallocate ($ image4, 255, 255, 255); $ Black1 = imagecolorallocate ($ image1, 0, 0, 0); $ Black2 = imagecolorallocate ($ image2, 0, 0, 0); $ Black3 = imagecolorallocate ($ image3, 0, 0, 0); $ Black4 = imagecolorallocate ($ image4, 0, 0, 0); Imagefill (image1 $, $ branco1); Imagefilledarc ($ image1, 50, 30, 90, 90, 0, 220, $ Black1, IMG_ARC_PIE); Imagepng ($ imagem1 ", pie.png"); Imagedestroy ($ imagem1); Imagefill ($ image2, white2 $); Imagefilledarc ($ image2, 50, 30, 90, 90, 0, 220, $ Black1, IMG_ARC_CHORD); Imagepng ($ imagem2 ", chord.png"); Imagedestroy ($ imagem2); Desenhando formas básicas em sua tela Esvaziar 177 Imagefill ($ image3, $ white3); Imagefilledarc ($ image3, 50, 30, 90, 90, 0, 220, $ black3, IMG_ARC_NOFILL); Imagepng ($ image3 ", nofill.png"); Imagedestroy ($ image3); Imagefill (image4 $, $ white4); Imagefilledarc ($ image4, 50, 30, 90, 90, 0, 220, $ black4, IMG_ARC_EDGED); Imagepng ($ image4 ", edged.png"); Imagedestroy ($ image4); ?> <table border="1" cellpadding="2" cellspacing="2"> <tr> <td align="left" valign="top"> <img src="pie.png"> </ td> <td align="left" valign="top"> <img src="chord.png"> </ td> </ Tr> <tr> <td align="left" valign="top"> IMG_ARC_PIE </ td> <td align="left" valign="top"> IMG_ARC_CHORD </ td> </ Tr> <tr> <td align="left" valign="top"> <img src="nofill.png"> </ td> <td align="left" valign="top"> <img src="edged.png"> </ td> </ Tr> <tr> <td align="left" valign="top"> IMG_ARC_NOFILL </ td> <td align="left" valign="top"> IMG_ARC_EDGED </ td>

Page 155: Programação de jogos em PHP

</ Tr> </ Table> Isso produz a tela que você vê na figura 8.10. A uma forma óbvia geométricas faltando GD é uma função para criar uma elipse. Ou é isso? Você pode usar o imagearc () e imagefilledarc () para criar uma elipse. Tudo o que você tem que fazer é especificar um grau inicial de 0 e terminando um grau de 360. Isto irá criar uma elipse completa. Por exemplo: <? Php $ Imagem = imagecreate (320, 200); $ White = imagecolorallocate ($ image, 255, 255, 255); $ Preto = imagecolorallocate ($ imagem, 0, 0, 0); Imagefill ($ imagem, $ branco); Imagearc (imagem $, 50, 40, 70, 40, 0, 360, $ preto); 178 Capítulo 8 ■ GD Gráfica Visão header ("Content-type: image / png"); Imagepng ($ imagem); Imagedestroy ($ imagem); ?> Isto gera uma elipse que se parece com a Figura 8.11. Figura 8.10 O imagefilledarc () função. Figura 8.11 Criando uma elipse. Criando imagens com texto 179 Criando imagens com texto 179 Criando Imagens com Texto Você viu como GD pode lidar com a geometria de desenho sobre a tela, mas o que se tem algum texto que deseja colocar dinamicamente em seu gráfico? GD oferece três funções principais para fazer isso. São eles: ■ imagestring (resource image, fontNumber int, int x, int y seqüência de texto, cor int) ■ imagettftext (resource image, int tamanho, ângulo de int, int x, int y, int cor string, fontfile, string texto) ■ imagettfbbox (int tamanho ângulo, int, string fontfile, string texto); O imagestring () função é bastante simples. Leva seis parâmetros. O primeiro é o recurso à imagem. O segundo é um número de fontes, 1-5, que usa uma fonte built-in para escrever seu texto. O terceiro e quarto argumentos são o local que você deseja que o texto para iniciar em. O quinto argumento é o texto que você deseja exibir. O argumento final é a cor em que você deseja que o texto a ser exibido. Este é o mais simples de todas as três fontes funções e dá-lhe o mínimo de flexibilidade. <? Php $ Imagem = imagecreate (320, 200);

Page 156: Programação de jogos em PHP

$ White = imagecolorallocate ($ image, 255, 255, 255); $ Preto = imagecolorallocate ($ imagem, 0, 0, 0); Imagefill ($ imagem, $ branco); Imagestring ($ imagem, 1, 10, 10, "Text Font Em 1", $ preto); Imagestring ($ imagem, 2, 10, 30, "Text Font Em 2", $ preto); Imagestring ($ imagem, 3, 10, 50, "Texto Em Fonte 3", $ preto); Imagestring ($ imagem, 4, 10, 70, "Text Font Em 4", $ preto); Imagestring ($ imagem, 5, 10, 90, "Text Font Em 5", $ preto); header ("Content-type: image / png"); Imagepng ($ imagem); Imagedestroy ($ imagem); ?> O exemplo de código acima passa por cada tamanho da fonte que pode ser processado pelo Imagestring () função. Figura 8.12 mostra os resultados do código. Como você pode ver, não é um fonte muito bonita.  

Criando imagens com texto 179 Criando Imagens com Texto Você viu como GD pode lidar com a geometria de desenho sobre a tela, mas o que se tem algum texto que deseja colocar dinamicamente em seu gráfico? GD oferece três funções principais para fazer isso. São eles: ■ imagestring (resource image, fontNumber int, int x, int y seqüência de texto, cor int) ■ imagettftext (resource image, int tamanho, ângulo de int, int x, int y, int cor string, fontfile, string texto) ■ imagettfbbox (int tamanho ângulo, int, string fontfile, string texto); O imagestring () função é bastante simples. Leva seis parâmetros. O primeiro é o recurso à imagem. O segundo é um número de fontes, 1-5, que usa uma fonte built-in para escrever seu texto. O terceiro e quarto argumentos são o local que você deseja que o texto para iniciar em. O quinto argumento é o texto que você deseja exibir. O argumento final é a cor em que você deseja que o texto a ser exibido. Este é o mais simples de todas as três fontes funções e dá-lhe o mínimo de flexibilidade. <? Php $ Imagem = imagecreate (320, 200); $ White = imagecolorallocate ($ image, 255, 255, 255); $ Preto = imagecolorallocate ($ imagem, 0, 0, 0); Imagefill ($ imagem, $ branco); Imagestring ($ imagem, 1, 10, 10, "Text Font Em 1", $ preto); Imagestring ($ imagem, 2, 10, 30, "Text Font Em 2", $ preto); Imagestring ($ imagem, 3, 10, 50, "Texto Em Fonte 3", $ preto); Imagestring ($ imagem, 4, 10, 70, "Text Font Em 4", $ preto);

Page 157: Programação de jogos em PHP

Imagestring ($ imagem, 5, 10, 90, "Text Font Em 5", $ preto); header ("Content-type: image / png"); Imagepng ($ imagem); Imagedestroy ($ imagem); ?> O exemplo de código acima passa por cada tamanho da fonte que pode ser processado pelo Imagestring () função. Figura 8.12 mostra os resultados do código. Como você pode ver, não é um fonte muito bonita. 180 Capítulo 8 ■ GD Gráfica Visão Figura 8.12 Adicionando texto com o Imagestring () função. A função mais útil para a renderização de fontes para a sua tela é imagettftext (). O Imagettftext (função) leva oito argumentos. O primeiro é o recurso à imagem, o O segundo argumento é o tamanho em que você deseja processar o texto. O terceiro argumento é o ângulo em que você deseja processar o texto. Isso permitirá que você processar para os lados do texto, na diagonal, e mesmo de cabeça para baixo, é realmente um argumento divertido para brincar. O quarto e quinto argumentos são os (x, y) de coordenadas que deseja que o texto para iniciar em. O sexto argumento é a cor que você deseja processar a fonte polegadas O sétimo argumento é a fonte True Type que pretende utilizar, e o argumento final é o texto que você quer para processar. O imagettftext () retorna um array com oito elementos que representam os quatro pontos que fazem a bounding caixa do texto. Dê uma olhada na Tabela 8.1 para ver o índice aponta para que no ponto. T ip Bounding Box Coordenadas Índice em Descrição da Matriz Posição 0 Lower x esquerda. Um baixo, à esquerda posição y. 2 Lower direita x posição. 3 direita inferior posição y. 4 x posição superior direita. 5 posições y superior à direita. 6 x posição superior esquerda. 7 posições y superior esquerdo. Tabela 8.1 * Você começa no canto inferior esquerdo e trabalhar sua maneira sentido anti-horário ao redor da caixa.

Page 158: Programação de jogos em PHP

Por padrão, imagettftext () processa anti-aliased texto. Se você gostaria que a fonte a ser processado como aliased texto que você precisa colocar um sinal "-" (menos) na frente da cor. Criando imagens com texto 181 Agora, tente tornar um texto em uma fonte legal tipo True. Estou usando o Matisse ITC para este exemplo. <? Php $ Imagem = imagecreate (500, 200); $ White = imagecolorallocate ($ image, 255, 255, 255); $ Preto = imagecolorallocate ($ imagem, 0, 0, 0); Imagefill ($ imagem, 0, 0, $ branco); Imagettftext imagem ($, 36, 0, 0, 80, $ preto, "matisse_.ttf", "Texto Anti-alias fresco !!!"); Imagettftext (imagem $, 36, 0, 0, 150, - $ negro ", matisse_.ttf", "Texto Aliased fresco !!!"); header ("Content-type: image / png"); Imagepng ($ imagem); Imagedestroy ($ imagem); ?> C Aution Seja executado corretamente, o arquivo de fonte deve estar localizado no mesmo diretório que seu arquivo PHP. Neste exemplo, eu prestados tanto o texto anti-aliased texto e alias para lhe mostrar a diferença. Os resultados são mostrados na Figura 8.13. Como você pode ver, o texto alias é muito irregulares em torno das bordas e não muito bonita. Imagino que haverá muito poucos casos em que você usar a fonte aliased. Figura 8.13 Rendering de texto com o imagettftext () função. 182 Capítulo 8 ■ GD Gráfica Visão C Aution Há um bug na biblioteca GD no PHP 4.2. O bug fará imagettftext () para lançar um erro. Isso não deve ser um problema desde o PHP 5 foi lançado. Se você ainda está usando PHP 4.2, upgrade! Eu sei que você está dizendo, "Cool, mas e se eu quero fazer alguns efeitos de fonte, como o relevo?" Você pode fazer isso com imagettftext () também. Ele só requer alguma colocação cuidadosa de cores e texto. Tomemos o exemplo mesmo que você acabou de fazer, mas acrescentar mais algumas linhas de código para ele. <? Php $ Imagem = imagecreate (500, 200); $ White = imagecolorallocate ($ image, 255, 255, 255); $ Preto = imagecolorallocate ($ imagem, 0, 0, 0); $ Cinza = imagecolorallocate ($ image, 155, 155, 155); Imagefill ($ imagem, $ branco);

Page 159: Programação de jogos em PHP

Imagettftext imagem ($, 36, 0, 2, 81, $ preto, "matisse_.ttf", "texto fresco Embossed !!!"); Imagettftext imagem ($, 36, 0, 0, 79, $ branco ", matisse_.ttf", "texto fresco Embossed !!!"); Imagettftext imagem ($, 36, 0, 0, 80, $ cinza ", matisse_.ttf", "texto fresco Embossed !!!"); header ("Content-type: image / png"); Imagepng ($ imagem); Imagedestroy ($ imagem); ?> O primeiro passo para criar o efeito que você vê na figura 8.14 é tornar a borda preta em torno do texto. Para fazer isso que você acabou de adicionar 1 ao (x, y) de coordenadas. Em seguida, você quer tornar o texto mais uma vez com branco para criar uma separação entre o cinza eo preto. Para fazer isso, você subtraia 1 do (x, y) de coordenadas. O passo final é tornar o texto em cinza no especificado (x, y) de coordenadas. A função de texto final de aprender é o imagettfbbox () função. Esta função leva quatro argumentos. O primeiro é o tamanho da fonte, então o ângulo, seguido pelo True Type Font arquivo, e, por fim, o texto que você deseja processar. imagettfbbox () retorna uma matriz com os caixa delimitadora do texto. Esta é uma função extremamente útil quando você precisa fazer certeza de que o texto que você vai render é dentro da imagem, a menos que você não se importa de corte seu texto fora no meio da frase. A matriz retornada é ordenado exatamente o mesmo que o imagettftext () matriz função. Ele começa no canto inferior esquerdo da caixa e trabalha o seu caminho em torno de um sentido anti-horário moda. Criando imagens com texto 183 Figura 8.14 Criando efeitos de texto legal com o Imagettftext () função. Agora crie uma função para colocar em nosso arquivo common.php que irá calcular a largura e altura da caixa delimitadora para o texto. Sua função também precisa tomar quatro argumentos, mas você vai querer voltar dois inteiros. Portanto, sua função vai realmente precisa tomar seis argumentos. <? Php função MyTTFBox ($ size, $ ângulo, fontfile $, $ texto, & $ largura, & $ altura) { / / Pega a caixa delimitadora $ ArrBox imagettfbbox = ($ tamanho, $ ângulo, fontfile $, $ texto);

Page 160: Programação de jogos em PHP

/ / Agora calcular a largura ea altura da caixa $ Width = abs ($ arrBox [6] - $ arrBox [2]); $ Height = abs ($ arrBox [7] - $ arrBox [3]); } $ MyWidth = 0; $ MyHeight = 0; MyTTFBox (36, 0, "matisse_.ttf", "Texto em relevo fresco !!!", myWidth $, $ myHeight); echo ("A caixa delimitadora é de R $ myWidth pixels por pixels $ myHeight."); ?> 184 Capítulo 8 ■ GD Gráfica Visão O MyTTFBox () função tem os mesmos quatro argumentos como o imagettfbbox () função mais dois argumentos, o mais largura ea altura. A largura ea altura são passados por referência, o que significa que qualquer coisa que muda essas variáveis em função também afetar os resultados das variáveis que foram passados dentro Dê uma olhada na Figura 8.15 para ver o resultados de sua nova função. Salvar suas imagens Todos os exemplos que você já viu o uso de imagepng () e imagejpeg (). Estes dois funções são usadas para guardar as imagens em um arquivo e renderizar imagens para o navegador. Há um terceira função chamada imagewbmp () que processa e salva arquivos de WBMP. Todos os três destes funções possuem dois argumentos. O primeiro é necessário: o recurso à imagem. O segundo argumento é opcional, você pode especificar um nome de arquivo que você gostaria de salvar a imagem os dados. Apenas certifique-se que se você salvar um arquivo que você use a extensão adequada. Não tente salvar um arquivo. png ao usar o imagejpeg () e vice-versa. / / Isso salva um arquivo PNG Imagepng ($ imagem, "myimage.png"); / / Isso salva um arquivo JPEG Imagejpeg ($ imagem, "myimage.jpg"); / / Isso salva um arquivo WBMP Imagewbmp (imagem $ ", myimage.wbmp"); Figura 8.15 O MyTTFBox () função. Usando imagens existentes 185 Se você quiser tornar a imagem diretamente para o navegador que você deve especificar um tipo de conteúdo. Você pode fazer isso usando o construído em PHP header () função. Para renderizar uma png. Você tem que especificar um tipo de conteúdo image / png. Para renderizar uma jpeg. Você tem que especificar um tipo de conteúdo de image / jpg. Para renderizar uma WBMP você tem que especificar um tipo de conteúdo de imagem / wbmp. / / Isso torna um PNG para o browser

Page 161: Programação de jogos em PHP

header ("Content-type: image / png"); Imagepng ($ imagem); / / Isso torna um JPEG para o navegador header ("Content-type: image / jpg"); Imagejpeg ($ imagem); / / Isso torna um WBMP para o navegador header ("Content-type: image / wbmp"); Imagewbmp ($ imagem); Usando imagens existentes Ao longo deste capítulo você viu como criar imagens, cores usar, desenhe geométricas formas para a tela, e processar texto às suas imagens. Agora você vai aprender a usar imagens existentes para criar novas imagens. Existem seis funções básicas que você irá usar. O dois primeiros são a base do uso de imagens já existentes para fazer novas imagens. ■ imagecreatefromjpeg (string filename) ■ imagecreatefromjpeg (string filename) Cada uma dessas funções retorna um recurso a uma imagem. Você não pode criar uma imagem de um WBMP, somente a partir. pngs e. jpegs. / / Pega um recurso a uma imagem existente $ Imagem = imagecreatefromjpeg ("someimage.png"); Depois de ter aberto um arquivo e recuperados um recurso que você pode copiar, redimensionar resample, ou mesclar a imagem com outra imagem com as seguintes funções: ■ imagecopy (recurso destinationImage, recursos sourceImage, int desinationX, destinationY int, int sourceX, int sourceY, int sourceWidth, int sourceHeight) ■ imagecopyresized (recurso destinationImage, recursos sourceImage, int desinationX, int destinationY, int sourceX, int sourceY, int destinationWidth, int destinationHeight, int sourceWidth, int sourceHeight) ■ imagecopyresampled (recurso destinationImage, recursos sourceImage, int desinationX, int destinationY, int sourceX, int sourceY, int destinationWidth, destinationHeight int, int sourceWidth, int sourceHeight) 186 Capítulo 8 ■ GD Gráfica Visão ■ imagecopymerge (recurso destinationImage, recursos sourceImage, int destinationX, destinationY int, int sourceX, int sourceY, int sourceWidth, int sourceHeight, int por cento) Eu incluí duas imagens no CD chamado dragon.jpg e frame.jpg. Você vai usar estas imagens para criar uma nova imagem usando o imagecopy () função. As imagens aparecem em Figura 8.16. Agora você vai copiar dragon.jpg para frame.jpg usando o imagecopy () função. <? Php / / Pega os nossos recursos de imagem $ Dragão = imagecreatefromjpeg ("dragon.jpg");

Page 162: Programação de jogos em PHP

$ Frame = imagecreatefromjpeg ("frame.jpg"); / Copiar / dragão em quadro Imagecopy ($ frame, $ dragão, 21, 31, 0, 0, 477, 462); / / Salva a imagem e mostrá-la Imagejpeg (frame $, "frameDragon.jpg"); echo ("<img src=frameDragon.jpg>"); ?> Figura 8.16 Imagens para uso no imagecopy () função. Usando imagens existentes 187 Eu vou quebrar cada elemento do imagecopy () função neste exemplo. O primeiro argumento é a imagem de destino, que neste caso é de R $ frame. O segundo argumento é o imagem de origem, que é de R $ dragão. O próximo argumento é o pixel que deseja colocar o imagem de origem em na imagem de destino. Uma vez que o quadro termina na coordenada (21, 31), que é onde você quer colocar a imagem de origem. O próximo argumento é o que você quer pixels para pegar a imagem em. Desde que a imagem do dragão se encaixa perfeitamente dentro da moldura, você acabou de pegar que começando na coordenada (0, 0). As alegações finais são a largura ea altura da imagem de origem. Uma vez que o dragão se encaixa perfeitamente dentro da moldura, você pode especificar o largura e altura reais da imagem. Mas e se o dragão foi o mesmo tamanho que o frame? Se ambas as imagens eram do mesmo tamanho, você teria que fazer um pouco de matemática para obter o mesmo resultados da Figura 8.17. Você gostaria de primeiro pegar a imagem de origem do mesmo ponto você estava colocando a imagem. No exemplo acima, seria (0, 0). Então você teria que quero subtrair esse valor da largura total e altura da imagem. No exemplo acima, seria (456, 431). Assim, o imagecopy new () linha ficaria assim: Imagecopy ($ frame, $ dragão, 21, 31, 0, 0, 456, 431); Figura 8.17 Copiando uma imagem com o imagecopy () função. 188 Capítulo 8 ■ GD Gráfica Visão Então agora você sabe como copiar uma imagem que seja do mesmo tamanho ou menor que o imagem de destino. Mas e se você quiser copiar uma imagem que é maior do que o destino imagem? Você usaria o imagecopyresized () ou imagecopyresampled () funções. A bom exemplo seria a de tomar a imagem framedDragon.jpg que você acabou de criar e criar de 100 100 miniatura da imagem. <? Php

Page 163: Programação de jogos em PHP

/ / Pega os nossos recursos de imagem $ Imagem = imagecreatefromjpeg ("frameDragon.jpg"); / / Cria uma imagem true color 100x100 $ Thumb = imagecreatetruecolor (100, 100); / Copiar / dragão em quadro Imagecopyresized ($ thumb, $ imagem, 0, 0, 0, 0, 100, 100, imagesx ($ imagem), Imagesy ($ imagem)); / / Salva a imagem e mostrá-la Imagejpeg ($ thumb ", thumbFrameDragon.jpg"); echo ("<img src=thumbFrameDragon.jpg>"); ?> Este começa da mesma forma que o último exemplo, fazendo com que o recurso a uma imagem existente. Então você cria uma imagem true-color novo que é de 100 100 pixels. Agora você copiar a imagem Polegar $ imagem para a imagem de destino $. Os argumentos sétimo e oitavo são o destino largura da imagem e da altura. Os argumentos são nono e décimo a origem da imagem do largura e altura. Neste exemplo você usa o imagesx () e imagesy () funções que retornam a largura ea altura do recurso de imagem. Uma lista completa de todas as funções de imagem pode ser encontrada no Apêndice D. Dê uma olhada na Figura 8.18 para ver os resultados do exemplo acima. Figura 8.18 Usando o Imagecopyresized () função. Usando imagens existentes 189 Mencionei anteriormente neste capítulo que a função imagecopyresized () ea Imagecopyresampled (função) fazer a mesma coisa. Bem, tecnicamente eles fazem a mesma coisa, mas com uma diferença menor. Após as cópias função imagecopyresampled () e redimensiona a imagem, ele também resamples-lo. Os resultados são uma nítida imagem mais limpa,. No código próximos exemplo, você irá redimensionar a imagem usando imagecopyresized () e depois imagecopyresampled (). Depois que eles são redimensionados você vai salvá-los e comparar os resultados. <? Php / / Pega os nossos recursos de imagem $ Imagem = imagecreatefromjpeg ("frameDragon.jpg"); / / Cria uma imagem true color 100x100 $ Thumb = imagecreatetruecolor (250, 250); $ Thumb2 = imagecreatetruecolor (250, 250); / Copiar / dragão em quadro Imagecopyresized ($ thumb, $ imagem, 0, 0, 0, 0, 250, 250, imagesx ($ imagem), Imagesy ($ imagem));

Page 164: Programação de jogos em PHP

Imagecopyresampled ($ Thumb2, $ imagem, 0, 0, 0, 0, 250, 250, imagesx ($ imagem), Imagesy ($ imagem)); / / Salva a imagem e mostrá-la Imagejpeg ($ thumb ", thumbFrameDragon1.jpg"); Imagejpeg ($ Thumb2 ", thumbFrameDragon2.jpg"); echo ("<img src=thumbFrameDragon1.jpg> <img src=thumbFrameDragon2.jpg>"); ?> Os resultados do exemplo de código são mostrados na Figura 8.19. A diferença é perceptível. A imagem superior é aquele feito com imagecopyresized (). Tem um pouco de artifacting e parece muito granulada em comparação com a imagem de fundo, que foi criado com imagecopyresampled (). Então, por que você nunca usa imagecopyresized ()? Bem, a única razão que eu posso pensar é velocidade. Mas desde que você não está batching uma tonelada de imagens de uma só vez, assim como você pode usar o Imagecopyresampled () função sempre que a velocidade não é uma preocupação. Afinal, você quer ficar os melhores resultados você pode possivelmente. A função final é olhar para o imagecopymerge () função. Esta função se comporta exatamente como o imagecopy (função), com uma diferença muito importantes. O parâmetro extra (int por cento) diz a imagem opaca como a imagem deve estar na imagem de destino. Este permite a criação de alguns fundos fresco ou imagens translúcidas. 190 Capítulo 8 ■ GD Gráfica Visão Figura 8.19 Resultados do Imagecopyresized () [top] e Imagecopyresampled () [baixo] funções. Vamos mesclar a nossa imagem para uma imagem de dragão branco com opacidade 20%. Isto permitirá que a maioria dos do branco para mostrar através durante a exibição de uma imagem fraca do dragão. <? Php / / Pega os nossos recursos de imagem $ Dragão = imagecreatefromjpeg ("dragon.jpg"); / / Cria uma imagem true color branco $ WhiteImage = imagecreatetruecolor (512, 512); $ White = imagecolorallocate ($ whiteImage, 255, 255, 255); $ Preto = imagecolorallocate ($ whiteImage, 0, 0, 0); $ Cinza = imagecolorallocate ($ whiteImage, 155, 155, 155); Imagefill ($ whiteImage, 0, 0, $ branco); Utilizando 191 imagens existentes / Copiar / dragão em quadro

Page 165: Programação de jogos em PHP

Imagecopymerge ($ whiteImage, $ dragão, 0, 0, 0, 0, imagesx ($ dragão), imagesy ($ dragão), 20); Imagettftext ($ whiteImage, 36, 45, 201, 257, $ preto, "matisse_.ttf", "Dragon !!!"); Imagettftext ($ whiteImage, 36, 45, 199, 254, $ branco ", matisse_.ttf", "Dragon !!!"); Imagettftext ($ whiteImage, 36, 45, 200, 256, $ cinza ", matisse_.ttf", "Dragon !!!"); / / Mostra a nova imagem header ("Content-type: image / jpeg"); Imagejpeg ($ whiteImage); Imagedestroy ($ whiteImage); ?> Os resultados de todas as suas trabalho duro são mostrados na Figura 8.20. Figura 8.20 Os resultados do seu trabalho duro! 192 Capítulo 8 ■ GD Gráfica Visão Conclusão É isso aí! Você está agora oficialmente um mestre imagem dinâmica em PHP. Você aprendeu a criar imagens indexadas e de cores verdadeiras. Você também aprendeu como alocar as cores para uma imagem. Você se tornou um deus em desenhar formas dinâmicas para o seu telas vazias. Você também aprendeu como gerar texto a partir de uma fonte True Type e usá-lo em sua imagem. Finalmente, você aprendeu como usar imagens existentes para a sua vantagem para criar alguns gráficos muito bacana,. Próximo passo: criar um jogo chamado Battle Tank e criando terreno para a nova dinâmica tanque jogo! Capítulo 9  

Capítulo 9   Criando Battle Tank e Usando Terrain dinâmico ■ Battle Tank Planejamento ■ Criando os gráficos ■ Criando a lógica do jogo ■ Criando Terrain dinâmico Y ou já se tornaram um mestre do uso de gráficos. Você também se tornaram muito bom no uso de HTML em conjunto com o PHP. Neste capítulo, você irá criar uma Batalha Tanque jogo. Lembre-se no início dos anos 90 wh en um jogo incrível chamado Scorched Terra foi lançado? Bem, Tank Batalha será a sua versão do jogo. Você está pronto? Planejamento Battle Tank

Page 166: Programação de jogos em PHP

Antes que você acabou de entrar e começar a codificação que você precisa para planejar como você deseja que o seu jogo para estudar e trabalhar. Desde que você deseja criar um remake Scorched Earth, você vai precisar de dois gráficos tanque. Você vai precisar de algum tipo de condições de concorrência equitativas. Você precisará ser capaz de entrada um ângulo e velocidade de modo que você pode tentar matar o seu oponente. Tudo isso é apenas o que o usuário verá. Não tem nada a ver com a lógica do jogo. Então o que você precisa para a lógica do jogo? Bem, você vai precisar de algum tipo de cálculo para o seu balas. Você vai precisar de detectar se o adversário tiver sido atingido. Se o adversário foi atingido você precisa dizer ao usuário se ele ganhou ou perdeu. Você também precisa ser capaz de controlar o computador. Se o computador não foi atingido, então o computador começa a calcular uma mover e disparar contra o adversário. 193 194 Capítulo 9 ■ Criando Battle Tank e usando Terrain dinâmico Você também vai precisar para determinar que jogo estados que você terá. Um bom começo é assumir que você vai precisar de três estados do jogo. Os três estados padrão de jogo que você deve ter são: ■ A partir do jogo ■ jogo a correr ■ Game Over Se você precisar de mais estados jogo você pode adicioná-los mais tarde, mas por agora vamos supor que esses são os três que você vai precisar. Este parece ser um bom começo. Agora você deve determinar o que os gráficos você vai precisar. Antes que você comece a criar dinâmicas terreno que você deve criar o jogo com todas as imagens estáticas. Você vai querer definir uma imagem para seus tanques, uma imagem para o seu terreno, e uma imagem para a explosão que irá ocorrer quando um tiro detona. Só para ter certeza isso é claro, você precisará definir o seguinte: ■ A imagem de Tanque # 1 ■ A imagem de Tanque # 2 ■ A imagem para o terreno ■ A imagem da explosão Quando você cria a explosão você vai querer criar uma animação. Gif. Dessa forma você terá um efeito pseudo de animação em tempo real. Você vai aprender como fazer isso na próxima seção deste capítulo, "Criando o Graphics." Desde que você estará fazendo cálculos que lidar com ângulo e velocidade que você vai precisar de algum

Page 167: Programação de jogos em PHP

mais ou menos constante para puxar para baixo a bala. Isso mesmo, a poeira fora todos aqueles antiga física livros, você terá de definir a gravidade. Se você precisar de qualquer outras constantes você pode adicioná-los mais tarde, assim como com os estados do jogo. Então, quais são os objectivos do jogo? Você quer gerar um jogo baseado em turnos que leva ângulo e velocidade como a entrada do usuário. Depois de ter o ângulo ea velocidade de calcular onde a explosão ocorrerá. Se você acertar o oponente, você ganha, se o adversário acertar você, então você perde. Depois de ter uma versão funcional do jogo que você vai querer voltar e adicionar terreno dinâmico com todos os seus conhecimentos gráficos newfound. Com base nesta descrição que você irá precisar de seis estados do jogo. Você vai usar os três que você já determinou mais três. ■ A partir do jogo ■ Menu de Jogo Jogo ■ Init ■ Jogo ■ Jogo Win ■ Game Over Criando a 195 Gráficos O estado do jogo começar o jogo diz para iniciar a sessão, em seguida, ir para o menu. Enquanto você estão no menu que está no estado menu do jogo. Uma vez que você clica para começar um novo jogo, que leva você para o estado do jogo init. Este não é um grande negócio para a primeira versão do jogo, mas ele vai vir a calhar quando você começar a gerar o terreno. Uma vez que você sair do jogo de inicialização estado que você entrar no estado de jogo. Este é o lugar onde você está fisicamente jogando esse jogo. Se você acertar o oponente, então você entrar no estado ganha jogo, onde você pode exibir uma fria "Você ganha" gráfico. Se você for atingido pelo adversário, então você entrar no jogo sobre o estado onde você vai colocar um gráfico dizendo que o jogador que perdeu. Muito simples, né? Tomar uma olhada na Figura 9.1 para ver uma imagem da tela do que o produto final deve ser semelhante ao vocês são todos completamente. Criando os gráficos Para a maior parte eu criei todos os gráficos para você e colocá-los no CD. Você tem dois gráficos tanque: uma para a esquerda e um tanque para o tanque direito. Eles são chamados

Page 168: Programação de jogos em PHP

tankLeft.gif e tankRight.gif no CD. Os gráficos tanque são mesmo tanque, mas um dos eles é um espelho de 180 graus do outro. Eles são ambos. Gif, porque eles têm uma forma transparente fundo, você poderia usar pngs, se quiser.. Os dois gráficos tanque será colocado na tela usando algumas folhas de estilo em cascata e um </ div> camada. Não se preocupe, eu vou explicar tudo isso quando você começa a codificação. Figura 9.1 A captura de tela de Battle Tank. 196 Capítulo 9 ■ Criando Battle Tank e usando Terrain dinâmico A parte seguinte do gráfico que será utilizado é o fundo do céu. O fundo do céu é chamado sky.jpg no CD. O gráfico céu é simplesmente um fundo azul com gradiente algumas nuvens fresco e um sol sobre ele. As nuvens são parcialmente opaco para lhes dar a transparência olhar. Para esta primeira versão do jogo eu criei um gráfico chamado terrain.jpg que também é incluído no CD. Terrain.jpg contém o fundo do céu com o solo pré-desenhadas sobre o fundo. Isso é essencialmente todos os gráficos que você vai trabalhar com para este primeira versão do jogo. Criando a lógica do jogo Aqui é onde você começa para baixo e sujo. Isto é onde você levar o seu plano e todos os seus gráficos e colocá-los a trabalhar, que é onde você realmente o código do jogo. O primeiro passo para tomar é decidir como você deseja colocar para fora sua tela. Lembre-se, você não tem que fazer esta exatamente como eu faço isso. Para esta versão terei a tela de jogo no topo da minha mesa e entrada do usuário na parte inferior da minha mesa. Este parece ser um layout lógico para mim, mas você pode se sentir livre para jogar com ele da maneira que quiser. Vou dar um passo adiante e quebrar o meu função de renderização em três funções: uma para a prestação do terreno, uma para a prestação dos tanques, e um para renderização da interface de usuário real. Vou chamá-los RenderTerrain (), RenderTanks (), e RenderInterface (). Vamos começar com o RenderTerrain () função. RenderTerrain função () { printf ("<borda da tabela = \" 0 \ "cellpadding = \" 0 \ "cellspacing = \" 0 \ "width = \" 700 \ " height = \ "450 \" bgcolor = \ "# 000000 \ ">"); printf ("<tr>"); printf ("<td align=\"left\" valign=\"top\">"); printf ("<img src=\"" TERRAIN_IMAGE "\" border=\"0\">..");

Page 169: Programação de jogos em PHP

printf ("</ td>"); printf ("</ tr>"); printf ("</ table>"); } Tudo o que o RenderTerrain () função faz é criar uma tabela que é de 700 pixels de largura e 450 pixels de altura e exibe o gráfico de terreno no meio da tabela. Repare que eu tenho o gráfico terreno definido como uma constante. Você começará a isso em breve. Dê uma olhada no RenderTanks () função. O propósito desta função é a posição os tanques sobre o fundo para fazê-los parecer que eles estão na cena. Para fazer Criando a lógica do jogo 197 isso você vai usar uma </ div> tag para cada tanque e especificar os pixels do topo e a partir da esquerda, onde o tanque deve aparecer. RenderTanks function () { gLeftTankLocation $ global; gRightTankLocation $ global; / / Get locais $ GLeftTankLocation _SESSION = $ ['gLeftTankLocation']; $ GRightTankLocation _SESSION = $ ['gRightTankLocation']; / / Esquerda tanque printf ("<div id = \" leftTank \ "style = \" position: absolute; esquerda: ". $ GLeftTankLocation ["x"]. "Px; top:". $ GLeftTankLocation ["y"]. "Px; \ ">"); printf ("<img src=\"" LEFT_TANK_IMAGE "\" border=\"0\">.."); printf ("</ div>"); / Tank / Direita printf ("<div id = \" rightTank \ "style = \" position: absolute; esquerda: ". $ GRightTankLocation ["x"]. "Px; top:". $ GRightTankLocation ["y"]. "Px; \ ">"); printf ("<img src=\"" RIGHT_TANK_IMAGE "\" border=\"0\">.."); printf ("</ div>"); } A primeira coisa a fazer nesta função é recuperar a matriz local da sessão para cada tanque. Em seguida, imprimir o tag HTML real a posição do tanque. Para posicionar o tanque absolutamente que você use uma folha de estilo em cascata. A folha de estilo em cascata é definido com o atributo de estilo. Você quer posicionar os tanques absolutamente usando o elemento de posição. Em seguida, você terá que especificar o número de pixels da esquerda do navegador e do parte superior do navegador. Você pode fazer isso com o elemento esquerdo e superior. style = "position: absolute; left: 200px; top: 200px;" Agora você pode renderizar o terreno e os tanques para a tela, mas você ainda não tem nenhuma maneira de obter a entrada do usuário. É aí que a RenderInterface () função vem dentro do RenderInterface ()

Page 170: Programação de jogos em PHP

função irá processar o formulário para o navegador por baixo do jogo. RenderInterface function () { printf ("<borda da tabela = \" 0 \ "cellpadding = \" 0 \ "cellspacing = \" 0 \ "width = \" 700 \ " bgcolor = \ "# 000000 \ ">"); printf ("<tr>"); printf ("<td align=\"right\" valign=\"top\" colspan=\"2\">"); 198 Capítulo 9 ■ Criando Battle Tank e usando Terrain dinâmico printf ("<b class=\"white\"> CONTROLE DE COMANDO </ b>"); printf ("</ td>"); printf ("</ tr>"); printf ("<tr>"); printf ("<td align=\"right\" valign=\"middle\">"); printf ("<b class=\"white\"> Angle: </ b>"); printf ("</ td>"); printf ("<td align=\"left\" valign=\"top\">"); printf ("<input type=\"text\" width=\"80\" name=\"angle\">"); printf ("</ td>"); printf ("</ tr>"); printf ("<tr>"); printf ("<td align=\"right\" valign=\"middle\">"); printf ("<b class=\"white\"> Velocidade: </ b>"); printf ("</ td>"); printf ("<td align=\"left\" valign=\"top\">"); printf ("<input type=\"text\" width=\"80\" name=\"velocity\">"); printf ("</ td>"); printf ("</ tr>"); printf ("<tr>"); printf ("<td align=\"left\" valign=\"top\">"); printf (""); printf ("</ td>"); printf ("<td align=\"left\" valign=\"middle\"> <br>"); printf ("<input type=\"submit\" name=\"btnFire\" value=\"FIRE!!!\">"); printf ("<br> </ td>"); printf ("</ tr>"); printf ("</ table>"); } Isso cria uma tabela que é de 700 pixels de largura, com um fundo preto. Ela coloca três elementos formam na tabela. O primeiro elemento de formulário é uma caixa de texto para recuperar o ângulo. O segundo elemento do formulário é uma caixa de texto para recuperar a velocidade. O elemento de formulário terceiro e último é uma Botão Enviar para que você possa dizer a seu tanque ao fogo. Que o faz para as funções de processamento para o jogo. Agora, dê uma olhada no define e o globals que o jogo irá utilizar. <? Php / / Jogo Estados

Page 171: Programação de jogos em PHP

Criando a lógica do jogo 199 define ("GAME_START", 0); define ("GAME_MENU", 1); define ("GAME_INIT", 2); define ("GAME_PLAY", 3); define ("GAME_WIN", 4); define ("game_over", 5); / / Constantes para o cálculo define ("Gravity", -9,8); / / m / s / s define ("PI", 3,14159); / / Imagens define ("TERRAIN_IMAGE", "imagens / terrain.jpg"); define ("LEFT_TANK_IMAGE", "imagens / tankLeft.gif"); define ("RIGHT_TANK_IMAGE", "imagens / tankRight.gif"); define ("EXPLOSION_IMAGE", "imagens / explosion.gif"); / / Globals global $ gGameState; gDifficulty $ global; gLeftTankLocation $ global; gRightTankLocation $ global; ?> Primeiro você define os estados jogo, então a constante de gravidade. Isso será usado na sua cálculos para a bala. Então você define todas as imagens que você irá usar. Para este primeiro iteração do jogo você terá apenas um nível de dificuldade, mas você deve adicionar o globais de qualquer maneira para que, quando você adicionar mais de um nível de dificuldade, o quadro já está lá. Agora que todos os globals e constantes são declaradas você pode passar para a StartGame () e EndGame () funções. O StartGame () irá iniciar a sessão e inicializar todas as variáveis para a sessão. O fim do jogo () função unset todas as variáveis e no final do sessão. StartGame função () { global $ gGameState; gDifficulty $ global; if ($ gGameState == GAME_START) { $ GGameState = GAME_MENU; } 200 Capítulo 9 ■ Criando Battle Tank e usando Terrain dinâmico / / Gerenciar a sessão session_start (); $ BSession _SESSION = $ ['bSession']; if (! isset ($ bSession)) {

Page 172: Programação de jogos em PHP

$ BSession = 1; $ _SESSION ['BSession'] = $ bSession; $ _SESSION ['GDifficulty'] = $ gDifficulty; } outro { / / Pega o estado do jogo atual $ GGameState _SESSION = $ ['gGameState']; } } EndGame função () { global $ gGameState; gDifficulty $ global; gLeftTankLocation $ global; gRightTankLocation $ global; unset ($ gGameState); unset ($ gDifficulty); unset ($ gLeftTankLocation); unset ($ gRightTankLocation); unset ($ turno); session_destroy (); } A primeira coisa que ocorre no StartGame () função é que o estado do jogo está ligado de GAME_START para GAME_MENU. Isso levará o usuário ao menu depois que a função foi concluída. Em seguida, a sessão é iniciada. Após a sessão é iniciada, o StartGame () função verifica para ver se esta é uma nova sessão ou uma sessão existente. Se a sessão é nova, ele define algumas variáveis. Se a sessão já existir, ele recupera o estado do jogo. O fim do jogo () função unsets todas as variáveis globais que foram usados durante todo o jogo e destrói a sessão atual. Esta é uma função útil, porque esta permite que o usuário iniciar um jogo completamente novo sem ter que fechar o navegador e abri-lo novamente. Uma vez que o jogador está descartado para o menu ele pode optar por começar um novo jogo. Quando um novo jogo é iniciado ele liga o Estado a GAME_INIT, onde o GameInit () função é Criando a lógica do jogo 201 chamado. Esta função é usada principalmente para colocar os tanques nas suas posições de partida e de mudar o estado do jogo para GAME_PLAY. GameInit function () { global $ gGameState; gLeftTankLocation $ global;

Page 173: Programação de jogos em PHP

gRightTankLocation $ global; / / Definir os locais de depósito de $ GLeftTankLocation = array ("x" => 42, "y" => 243); $ GRightTankLocation = array ("x" => 628, "y" => 172); $ _SESSION ['GLeftTankLocation'] = $ gLeftTankLocation; $ _SESSION ['GRightTankLocation'] = $ gRightTankLocation; $ GGameState = GAME_PLAY; } A localização exata dos tanques deve ser determinado com base em como você criou seu terreno. Para o terreno preset que eu estou usando nesta versão do jogo, deixou o tanque é de 42 pixels da esquerda do navegador e 243 pixels da parte superior do browser. O direito tanque é 628 pixels da esquerda do navegador e 172 pixels da parte superior do browser. Esses locais são importantes porque eles serão usados para determinar se um tanque foi atingida por uma bala ou não. Agora, dê uma olhada no circuito principal do jogo. Essa função é chamada cada vez que a página é carregado. Ele usa o estado do jogo atual para determinar o que o jogo deve fazer. Renderização function () { global $ gGameState; gDifficulty $ global; gLeftTankLocation $ global; gRightTankLocation $ global; / / Get locais $ GLeftTankLocation _SESSION = $ ['gLeftTankLocation']; $ GRightTankLocation _SESSION = $ ['gRightTankLocation']; switch ($ gGameState) { GAME_MENU caso: 202 Capítulo 9 ■ Criando Battle Tank e usando Terrain dinâmico { / / Mostra o menu RenderMenu (); break; } GAME_INIT caso: { / / Inicia o Jogo GameInit (); / Screen / Update Render (); break; } GAME_PLAY caso:

Page 174: Programação de jogos em PHP

{ / / Pega a entrada e calcular o ponto de vida if ($ _POST ['btnFire']! = "") { $ ExplosionCoords CalculateFire = ($ _POST ['ângulo'], $ _POST ['velocidade']); / / Check para ver se houve um sucesso if ($ explosionCoords ["x"]> $ gRightTankLocation = ["x"] & & $ ExplosionCoords ["x"] <= gRightTankLocation $ ["x"] + 47 & & $ explosionCoords ["x"]> = $ GRightTankLocation ["y"] & & $ explosionCoords ["y"] <gRightTankLocation = $ ["x"] + 24) { / / Hit o outro tanque $ GGameState = GAME_WIN; Render (); retorno; } RenderExplosion ($ explosionCoords); } / / Faz o computador disparar $ ExplosionCoords CalculateFire = (-rand (30,50),-rand (70, 100)); if ($ explosionCoords ["x"]> $ gLeftTankLocation = ["x"] & & $ ExplosionCoords ["x"] <= gRightTankLocation $ ["x"] + 47 & & $ explosionCoords ["x"]> = $ GLeftTankLocation ["y"] & & $ explosionCoords ["y"] <gLeftTankLocation = $ ["x"] + 24) Criando a lógica do jogo 203 { / / Hit o outro tanque $ GGameState = game_over; Render (); retorno; } RenderExplosion ($ explosionCoords); / / Render o terreno RenderTerrain (); / / Render dos tanques RenderTanks (); / / Render da interface RenderInterface (); break; } GAME_WIN caso: { / / Deixe o leitor saber que ganhou printf ("WIN !!!"); break; } game_over caso: {

Page 175: Programação de jogos em PHP

/ / Deixe o jogador conhece o jogo acabou printf ("game over"); break; } } / / Atualizar o nosso estado do jogo $ _SESSION ['GGameState'] = $ gGameState; } Esta função é fazer um pouco. A primeira coisa que faz é recuperar os locais dos dois tanques. Após a localização dos tanques de ter sido recuperada, ela determina que o estado jogo atualmente está dentro Se o jogo é no estado GAME_MENU, o menu é processado para o navegador. Se o jogo for no estado GAME_INIT, o jogo é inicializado chamando o GameInit () função que você viu anteriormente neste capítulo. 204 Capítulo 9 ■ Criando Battle Tank e usando Terrain dinâmico O estado GAME_PLAY é onde todo o jogo acontece. Primeiro é preciso a entrada do usuário. Ele sabe que o usuário clicou no botão de fogo no centro de comando e ele recupera o ângulo ea velocidade que o usuário inseriu. Depois disso, ele calcula que a explosão deve ocorrer. Se o usuário atingiu o tanque do outro lado do campo, o estado do jogo é comutada para GAME_WIN, a tela é atualizada, ea função retorna sem processamento qualquer outra coisa. No entanto, se o usuário perde, o computador agora começa a atirar. O computador calcula aleatoriamente uma coordenada que está dentro do campo de jogo e calcula onde o seu tiro deve explodir. Se o tiro atinge o usuário, então o estado do jogo é definida como game_over, a tela é atualizada, ea função retorna. Se nenhum jogador foi morto, o jogo retorna o controle para o usuário e espera por outro ângulo e velocidade a ser inserido. Como isso é legal? Para realmente calcular a distância que a bala vai viajar você precisa usar um projétil pouco física. Primeiro, a velocidade precisa ser quebrado em velocidade na direção x e velocidade na direção y. Para fazer isso você multiplicar pelo co-seno e seno do ângulo. $ $ Vx = velocidade * cos ($ angle); $ $ Vy = velocidade * sin ($ angle); Em seguida, você calcular o tempo de travamento do projétil. (Neste caso, o projétil é o shell que é disparado do canhão.) Você pode fazer isso multiplicando 0,204 pelo componente y de

Page 176: Programação de jogos em PHP

a velocidade. $ Time = 0,204 * $ vy; Agora que você sabe o tempo que a bala está no ar você pode calcular a distância máxima a bala pode ir. Para fazer isso você multiplicar o componente x da velocidade pelo tempo total para obter o alcance máximo. XMax $ = $ vx * $ tempo; A final coordenada y pode ser calculado multiplicando-se o componente y da velocidade pelo tempo e pelo meia subtraindo da gravidade multiplicado por vezes ao quadrado. YMax $ = $ vy * Tempo - 0,5 * * GRAVITY ($ time * $ tempo); É isso aí. É assim que você calcular onde a explosão deve ocorrer. Agora que você tem um xe coordenada y você precisa apenas verificar se ele está no mesmo intervalo que o jogo de campo. Se não for, você precisa colocá-lo lá. Agora você pode tornar a explosão usando um em cascata estilo pixels x folha da esquerda do navegador e pixels y a partir do topo do browser. Figura 9.2 mostra uma foto do jogo em ação (bem, a ação, tanto quanto pode ser retratada em um fotograma). Criar dinâmicas Terrain 205 Figura 9.2 Battle Tank em ação. C Aution Você vai querer editar o arquivo php.ini para desligar avisos. Você pode fazer isso adicionando "& ~ E_NOTICE" para a linha error_reporting. Criando Terrain dinâmico Criando o terreno dinâmica é realmente muito fácil. Eu incluí o fundo como sky.jpg no CD. Você pode usar isso para criar sua imagem. Depois de ter criado o seu imagem que você só precisa definir os dois primeiros pontos a 0 e 450. Isto irá colocar a primeira coordenada na parte inferior esquerda do gráfico. Depois de ter colocado a coordenada primeiro na parte inferior esquerda do gráfico que você precisa para começar no próximo pixel que você gostaria de colocar o seu próximo ponto e percorrer todo o largura da imagem. Enquanto você estiver percorrendo toda a largura da imagem que você estará gerando dois pontos. Um deles é a parte x que deve ser apenas o seu contador de loop, e os outro é um gerado aleatoriamente y coordenadas. 206 Capítulo 9 ■ Criando Battle Tank e usando Terrain dinâmico Depois de ter atravessado toda a largura da imagem que você vai querer definir os dois últimos

Page 177: Programação de jogos em PHP

pontos. Os últimos dois pontos precisam ser no canto inferior direito da imagem. Neste caso, é (700, 450). Agora está tudo pronto para gerar um polígono preenchido com todos os pontos que você tem apenas gerado. Todos esses procedimentos devem ir para o GameInit () função. Dê uma olhada no seguinte exemplo de código para ver o GameInit nova função (): GameInit function () { global $ gGameState; gLeftTankLocation $ global; gRightTankLocation $ global; Terreno $ = imagecreatefromjpeg ("images / sky.jpg"); $ Pontos [0] = 0; $ Pontos [1] = 450; $ I = 2; for ($ x = 10; $ x <710; $ x = $ x + 20) { $ Pontos [$ i] = $ x; $ Pontos [$ i +1] = rand (150, 350); $ I = $ i + 2; } $ Pontos [count ($ pontos) -1] = 700; $ Pontos [count ($ pontos)] = 450; $ Marrom = imagecolorallocate ($ terreno, 139, 164, 125); ImageFilledPolygon ($ terreno, $ pontos, sizeof ($ pontos) / 2, $ marrom); Imagejpeg ($ terreno, "images / temp.jpg"); Imagedestroy ($ terreno); $ Canhoto = (($ pontos [3] + $ pontos [5]) / 2) - (($ pontos [2] + $ pontos [4]) / 2) - 10; Righty $ = (($ pontos [count ($ pontos) -4] + $ pontos [count ($ pontos) -3]) / 2) - $ Pontos [count ($ pontos) -4]; / / Definir os locais de depósito de $ GLeftTankLocation = array ("x" => 42, "y" => $ canhoto); Criar dinâmicas Terrain 207 $ GRightTankLocation = array ("x" => 628, "y" => $ destro); $ _SESSION ['GLeftTankLocation'] = $ gLeftTankLocation; $ _SESSION ['GRightTankLocation'] = $ gRightTankLocation; $ GGameState = GAME_PLAY; } O primeiro evento que ocorre no GameInit () é uma nova imagem é gerada a partir do fundo do céu existente usando: Terreno $ = imagecreatefromjpeg ("images / sky.jpg"); Em seguida, você definir o primeiro conjunto de coordenadas. $ Pontos [0] = 0; $ Pontos [1] = 450; Agora que você está começando no canto inferior esquerdo da imagem que você precisa para começar a 10

Page 178: Programação de jogos em PHP

pixels para a largura da imagem e atravessar toda a maneira através da imagem para 700. $ I = 2; for ($ x = 10; $ x <710; $ x = $ x + 20) { $ Pontos [$ i] = $ x; $ Pontos [$ i +1] = rand (150, 350); $ I = $ i + 2; } Este loop gera um número aleatório a cada 20 pixels entre 150 pixels e 350 pixels. Isto é o que lhe dá a x e y para os pontos de coordenadas lógica seguinte. Agora que você tem percorrido todo o caminho entre a imagem que você precisa para definir o ponto final. Desde que você quer o polígono para preencher todo o caminho até o fundo, você precisa definir o ponto final para (700, 450). $ Pontos [count ($ pontos) -1] = 700; $ Pontos [count ($ pontos)] = 450; Agora você simplesmente desenhar o polígono na tela usando o ImageFilledPolygon () função. Depois de desenhar o polígono que você precisa para salvar a imagem em disco. A razão você salvar a imagem em disco é porque você só quer gerar um novo terreno quando você iniciar um jogo. Você não quer que o terreno estar a mudar cada vez que alguém dispara sua canhão. $ Marrom = imagecolorallocate ($ terreno, 139, 164, 125); ImageFilledPolygon ($ terreno, $ pontos, sizeof ($ pontos) / 2, $ marrom); Imagejpeg ($ terreno, "images / temp.jpg"); Imagedestroy ($ terreno); 208 Capítulo 9 ■ Criando Battle Tank e usando Terrain dinâmico Agora tudo que resta é a posição dos tanques. Neste exemplo, o tanque é coordenada x é sempre a mesma ea coordenada y é calculado com a média de dois dos pontos y. Esta não é uma maneira totalmente precisos para posicionar o tanque, mas ele não chegar perto do tanque de o suficiente. Se você quer um método mais preciso que você precisa tomar três ou quatro pontos e reposicionar o tanque com base na coordenada x também. $ Canhoto = (($ pontos [3] + $ pontos [5]) / 2) - (($ pontos [2] + $ pontos [4]) / 2) - 10; Righty $ = (($ pontos [count ($ pontos) -4] + $ pontos [count ($ pontos) -3]) / 2) - $ Pontos [count ($ pontos) -4]; / / Definir os locais de depósito de $ GLeftTankLocation = array ("x" => 42, "y" => $ canhoto); $ GRightTankLocation = array ("x" => 628, "y" => $ destro);

Page 179: Programação de jogos em PHP

Agora que você já calculadas as coordenadas x e y para cargos de seu tanque você precisa salvar as informações para a sessão. $ _SESSION ['GLeftTankLocation'] = $ gLeftTankLocation; $ _SESSION ['GRightTankLocation'] = $ gRightTankLocation; Após as coordenadas são guardadas para a sessão de tudo o que resta a fazer é iniciar o jogo mudar o estado do jogo. $ GGameState = GAME_PLAY; Figura 9.3 mostra uma captura de tela do jogo com algum terreno dinâmica que está sendo gerado. Figura terreno Gerando 9,3 dinâmico. Conclusão 209 Conclusão Você criou com sucesso um jogo totalmente dinâmico PHP que é um clone muito bom do clássico Scorched Earth. Há, no entanto, várias coisas que você pode fazer para tornar este um jogo muito melhor. A primeira coisa que você pode fazer é obter o posicionamento dinâmico do tanques mais precisos. A segunda coisa que você pode fazer é adicionar um pouco de detecção de colisão para ver se a bala atingiu o terreno. O terceiro passo que você pode tomar para tornar o jogo melhor é dinamicamente remover pedaços de terreno atingido pela bala. Você provavelmente poderia descobrir algo com um arco de fazer isso. Está ficando muito bom neste tipo de coisas PHP, e você deve estar orgulhoso de si mesmo. Dar um tapinha grande nas costas. Nos capítulos seguintes você vai realizar algumas chances e termina. Por exemplo, no capítulo seguinte você vai olhar para como usar sockets no PHP. Em Capítulo 11 você vai começar a aprender sobre jogos de MMORPG e começar a criar seus próprios mini-jogo. Parece divertido? Bom, então vamos a ele. Esta página foi intencionalmente deixada em branco Extras e Projetos finais Capítulo 10 PHP e Sockets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0,213 Capítulo 11 Kiddy Cartel-Criando seu próprio MMO. . . . . . . . . . . . . . . . . . . . . 0,229 Capítulo 12 Construção de suas habilidades PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 0,257 PARTE IV Esta página foi intencionalmente deixada em branco capítulo 10 PHP e Sockets

Page 180: Programação de jogos em PHP

■ Soquete Basics ■ Criando um servidor ■ Criando um cliente Eu n Neste capítulo você vai explorar o mundo fascinante e por vezes confuso de soquetes. Sockets deve ser um dos componentes mais subutilizada em PHP. Hoje você vai dar uma olhada em como criar um servidor para o qual um cliente pode conectar-se, como se conectar a um servidor de um cliente usando sockets, e como processar informações no servidor e enviá-lo para o cliente de destino. Acredite ou não, você tem sido usando sockets todo o tempo que você tem de programação em PHP. O servidor é o servidor HTTP que você se conecta, eo cliente é a Web browser você está usando para se conectar ao servidor. Esta é uma relação de cliente / servidor único. Noções básicas de soquete PHP usa a Berkley sockets biblioteca para fazer suas ligações. Você pode pensar em uma tomada como nada mais do que uma estrutura de dados. Você usa esta estrutura de dados socket para iniciar uma conversa entre um cliente e um servidor. O servidor está sempre ouvindo para abrir uma nova conversa. Quando um cliente quer falar com o servidor, ele abre uma conversa através de um específico porta na qual o servidor está escutando. Quando o servidor recebe a solicitação do cliente que ela seja concluída a conexão, completando assim o ciclo. Agora o cliente pode enviar informações para o servidor eo servidor pode enviar informações para o cliente. 213 214 Capítulo 10 ■ PHP e Sockets Para criar um socket que você vai precisar de três variáveis: um protocolo, um tipo de socket, e uma comum tipo de protocolo. Existem três protocolos que você pode escolher ao criar um socket. Dê uma olhada na Tabela 10.1 para os nomes dos protocolos e uma descrição do que cada protocolo faz. Quando você criar seu próprio servidor irá utilizar o protocolo AF_INET. Há cinco tipos de soquete para escolher na biblioteca de socket Berkley. Por favor, consulte a Tabela 10.2 para o constante e uma descrição do tipo de soquete. O elemento final para a criação de uma tomada é definir o tipo de protocolo comum que o conexão deve usar. Tabela 10.3 lista o nome ea descrição do comum três tipos de protocolo. Protocolos Nome / Descrição Constante

Page 181: Programação de jogos em PHP

AF_INET AF_INET6 AF_UNIX Nome / Descrição Constante SOCK_STREAM SOCK_DGRAM datagramas SOCK_RAW SOCK_RDM Tabela 10.1 O mais comum dos protocolos que são usados na criação de sockets. AF_INET usa TCP ou UDP e um endereço IPv4. Semelhante ao AF_INET mas usa um endereço IPv6 em vez de um endereço IPv4. Um protocolo de comunicação local. Este é específico para UNIX e Linux, e usa o sistema de arquivos para definir suas conexões socket. Este protocolo é raramente usado. Quando é usado, o cliente eo servidor são geralmente na mesma máquina. Tipos de Tabela 10.2 Soquete Esse tipo de socket fornece sequencial, seguro, full-duplex conexões com base em streams de bytes. Este é o tipo de soquete mais usado. Este é também o Tomada do tipo que o protocolo TCP comum utiliza. Esse tipo de socket fornece conexão, de comprimento fixo transmissões chamado . Esse tipo de socket é bastante confiável. UDP usa esse tipo de socket para o seu conexões. Tipo SOCK_SEQPACKET Esta tomada fornece uma de duas vias, conexão confiável para o envio de FixedLength transmissões. O receptor é obrigado a ler todo o pacote para cada ler apelo feito quando se utiliza esse tipo de socket. Esse tipo de socket fornece acesso protocolo de rede. O ICMP comum protocolo (ping, traceroute, e assim por diante) usa esse tipo de socket. Esse tipo de socket é raramente utilizado e não é implementada na maioria dos operacionais sistemas. Isso proporciona uma camada de datagrama que não garante a ordenação de seus pacotes. Noções básicas de socket 215 Protocolos comuns Nome / Descrição Constante ICMP para relatar erros na comunicação. UDP TCP Tabela 10.3 O Internet Control Message Protocol. Ele é usado principalmente por gateways e hosts

Page 182: Programação de jogos em PHP

O User Datagram Protocol. Como mencionado anteriormente, esta é uma conexão, forma confiável para transmitir dados. O Transmission Control Protocol. Este é o mais comum e mais confiável dos protocolos comuns. TCP garante que seus pacotes chegarão ao destinatário. Se houve erros durante a transmissão, o TCP re-transmite o pacotes para se certificar de que eles aparecem livre de erros. Agora que você sabe os três elementos para criar um socket, dê uma olhada no socket_create () função que o PHP usa para criar um socket. O socket_create () função recebe três parâmetros: um protocolo, um tipo de socket, e um protocolo comum. O socket_create () retorna a função um recurso para o socket se ele foi criado com sucesso, ou retorna false se o socket não foi criado com sucesso. recurso socket_create (protocolo int, int SocketType, int commonProtocol); Agora que você pode criar um socket, como você pode usá-lo? PHP fornece várias funções para lidar com soquetes. Você pode vincular sockets a um IP, ouvir para comunicação em um soquete, aceitar uma tomada, a lista só vai sobre e sobre. Comece dando uma olhada em um exemplo para ver que funções você vai precisar para criar, aceitar e ouvir um socket. <? Php $ CommonProtocol = getprotobyname ("tcp"); $ Socket = socket_create (AF_INET, SOCK_STREAM, $ commonProtocol); socket_bind ($ socket, "localhost", 1337); socket_listen ($ socket); Funcionalidade / / Mais de soquete para vir ?> O exemplo acima é um começo para criar seu próprio servidor. A primeira linha do exemplo, $ CommonProtocol = getprotobyname ("tcp"); Obtém o tipo de protocolo que você vai usar pelo nome. Neste caso, você deseja usar o protocolo TCP comum. Se você queria usar UDP ou ICMP você deve passar "udp" 216 Capítulo 10 ■ PHP e Sockets ou "icmp" como o parâmetro para o getprotobyname () função. Uma alternativa ao uso do função getprotobyname () é especificando o SOL_TCP ou SOL_UDP como argumento final para a função socket_create (). $ Socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); A segunda linha do exemplo cria o socket e retorna a instância do soquete recursos. Depois de ter a instância do recurso socket, você precisa vincular o soquete para uma determinada porta e endereço IP. socket_bind ($ socket, "localhost", 1337);

Page 183: Programação de jogos em PHP

Neste caso você está ligando a tomada para o seu computador local (127.0.0.1) e você está ligação com o soquete para a porta 1337. Depois de tudo é criado e vinculado você deve ouvir uma conexão para vir para o socket. socket_listen ($ socket); Estes são apenas quatro das funções usadas no mundo maravilhoso de soquetes. Dê uma olhada Tabela 10.4 para ver todas as funções que usam sockets. Nome Descrição da função socket_accept (resource socket) de recursos socket_bind (resource socket, endereço string, bool int endereço de porta) e porta especificada. socket_bind () socket_clear_error ([resource socket]) void socket_close void (resource socket) socket_connect (socket recurso de endereço string,, bool [Int port]) falhou. socket_create_listen (int porta, [int backlog]) de recursos comprimento da fila de pendentes Tabela 10.4 Funções para Socket Retorna Depois de ter criado um socket, envolveram, e comecei a ouvir sobre esse socket, esse função irá aceitar conexões de entrada. Isso vincula o socket resource para o irá retornar TRUE se for bem sucedido e FALSE se ele falhar. Isto irá limpar os erros na especificado socket. Se um socket não for especificado, então apaga o último erro de socket global. Fecha o socket criado. Tenta conectar-se à tomada de recursos. Retorna TRUE se a conexão sucedido e FALSE se a conexão Cria um socket AF_INET novo que escuta na porta especificada. Backlog define o conexões. Noções básicas de socket 217 (Continuação) Nome Descrição da função socket_create_pair (protocolo int, int SocketType, bool int commonProtocol, array & fd) armazenados na matriz fd socket_create (protocolo int, int SocketType, de recursos int commonProtocol) socket_get_option tomada de recursos (, nível int, misturado int optname) socket_getpeername (resource socket, bool string & endereço, [int & port]) socket_getsockname (resource socket, bool

Page 184: Programação de jogos em PHP

string & endereço, [int & port]) socket_iovec_add (recurso iovec, int iov_len) bool recurso socket_iovec_alloc (num_vectors int) socket_iovec_delete (recurso iovec, iov_pos int) bool Exclui o iovec alocado. socket_iovec_fetch string (recurso iovec, int iovec_pos) Retorna os dados contidos no iovec_pos em socket_iovec_free (recurso iovec) bool socket_iovec_set (recurso iovec, bool Define os dados em iovec_position para o novo iovec_position int, string new_val) socket_last_error ([resource socket]) int Recupera o último código de erro que ocorreu retorna o último erro que ocorreu para que socket_listen (resource socket, [int backlog]) bool escuta para uma conexão com o especificado socket_read (socket recurso, comprimento int, string [Int type]) string normal com o escape normal, socket_readv (resource socket, recursos iovec) bool Lê da matriz fd usando o Tabela 10.4 Funções para Socket Retorna Isso cria um par de sockets que são . Não há maneira de distinguir entre os dois sockets. Cria um novo socket. Esta função recupera as opções para uma socket. Esta função retorna o IP remoto endereço do computador de mesmo nível de conexão. Esta função retorna o endereço IP local da tomada. Essa função adiciona um novo vetor para a dispersão / coletar matriz. Esta função cria uma estrutura para iovec uso com sendmsg, recvmsg, writev, e readv. o recurso especificado. Libera o recurso iovec. valor. em qualquer tomada. Se um soquete é especificado, ele socket. socket. Backlog define o comprimento do fila para conexões pendentes. Este lê bytes de comprimento a partir do especificado socket. Tipo pode ser PHP_BINARY_READ ou PHP_NORMAL_READ. Se PHP_BINARY_READ é usada, a string é uma seqüência binária, caso contrário a string é uma caracteres. dispersão / coletar matriz.

Page 185: Programação de jogos em PHP

218 Capítulo 10 ■ PHP e Sockets (Continuação) Nome Descrição da função socket_recv (socket recurso de cadeia, e buffer, int Recebe dados no buffer em um conectado int length, flags int) socket_recvfrom (socket recurso de cadeia, e buffer, int int length, flags int, string & nome, [int & port]) socket_recvmsg (resource socket, recursos iovec, bool array & controle int, int & controlLength, e bandeiras, string & endereço. [Int & port]) socket_select array (e ler matriz, e escrever, int matriz & Exceto, tv_sec int, [int tv_usec]) a leitura escrever exceto socket_send (socket de recursos, buffer de string, int int length, flags int) socket_sendmsg (resource socket, recursos iovec, bool int flags, endereço de string, [int port]) socket_sendto (resource socket, buffer de string, int comprimento int, int flags, endereço de string, [Int port]) socket_set_block (resource socket) bool socket_set_nonblock (resource socket) bool socket_set_option (socket nível de recursos, int, bool socket_shutdown (resource socket, [como int]) bool como socket_strerror string (ErrorNumber int) Retorna uma descrição do erro especificado socket_write (socket de recursos, buffer de string, int [Int length]) socket_writev (resource socket, recursos iovec) bool Escreve para a matriz fd usando o dispersão / coletar Tabela 10.4 Funções para Socket Retorna socket. Recebe dados de um socket ou não o socket está conectado. Esta função é usada para receber mensagens em um soquete que usa iovectors. Esta função aceita uma matriz de sockets para assistir. As tomadas que são passados em série são observados para os caracteres que ficam disponíveis para leitura. O array é observado para os blocos que são escrita. As matrizes são vigiados para exceções. Esta função envia dados para um computador conectado

Page 186: Programação de jogos em PHP

socket. Envia uma mensagem para o socket. Esta função envia comprimento do buffer através do socket para o especificado endereço. Define o modo de bloqueio em um socket. Conjuntos de modo não-bloqueio em um socket. Define as opções de socket para o socket. int optname optval, mista) Esta função permite que você desligar leitura, escrita ou ambos para o especificado socket. pode ser 0, 1 ou 2. número. Escreve o buffer para o socket. array. * No momento da redação deste texto, www.php.net não ter definições para cada função socket. Noções básicas de socket 219 Essas são todas as funções que o PHP oferece para uso com soquetes. Você já deve ter sockets habilitado, mas se você não fizer isso, então editar o arquivo php.ini e descomente a linha que diz: extension = php_sockets.dll Se você não tire o comentário desta linha que você pode carregar a extensão dinamicamente usando o seguinte código: <? Php if (! extension_loaded ('sockets')) { if (strtoupper (substr (PHP_OS, 3)) == "WIN") { dl ('php_sockets.dll'); } outro { dl ('sockets.so'); } } ?> Se você não sabe se os soquetes estão habilitadas você sempre pode usar a função phpinfo () para determinar se as tomadas estão habilitados. Deve haver uma seção que se parece com a Figura 10.1. Figura 10.1 Visualizando o phpinfo () para sockets. 220 Capítulo 10 ■ PHP e Sockets Criando um servidor Agora volte para o exemplo anterior e concluí-lo. Para fazer isso basta para escutar

Page 187: Programação de jogos em PHP

a uma tomada de particular e, em seguida, o processo de usuário (s) se conectar a ele. <? Php $ CommonProtocol = getprotobyname ("tcp"); $ Socket = socket_create (AF_INET, SOCK_STREAM, $ commonProtocol); socket_bind ($ socket, "localhost", 1337); socket_listen ($ socket); / / Aceitar conexões de entrada para o servidor $ Connection = socket_accept ($ socket); if ($ conexao) { socket_write ($ conexao, "Você tem ligado à tomada ... \ n \ r"); } ?> Você vai querer executar este exemplo a partir de um prompt de comando. A razão para isto é que você está criando um servidor, e não uma página da Web. Se você tentar executar este script em um navegador da Web, o script mais tempo provável para fora após 30 segundos. Você pode definir um tempo infinito pela usando a seguinte linha de código, mas é melhor para executar o servidor a partir de um prompt de comando: set_time_limit (0); Para executar seus scripts a partir de uma linha de comando basta digitar: example01_server.php php.exe Se você ainda não mapeado o caminho para o interpretador do PHP você precisará especificar o caminho antes php.exe. Depois de ter iniciado o servidor que você pode testar a conexão por telnet para a porta 1337. Você deve ver os resultados que se assemelham a Figura 10.2 O problema com este servidor é triplo: primeiro, ele não aceita múltiplas conexões. Dois, ele realiza apenas um comando que é muito útil. Finalmente, você ainda não pode conectar-se a este servidor através de seu navegador web. O primeiro problema é fácil de resolver se você estivesse usando um aplicativo que não tem que reconectar ao servidor cada vez que você clicou alguma coisa. Mas já que você está usando um Web página para se conectar ao servidor, isso coloca um problema muito grande. Você tem que fazer sua servidor aceita uma conexão, gravar dados para o cliente (se houver alguma de escrever), fechar a conexão, e esperar por outra conexão. Criando um servidor 221 Figura 10.2 O seu primeiro servidor. Vamos fazer exatamente isso. Dê uma olhada no seguinte exemplo de código para ver o novo servidor: <? Php

Page 188: Programação de jogos em PHP

/ / Set up nossa tomada de $ CommonProtocol = getprotobyname ("tcp"); $ Socket = socket_create (AF_INET, SOCK_STREAM, $ commonProtocol); socket_bind ($ socket, "localhost", 1337); socket_listen ($ socket); / / Inicializa o buffer $ Buffer = "NO DATA"; while (true) { / / Aceitar conexões entrando neste socket 222 Capítulo 10 ■ PHP e Sockets $ Connection = socket_accept ($ socket); printf ("Socket conectado \ r \ n"); / / Verifique se há algo no buffer if ($ buffer! = "") { printf ("Algo está no buffer ... o envio de dados ... \ r \ n"); socket_write ($ conexao, $ buffer "\ r \ n".); printf ("Escreveu para o socket \ r \ n"); } outro { printf ("Sem dados no buffer \ r \ n"); } / / Pega o input while ($ dados = socket_read ($ conexao, 1024, PHP_NORMAL_READ)) { $ Buffer = $ data; socket_write ($ conexao, "Informações recebidas \ r \ n"); printf ("Buffer:".. $ buffer "\ r \ n"); } socket_close ($ conexao); printf ("Fechado o socket \ r \ n \ r \ n"); } ?> Isto é o que o servidor faz. Ele inicializa o soquete e da reserva que você usa para receber e enviar dados. Em seguida, ele espera por uma conexão. Uma vez que uma conexão é criada ela imprime "Socket conectado" para a tela o servidor está sendo executado. O servidor então verifica se não há nada no buffer, se houver, ele envia os dados para o computador conectado. Depois ele envia os dados que ele espera para receber informações. Uma vez que recebe a informação que ele armazena que nos dados, permite que o computador conectado sabe que recebeu a informação, e em seguida, fecha a conexão. Após a conexão é fechada, o servidor começa a todo processo novamente.

Page 189: Programação de jogos em PHP

Dê uma olhada na Figura 10.3 para ver os resultados do servidor. Criando o cliente 223 Figura 10.3 Resultados do novo servidor. Criando o cliente Para resolver o segundo problema é muito fácil. Você precisa criar uma página PHP que se conecta a um socket, receberá todos os dados que está no buffer, e processá-lo. Depois de ter processado o dados no buffer você pode enviar seus dados para o servidor. Quando outro cliente se conecta, ele irá processar os dados que você enviou e que o cliente irá enviar mais dados para o servidor. Nota Isto é simplesmente um exemplo para demonstrar o uso de soquetes. Isto é, não significa nível de produção código para ser usado em um jogo público. <? Php / / Cria o socket e conectar-se $ Socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); $ Connection socket_connect = ($ socket, "localhost", 1337); enquanto (buffer $ = socket_read ($ socket, 1024, PHP_NORMAL_READ)) { if ($ tampão == "NO DATA") { echo ("<p> NO DATA </ p>"); break; } outro { 224 Capítulo 10 ■ PHP e Sockets / / Faz alguma coisa com os dados no buffer echo ("Dados <p> Buffer:".. $ buffer "</ p>"); } } echo ("Escrevendo para <p> soquete </ p>"); / / Escreve alguns dados de teste para a nossa tomada de if (! socket_write ($ socket, "alguns dados \ r \ n")) { echo ("Escreva <p> falhou </ p>"); } / / Lê qualquer resposta da tomada enquanto (buffer $ = socket_read ($ socket, 1024, PHP_NORMAL_READ)) { echo ("Dados enviados <p> foi: ALGUNS DADOS <br> Resposta foi:".. $ buffer "</ p>"); } echo ("Feito <p> Leitura de soquete </ p>"); ?> Este cliente exemplo se conecta ao servidor usando todo o código que você tenha visto antes.

Page 190: Programação de jogos em PHP

O cliente lê os dados. Se esta é a primeira vez através do laço na primeira conexão, em seguida, o servidor irá enviar "NO DATA" volta para o cliente. Se isso ocorrer, o cliente continua em. O cliente envia seus dados para o servidor. Após os dados terem sido enviados para o servidor do cliente aguarda uma resposta. Uma vez que recebe uma resposta que ele escreve a resposta na tela. C Aution Você vai querer editar o arquivo php.ini para desligar avisos. Você pode fazer isso adicionando "& ~ E_NOTICE" para a linha error_reporting. T ip Ao usar PHP_NORMAL_READ a linha de dados é feito uma vez considerada a \ r \ n caracteres de escape foram enviadas. Integração com Sockets Battle Tank Agora que você tem todo este código legal que lida com sockets, você pode integrá-lo na Jogo de tanque de guerra que criou no capítulo anterior. Para fazer isso é muito simples. Obviamente, a primeira coisa que você vai querer fazer é ligar na tomada toda vez que você clica no Fogo Integração com Sockets Battle Tank 225 botão ou iniciar um novo jogo. Se você clicar no botão de fogo você vai querer mandar seus dados para o servidor. Uma vez que os seus dados alcançou o servidor que você vai querer consultar o servidor para as coordenadas próxima da bala, e depois processar o jogo com as novas coordenadas. Aqui está o novo Render () função para Battle Tank: Renderização function () { / / Cria o socket e conectar-se $ Socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP); $ Connection socket_connect = ($ socket, "localhost", 1337); global $ gGameState; gDifficulty $ global; gLeftTankLocation $ global; gRightTankLocation $ global; / / Get locais $ GLeftTankLocation _SESSION = $ ['gLeftTankLocation']; $ GRightTankLocation _SESSION = $ ['gRightTankLocation']; switch ($ gGameState) { GAME_MENU caso: { / / Mostra o menu RenderMenu (); break;

Page 191: Programação de jogos em PHP

} GAME_INIT caso: { / / Inicia o Jogo GameInit (); / Screen / Update Render (); break; } GAME_PLAY caso: { 226 Capítulo 10 ■ PHP e Sockets / / Printf (session_id ()); / / Pega a entrada e calcular o ponto de vida if ($ _POST ['btnFire']! = "") { $ ExplosionCoords CalculateFire = ($ _POST ['ângulo'], $ _POST ['velocidade']); if (! socket_write ($ socket, $ explosionCoord [0]. ",". $ ExplosionCoords [1]. "\ R \ n")) { echo ("Escreva <p> falhou </ p>"); } / / Check para ver se houve um sucesso if ($ explosionCoords ["x"]> $ gRightTankLocation = ["x"] & & $ ExplosionCoords ["x"] <= gRightTankLocation $ ["x"] + 47 & & $ explosionCoords ["x"]> = $ GRightTankLocation ["y"] & & $ explosionCoords ["y"] <gRightTankLocation = $ ["x"] + 24) { / / Hit o outro tanque $ GGameState = GAME_WIN; Render (); retorno; } RenderExplosion ($ explosionCoords); } enquanto (buffer $ = socket_read ($ socket, 1024, PHP_NORMAL_READ)) { if ($ tampão == "NO DATA") { echo ("<p> NO DATA </ p>"); break; } outro { / / Faz alguma coisa com os dados no buffer ExplosionCoords $ split = ($ buffer, ","); } } Integração com Sockets Batalha de Tanques 227

Page 192: Programação de jogos em PHP

/ / Faz os outros jogadores tiro if ($ explosionCoords [0]> = $ gLeftTankLocation ["x"] & & $ explosionCoords [0] <= GRightTankLocation $ ["x"] + 47 & & $ explosionCoords [1]> = $ gLeftTankLocation ["y"] & & $ ExplosionCoords [1] <= $ gLeftTankLocation ["x"] + 24) { / / Hit o outro tanque $ GGameState = game_over; Render (); retorno; } RenderExplosion ($ explosionCoords); / / Render o terreno RenderTerrain (); / / Render dos tanques RenderTanks (); / / Render da interface RenderInterface (); break; } GAME_WIN caso: { / / Deixe o leitor saber que ele ganhou printf ("WIN !!!"); break; } game_over caso: { / / Deixe o jogador conhece o jogo acabou printf ("game over"); break; } } / / Atualiza o estado do jogo $ _SESSION ['GGameState'] = $ gGameState; } 228 Capítulo 10 ■ PHP e Sockets É isso aí! Como eu disse antes, esta não é a melhor maneira de fazer isso, mas funciona para demonstrar PHP capacidades socket. Existem algumas coisas legais que você poderia fazer através da criação de sockets que falam para o Flash peças através do seu servidor PHP própria, que é uma maneira mais comum usar soquetes. Conclusão Se vai ou não realizá-lo, você fez uma tremenda quantidade de aprendizagem neste capítulo. Se você gostaria de aprender mais sobre sockets sugiro pegar uma mais

Page 193: Programação de jogos em PHP

em profundidade livro sobre soquetes. Você também pode se referir a www.php.net, onde você encontrará mais indepth explicações de todas as funções que você viu neste capítulo. No próximo capítulo você estará criando o seu próprio jogo MMORPG. Parece divertido? Bem então, virar a página e mexa-se! capítulo 11 Cartel Kiddy - Seu próprio MMO Criando ■ Instalar mySQL ■ Bancos de Dados Relacionais: um rápido resumo ■ Cartel Kiddy: as normas e especificações ■ Criação de Ações Sua Base ■ Criação de um comando com Sub-Comandos ■ A criação de um Comando sem Sub-Comandos ■ Olhe para todos os comandos ... e agora? Eu n Neste capítulo você vai aprender o que se passa em uma linha massivamente multiplayer (MMO) jogo. No final deste capítulo você terá criado um jogo MMO incrível chamado Cartel Kiddy. O objectivo deste jogo é tomar a personalidade de uma criança e construir uma império através da compra de barracas de limonada, cortar a grama, e atacar concorrentes bairros. Parece divertido? Vamos começar. Primeiro, algumas notas sobre Cartel Kiddy. Este jogo utiliza voltas. Isso significa que cada vez você executa uma ação que leva o número n de voltas. É também um jogo baseado em texto, então se você quer gráficos você precisará adicioná-los. Cada conta que você criar irá controlar apenas um bairro, por isso, se você quiser controlar vários bairros você vai precisar para criar várias contas. Além disso, este jogo terá de usar um banco de dados relacional, então o banco de dados relacional melhor que mySQL? Ele está disponível gratuitamente no www.mysql.com e mySQL 4 Versão incluído no CD que acompanha este livro. Você também vai precisar de uma chamada de biblioteca PEAR. PEAR está para PHP Extension and Repository Aplicação. 229 230 Capítulo 11 ■ Kiddy Cartel-Criando seu próprio MMO Se você instalou o PHP a partir do CD, então PEAR e suas bibliotecas padrão e gerente são já instalado em sua máquina se você estiver executando uma plataforma UNIX. Se você estiver executando plataforma Windows, você precisará instalar o gerenciador de PEAR. Para instalar o gerenciador de PEAR, basta executar o arquivo go-pear.bat no diretório de instalação após

Page 194: Programação de jogos em PHP

você instalou o PHP. Se você não instalar o PHP a partir do CD incluído neste livro, então Eu sugiro que você vá para http://pear.php.net e ver a secção de instalação da documentação para instalar PEAR. Instalando o MySQL Instalando o MySQL no Windows é uma tarefa muito simples. Tudo que você precisa fazer é executar o programa setup.exe que vem com a distribuição do Windows. Depois de ter instalado mySQL você terá de executar o arquivo executável WinMySQLAdmin para configurar o arquivo my.ini. Para instalar o MySQL no Linux, a maneira mais fácil é usar um pacote RPM. A fim de Neste livro você só precisa usar o servidor e os pacotes RPM cliente. Se você gostaria de como instalar outros pacotes que você pode baixá-los em www.mysql.com. Para instalar o cliente eo servidor como uma instalação padrão, você deve usar a seguinte linha: %> Rpm-i MySQL-server-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm Uma vez que o pacote é terminar a instalação você deve encontrar um novo diretório em / var / lib / chamado mysql. A instalação do mySQL também adiciona as linhas apropriadas no arquivo / etc / init.d / de modo que o mySQL servidor irá iniciar na inicialização. Nota Se você estiver atualizando de uma versão anterior do mySQL você terá de interromper a contagem atual serviço, a fim de instalar o mySQL novo. Assim que o MySQL está instalado, você precisa conceder permissão para um usuário e tabelas. Se você pular Nesta etapa, você só será capaz de se conectar ao seu banco de dados como root. Você pode adicionar um usuário depois mas eu recomendo que você faça isso agora. No Windows você precisa digitar o seguinte na prompt de comando: C: \> cd \ mysql \ scripts C: \> mysql_install_db C: \> cd \ mysql \ bin C: \> mysqld_safe-user = mysql & Onde - user = mysql você pode colocar qualquer usuário que deseja. Por exemplo, - user = mmodb seria criar um usuário chamado mmodb. Bancos de dados relacional: um rápido resumo 231 Se você estiver instalando mySQL em uma máquina Linux você vai precisar digitar o seguinte em um prompt de comando: >%. / Scripts / mysql_install_db % Mysql_installation_directory cd> .>% / Bin / mysqld_safe - user = mysql &

Page 195: Programação de jogos em PHP

Se você tiver problemas para criar seu usuário e concessão de permissões de usuário ao banco de dados você deve olhar a documentação em www.mysql.com para ver as sugestões para solução de problemas. Agora vá em frente e criar o banco de dados que Cartel Kiddy irá usar para armazenar seus dados. Ir a um prompt de comando e navegue até o diretório onde você instalou o mySQL. Depois de conseguir nesse diretório, digite o seguinte: . / Bin / mysqladmin kiddycartel criar Isso irá criar um novo banco de dados chamado kiddycartel. Agora você precisa adicionar uma tabela ao banco de dados. Para isso, primeiro dar uma olhada rápida na linguagem T-SQL. Bancos de dados relacional: um rápido resumo Bancos de dados relacionais são bancos de dados que sabe de outras tabelas. É absolutamente necessário usar um banco de dados relacional para fazer um jogo MMO. A razão para isto é que os jogos MMO rapidamente ficar complicado e se você está sempre tentando fazer um loop através de arquivos para localizar um registro, o seu jogo vai sofrer em desempenho e eu garanto que você vai perder o controle de quais dados você está tentando armazenar e recuperar. Com isso dito, bancos de dados relacionais use uma linguagem chamada T-SQL para operar em bases de dados. T-SQL permite criar tabelas em seus bancos de dados, e para inserir, atualizar e excluir registros, para mencionar apenas as funções mais comuns. Com estas quatro opções você pode obter começou na criação do jogo Cartel Kiddy, embora estes quatro operações não fará você um especialista em bancos de dados relacionais. Nota Este não é um tutorial completo de T-SQL. Se você quiser saber mais sobre bancos de dados relacionais você deve explorar alguns livros banco de dados relacional e tutoriais online. Para criar uma tabela usando T-SQL que você precisa para usar a função CREATE TABLE. CREATE TABLE função recebe as definições da coluna como parâmetros e um nome de tabela. A maneira mais fácil explicam como criar uma tabela é para te mostrar. Abra um prompt de comando e navegar para o mysql \ bin. Quando você estiver no diretório, digite o seguinte: mysql 232 Capítulo 11 ■ Kiddy Cartel-Criando seu próprio MMO Este deve iniciar o comando prompt mysql. Quando você estiver no comando mySQL solicitar que você precisa se conectar a um banco de dados, de modo digite o seguinte:

Page 196: Programação de jogos em PHP

conectar kiddycartel Isto irá conectá-lo ao banco de dados Cartel Kiddy. Agora que você está no banco de dados você pode adicionar as tabelas necessárias para o banco de dados. Você terá que inserir as linhas seguintes em prompt de comando para criar a tabela de bairros: CRIAR TABELA bairros ( Playername CHAR (64) NOT NULL PRIMARY KEY, NeighborhoodName CHAR (64) NOT NULL, Senha CHAR (64) NOT NULL, Bullies 0 Default INT, Paperboys PADRÃO INT 0, Cortadores de grama PADRÃO INT 1, LemonadeStands PADRÃO INT 0, Padarias PADRÃO INT 0, PADRÃO dinheiro INT 300, Limonada PADRÃO INT 100, Os cookies PADRÃO INT 50, Bexigas d'água PADRÃO INT 0, PlasticBats PADRÃO INT 0, Estilingues PADRÃO INT 0, DATETIME LastTurnCredited NOT NULL, Transforma PADRÃO INT 50 ); Isto irá criar uma tabela de 16 coluna chamada bairros. A primeira coluna no banco de dados armazena o nome do jogador e é chamado playername. Você especificar o tipo de dados da coluna depois de definir o nome da coluna. As palavras-chave PRIMARY KEY dizer que mySQL esta é uma coluna exclusiva e é isso que deve ser usado para identificar os registros nesta mesa. Nota O banco de dados Cartel Kiddy consiste em apenas uma tabela. Este jogo é apenas para fins exemplo e não mostrar projeto de banco de dados relacional apropriada. Kiddy Cartel: As Regras e 233 Especificações Agora que você criou o banco de dados e uma tabela, você pode inserir registros na tabela. Para inserir um registro na tabela que você irá usar o INSERT INTO função. INSERT INTO bairros (playername, NeighborhoodName, Senha, LastTurnCredited) VALUES ('myPlayer', 'Mytown', 'mmorocks', GETDATE ()) Isto irá inserir um registro que tem o myPlayer valores como o nome do jogador, como o Mytown nome do bairro, mmorocks como a senha ea data e hora para a último turno creditado coluna. O restante das colunas irá conter os valores padrão especificados

Page 197: Programação de jogos em PHP

na definição da tabela. Digamos que você deseja atualizar o registro myPlayer e mudar sua senha. Para fazer isso você vai precisar usar a função UPDATE. A função de atualização leva o nome da tabela e depois a coluna que você deseja atualizar. Por exemplo: ATUALIZAÇÃO bairros Senha SET = 'newPassword' WHERE playername = 'myPlayer' Isto irá atualizar o registro associado myPlayer. Exclusão de um registro é tão simples. Você usa o DELETE FROM função. O DELETE FROM função recebe um nome de tabela como seu principal parâmetro. DELETE FROM bairros onde playername = 'myPlayer' A linha acima irá excluir o registro myPlayer. Se você não especificar uma cláusula WHERE no DELETE FROM função seria excluir todos os registros na tabela especificada. Então, certifique-se de sempre especificar uma cláusula WHERE a menos que você não se importa de perder todos os seus dados. Que é um resumo muito rápido de algumas básica T-SQL funções. De maneira nenhuma isso é uma completa how-to em bancos de dados relacionais. Mas agora que você tem uma idéia geral sobre o que TSQL é, e agora que você tem um banco de dados criado para Cartel Kiddy, vamos dar uma mais em profundidade olhar para as especificações de Cartel Kiddy. Kiddy Cartel: as normas e especificações Desde Kiddy Cartel é um jogo multiplayer, cada jogador será controlado por um humanos; não haverá jogadores de computador. Depois de ter criado um bairro para controlar você será dado um estoque de limonada e um estoque de cookies. Você também será dado um cortador de grama para que você possa gerar mais dinheiro. Você vai começar com US $ 300 e 50 voltas. O objetivo do jogo é obter tantos recursos e dinheiro, tanto quanto possível. Para fazer isso você vai precisar para criar está limonada, fazem biscoitos, cortar a grama, espião, e assumir outros bairros. Há três principais regras que se aplicam ao código deste jogo. 1. Voltas - Um certo número de voltas será gerada para um jogador de cada hora. Jogadores pode estocar voltas durante o tempo que eles querem. 234 Capítulo 11 ■ Kiddy Cartel-Criando seu próprio MMO 2. Geradores de recursos - Você vai precisar para gerar recursos. Cada gerador de recursos é capaz de gerar uma quantidade específica de recursos. 3. Ações - Este é o coração do jogo. Cada ação terá um número de voltas. Uma ação pode exigir um número de recursos ou um número de minions.

Page 198: Programação de jogos em PHP

Para jogar este jogo você vai precisar de algum tipo de interface. Você estará usando formas de executar todas as ações no jogo. Você pode ver a interface que será usada para o jogo na Figura 11.1. Dê uma olhada as ações que o jogador pode executar durante o curso do jogo. ■ Adquira uma banca de limonada ■ Adquira um forno de assar Simples ■ Adquira um cortador de grama ■ Água Balões Compra ■ Adquira Bats plástico ■ Adquira uma Slingshot ■ Criar um Bully ■ Criar um menino de papel ■ Mow gramados ■ Mix Lemonade Figura 11.1 A interface do jogo Kiddy Cartel. Ações criando sua base de 235 ■ Cookies Bake ■ Destruir uma propriedade ■ Scare um miúdo ■ Steal Propriedade ■ Spy em um Kid ■ Sabotage uma propriedade ■ Enviar Bribe Ações criando sua base Cada ação que você pode tomar requer algum comando a ser executado. Uma vez que cada comando terá as variáveis mesma base você irá criar uma classe de comando a partir do qual cada comando subsequente pode herdar. Uma vez que cada comando tem um comando de pai, você vai precisar de uma variável para armazenar o pai. Você também vai precisar de uma forma de executar os comandos. Não faria sentido fazer cada comando executar suas próprias funções, em vez de ter o CCommand () executar a classe comando funções. Cada comando poderia ter sub-comandos, para que você também precisa da capacidade de armazenar essas. Uma vez que você irá armazenar sub-comandos que você precisa para manter o controle dos quais de comando que você está atualmente. Se alguma coisa der errado com o comando, você necessidade de reverter tudo o que você fez. Afinal, você não quer dados parciais flutuante ao redor durante o jogo. Agora que você sabe o que cada comando tem de fazer, você pode começar a planejar como vai código da classe. A forma como eu vejo, cada comando tem quatro estados possíveis. O comando

Page 199: Programação de jogos em PHP

poderia erro, ele poderia estar à espera de entrada, ele poderia ter mais sub-comandos para processo, ou poderia ser feito o processamento. Portanto, vamos definir algumas constantes. / / Definir alguns valores de retorno padrão para os comandos. / / Comanda específicos pode retornar o que quiserem. / / Comandos que são executados por CGame deve retornar um desses quatro valores. define ("CMD_ERROR", 1); / / ocorreu um erro define ("CMD_CONTINUED", 2) / / o comando tem mais passos para executar antes de terminar define ("CMD_FINISHED", 3) / / o comando tiver terminado a execução define ("CMD_NEEDS_INPUT", 4) / / o comando de entrada necessidades humanas antes que ele possa continuar Nos comentários que você vê uma referência a uma classe chamada CGame (). O CGame () da classe irá lidar com executar o jogo e será coberto mais tarde neste capítulo. 236 Capítulo 11 ■ Kiddy Cartel-Criando seu próprio MMO Em seguida, vamos criar o CCommand () da classe. Você sabe que você tem que acompanhar o objeto pai, o comando atual, os comandos sub-do objeto pai, e se o comando precisa ser revertida. classe CCommand { / / Esta é uma referência a um objeto pai var $ m_pParent = null; / / O índice do atual sub-comando que está sendo executado var $ m_nCurrentCommand; / / Se true, o comando precisa ser revertida. se falso, / / O comando não var $ m_bNeedRollBack; / / Um array para armazenar os comandos sub- var $ m_arraySubCommands; função CCommand (& $ matriz) { / / Definir a referência ao nosso pai $ This-> m_pParent = & $ pai; / / Definir o comando atual para o primeiro $ This-> m_nCurrentCommand = 0; / / Inicialmente, os comandos não precisam ser revertidas $ This-> m_bNeedRollBack = false; } função Execute ($ args) { / / Cada comando tem que lidar com a manipulação de sua própria execução retorno CMD_FINISHED; } / * Esta função manipula o valor de retorno de um sub-comando. É responsável por incrementar o índice comando atual

Page 200: Programação de jogos em PHP

e para determinar se esse comando tem nada esquerda para a executar. Ações criando sua base de 237 * / função HandleSubCommand ($ resultado) { / / Fiz isso terminar? if ($ resultado == CMD_FINISHED) { / / Sim, então vá para a próxima $ This-> m_nCurrentCommand + +; } / / Houve um erro? else if ($ resultado == CMD_ERROR) { / / Sim, então se propagar para cima de erro retorno CMD_ERROR; } / / Faz a entrada necessidade de comando? else if ($ resultado == CMD_NEEDS_INPUT) { / / Sim, por isso a necessidade de se propagar para cima de entrada retorno CMD_NEEDS_INPUT; } / / Temos tudo já executados / / Precisamos para este comando? if ($ this-> m_nCurrentCommand> = count ($ this-> m_arraySubCommands)) { retorno CMD_FINISHED; } / / Ainda temos mais a fazer! outro { retorno CMD_CONTINUED; } } OnError função ($ sError) { / / Se temos um pai, deixá-lo lidar com ela if ($ this-> m_pParent! = null) 238 Capítulo 11 ■ Kiddy Cartel-Criando seu próprio MMO { $ This-> m_pParent-> OnError ($ sError); } / / Caso contrário, nós * são * o pai, por isso temos de lidar com ela outro { / / Imprimir a mensagem de erro echo "Ocorreu um erro: $ <BR> sError";

Page 201: Programação de jogos em PHP

/ * Nós rolamos-nos de volta, que, assumindo todas as classes de nosso filho OnRollBack implementado corretamente, vai desfazer tudo. * / $ This-> OnRollBack (); } } / / Implementação do padrão do comando OnRollBack / / Assume que o comando / / Não realiza nenhum processamento que afeta o roll back. / / Se este não se sustenta, uma / / Comando deve substituir esse método, a fim de / / Pegar o processamento em conta OnRollBack function () { / / Uma vez que este comando não executar qualquer processamento / / Fora do subcomando, / / Podemos simplesmente chamar rollback em cada um de seus / / Sub-comandos na ordem inversa for ($ i = $ this-> m_nCurrentCommand; $ i> = 0; $ i) { / / Desenrole o sub-comando se for definido. / / Isset o cheque é / / Para ter certeza de que não tentar / / Rolo voltar comandos que / / Não tem sub-comandos, mas não substituir OnRollBack. if (isset ($ this-> m_arraySubCommands [$ i])) { $ This-> m_arraySubCommands [$ i] -> OnRollBack (); } } Ações criando sua base de 239 / / Reset o ponteiro do comando atual $ This-> m_nCurrentCommand = 0; } } Quando um objeto de comando é criado, ele chama o construtor CCommand (). Esse construtor inicializa todas as variáveis membro da classe. Neste caso, o objeto pai é definido, o número de sub-comandos é definido como 0, ea variável reversão necessária é definida como false. Mencionei anteriormente que cada comando pai iria lidar com sua própria execução. Assim a única coisa que o Execute () função precisa fazer é dizer que o jogo é terminado execução. Agora você precisa encontrar uma maneira de lidar com os comandos sub-que necessitam de processamento. Que melhor

Page 202: Programação de jogos em PHP

nome para uma função que HandleSubCommand ()? O HandleSubCommand () classe leva um único argumento de que o manipulador diz que estado está executando o comando dentro Primeiro você vê se o comando terminar. Se o comando terminar com sucesso, então você pode seguir em frente para o próximo sub-comando na árvore. Se o comando não terminou, então ele deve estar em outro estado. Então, você verificar para ver se um erro na execução ocorreu. Se um erro ocorreu, então você precisa dizer o jogo terminar a sua execução. Se um erro não ocorreu, então você precisa verificar se o comando está aguardando a entrada. Se o comando está esperando para a entrada, então você precisa dizer ao jogo para segurar e esperar para o usuário. Se você passar por tudo isso você deve verificar em seguida, verificar para ver se existem mais comandos para executar. Se houver mais comandos para executar, então você precisa dizer o jogo que precisa de continuar para o próximo comando. Se você tiver executado todas as possíveis sub-comandos então você está terminado a execução. O que acontece se ocorrer um erro durante a execução? Se um erro ocorrer durante a execução de um comando, você precisa chamar o OnError () função. Existem dois estados onde um erro pode ocorrer: 1) se o comando tem um pai, e 2) se o comando não tem um pai. Se o comando executar tem um comando pai, então o comando dos pais deve lidar com o erro. Mas se o comando executar não tem pai, então o CCommand () classe precisa limpar-se por chamar o OnRollBack () função. Todos os OnRollBack a função () faz é limpar os sub-comandos que podem existir e, em seguida, redefine a contar. Você pode estar pensando que se parece com uma enorme quantidade de código para uma classe que realmente não faz qualquer coisa. Para dizer a verdade, esta classe irá permitir-lhe manter a consistência entre todos seus comandos. Cada vez que você criar um comando, esse comando vai herdar todos os funções nesta classe. 240 Capítulo 11 ■ Kiddy Cartel-Criando seu próprio MMO Criação de um comando com Sub-Comandos Assim como você criar um novo comando? Criar um novo comando é tão simples como a criação de uma nova classe que herda da classe CCommand () e executar a lógica do Execute ()

Page 203: Programação de jogos em PHP

e OnRollBack () funções de membro. Alguns comandos, como o comando de login criar, não implementar a função OnRollBack () porque ele usa sub-comandos. Isso significa que que a classe CCommand () irá lidar com a reversão de todos os comandos do sub-. Dê uma olhada o CCreateAccountCmd () da classe. <? require_once ("CCommand.php"); require_once ("CRenderCmd.php"); require_once ("CLockTableCmd.php"); require_once ("CUnlockTableCmd.php"); require_once ("CVerifyAccountInfoCmd.php"); require_once ("CCreateNeighborhoodCmd.php"); classe CCreateAccountCmd estende CCommand { função CCreateAccountCmd (& $ pParent) { parent:: CCommand ($ pParent); $ This-> m_arraySubCommands [0] = new CRenderCmd ($ this); $ This-> m_arraySubCommands [1] = new CLockTableCmd ($ this); $ This-> m_arraySubCommands [2] = new CVerifyAccountInfoCmd ($ this); $ This-> m_arraySubCommands [3] = new CCreateNeighborhoodCmd ($ this); $ This-> m_arraySubCommands [4] = new CUnlockTableCmd ($ this); $ This-> m_arraySubCommands [5] = new CRenderCmd ($ this); } função Execute ($ args) { $ Resultado = null; / / É ok para nós continuar para realmente criar a conta? if ($ this-> m_nCurrentCommand == 0 & & isset ($ args ['avançar'])) { / / Temos o nosso contributo, por isso vamos passar para o próximo comando $ This-> m_nCurrentCommand + +; / / Queremos que o próximo "avançar" vemos ser um novo. Criação de um comando com Sub-Comandos 241 / / Assim se livrar do que temos hoje unset ($ args ['avançar']); } fazer { / / Salta para o comando atual e executá-lo switch ($ this-> m_nCurrentCommand) { case 0: / / Processar a página de criação da conta $ Result = $ this-> m_arraySubCommands [0] -> Execute ("CreateAccount.html", $ args); / / Se ele foi bem sucedido, então sabemos / / Que é preciso aguardar pela entrada

Page 204: Programação de jogos em PHP

if ($ resultado == CMD_FINISHED) { $ Resultado = CMD_NEEDS_INPUT; } break; case 1: / / Bloquear a tabela do banco de dados $ Result = $ this-> m_arraySubCommands [1] -> Execute ($ GLOBALS ['g_DBTable']); break; case 2: / / Verificar as informações da conta $ Result = $ this-> m_arraySubCommands [2] -> Execute ($ args ['sPlayerName'], $ Args ['sPassword'], $ Args ['sPasswordRetype'], $ Args ['sNeighborhoodName']); / / Houve um erro? if ($ result == CMD_ERROR) { / / Deixe o erro regulares / Negócio / manipulador com esses erros break; } / / Qualquer outro erro? else if ($ resultado! = CMD_FINISHED) { 242 Capítulo 11 ■ Kiddy Cartel-Criando seu próprio MMO / / Desfazer tudo o que fizemos até agora $ This-> OnRollBack (); / / Fazer uma nota do erro, / / Assim que a criação de / / Página conta pode render / / Para o usuário $ Args ['sError'] = $ resultado; / / Reiniciar a execução deste comando $ This-> m_nCurrentCommand = 0; return $ this-> Execute ($ args); } break; case 3: / / Criar o bairro $ Result = $ this-> m_arraySubCommands [3] -> Execute ($ args ['sPlayerName'], $ Args ['sPassword'], $ Args ['sNeighborhoodName']); break; case 4: / / Desbloquear todas as tabelas do banco de dados bloqueado $ Result = $ this-> m_arraySubCommands [4]

Page 205: Programação de jogos em PHP

-> Execute (); break; case 5: / / Render um "bem-sucedida criação" página $ Result = $ this-> m_arraySubCommands [5] -> Execute ("AccountCreationSuccess.html", $ args); break; } / / Manipular o resultado do nosso sub-comando $ Result = $ this-> HandleSubCommand ($ resultado); / / Enquanto ainda há comandos a serem / / Executado que não precisam de intervenção humana } While ($ resultado == CMD_CONTINUED); Criação de um comando com Sub-Comandos 243 return $ resultado; } } ?> Você notará que os primeiros seis linhas do código requerem outros arquivos. Esses arquivos são outras simplesmente outras classes que o jogo usa. Uma vez que este é um comando, você precisa de exigir a Arquivo CCommand.php assim você pode herdar dele. O CRenderCmd () permite que você passe a executar a função de um arquivo html para tornar o navegador. Este comando trata de tudo que o usuário vê. O CLockTableCmd () ea CUnlockTableCmd () bloqueia e desbloqueia um determinado tabela no banco de dados Cartel Kiddy. Sem essas duas classes, haveria uma chance que um usuário pode estar atualizando o banco de dados ao mesmo tempo que outro usuário está atualizando banco de dados, e que não é bom. O CVerifyAccountInfoCmd () procura no banco de dados certifique-se que o usuário não está tentando criar uma conta duplicada. Se forem, então a execução precisa parar e que o usuário precisa saber que a conta já existe. O último arquivo necessário é o arquivo que realmente cria o bairro de padrão para o usuário. Não vou explicar cada uma dessas classes. Há aulas apenas demais em este jogo para explicar cada em grande detalhe. Por favor, olhe o CD e dê uma olhada cada classe. Você notará que cada comando é estruturado de forma muito semelhante. Vou explicar o CCreateAccountCmd () classe e outra classe que não tem sub-comandos para executar de modo você pode ver a diferença na forma de código-las. Todos os CCreateAccountCmd () classe implementa é um construtor e do Execute () função.

Page 206: Programação de jogos em PHP

O construtor diz ao CCommand () classe que o CCreateAccountCmd () é a classe pai. Em seguida, a classe passa a configurar um conjunto de sub-comandos. Cada uma dessas sub-comandos terá a sua própria lógica no Execute () função. O Execute () usa uma função do ... while e uma instrução switch para determinar qual comando que deve ser executado. Cada caso em a instrução switch corresponde a um sub-comando. O sub-comando parecido com este: $ This-> m_arraySubCommands [0] = new CRenderCmd ($ this); $ This-> m_arraySubCommands [1] = new CLockTableCmd ($ this); $ This-> m_arraySubCommands [2] = new CVerifyAccountInfoCmd ($ this); $ This-> m_arraySubCommands [3] = new CCreateNeighborhoodCmd ($ this); $ This-> m_arraySubCommands [4] = new CUnlockTableCmd ($ this); $ This-> m_arraySubCommands [5] = new CRenderCmd ($ this); Então isso significa que a declaração primeiro caso irá conter a lógica para o CRenderCmd (). O segundo declaração caso irá conter a lógica para o CLockTableCmd (), e assim por diante. Uma vez que um comando tiver terminado a execução, o loop recomeça e se move para o próximo comando incrementando a variável $ m_nCurrentCommand. 244 Capítulo 11 ■ Kiddy Cartel-Criando seu próprio MMO A declaração primeiro caso usa o CRenderCmd () da classe. A função Execute () do CRenderCmd (classe) tem uma página HTML para um argumento. Isto irá renderizar a página HTML para o navegador. Uma vez que a página é processada para o navegador, o estado do jogo muda para esperar para a entrada. Uma vez que o usuário preenche o formulário na página CreateAccount.html e depois clica em Enviar, o comando é executado e bloqueia a tabela. Depois que a tabela está bloqueado o loop executa novamente, mas desta vez ele cai no terceiro caso. Isto é onde você verificar se esse usuário não existe. Se o usuário não existe, então a classe precisa reverter o que você tem feito até este ponto. Depois de ter verificado que a conta não existe no banco de dados você cria o bairro e desbloquear a mesa. Uma vez que a tabela é destravada você renderizar uma mensagem para o navegador dizendo ao usuário que a conta foi criada com sucesso e que eles pode logar e começar a jogar, Dê uma olhada Figuras 11.2 e 11.3 para ver o Criar Conta página ea página de Sucesso. É muito fácil criar um comando com sub-comandos. Não se preocupe em como integrar o comando para o jogo ainda. Que serão abordados mais adiante neste capítulo. Para

Page 207: Programação de jogos em PHP

agora, dar uma olhada em como criar um comando sem sub-comandos. Figura 11.2 A página Criar Conta. Criação de um Comando sem Sub-Comandos 245 Figura 11.3 a criação de contas de sucesso. Criação de um Comando sem Sub-Comandos Para criar um comando sem sub-comandos é muito mais simples do que criar comandos com sub-comandos. Em vez de implementar uma função de construtor e os Execute (), implementar o Execute () função eo OnRollBack () função. Desde que você não tem que executar a lógica para cada sub-comando, a única lógica que precisa estar no Execute () função é a lógica para a tarefa que você está tentando concluir. Vou usar o CAddWeaponsCmd () da classe para um exemplo. <? require_once ("db.php"); require_once ("CCommand.php"); require_once ("settings.php"); classe CAddWeaponsCmd estende CCommand { / / Informação necessária para reverter var $ m_sPlayerName; var $ m_nWaterBalloons; 246 Capítulo 11 ■ Kiddy Cartel-Criando seu próprio MMO var $ m_nPlasticBats; var $ m_nSlingshots; função Execute ($ sPlayerName, $ nWaterBalloons, NPlasticBats $, $ nSlingshots) { / / Certifique-se que a entrada são valores inteiros $ NWaterBalloons = (int) $ nWaterBalloons; $ NPlasticBats = (int) $ nPlasticBats; $ NSlingshots = (int) $ nSlingshots; / / Conecta ao db $ Db = DB:: connect ($ GLOBALS ['g_PearDBDSN']); if (DB:: IsError ($ db)) { / / Que todos saibam que houve um problema $ This-> OnError ("Falha ao conectar-se à banco de dados usando ". $ GLOBALS ['g_PearDBDSN']); / / Retorna falha retorno CMD_ERROR; } $ Query = "UPDATE". $ GLOBALS ['g_DBTable']. "Bexigas d'água SET = + $ NWaterBalloons bexigas d'água, PlasticBats = PlasticBats + $ NPlasticBats, estilingues Slingshots = + $ nSlingshots ONDE Playername = '$ sPlayerName' "; $ Result = $ db-> query ($ query); if (DB:: IsError ($ result))

Page 208: Programação de jogos em PHP

{ / / Que todos saibam que há um problema $ This-> OnError ("Failed to update" $ GLOBALS ['g_DBTable'].); / / Retorna falha retorno CMD_ERROR; Else {} / / Configurar as variáveis membro $ This-> m_sPlayerName = $ sPlayerName; $ This-> m_nWaterBalloons = $ nWaterBalloons; Criação de um Comando sem Sub-Comandos 247 $ This-> m_nPlasticBats = $ nPlasticBats; $ This-> m_nSlingshots = $ nSlingshots; retorno CMD_FINISHED; } } OnRollBack function () { / / Já que não há comando para deduzir as armas, / / Esta reversão deve ser implementado aqui / / Conecta ao db $ Db = DB:: connect ($ GLOBALS ['g_PearDBDSN']); if (DB:: IsError ($ db)) { / / Que todos saibam que houve um problema $ This-> OnError ("Falha ao conectar ao banco de dados usando" . $ GLOBALS ['g_PearDBDSN']); / / Retorna falha retorno CMD_ERROR; } $ Result = $ db-> Consulta ("UPDATE". $ GLOBALS ['g_DBTable']. "SET". "Bexigas d'água = bexigas d'água + $ this-> m_nWaterBalloons". "PlasticBats PlasticBats = + $ this-> m_nPlasticBats". "Slingshots Slingshots = + $ this-> m_nSlingshots". "WHERE playername = '$ this-> m_sPlayerName'"); if (DB:: IsError ($ result)) { / / Não há nada que podemos fazer se o / Rollback / falhou, por isso, deixe-o ir } retorno; } } ?> 248 Capítulo 11 ■ Kiddy Cartel-Criando seu próprio MMO Este comando é muito mais simples do que uma classe com sub-comandos. O Execute () função recebe os argumentos que você deseja atualizar. Neste caso, já que você está acrescentando armas para o seu leitor, ele precisa tomar um nome de jogador, o número de balões de água

Page 209: Programação de jogos em PHP

para adicionar, o número de morcegos de plástico para adicionar, eo número de estilingues para adicionar. O Execute () função começa, certificando-se que as variáveis são números inteiros. Em seguida, ele tenta se conectar ao banco de dados. Se a função Execute () não consegue se conectar ao banco de dados em seguida, ocorreu um erro e você precisa deixar o usuário saber o que aconteceu. Se o Execute () função conectado ao banco de dados com sucesso, então você pode atualizar o registro. A variável $ db está usando a API PEAR para se conectar ao banco de dados. A API PEAR contém uma função membro chamado Query () que irá executar a consulta que você especificou. Se um erro ocorre durante a execução você precisará chamar o OnRollBack () função. Caso contrário você atualizar stats dos jogadores e devolver o controle de volta ao jogo para que ele possa voltar a tornar o página. O OnRollBack () função tenta se conectar ao banco de dados. Após a OnRollBack () função, com sucesso, conectada ao banco de dados ele tenta atualizar o banco de dados de volta para os valores originais que o jogador tinha antes da consulta falhou. Se alguma coisa na Função OnRollBack () falhar, não há muito que você pode fazer. Olhe para todos os comandos ... e agora? Agora que você sabe como criar seus próprios comandos, você precisa encontrar uma maneira para acessá-los através da estrutura do jogo. Você vai precisar para criar algo chamado uma fábrica de comando. A classe de fábrica de comando contém uma única função chamada CreateCommand (). O comando classe de fábrica também tem um require_once () de referência para cada classe de comando único que que você criou. A classe de fábrica de comando permitirá que você criar um comando com base em na seqüência de consulta. Quando você clica em um link que aciona uma ação e você precisa dizer o jogo que tipo de ação que você vai começar, você fazer isso através da seqüência de consulta. Dê uma olhada na classe CommandFactory (). <? / * Você deve require_once () todos os arquivos de origem que contém comandos que deseja instanciado usando a fábrica. O CGame objeto usa a fábrica para lidar com a criação do objetos de comando a fim de esconder a necessidade de um pai do objeto CGame. * /

Page 210: Programação de jogos em PHP

Olhe para todos os comandos. . . Now What? 249 require_once ("CLockTableCmd.php"); require_once ("CUnlockTableCmd.php"); require_once ("CRenderCmd.php"); require_once ("CManageAccountCmd.php"); require_once ("CCreateAccountCmd.php"); require_once ("CEditAccountCmd.php"); require_once ("CMoveOutOfNeighborhoodCmd.php"); require_once ("CLogoutCmd.php"); require_once ("CLoginCmd.php"); require_once ("CGameMenuCmd.php"); require_once ("CAssetAcquisitionCmd.php"); require_once ("CBuyWeaponsCmd.php"); require_once ("CBuyEquipmentCmd.php"); require_once ("CRecruitCmd.php"); require_once ("CBuildResourceCmd.php"); require_once ("CMowLawnCmd.php"); require_once ("CMakeLemonadeCmd.php"); require_once ("CBakeCookiesCmd.php"); require_once ("CShowNeighborhoodStatsCmd.php"); require_once ("CViewTopNeighborhoodsCmd.php"); require_once ("COrderMinionsCmd.php"); require_once ("COrderPaperBoysCmd.php"); require_once ("COrderBulliesCmd.php"); require_once ("CRazeCmd.php"); require_once ("CScareCmd.php"); require_once ("CTakeOverCmd.php"); require_once ("CSpyCmd.php"); require_once ("CSabotageCmd.php"); require_once ("CBribeCmd.php"); 250 Capítulo 11 ■ Kiddy Cartel-Criando seu próprio MMO classe CCommandFactory { / / Isso existe para permitir que o pai / / Referência nos comandos para ser definido como null. var $ m_NullVariable = null; função CreateCommand (sCmdName $ = "") { / / Se é uma classe conhecida, criá-lo if (class_exists ($ sCmdName)) { return new $ sCmdName ($ m_NullVariable); } / / Estamos tentando criar uma classe que não existe? else if ($ sCmdName! = "" & &! class_exists ($ sCmdName)) { / / Isto nunca deveria acontecer, por isso alertar o programador / / (Eles provavelmente se esqueceu de require_once o comando) echo "<BR> comando desconhecido"; / / Saída difícil, pois não há nada que possamos realmente

Page 211: Programação de jogos em PHP

exit (1); } / / Ela é indefinida, então vá com o padrão outro { / / Render o comando principal do jogo por defeito return new CGameMenuCmd ($ this-> m_NullVariable); } } } ?> Se você criar seus próprios comandos e esquecer de adicionar o require_once () de referência para o arquivo então o jogo permitirá que você saiba que ele está tentando executar um comando desconhecido. Assim lembre-se de adicionar o seu comando para a fábrica de comando. Como você pode ver, tudo o que a fábrica de comando faz é verificar se o comando que você está tentando criar existe. Se o comando não existe, então cria-lo, se o comando não existe, então permite que você saiba. Se não houver um comando a ser executado, em seguida, ele assume que você está no menu do jogo e que deve tornar o menu para o browser. Olhe para todos os comandos. . . Now What? 251 Assim como no mundo você coloca tudo isso junto? Bem, é aí que a classe CGame () entra em jogo. Tudo o que acontece no jogo ocorre através da página main.php. A página chama o main.php CGame () da classe. Dê uma olhada na página main.php. <? require_once ("CGame.php"); require_once ("CNeighborhood.php"); require_once ("CCommand.php"); require_once ("CRenderCmd.php"); função main () { / Seed / gerador de números aleatórios uma vez para todos os comandos srand (time ()); / / Obtém a sessão em funcionamento session_start (); / / Se não houver uma objeção jogo na sessão, fazer uma if (! isset ($ _SESSION ['jogo'])) { $ _SESSION ['Jogo'] = new CGame; } / / Executar o comando de jogo atual $ _SESSION ['Jogo'] -> ExecuteCommand ($ _REQUEST); } main ();

Page 212: Programação de jogos em PHP

?> O primeiro evento que ocorre quando você bater esta página é que ele verifica para ver se você atualmente ter uma sessão. Se você tiver uma sessão, em seguida, ele executa as solicitações que têm vindo através da página usando a variável global $ _REQUEST. No entanto, se você não tem uma sessão ele começa um novo jogo, chamando o CGame () da classe. Figura 11.4 mostra a tela de login do o jogo, que é processado quando uma sessão é iniciada. 252 Capítulo 11 ■ Kiddy Cartel-Criando seu próprio MMO Figura 11.4 A tela de login aparece quando um novo jogo é iniciado. Depois que o arquivo main.php constrói a CGame () de classe, o CGame () constrói uma nova classe fábrica de comando. CGame função () { / / Cria a fábrica que iremos utilizar para obter os nossos comandos da $ This-> m_CmdFactory = new CCommandFactory; } Uma vez que a fábrica de comando é carregado, o arquivo main.php chama a ExecuteCommand () função para a classe CGame (). Esta função verifica a string de consulta para ver se existem comandos enviada para ele. Se não houver comandos colocada nas _REQUEST $ object, em seguida, o comando tipo é definido como uma string em branco. Esta seqüência em branco diz o jogo para tornar o jogo menu. Lembre-se que o objeto $ _REQUEST envia o tipo de comando para o comando fábrica e se não houver nenhum comando, ele assume que você está no menu. Após a CGame () da classe verifica se o objeto $ _REQUEST é preenchida créditos que o jogador com as voltas que ele merece. Em seguida, ele verifica se um comando está em execução. Se um comando não está executando, em seguida, ele tenta criar um novo comando. Se um comando está sendo executado em seguida, o CGame () da classe verifica se o comando executar é o mesmo que o comando que foi solicitado. Se não for o mesmo, então, algo estranho Olhe para todos os comandos. . . Now What? 253 que aconteceu e executar o comando precisa ser revertida e os novos solicitado comando precisa ser criado. Depois que o comando é criado, ele executa o comando. Após o comando é executado, ele verifica os resultados que você definiu anteriormente no Comando () da classe. Se o resultado for igual a CMD_FINISHED isso significa que o comando foi concluído com sucesso. Caso contrário, ele verifica

Page 213: Programação de jogos em PHP

para ver se ocorreu um erro. Se tiver ocorrido um erro no comando já rolou de volta o que ele tentou fazer, então você só precisa deixar o usuário saber o que aconteceu. A listagem de código a seguir mostra a CGame () classe em toda a sua glória fantástico: <? require_once ("CCommandFactory.php"); require_once ("CNeighborhood.php"); require_once ("CCreditTurns.php"); classe CGame { / / Bairro do jogador m_Neighborhood $ var; / / O comando em execução no momento var $ m_CurrentCmd; / / O comando da fábrica, que para obter todos os nossos comandos var $ m_CmdFactory; CGame função () { / / Cria a fábrica que iremos utilizar para / / Obter o nosso comanda a partir de $ This-> m_CmdFactory = new CCommandFactory; } / / Executa o próximo passo no jogo função ExecuteCommand ($ args) { / / Se um tipo não está definido, alterá-lo para um espaço em branco if (! isset ($ args ['type'])) { $ Args ['type'] = ""; 254 Capítulo 11 ■ Kiddy Cartel-Criando seu próprio MMO } / / Se o jogador estiver conectado, ele o crédito / / Voltas que ele merece if (isset ($ _SESSION ['bairro'])) { $ Turn_update CCreditTurns = new ($ null); $ Turn_update-> Execute (); } / / Não há comando atualmente em execução? if ($ this-> m_CurrentCmd == NULL) { / / Cria o novo comando $ This-> m_CurrentCmd = $ this-> m_CmdFactory-> CreateCommand ($ args ['type']); } / / Se o tipo de comando mudança em nós? else if (strtolower (get_class ($ this-> m_CurrentCmd))! = strtolower ($ args ['type'])) {

Page 214: Programação de jogos em PHP

/ / Nós interrompeu um comando, assim que desfazer o que fizemos $ This-> m_CurrentCmd-> OnRollBack (); / / Cria o novo comando $ This-> m_CurrentCmd = $ this-> m_CmdFactory-> CreateCommand ($ args ['type']); } / / Se há algo para executar (e não deve haver!), Fazê-lo if ($ this-> m_CurrentCmd! = NULL) { / / Executar o comando $ Result = $ this-> m_CurrentCmd-> Execute ($ args); / / É terminado? if ($ resultado == CMD_FINISHED) { $ This-> m_CurrentCmd = NULL; } Olhe para todos os comandos. . . Now What? 255 else if ($ resultado == CMD_ERROR) { echo "Ocorreu um erro durante a execução". get_class ($ this-> m_CurrentCmd). "<BR>!"; } } } } ?> Depois de ter tudo juntos na fábrica de comando e todas as configurações tweaked no arquivo settings.php, você pode rodar o jogo. Quando você efetuar login no jogo você vai ver o menu que parece com a Figura 11.5. Quando você rolar sobre os links que você vai ver um seqüência de consulta. Esta cadeia de consulta é deixar o jogo sabe o comando para executar. O link na barra de status do seu navegador deve ficar assim: http://localhost/chapter11/main.php?type=CBuyEquipmentCmd Figura 11.5 O jogo em ação. 256 Capítulo 11 ■ Kiddy Cartel-Criando seu próprio MMO Conclusão Você criou com sucesso um dos jogos mais legais MMO atualmente lá fora. Você deve dar-se uma palmadinha nas costas, porque você veio aos trancos e barrancos de o início deste livro. No próximo capítulo você vai explorar como criar seu próprio dinâmica peças Flash com PHP. Você também vai aprender como adicionar ActionScript e animação a estas peças em Flash dinâmico. Eu tenho que agradecer rapidamente Dragão Game Design Fly (www.dragonflygamedesign.com/) para

Page 215: Programação de jogos em PHP

criar esta idéia incrível para este MMO. Vá vê-los, pois eles fazem algumas incríveis de trabalho. Com isso dito, vamos passar a criar algumas peças em Flash dinâmico!  

capítulo 12 Construindo sua Habilidades PHP ■ PHP e Ming ■ Como criar um filme do Flash ■ Desenho para seu filme do Flash ■ Enchimento com Ming ■ Adicionando animação ao Pedaço de Flash ■ Adicionar ActionScript para a sua peça em Flash Ongratulations C, você conseguiu chegar até o fim deste livro, e você tem feito um pouco. Você aprendeu tudo sobre o ambiente de servidor em que PHP é executado. Você instalou seu próprio servidor Web. Você instalou o PHP intérprete. Você aprendeu tudo sobre HTML, e então você conquistou o básico de PHP. Você aprenderam sobre matrizes e você criou um jogo de tic-tac-toe. Você, então, dominado não relacionais bases de dados e criou um jogo de xadrez básico. Depois disso, você refaz uma Web-based versão do clássico Scorched Terra, chamado Battle Tank. Você mesmo criou o seu próprio MMO jogo. Você tem feito tudo isso com PHP sozinho. Imaginar o que mais você pode fazer com PHP. Nesta capítulo final, você vai dar uma olhada em algumas das outras coisas legais que você pode fazer com PHP. PHP e Ming O que é Ming? Ming é uma biblioteca que permite que você crie seu próprio SWF dinâmicos Filmes flash. Isso mesmo, você pode criar on-the-fly de filmes Flash. Imaginar o infinito 257 258 Capítulo 12 ■ Construir suas habilidades PHP aplicativos que você pode usar isto para. Tickers dinâmica, uma aplicação de chat on-line usando um Motor de PHP, criação de jogos desafio aleatório, a lista vai sobre e sobre. Até este ponto, todos os seus jogos têm sido baseado em turnos com mínima interação do usuário com a página em si. Com PHP combinado com o Flash você pode adicionar algumas interações muito legal o seu jogo. Além de adicionar interação que você pode criar algumas animações real. Você pode até adicionar o Flash elementos em seu jogo. Agora provavelmente você está mastigando o bocado para instalar Ming. Antes de eu chegar ao que eu só quero

Page 216: Programação de jogos em PHP

dizer que esta não é uma completa "tudo o que você pode fazer com Ming" capítulo. Isto é simplesmente um olhar o que você pode fazer para construir suas habilidades PHP. Agora, com o que disse, você instala Ming como qualquer outra extensão. Abra o arquivo php.ini e descomente a seguinte linha: extension = php_ming.dll Se você é do tipo que prefere carregar a extensão dinamicamente, você sempre pode usar o seguinte código para fazer exatamente isso: <? Php if (! extension_loaded ('ming')) { if (strtoupper (substr (PHP_OS, 0, 3)) == 'WIN') { dl ('php_ming.dll'); } outro { dl ('php_ming.so'); } } ?> Agora que você tem oficialmente habilitado Ming você pode começar a criar peças em Flash dinâmico. Ming vem com 13 classes que permitem realizar várias tarefas em Flash. Dê uma olhada na Tabela 12.1 para uma descrição dessas 13 classes para criar e manipular o seu peças em Flash dinâmico. Nota Ming não cria ActionScript para você. No entanto, ele lhe dá uma interface para adicionar seus próprios ActionScript para suas peças em Flash dinâmico. Como criar um filme Flash 259 Ming Objects Descrição da classe SWFMovie SWFShape SWFFill SWFGradient SWFBitmap SWFFont SWFText SWFTextField SWFDisplayItem SWFSprite SWFMorph SWFButton SWFAction Tabela 12.1

Page 217: Programação de jogos em PHP

Cria um filme do Flash. Cria formas geométricas para o seu filme Flash. Fornece métodos para preencher seus objetos. Cria um objeto de gradiente para que você possa usá-lo como um preenchimento de sua geometria. Permite que você inclua. Jpg e. Png em seu filme Flash. Permite criar uma fonte para o seu pedaço Flash. Possibilita a saída de texto para o seu pedaço Flash. Permite que você crie uma área de entrada de texto em seu pedaço Flash. Permite que você acesse objetos Flash. Permite que você crie um clipe de filme para o seu pedaço Flash. Permite que você crie tweens forma entre dois objetos. Permite que você crie um botão no seu pedaço Flash. Cria um objeto do ActionScript que você pode adicionar o ActionScript para o seu pedaço Flash. Como criar um filme do Flash Para criar um novo filme do Flash que você precisa para invocar uma instância da classe SWFMovie. Dê uma olhar para a seguinte linha de código para ver como invocar a classe SWFMovie: $ MyMovie = new SWFMovie (); A variável $ myMovie agora contém uma instância da classe SWFMovie. Agora que você tem um instância de SWFMovie você pode especificar os fundamentos de seu filme, como filme dimensões, taxa de quadros, ea cor de fundo. Depois de ter especificado esses fundamentos de seu filme você poderia saída para o navegador. Para definir as dimensões de seu filme, a classe SWFMovie contém uma função membro chamado setDimension (). O setDimension () função recebe dois argumentos: a largura ea altura (Em pixels) que você quer que seu filme seja. Dê uma olhada na seguinte linha de código para ver como para definir a dimensão do seu filme Flash dinâmico: $ MyMovie-> setDimension (400, 300); Isso define a peça Flash $ myMovie para uma largura de 400 pixels e uma altura de 300 pixels. Agora que definiu as dimensões de sua peça em Flash que você precisa especificar a sua taxa de quadros. Sua taxa de quadros especifica o número de quadros por segundo que será exibido. A Flash 260 Capítulo 12 ■ Construir suas habilidades PHP filme é apenas uma série de quadros, como uma espécie de cartoon. Então, para mostrar uma animação você iria percorrer diferentes quadros. Para definir a taxa de quadros você usa o setRate () função. Esta função recebe um parâmetro: um inteiro que especifica o número de quadros por segundo, que será exibida. $ MyMovie-> setRate (30);

Page 218: Programação de jogos em PHP

O trecho de código acima define o filme para percorrer seus quadros a 30 frames por segundo. Agora que você tenha especificado as dimensões de seu filme ea taxa em que seu filme será reproduzido você precisa definir uma cor de fundo. Para definir a cor de fundo do seu filme, a classe SWFMovie contém uma função membro setBackground chamada (). O setBackground () função recebe três argumentos, todos os inteiros. O primeiro argumento é o componente vermelho da cor que você deseja usar. O segundo argumento é o componente verde, eo argumento terceiro e último é o componente azul da a cor que você deseja usar. Dê uma olhada no seguinte trecho de código. Ele define o fundo cor da sua peça Flash para negros. $ MyMovie-> setBackground (0, 0, 0); Agora que você já criou uma peça básica do Flash, e eu quero dizer básicos, você vai querer de alguma forma para exibi-lo para a tela. É uma coisa boa que a classe SWFMovie contém uma função membro saída chamada () que escreve a saída para o navegador. Para usá-lo, você precisa especificar o tipo de conteúdo, tal como fez quando estava criando seus próprios gráficos dinâmicos. Dê uma olhar para as seguintes linhas de código: header ("Content-type: application / x-shockwave-flash"); $ MyMovie-> output (); Vamos colocar tudo isso junto e dar uma olhada nele para ver os resultados de todo este código. <? Php $ MyMovie = new SWFMovie (); $ MyMovie-> setDimension (400, 300); $ MyMovie-> setRate (30); $ MyMovie-> setBackground (0, 0, 0); / / Agora a saída do filme header ("Content-type: application / x-shockwave-flash"); $ MyMovie-> output (); ?> Hmmm. . . Observe como o pedaço do Flash inteira enche o navegador não importa quão grande é mesmo que você especificou as dimensões do filme do Flash? Ele faz isso porque um Flash peça pode escala-se dinamicamente, pois utiliza gráficos vetoriais. Portanto, a fim de manter o Como criar um filme Flash 261 Flash pedaço nas dimensões que você especificou, você precisa incorporá-lo em uma tag <object> e salvar o filme do Flash para o disco. Dê uma olhada no exemplo a seguir para ver como fazer isso: <html>

Page 219: Programação de jogos em PHP

<body> <OBJECT classid = "clsid: D27CDB6E-AE6D-11cf-96B8-444553540000" codebase = "http://download.macromedia.com/pub/shockwave/cabs/flash/ swflash.cab # version = 6,0,0,0 " WIDTH = "400" height = id "300" = "flashTest"> <PARAM NAME=movie VALUE="example01.php"> <EMBED src = "WIDTH example01.php" = "400" height = "300" TYPE = "application / x-shockwave-flash" Pluginspage = "http://www.macromedia.com/go/getflashplayer"> </ embed> </ OBJECT> </ Body> </ Html> Dê uma olhada na Figura 12.1 para ver os resultados de incorporar o arquivo Flash em uma dinâmica Página HTML. Não é muito ainda, mas agora eu vou lhe mostrar como desenhar em sua tela de filme do Flash. Figura 12.1 Um filme de Flash dinâmico básico incorporado em um Página HTML. 262 Capítulo 12 ■ Construir suas habilidades PHP Desenho para seu filme do Flash Para desenhar a sua peça em Flash que você precisa criar uma instância da classe SWFShape. Você fazer isso da mesma forma que você criou uma instância da classe SWFMovie. Uma vez que uma instância de SWFShape é criado você tem acesso a várias funções para desenhar linhas e curvas. $ Forma = new SWFShape (); Agora que você tem uma instância da classe SWFShape, você pode desenhar para o filme que você criado anteriormente. Para desenhar uma linha, SWFShape oferece duas funções de membro para realmente chamar a a linha e uma função de membro para definir o estilo da linha. Para definir o estilo da linha você pode usar o setLine () função. O setLine () função recebe cinco argumentos. A primeira é a largura da linha em pixels; os próximos três argumentos são os Valores RGB para a cor da linha, o quinto e último argumento é o valor alfa para o linha. Digamos que você queria desenhar uma linha de 5 pixels, largura amarela em sua tela. Você teria definir o estilo parecido com isto: $ Forma-> setLine (5, 255, 255, 0 255.); As duas funções para desenhar uma linha para a tela são drawLine () e drawLineTo (). Cada um dos estas funções possuem dois argumentos: uma coordenada x e ay de coordenadas. O drawLine () função desenha uma linha a partir da posição atual caneta para um ponto (x, y) pixels de distância da

Page 220: Programação de jogos em PHP

posição atual. O drawLineTo () função desenha uma linha a partir da posição atual caneta para a (x, y) de coordenadas especificado. A posição caneta é onde a ponta da caneta está atualmente na tela. Você pode mover o posição da caneta chamando o movePenTo () função de membro. O movePenTo () membro função recebe dois argumentos: uma coordenada x e ay de coordenadas. Dê uma olhada no seguinte código de exemplo para ver a diferença entre as duas funções de desenho de linha: <? Php $ MyMovie = new SWFMovie (); $ MyMovie-> setDimension (400, 300); $ MyMovie-> setRate (30); $ MyMovie-> setBackground (200, 200, 200); / / Desenha uma linha para a tela usando drawLine () $ Linha1 = new SWFShape (); $ Linha1-> setLine (5, 0, 0, 0, 255); $ Linha1-> movePenTo (40, 20); $ Linha1-> drawLine (100, 100); $ Linha2 = new SWFShape (); $ Line2-> setLine (5, 0, 0, 0, 255); Desenho para seu filme Flash 263 $ Line2-> movePenTo (80, 20); $ Line2-> drawLineTo (200, 100); / / Agora adicione as formas para o filme $ MyMovie-> add ($ linha1); $ MyMovie-> add ($ linha2); / / Agora a saída do filme header ("Content-type: application / x-shockwave-flash"); $ MyMovie-> output (); ?> Primeiro você cria um filme que é de 400 300 pixels com um fundo cinza claro. Depois que você tiver inicializado o filme que você criar duas linhas, ambas de 5 pixels de largura, com uma cor de preto. Em seguida, você move a caneta para um ponto específico na tela e desenhar uma linha. Depois de ter traçada uma linha para ambos os objetos SWFShape você precisa adicioná-los ao cinema. Para fazer isso, você usar o add () função membro da classe SWFMovie. O add () função recebe uma argumento de um tipo misto. Os resultados do exemplo acima a aparência da Figura 12.2. Agora que você sabe como desenhar linhas com o estágio de seu pedaço Flash, dê uma olhada em como você desenhar curvas para o palco. Ming fornece duas funções para desenhar curvas como ele fornece

Page 221: Programação de jogos em PHP

-lo com duas funções para desenhar linhas. A primeira das duas funções é DrawCurve (). O DrawCurve () função desenha uma curva em relação à posição atual caneta. O DrawCurve (função) leva quatro argumentos. Os dois primeiros argumentos são os coordenadas X e Y do ponto de controle da curva. Os dois últimos argumentos são as coordenadas X e Y do que é chamado o ponto de ancoragem. Figura 12.2 Desenho de linhas com SWFShape. 264 Capítulo 12 ■ Construir suas habilidades PHP Quando Ming desenha uma curva, ele começa na posição atual da caneta, que é chamado de ponto de origem. Em seguida, desenha uma curva para o ponto de ancoragem, primeiro passando pelo controle ponto. Dê uma olhada na Figura 12.3 para ver uma representação visual deste. A segunda função utilizada para desenhar uma curva é chamado drawCurveTo (). Assim como o drawLineTo () função, ela começa na posição atual caneta e desenha seu ponto para o ponto de ancoragem, usando o ponto de controle para definir a gravidade da curva. O DrawCurve () função também leva quatro argumentos. Os dois primeiros argumentos são as coordenadas x e y do controle ponto. Os dois últimos argumentos são as coordenadas x e y do ponto de ancoragem. Para desenhar uma curva, na verdade você seguir a mesma lógica que você faria para desenhar uma linha. Você precisa criar um filme Flash, e inicializar as suas dimensões, taxa e cor de fundo. Então você necessidade de criar uma nova SWFShape () objeto e definir o estilo da linha que você está indo para uso por usando o setLine () função. Dê uma olhada na seguinte função para ver como desenhar uma curva usando o drawCurveTo () função: <? Php $ MyMovie = new SWFMovie (); $ MyMovie-> setDimension (400, 300); $ MyMovie-> setRate (30); $ MyMovie-> setBackground (200, 200, 200); / / Desenha uma curva Curva $ = new SWFShape (); $ Curva -> setLine (5, 0, 0, 0, 255); $ Curva -> movePenTo (40, 20); $ Curva -> drawCurveTo (100, 100, 100, 20); / / Agora adicione as formas para o filme $ MyMovie-> add ($ curva); / / Agora a saída do filme header ("Content-type: application / x-shockwave-flash"); $ MyMovie-> output ();

Page 222: Programação de jogos em PHP

?> Dê uma olhada nos resultados na Figura 12.4 Objetos com enchimento Ming 265 Figura 12.3 O Ming método de desenho de curva. Figura 12.4 Resultados da DrawCurveTo () função. Objetos de enchimento com Ming Ming oferece três maneiras de preencher um objeto. Você pode preencher um objeto com uma cor, você pode preencher um objeto usando um gradiente, e você ainda pode preencher um objeto usando uma imagem. O Classe SWFShape () fornece duas funções para preencher uma imagem. O setLeftFill () função da função eo setRightFill () recebem um SWFFill () objeto como seu único argumento. Você pode recuperar um SWFFill () objeto usando o addFill () função de membro que 266 Capítulo 12 ■ Construir suas habilidades PHP o SWFShape () classe fornece. O addFill () função recebe três argumentos. O primeiro argumento é o componente vermelho da cor que você deseja usar para preencher. O segundo argumento é o componente verde da cor, eo terceiro argumento é o componente azul da cor. Então, qual a função preencher você usa? Bem, tudo depende de como você está desenhando o seu objeto. Se você está desenhando o seu objeto no sentido horário, então você precisa usar o-Setright Fill (função). Se você está desenhando a sua forma no sentido anti-horário, então você precisa usar o setLeftFill () função. No exemplo a seguir você vai desenhar um quadrado com uma borda de 5 pixel-preta que é preenchido com o verde: <? Php $ MyMovie = new SWFMovie (); $ MyMovie-> setDimension (400, 300); $ MyMovie-> setRate (30); $ MyMovie-> setBackground (200, 200, 200); / / Cria uma nova forma e adicionar um objeto de preenchimento $ Square = new SWFShape (); $ Square-> setLine (5, 0, 0, 0, 255); Fill = $ $ square-> addFill (0, 255, 0); $ Square-> setRightFill ($ preenchimento); / / Desenha um quadrado $ Square-> movePenTo (40, 20); $ Square-> drawLineTo (140, 20); $ Square-> drawLineTo (140, 120); $ Square-> drawLineTo (40, 120); $ Square-> drawLineTo (40, 20); / / Agora adicione as formas para o filme

Page 223: Programação de jogos em PHP

$ MyMovie-> add ($ quadrados); / / Agora a saída do filme header ("Content-type: application / x-shockwave-flash"); $ MyMovie-> output (); ?> Desde que eu estou desenhando o quadrado em sentido horário Eu uso o setRightFill () função. Se eu fosse desenhar o quadrado em sentido anti-horário eu teria usado setLeftFill (). Dê uma olhada na Figura 12.5 para ver os resultados do exemplo acima. Objetos com enchimento Ming 267 Figura 12.5 Preenchendo uma forma. A segunda maneira de preencher um objeto no Flash é usar o SWFGradient () da classe. Esta classe permite você para preencher uma área com um preenchimento de gradiente. Depois de criar uma instância da SWFGradient () classe que você pode adicionar uma entrada de preenchimento para-lo usando o addEntry () função. O addEntry () função recebe cinco argumentos. O primeiro argumento é um valor índice que pode estar entre 0.0 e 1.0. Esta razão especifica onde no gradiente da cor deve ocorrer. Normalmente, quando você está adicionando um preenchimento gradiente, você irá adicionar duas entradas para o objeto. O primeiro cor será a relação de 0,0 ea segunda cor será o valor 1,0 para a razão. Você consegue adivinhar o que os próximos três argumentos são? Isso mesmo, eles são o vermelho, verde e componentes azuis da cor. O quinto argumento é um argumento opcional, onde você pode especificar o canal alfa para a cor. Agora pegue o exemplo anterior usada para preencher um quadrado e alterar o preenchimento regular a um gradiente preencher indo do vermelho ao branco e tem o início do gradiente do outro lado da praça. <? Php $ MyMovie = new SWFMovie (); $ MyMovie-> setDimension (400, 300); $ MyMovie-> setRate (30); $ MyMovie-> setBackground (200, 200, 200); / / Cria uma nova forma e definir o estilo de linha $ Square = new SWFShape (); $ Square-> setLine (5, 0, 0, 0, 255); 268 Capítulo 12 ■ Construir suas habilidades PHP / / Criar um novo preenchimento de gradiente $ Gradiente = new SWFGradient (); $ Gradiente-> addEntry (0.0, 255, 0, 0); $ Gradiente-> addEntry (0,5, 255, 255, 255); / / Adicionar o preenchimento à forma Fill = $ $ square-> addFill ($ gradiente, SWFFILL_RADIAL_GRADIENT); $ Square-> setRightFill ($ preenchimento);

Page 224: Programação de jogos em PHP

/ / Desenha um quadrado $ Square-> movePenTo (40, 20); $ Square-> drawLineTo (340, 20); $ Square-> drawLineTo (340, 220); $ Square-> drawLineTo (40, 220); $ Square-> drawLineTo (40, 20); / / Agora adicione as formas para o filme $ MyMovie-> add ($ quadrados); / / Agora a saída do filme header ("Content-type: application / x-shockwave-flash"); $ MyMovie-> output (); ?> Figura 12.6 mostra os resultados do exemplo acima. Muito legal, hein? Mas há uma coisa que eu preciso falar para não perdê-lo. Há duas maneiras de preencher um gradiente objeto: a maneira que você fez isso com a bandeira SWFFILL_RADIAL_GRADIENT ou você pode usar o SWFFILL_LINEAR_GRADIENT bandeira. Figura 12.6 Aplicando um preenchimento de gradiente a uma forma. Objetos de enchimento com Ming 269 Agora que você sabe como inundações preencher objetos e como gradiente de preenchimento objetos, você pode aprender a preencher objetos com bitmaps. Esta é uma maneira divertida para preencher objetos. Você pode classificar de comparar para o mapeamento de textura em programação de jogos 3D, mas não é tão complexo. Para preencher um objeto com bitmaps você precisa criar uma instância da SWFBitmap () da classe. O Classe SWFBitmap () não expõe todas as funções preencher mas permite que você crie um bitmap. O addFill () função de membro da SWFShape () da classe é o que permite que você preencher uma forma. A classe SWFBitmap () permite-lhe criar um bitmap de dois tipos de arquivos. O primeiro é um . Dbl arquivo (Definir Bits Lossless), que podem ser criados a partir de um gif. Ou um arquivo. Png. Ming fornece uma ferramenta chamada gif2dbl que converte um gif. para um arquivo. dbl. O segundo tipo de gráfico que você pode criar um bitmap é um. jpg não-progressivo. Você pode usar a edição de avaliação do Paint Shop Pro incluído no CD para criar não progressiva. jpg. Para criar um bitmap de outro arquivo, você precisará ler os dados em um buffer usando o funções de arquivo que o PHP oferece. Para ler em um arquivo, você precisará abrir o arquivo com a função fopen () e ler o arquivo com o fread () função. Dê uma olhada no seguinte trecho de código para um exemplo rápido: $ Fp = fopen ("somefile.jpg", "rb");

Page 225: Programação de jogos em PHP

$ Data = fread ($ fp, filesize ("somefile.jpg")); Nota Para aqueles de vocês acostumados a abertura e leitura de arquivos em C, PHP usa os mesmos parâmetros como C. Depois de ler os dados em um buffer, você passa o buffer para o SWFBitmap () construtor para criar uma imagem bitmap novo. $ Bitmap SWFBitmap = ($ data); Então, depois você tem uma imagem bitmap, você pode passá-lo para a função de membro addFill () do o SWFShape () da classe e especificar uma das seguintes bandeiras: ■ SWFFILL_CLIPPED_BITMAP. Esta bandeira será exibida apenas uma instância do bitmap. ■ SWFFILL_TILED_BITMAP. Esta bandeira será a telha bitmap em toda a sua imagem. Dê uma olhada no exemplo a seguir para ver como telha um bitmap em uma SWFShape (): <? Php $ MyMovie = new SWFMovie (); $ MyMovie-> setDimension (400, 300); $ MyMovie-> setRate (30); $ MyMovie-> setBackground (200, 200, 200); / / Cria uma nova forma e definir o estilo de linha 270 Capítulo 12 ■ Construir suas habilidades PHP $ Square = new SWFShape (); $ Square-> setLine (5, 0, 0, 0, 255); / / Abrir um gráfico e ler os dados em um buffer $ Fp = fopen ("tessalation.jpg", "rb"); $ Data = fread ($ fp, filesize ("tessalation.jpg")); / / Cria uma nova imagem bitmap $ Bitmap = new SWFBitmap ($ data); / / Adicionar o preenchimento à forma Fill = $ $ square-> addFill ($ bitmap, SWFFILL_TILED_BITMAP); $ Square-> setRightFill ($ preenchimento); / / Desenha um quadrado $ Square-> movePenTo (40, 20); $ Square-> drawLineTo (340, 20); $ Square-> drawLineTo (340, 220); $ Square-> drawLineTo (40, 220); $ Square-> drawLineTo (40, 20); / / Agora adicione as formas para o filme $ MyMovie-> add ($ quadrados); / / Agora a saída do filme header ("Content-type: application / x-shockwave-flash"); $ MyMovie-> output (); ?> Figura 12.7 mostra os resultados do exemplo acima. Figura 12.7 Preenchendo uma forma com uma imagem bitmap lado a lado.

Page 226: Programação de jogos em PHP

Adicionando animação ao seu filme do Flash 271 Adicionando animação ao seu filme do Flash Adicionando animação para seu filme Flash realmente não é tão difícil. Até este ponto, você tem função membro usou o add () do SWFMovie () da classe assumindo que ele não retorna qualquer coisa. Mas como uma questão de fato ele faz algo de retorno. Ele retorna um SWFDisplayItem () objeto. Você pode usar esse objeto retornado para manipular a forma que você adicionar ao seu Filme do Flash. / / Como você tem usado o add () função $ Filme-> add ($ forma); / / Do jeito que você vai usar o add () função $ = $ ShapeHandle filme-> add ($ forma); Com esta nova SWFDisplayItem () pega, poderá mover o objeto usando uma das duas funções. O primeiro é o move () função. Possui dois argumentos. O primeiro argumento é o x coordenar e segundo argumento é a coordenada y. A segunda função é a moveTo () função, e também leva uma coordenada x e ay de coordenadas. Não apenas você pode mover uma forma com o movimento () ou moveTo () funções, você também pode girar uma forma usando o rotate () função. O rotate () função recebe um único argumento especificando o número de graus que você deseja girar o objeto. Vamos tomar o exemplo quadrado novamente e desenhar o quadrado no canto superior esquerdo da a peça Flash. Movê-lo para um ponto e girar o quadrado de 45 graus. <? Php $ MyMovie = new SWFMovie (); $ MyMovie-> setDimension (400, 300); $ MyMovie-> setRate (30); $ MyMovie-> setBackground (200, 200, 200); / / Cria uma nova forma e definir o estilo de linha $ Square = new SWFShape (); $ Square-> setLine (5, 0, 0, 0, 255); / / Desenha um quadrado $ Square-> movePenTo (1, 1); $ Square-> drawLineTo (61, 1); $ Square-> drawLineTo (61, 61); $ Square-> drawLineTo (1, 61); $ Square-> drawLineTo (1, 1); / / Agora adicione as formas para o filme SquareHandle $ = $ myMovie-> add ($ quadrados); 272 Capítulo 12 ■ Construir suas habilidades PHP / / Move a forma um pouco $ SquareHandle-> moveTo (30, 100); / / Girar a forma 45 graus $ SquareHandle-> girar (45);

Page 227: Programação de jogos em PHP

/ / Agora a saída do filme header ("Content-type: application / x-shockwave-flash"); $ MyMovie-> output (); ?> O exemplo acima, com resultados mostrados na Figura 12.8, o objeto simplesmente se move para baixo e um pouco para a direita, e então ele gira o objeto 45 graus. Isso afeta apenas o primeiro quadro da peça Flash. Para que isto se torne uma animação você precisa adicionar vários quadros para a sua peça Flash. Para fazer isso você pode usar o nextFrame () função de membro da SWFMovie (classe). Figura 12.8 movendo e girando uma forma. Agora pegue o exemplo que você acabou de fazer e torná-lo uma animação. O objetivo dessa animação será simplesmente mover o número alguns quadrados de pixels e girá-lo cada quadro. Eu não vou ser capaz de mostrar-lhe um tiro de tela da animação, porque não faria qualquer sentido, mas o exemplo está no CD fornecido com este livro. <? Php $ MyMovie = new SWFMovie (); $ MyMovie-> setDimension (400, 300); $ MyMovie-> setRate (30); Adicionando animação ao seu filme do Flash 273 $ MyMovie-> setBackground (200, 200, 200); / / Cria uma nova forma e definir o estilo de linha $ Square = new SWFShape (); $ Square-> setLine (5, 0, 0, 0, 255); / / Desenha um quadrado $ Square-> movePenTo (1, 1); $ Square-> drawLineTo (61, 1); $ Square-> drawLineTo (61, 61); $ Square-> drawLineTo (1, 61); $ Square-> drawLineTo (1, 1); / / Agora adicione as formas para o filme SquareHandle $ = $ myMovie-> add ($ quadrados); $ SquareHandle-> moveTo (30, 100); $ MyMovie-> nextFrame (); $ SquareHandle-> girar (15); $ MyMovie-> nextFrame (); $ SquareHandle-> moveTo (80, 200); $ MyMovie-> nextFrame (); $ SquareHandle-> girar (15); $ MyMovie-> nextFrame (); $ SquareHandle-> moveTo (130, 280); $ MyMovie-> nextFrame (); $ SquareHandle-> girar (15); $ MyMovie-> nextFrame ();

Page 228: Programação de jogos em PHP

$ SquareHandle-> moveTo (180, 180); $ MyMovie-> nextFrame (); $ SquareHandle-> girar (15); $ MyMovie-> nextFrame (); $ SquareHandle-> moveTo (130, 80); $ MyMovie-> nextFrame (); $ SquareHandle-> girar (15); $ MyMovie-> nextFrame (); / / Agora a saída do filme header ("Content-type: application / x-shockwave-flash"); $ MyMovie-> output (); ?> 274 Capítulo 12 ■ Construir suas habilidades PHP Se você tomar um olhar para o exemplo no CD você vai perceber que o quadrado salta ao redor da tela. Se você acha que está indo muito rápido, você deve ajustar a taxa de quadros no seu flash peça ou adicionar mais quadros para a rotação. Este é um exemplo simples da animação, mas deve dar-lhe a idéia. Agora, dê uma olhada no SWFMorph (), o que permitirá que você crie uma interpolação de forma entre duas formas. A classe SWFMorph () tem duas funções de membro: getShape1 () e getShape2 (). Estas duas funções não têm quaisquer argumentos em tudo. Eles permitem que você defina uma forma começar a e forma um fim de morph entre eles. $ Morph = new SWFMorph (); Shape1 $ = $ morph-> getShape1 (); Shape2 $ = $ morph-> getShape2 (); Morph vamos a praça em um retângulo para ver como usar o SWFMorph () da classe. <? Php $ MyMovie = new SWFMovie (); $ MyMovie-> setDimension (400, 300); $ MyMovie-> setRate (5); $ MyMovie-> setBackground (200, 200, 200); / / Cria um objeto morph novo $ Morph = new SWFMorph (); / / Cria uma nova forma e definir o estilo de linha $ Square = new SWFShape (); $ Retângulo = new SWFShape (); $ Square = $ morph-> getShape1 (); $ Square-> setLine (5, 0, 0, 0, 255); Retângulo $ = $ morph-> getShape2 (); $ Retângulo> setLine (5, 0, 0, 0, 255); / / Desenha um quadrado $ Square-> movePenTo (1, 1); $ Square-> drawLineTo (61, 1); $ Square-> drawLineTo (61, 61);

Page 229: Programação de jogos em PHP

$ Square-> drawLineTo (1, 61); $ Square-> drawLineTo (1, 1); Adicionando o ActionScript a sua parte do Flash 275 / / Desenha um retângulo $ Retângulo> movePenTo (1, 1); $ Retângulo> drawLineTo (161, 1); $ Retângulo> drawLineTo (161, 61); $ Retângulo> drawLineTo (1, 61); $ Retângulo> drawLineTo (1, 1); MorphHandle $ = $ myMovie-> add ($ morph); $ MorphHandle-> moveTo (100, 100); for ($ i = 0,0; $ i <1,0; $ i + = 0,1) { $ MorphHandle-> setRatio ($ i); $ MyMovie-> nextFrame (); } / / Agora a saída do filme header ("Content-type: application / x-shockwave-flash"); $ MyMovie-> output (); ?> Primeiro, defina os atributos de seu filme. (Você notará neste exemplo que a taxa de quadros é de apenas 5 frames por segundo. A razão para isso é que você pode ver o morph com mais clareza.) Então você cria um objeto de metamorfose. Depois de ter criado um objeto morph você precisa criar dois objetos de forma e definir qual será a forma inicial e qual delas irá ser a forma final. Depois de ter definido as formas de início e fim, você pode desenhá-los. Então você precisa adicionar o morph objeto para o filme e começar a lidar com novo objeto. Assim que tiver o identificador de objeto você pode realmente criar a interpolação. Neste caso, a interpolação ocorre mais de 11 frames. Ele começa em 0.0 e adiciona 0,1 a $ i. Cada vez que $ i é incrementado de atualizar a relação em que o tween deve ocorrer e, em seguida, adicionar uma moldura para o filme. Dê uma olhada no exemplo incluído no CD para ver os resultados do exemplo acima. Adicionando o ActionScript a sua parte em Flash ActionScript é uma linguagem de programação orientada a objeto usado especificamente para criar interatividade e animações em Flash. Com o ActionScript que você pode fazer tudo, desde o carregamento em sprites dinâmica dinamicamente em movimento e clipes de filme de redimensionamento. 276 Capítulo 12 ■ Construir suas habilidades PHP Nota Sintaxe do ActionScript é muito parecido com JavaScript. Ele usa um DOM para acessar seus elementos-por exemplo,

Page 230: Programação de jogos em PHP

_root.clientinfo.ip. ActionScript usa tipos de dados para definir suas variáveis. Que costumava ser em Flash 4 que não necessidade de declarar o tipo de dados de sua variável. Mas desde o lançamento do Flash 5 você precisa especificar um tipo de dados. Existem cinco tipos de dados básicos que o Flash usa: ■ Boolean ■ Cordas Número ■ ■ Clipe de filme Objeto ■ Esses tipos de dados são usados em muitas línguas e deve ser novidade para você agora. Então, como você adicionar o ActionScript para suas peças em Flash dinâmico? Você usa o SWFAction () classe. O construtor para esta classe recebe um único argumento. Esse argumento é um Action- Comando de script. Por exemplo: $ Action = SWFAction nova ("stop ();"); A maneira mais fácil de ver como tudo isso funciona é ver um exemplo, então dê uma olhada no seguinte exemplo, em que uma caixa de texto exibirá a posição de uma forma no palco: <? Php $ MyMovie = new SWFMovie (); $ MyMovie-> setDimension (400, 300); $ MyMovie-> setRate (5); $ MyMovie-> setBackground (200, 200, 200); / / Cria um objeto morph novo $ Morph = new SWFMorph (); / / Cria uma nova forma e definir o estilo de linha $ Square = new SWFShape (); $ Square-> setLine (5, 0, 0, 0, 255); / / Desenha o quadrado $ Square-> movePenTo (1, 1); $ Square-> drawLineTo (61, 1); $ Square-> drawLineTo (61, 61); Adicionando o ActionScript para seu 277 peças em Flash $ Square-> drawLineTo (1, 61); $ Square-> drawLineTo (1, 1); / / Adicionar a forma de um clipe de filme que você pode acessar algumas propriedades mais tarde $ Forma = new SWFSprite (); $ Forma-> add ($ quadrados); $ Forma-> nextFrame (); / / Cria uma caixa de texto para mostrar algum texto $ Textbox = new SWFTextField (SWFTEXTFIELD_DRAWBOX); $ Textbox-> setBounds (100, 100); $ Textbox-> setFont (novo SWFFont ("_sans")); $ Textbox-> setColor (255, 0, 0);

Page 231: Programação de jogos em PHP

/ / Agora dar a caixa de texto um nome para que você possa fazer referência a ela $ Textbox-> setName ("myTextBox"); / / Para mover a caixa de texto você tem que adicioná-la a um sprite Container $ = new SWFSprite (); $ Container-> add ($ textbox); / / Move para o próximo quadro na entidade gráfica para que ele vai aparecer $ Container-> nextFrame (); / / Adicionar a praça para o clipe de filme ShapeHandle $ = $ myMovie-> add ($ forma); $ ShapeHandle-> moveTo (10, 10); $ ShapeHandle-> setName ("forma"); ContainerHandle $ = $ myMovie-> add ($ container); $ ContainerHandle-> moveTo (200, 100); $ ContainerHandle-> setName ("container"); $ MyMovie-> nextFrame (), $ MyMovie-> add SWFAction (novo ("_root.container.myTextBox = _root.shape._x + ',' + _root.shape._y ;")); / / Agora a saída do filme header ("Content-type: application / x-shockwave-flash"); $ MyMovie-> output (); ?> 278 Capítulo 12 ■ Construir suas habilidades PHP Vamos quebrar o exemplo acima. Primeiro você cria seu filme Flash e definir seu mestre propriedades como você tem feito. Então você cria uma nova forma, neste caso, um quadrados, e você desenhá-lo. Em seguida, você fazer algo um pouco diferente. Você adiciona a forma à sua Sprite próprio filme ou clipe de filme. Isso permitirá que várias coisas mas o mais importante será permitir o acesso a algumas propriedades predefinidas que contém um filme. O próximo passo é muito importante, você deve mover o sprite para o próximo quadro a fim de que qualquer coisa para aparecer em seu filme principal. Depois de ter criado o clipe de filme que contém a forma que você deseja acessar, você cria uma nova caixa de texto. Isto irá permitir que você digite o texto, embora no exemplo que você está usando -lo para exibir texto. Após a caixa de texto é criado, você adicioná-lo ao seu clipe de filme próprio. Lembrar para mover o clipe de filme para o próximo quadro. C Aution Certifique-se de mover sprites para o próximo quadro. Caso contrário, você nunca verá os resultados no flash peça que é enviado para o navegador. Agora você tem basicamente três filmes: o filme mestre, um clipe de filme contendo o seu

Page 232: Programação de jogos em PHP

forma, e um clipe de filme contendo sua caixa de texto. Para ter um filme do Flash completo você necessidade de combiná-las em uma só peça. Então você adiciona o clipe de filme forma ao seu mestre filme e, em seguida, você definir um nome. Definir o nome do clipe de filme permite que você acesse lo com o ActionScript. Agora você adicionar o segundo clipe de filme para o filme mestre e também definir o nome do clipe de filme. Agora você tem um filme com dois clipes de filme na mesma. Esses clipes de filme e seus elementos agora podem ser acessados e manipulados por meio do ActionScript, pois você definir os nomes dos os clipes. Para acessar os clipes, você começa na raiz do filme, que é chamado _root. Então você descer mais um nível para o clipe de filme. Uma vez lá, você pode manipular o filme clip, se as suas propriedades, ou elementos de acesso que são aninhados ainda no clipe. Remember that an ActionScript requires an action to trigger it, so you need to add a frame to the master movie and then add the script. Once the movie moves to the next frame it will execute the script on the frame. In this case, it will put the coordinates of the movie clip into the text box. Take a look at Figure 12.9 to see the results of the above example. Conclusion 279 Figure 12.9 An example of ActionScript. Conclusão This was a quick overview of some of the more advanced uses of PHP. You can go much more in depth than I have here. I suggest that you use all the resources available to you to check out the extensive functionality that PHP offers you. PHP is a great language that has many uses. Take a look at the following list to give you just a few ideas: ■ Create your own browsers. ■ Create parsing and management backends for your games. ■ Create extensible, fast, reliable applications and systems. ■ Manage and manipulate graphics. ■ Create your dynamic Flash pieces all with code. ■ Create sockets to Flash pieces to create a multiplayer experience. ■ Quickly create chat systems for your games or Web sites. 280 Chapter 12 ■ Building Your PHP Skills These are just a few of the applications for which you can use PHP. Let your mind wander and I am sure you will come up with some great and fantastic ideas for applying all of

Page 233: Programação de jogos em PHP

your newfound knowledge. With the Web your options are endless. Have fun with it. Now go create the next generation of online games! Appendixes Apêndice A HTML Language Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 Apêndice B PHP Language Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 Apêndice C Support—Debugging Applications . . . . . . . . . . . . . . . . . . . . . . . . . . 329 Apêndice D GD SDK Language Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .341 PART V Esta página foi intencionalmente deixada em branco  PARTE V Esta página foi intencionalmente deixada em branco apêndice A HTML Linguagem Referência T seu capítulo é simplesmente o seu guia para todas as funções de HTML disponíveis para você. Cada elemento é listado seguido por uma descrição do que o elemento faz, e, se houver alguma, uma lista de todos os atributos do elemento pode usar. <-! E <-> Comentar Denota um comentário em HTML. ! DOCTYPE Declara o tipo de conteúdo eo formato do documento. A Define um link de hipertexto. A HREF ou atributo NAME deve ser especificado. A Atributos Descrição atributo ACCESSKEY Define a chave de acessibilidade para este elemento CHARSET Define o conjunto de caracteres usado para codificar este elemento CLASSE Define a classe folha de estilo este elemento deve usar COORDS Define as coordenadas para este elemento Datafld Define o campo de uma dada fonte de dados para vincular a este elemento Datasrc Define a fonte dos dados para a ligação para este elemento DIR Define a direção de leitura para este elemento HREF Define o destino deste elemento Hreflang Define o código de idioma do recurso apontado por HREF ID Define a identificação deste elemento LANG Define o idioma deste elemento 283 284 Apêndice A ■ HTML Referência da Linguagem Descrição atributo LANGUAGE Ajusta a linguagem de script este elemento deve usar MÉTODOS Define os métodos HTTP suportados por este elemento

Page 234: Programação de jogos em PHP

O name define o nome desse elemento REL Define a relação entre este elemento eo elemento de destino SHAPE Define a forma do elemento ESTILO Define estilo folhas de informações específicas para este elemento TABINDEX Define a ordem de tabulação para este elemento TARGET Define o destino para onde o conteúdo deve ir TITLE Define uma dica de ferramenta para este elemento TYPE Define o tipo de MIME desse elemento URN Define um Uniform Resource Name para este elemento ENDEREÇO Especifica as informações como um endereço, uma assinatura, e de propriedade. Atributos ENDEREÇO Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar DIR Define a direção de leitura para este elemento ID Define o ID para este elemento LANG Define o idioma para este elemento LANGUAGE Ajusta a linguagem de script este elemento deve usar ESTILO Define estilo folhas de informações específicas para este elemento TITLE Define uma dica de ferramenta para este elemento APPLET Coloca um Applet Java na página. Atributos APPLET Descrição atributo ALIGN Define o alinhamento do elemento ALT Define o texto alternativo para este elemento ARQUIVO Define uma cadeia de caracteres que podem ser usados para a funcionalidade do próprio arquivo BORDER Define a quantidade de fronteira este elemento deve ter CLASSE Define a classe folha de estilo este elemento deve usar CODE Define a URL que aponta para a classe Java compilados CODEBASE Define a URL do componente Datafld Define o campo de uma dada fonte de dados para vincular a este elemento Datasrc Define a fonte dos dados para a ligação ALTURA Define a altura do elemento HSPACE Define a margem horizontal para o elemento HTML Referência da Linguagem 285 Descrição atributo ID Define o ID para este elemento Name define o nome para este elemento SRC Define um URL para ser carregado por este elemento ESTILO Define estilo folhas de informações específicas para este elemento TITLE Define uma dica de ferramenta para este elemento VSPACE Define a margem vertical para este elemento WIDTH Define a largura do elemento ÁREA Especifica a forma de um hot spot para um mapa de imagem do lado do cliente.

Page 235: Programação de jogos em PHP

Atributos ÁREA Descrição atributo ALT CLASS COORDS DIR HREF ID LANG LÍNGUA NOME Nohref SHAPE ESTILO TABINDEX TARGET TÍTULO Define o texto alternativo para este elemento Define a classe folha de estilo este elemento deve usar Define as coordenadas para o ponto quente Define a ordem de leitura deste elemento Define um URL de destino para este elemento Define a identificação do elemento Define o idioma deste elemento Define a linguagem de script do lado do cliente este elemento deve usar Define o nome desse elemento Define se um clique na região deve causar uma ação Define a forma desse elemento Define o estilo folhas de informações específicas para este elemento Define a ordem de tabulação para este item Define o destino do conteúdo Define uma dica de ferramenta para este elemento B Processa o texto especificado em negrito. Atributos B Descrição atributo CLASS DIR ID LANG LÍNGUA ESTILO TÍTULO Define a classe folha de estilo este elemento deve usar Define a ordem de leitura deste elemento Define a identificação do elemento Define o idioma do elemento Define a linguagem de script do lado do cliente este elemento deve usar Define o estilo folhas de informações específicas para este elemento Define uma dica de ferramenta para este elemento

Page 236: Programação de jogos em PHP

286 Apêndice A ■ HTML Referência da Linguagem BASE Especifica o URL do documento base. Atributos BASE Descrição atributo HREF Define o URL de base sobre o qual todos os links na página será baseado TARGET Define o destino do conteúdo BASEFONT Define a fonte base de que a página irá utilizar para o texto de renderização. Atributos BASEFONT Descrição atributo CLASS COLOR ROSTO ID LANG LÍNGUA TAMANHO Define a classe folha de estilo este elemento deve usar Define a cor a fonte deve ser processado em Define a fonte do elemento deve usar Define a identificação do elemento Define o idioma do elemento Define a linguagem de script do lado do cliente este elemento deve usar Especifica o tamanho da fonte BDO Desliga-se o algoritmo de renderização bidirecional para o fragmento de texto especificada. BDO Atributos Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar DIR Define a ordem de leitura deste elemento ID Define a identificação deste elemento LANG Define o idioma deste elemento ESTILO Define estilo folhas de informações específicas para este elemento TITLE Define uma dica de ferramenta para este elemento BGSOUND Especifica um som de fundo para ser jogado enquanto a página é carregada. Atributos BGSOUND Descrição atributo BALANÇO Define como o som de fundo deve ser distribuído entre a esquerda e os alto-falantes direito ID Define a identificação do elemento HTML Referência da Linguagem 287 Descrição atributo LOOP Define o número de vezes que o som deve loop quando jogado SRC define a URL de um som a ser tocado VOLUME Define o volume do som BIG Exibe o texto em uma fonte maior do que a atual fonte especificada.

Page 237: Programação de jogos em PHP

Atributos BIG Descrição atributo CLASS DIR ID LÍNGUA ESTILO TÍTULO Define a classe folha de estilo este elemento deve usar Define a ordem de leitura deste elemento Define a identificação do elemento Define a linguagem de script do lado do cliente este elemento deve usar Define o estilo folhas de informações específicas para este elemento Define uma dica de ferramenta para este elemento BLINK Faz com que o texto especificado a piscar e desliga na página. Atributos BLINK Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento BLOCKQUOTE Tabs um conjunto específico de texto, e denota uma citação no texto. Atributos BLOCKQUOTE Descrição atributo CITE CLASS DIR ID LANG LÍNGUA ESTILO TÍTULO Conjuntos de informações de referência sobre o texto Define a classe folha de estilo este elemento deve usar Define a ordem de leitura do elemento Define a identificação do elemento Define o idioma do elemento Define a linguagem de script do lado do cliente este elemento deve usar Define o estilo folhas de informações específicas para este elemento Define uma dica de ferramenta para este elemento 288 Apêndice A ■ HTML Referência da Linguagem CORPO Define o início do corpo do documento HTML. Atributos CORPO Descrição atributo ALINK ANTECEDENTES BGCOLOR BottomMargin

Page 238: Programação de jogos em PHP

CLASS DIR ID LANG LÍNGUA LEFTMARGIN Link RightMargin SCROLL ESTILO TEXTO TopMargin VLINK Define a cor do estado ativo de um link Define a imagem de fundo do corpo Define a cor de fundo do corpo da página Define a quantidade de margem na parte inferior da página Define a classe folha de estilo este elemento deve usar Define a ordem de leitura do elemento Define a identificação do elemento Define o idioma do elemento Define a linguagem de script do lado do cliente este elemento deve usar Define a quantidade de margem à esquerda da página Define a cor dos links na página Define a quantidade de margem sobre o direito da página Define se as barras de rolagem são ligados ou desligados Define o estilo folhas de informações específicas para este elemento Define a cor que o corpo do texto deve ser Define a quantidade de margem no topo do documento Define a cor dos links visitados BR Insere uma quebra de linha na página. BR Atributos Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar CLARO Define o lado onde a próxima linha de conteúdo será exibido após a quebra de linha, em relação a um objeto flutuante ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento BUTTON Torna um botão HTML com o texto especificado. Atributos BUTTON Descrição atributo ACCESSKEY Define a chave de acessibilidade para este elemento CLASSE Define a classe folha de estilo este elemento deve usar HTML Referência da Linguagem 289 Descrição atributo Datafld Define o campo de uma dada fonte de dados para vincular a este elemento

Page 239: Programação de jogos em PHP

Datasrc Define a fonte dos dados para a ligação DIR Define a ordem de leitura deste elemento DISABLED Define o estado do elemento ID Define a identificação do elemento LANG Define o idioma para este elemento LANGUAGE Ajusta a linguagem de script do lado do cliente que este elemento deve usar O name define o nome do elemento ESTILO Define estilo folhas de informações específicas para este elemento TABINDEX Define a ordem de tabulação deste elemento TITLE Define uma dica de ferramenta para este elemento TYPE Especifica o tipo de botão este elemento é VALOR Define o valor padrão selecionado deste elemento CAPTION Especifica uma legenda para ser colocado ao lado de uma mesa. CAPTION Atributos Descrição atributo ALIGN Define a posição do elemento relativo à tabela CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento CITE Exibe o texto em itálico. CITE Atributos Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento CODE Torna o texto como um exemplo de código usando uma fonte de largura fixa. Atributos CODE Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento 290 Apêndice A ■ HTML Referência da Linguagem COL Especifica coluna baseada em padrões para uma tabela. Atributos COL Descrição atributo ALIGN Define o alinhamento horizontal do elemento CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento SPAN Define o número de colunas no grupo ESTILO Define estilo folhas de informações específicas para este elemento VALIGN Define o alinhamento vertical do elemento WIDTH Define a largura do elemento COLGROUP Define um recipiente para um grupo de colunas. COLGROUP Atributos

Page 240: Programação de jogos em PHP

Descrição atributo ALIGN Define o alinhamento horizontal do elemento CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento SPAN Define o número de colunas no grupo ESTILO Define estilo folhas de informações específicas para este elemento VALIGN Define o alinhamento vertical do elemento WIDTH Define a largura padrão para cada coluna do grupo DD Isso especifica a definição de um item em uma lista de definições. DD Atributos Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento HTML Referência da Linguagem 291 DFN Define uma instância de um termo. DFN Atributos Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento DIR Torna o texto para que ele apareça como uma listagem do diretório. Atributos DIR Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar COMPACT Define um valor Boolean que especifica se a lista deve ser compactado, removendo espaço em branco entre os itens ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento DIV Define uma seção recipiente ou uma nova camada dentro de uma página. Atributos DIV Descrição atributo ALIGN CLASS Datafld DataFormat Datasrc DIR ID LANG LÍNGUA Nowrap ESTILO TABINDEX TÍTULO

Page 241: Programação de jogos em PHP

Define o alinhamento horizontal do elemento Define a classe folha de estilo este elemento deve usar Define o campo de uma dada fonte de dados para vincular a este elemento Define a forma de tornar a fonte de dados especificado, como HTML ou texto Define a fonte dos dados para a ligação para este elemento Define a direção de leitura para este elemento Define a identificação do elemento Define o idioma do elemento Define a linguagem de script do lado do cliente este elemento deve usar Define o navegador para não quebrar o texto automaticamente Define o estilo folhas de informações específicas para este elemento Define a ordem de tabulação para este elemento Define uma dica de ferramenta para este elemento 292 Apêndice A ■ HTML Referência da Linguagem DL Inicia uma lista de definições. DL Atributos Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar COMPACT Define um valor Boolean que especifica se a lista deve ser compactado, removendo espaço em branco entre os itens ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento DT Inicia um termo de definição em uma lista de definição. DT Atributos Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento EM Torna o texto como enfatizado; basicamente negrito do texto. EM Atributos Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento EMBED Incorpora um documento de qualquer tipo na página. Atributos EMBED Descrição atributo ALIGN Define o alinhamento horizontal do elemento ALT Define o texto alternativo para o elemento BORDER Define a quantidade de borda do elemento terá CLASSE Define a classe folha de estilo este elemento deve usar ALTURA Define a altura do elemento HTML Referência da Linguagem 293 Descrição atributo ID Define a identificação do elemento

Page 242: Programação de jogos em PHP

O name define o nome do elemento PLUGINSPAGE Recupera uma URL do plug-in para ser usado para visualizar o documento incorporado SRC Define um URL para ser carregado ESTILO Define estilo folhas de informações específicas para este elemento TITLE Define uma dica de ferramenta para este elemento WIDTH Define a largura do elemento FIELDSET Desenha uma caixa em torno dos elementos contidos. Atributos FIELDSET Descrição atributo ALIGN Define o alinhamento horizontal do elemento CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento FONT Permite que você especifique um tipo de fonte, tamanho e cor de uma seção de texto. Atributos FONT Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar COLOR Define a cor do texto para este elemento ROSTO Define a fonte para este elemento ID Define o ID para o elemento TAMANHO Define o tamanho da fonte para este elemento ESTILO Define estilo folhas de informações específicas para este elemento FORMULÁRIO Cria um formulário que pode conter controles e elementos cujos valores são enviados para o servidor. Atributos FORM Descrição atributo ACTION Especifica o URL para o processamento CLASSE Define a classe folha de estilo este elemento deve usar ENCTYPE Define o tipo de codificação da forma ID Define o ID para o elemento 294 Apêndice A ■ HTML Referência da Linguagem Descrição atributo Método define como o formulário irá transferir seus dados para o servidor O name define o nome do elemento ESTILO Define estilo folhas de informações específicas para este elemento ARMAÇÃO Especifica um quadro individual dentro de um conjunto de quadros. Atributos ARMAÇÃO Descrição atributo ALIGN Define o alinhamento horizontal do elemento BorderColor Define a cor da borda do elemento CLASSE Define a classe folha de estilo este elemento deve usar Datafld Define o campo de uma dada fonte de dados para vincular a este elemento Datasrc Define a fonte dos dados para a ligação para este elemento

Page 243: Programação de jogos em PHP

FRAMEBORDER Configura ou não o elemento terá uma borda ALTURA Define a altura do elemento ID Define a identificação do elemento Marginheight Define a altura da margem Marginwidth Define a largura da margem O name define o nome do elemento Noresize Define o quadro de uma largura fixa para que o usuário não pode redimensionar a moldura DESDOBRAMENTO Define se o quadro vai permitir a rolagem ou não SRC Define um URL para ser carregado pelo elemento ESTILO Define estilo folhas de informações específicas para este elemento FRAMESET Especifica um conjunto de quadros que pode conter vários quadros e outros conjuntos de quadros aninhados. Atributos FRAMESET Descrição atributo BORDER Define a quantidade de fronteira para o conjunto de quadros de ter BorderColor Define a cor da borda para este elemento CLASSE Define a classe folha de estilo este elemento deve usar COLS Define a largura das colunas no conjunto de quadros FRAMEBORDER Configura se deve ou não exibir uma borda FRAMESPACING Define a quantidade de espaço entre os quadros ID Define a identificação do elemento ROWS Define a altura das linhas no conjunto de quadros ESTILO Define estilo folhas de informações específicas para este elemento HTML Referência da Linguagem 295 CABEÇA Começa o título de um documento HTML, e contém as tags que contém informações sobre o documento. Atributos CABEÇA Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento PERFIL Define um ou mais Uniform Resource Identificadores de meta-dados de perfis ESTILO Define estilo folhas de informações específicas para este elemento HN Os seis cabeçalhos (H1 - H6) que podem tornar o texto em uma variedade de tamanhos. HN Atributos Descrição atributo ALIGN Define o alinhamento horizontal do elemento CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento HR Coloca uma linha horizontal na página. HR Atributos Descrição atributo

Page 244: Programação de jogos em PHP

ALIGN CLASS COLOR ID Noshade TAMANHO ESTILO Define o alinhamento horizontal do elemento Define a classe folha de estilo este elemento deve usar Define a cor do elemento Define a identificação do elemento Define o elemento para tornar sem 3-D shading Define o tamanho do elemento Define o estilo folhas de informações específicas para este elemento 296 Apêndice A ■ HTML Referência da Linguagem HTML Inicia o próprio documento HTML. Eu Torna um intervalo de texto em itálico. Eu Atributos Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ESTILO Define estilo folhas de informações específicas para este elemento IFRAME Cria um quadro na linha de flutuação na página. IFRAME Atributos Descrição atributo ALIGN FRONTEIRA BorderColor CLASS Datafld Datasrc FRAMEBORDER ALTURA HSPACE ID Marginheight Marginwidth NOME Noresize SCROLLING SRC ESTILO VSPACE WIDTH Define o alinhamento horizontal do elemento Define a quantidade de fronteira para o elemento Define a cor da borda para o elemento Define a classe folha de estilo este elemento deve usar

Page 245: Programação de jogos em PHP

Define o campo de uma dada fonte de dados para vincular a este elemento Define a fonte dos dados para a ligação para este elemento Define se ou não o elemento terá uma borda Define a altura do elemento Define a margem horizontal para o elemento Define a identificação para este elemento Define a altura da margem Define a largura da margem Define o nome do elemento Define o quadro de uma largura fixa para que o usuário não pode redimensionar a moldura Define se o quadro vai permitir a rolagem ou não Define um URL para ser carregado pelo elemento Define o estilo folhas de informações específicas para este elemento Define a margem vertical para o elemento Define a largura do elemento Referência HTML 297 Idioma IMG Incorpora uma imagem na página. Atributos IMG Descrição atributo ACCESSKEY ALIGN ALT FRONTEIRA ID ALTURA NOME SRC USEMAP WIDTH Define ou recupera a chave de acessibilidade Define o alinhamento horizontal do elemento Define o texto alternativo para o elemento Define a quantidade de fronteira para o elemento Define a identificação do elemento Define a altura do elemento Define o nome do elemento Define a URL a ser carregado pelo elemento Define o mapa de imagem para uso Define a largura do elemento ENTRADA Especifica um controle de entrada de um formulário. O controle de entrada pode ser um botão, caixa de seleção botão de rádio, caixa de texto ou caixa de senha. Atributos de entrada Descrição atributo ACCEPT ACCESSKEY ALIGN

Page 246: Programação de jogos em PHP

ALT CHECKED CLASS Datafld DataFormat Datasrc HSPACE ID MaxLength NOME READONLY TAMANHO ESTILO TABINDEX TIPO VALOR Define um conjunto de tipos separados por vírgula conteúdo que será aceito pelo elemento Define ou recupera a chave de acessibilidade Define o alinhamento horizontal do elemento Define o texto alternativo para este elemento Define se o campo está marcada Define a classe folha de estilo este elemento deve usar Define o campo de uma dada fonte de dados para vincular a este elemento Define a forma de tornar a fonte de dados especificado, como HTML ou texto Define a fonte dos dados para a ligação para este elemento Define a margem horizontal do elemento Define a identificação do elemento Define o número máximo de caracteres aceitos para este elemento Define o nome do elemento Especifica que o elemento é somente leitura Define o tamanho do elemento Define o estilo folhas de informações específicas para este elemento Define a ordem de tabulação para este elemento Define o tipo de entrada deste elemento será Define o valor inicial para o elemento LI 298 Apêndice A ■ HTML Referência da Linguagem KBD Exibe o texto em uma largura tipo fonte fixa, como de uma máquina de escrever. KBD Attrbiutes Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento LABEL Define um rótulo para um elemento de controle Atributos LABEL Descrição atributo

Page 247: Programação de jogos em PHP

CLASS Datafld DataFormat Datasrc PARA ID STY LE Define a classe folha de estilo este elemento deve usar Define o campo de uma dada fonte de dados para vincular a este elemento Define a forma de tornar a fonte de dados especificado, como HTML ou texto Define a fonte dos dados para a ligação para este elemento Define o elemento para o qual o rótulo deve ser atribuído Define a identificação do elemento Define o estilo folhas de informações específicas para este elemento Especifica um item em uma lista ordenada ou não ordenada. LI Atributos Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define o ID para o elemento ESTILO Define estilo folhas de informações específicas para este elemento Link Especifica um hiperlink para outro documento. Isto é usado no título do documento HTML. Atributos-LINK Descrição atributo CLASSE Define a classe folha de estilo que este elemento deve usar HREF Especifica a URL base para ir para ID Define o ID para o elemento ESTILO Define estilo folhas de informações específicas para este elemento HTML Referência da Linguagem 299 MAP Define a coleção de hot spots para um mapa de imagem. MAP Atributos Descrição atributo CLASSE Define a classe folha de estilo que este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento O name define o nome do mapa de imagem definida pelo elemento do mapa MARQUEE Cria uma marquise de rolagem na página. Esta marquise pode rolar verticalmente ou horizontalmente. MARQUEE Atributos Descrição atributo ALIGN COMPORTAMENTO BGCOLOR CLASS Datafld DataFormat Datasrc

Page 248: Programação de jogos em PHP

DIREÇÃO ALTURA ID LOOP ScrollAmount SCROLLDELAY ESTILO WIDTH Define o alinhamento horizontal deste elemento Define o comportamento de rolagem do elemento Define a cor de fundo do elemento Define a classe folha de estilo este elemento deve usar Define o campo de uma dada fonte de dados para vincular a este elemento Define a forma de tornar a fonte de dados especificado, como HTML ou texto Define a fonte dos dados para a ligação para este elemento Define a direção do texto deve rolar Define a altura do elemento Define a identificação do elemento Define o número de vezes que o elemento deve jogar Define a quantidade de caracteres do elemento deve rolar por Define a quantidade de atraso antes de rolagem começa Define o estilo folhas de informações específicas para este elemento Define a largura do elemento META Fornece vários tipos de informações aos motores de busca e outros intérpretes. Este elemento vai no cabeçalho do documento HTML. Atributos META Descrição atributo CONTEÚDO Define o conteúdo meta HTTP-EQUIV Define informações a serem usadas para vincular o conteúdo para os cabeçalhos HTTP Name define o nome do valor especificado no conteúdo 300 Apêndice A ■ HTML Referência da Linguagem NOFRAMES Especifica a seção de texto para mostrar para browsers que não suportam quadros. Atributos NOFRAMES Descrição atributo CLASSE Define a classe folha de estilo que este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento OBJETO Insere um objeto, como um pedaço Flash, no documento HTML. Atributos de objetos Descrição atributo ALIGN FRONTEIRA CLASS CLASSID

Page 249: Programação de jogos em PHP

CODE CODEBASE CodeType ALTURA NOME ESTILO WIDTH Define o alinhamento horizontal do elemento Define a quantidade de borda do elemento deve ter Define a classe folha de estilo que este elemento deve usar Define o identificador de classe para o elemento Define um URL para a localização da classe compilada Define a URL do componente para este elemento Define o tipo de mídia internet para este elemento Define a altura deste elemento Define o nome para este elemento Define o estilo folhas de informações específicas para este elemento Define a largura deste elemento OL Cria uma lista ordenada na qual cada item é numerado com a tag LI. Atributos OL Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento INÍCIO Define um número inicial para o elemento ESTILO Define estilo folhas de informações específicas para este elemento TYPE Define o tipo de lista ordenada esta deve ser HTML Referência da Linguagem 301 OPÇÃO Especifica um item da lista para um elemento de formulário select. Atributos OPÇÃO Descrição atributo CLASS ID LABEL SELECIONADOS ESTILO VALOR Define a classe folha de estilo este elemento deve usar Define a identificação do elemento Define o rótulo para o elemento Define o elemento a ser o item selecionado na lista Define o estilo folhas de informações específicas para este elemento Define o valor para este elemento P Especifica um parágrafo de texto. Mesmo que a marca final é opcional, eu recomendo sempre para colocá-lo em plenitude. Atributos P Descrição atributo

Page 250: Programação de jogos em PHP

ALIGN Define o alinhamento horizontal do elemento CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento PARAM Especifica um parâmetro ou uma propriedade em um objeto ou uma APPLET. Atributos PARAM Descrição atributo ID Define a identificação do elemento O name define o nome do elemento TYPE Define o tipo do elemento VALOR Define o valor do elemento ValueType Define o tipo do valor especificado 302 Apêndice A ■ HTML Referência da Linguagem PRE Exibe o texto em uma fonte de largura fixa. Atributos PRE Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento SAMP Exibe o texto em uma fonte menor para uso como uma listagem exemplo de código. SAMP Atributos Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento SCRIPT Denota um bloco de script do lado do cliente para a página que será interpretado pelo browser do mecanismo de script. Atributos SCRIPT Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento SRC Especifica uma URL apontando para um arquivo de scripting TYPE Define o idioma para o bloco de script SELECIONE Cria uma caixa de lista ou uma lista suspensa em um formulário. Selecionar Atributos Descrição atributo ALIGN Define o alinhamento horizontal do elemento CLASSE Define a classe folha de estilo este elemento deve usar Datafld Define o campo de uma dada fonte de dados para vincular a este elemento Datasrc Define a fonte dos dados para a ligação para este elemento HTML Referência da Linguagem 303 Descrição atributo

Page 251: Programação de jogos em PHP

Define MÚLTIPLAS se você pode selecionar vários itens no elemento O name define o nome do elemento TAMANHO Define o número de itens a serem mostrados ao mesmo tempo no elemento ESTILO Define estilo folhas de informações específicas para este elemento TABINDEX Define a ordem de tabulação deste elemento PEQUENO Especifica uma seção de texto que será processado em uma fonte menor que a corrente especificada fonte. Atributos SMALL Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento SPAN Usado com uma folha de estilo para definir não-padrão atributos para uma seção de elementos. Atributos SPAN Descrição atributo CLASS Datafld DataFormat Datasrc ID ESTILO Define a classe folha de estilo este elemento deve usar Define o campo de uma dada fonte de dados para vincular a este elemento Define a forma de tornar a fonte de dados especificado, como HTML ou texto Define a fonte dos dados para a ligação para este elemento Define a identificação do elemento Define o estilo folhas de informações específicas para este elemento FORTE Torna uma seção de texto em uma fonte em negrito. Atributos FORTE Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento 304 Apêndice A ■ HTML Referência da Linguagem SUB Exibe o texto em subscrito, com uma fonte menor do que a atual fonte especificada. Atributos SUB Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento SUP

Page 252: Programação de jogos em PHP

Exibe o texto em sobrescrito, utilizando uma fonte menor do que a atual fonte especificada. Atributos SUP Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento TABELA Cria uma tabela na página que pode conter TR, TD, TH e tags. Atributos da tabela Descrição atributo ALIGN ANTECEDENTES BGCOLOR FRONTEIRA BorderColor BORDERCOLORDARK BORDERLIGHTCOLOR CellPadding CellSpacing CLASS ARMAÇÃO ALTURA ID ESTILO WIDTH Define o alinhamento horizontal do elemento Define uma imagem de fundo para o elemento Define a cor de fundo do elemento Define a quantidade de borda do elemento deve ter Define a cor da borda Define a cor da parte escura da fronteira Define a cor da parte clara da fronteira Define a quantidade de preenchimento entre o conteúdo ea borda da célula Define a quantidade de espaçamento entre as células Define a classe folha de estilo este elemento deve usar Define a forma como o quadro de fronteira em torno da mesa deve exibir Define a altura do elemento Define a identificação do elemento Define o estilo folhas de informações específicas para este elemento Define a largura do elemento HTML Referência da Linguagem 305 TD Cria uma célula em uma tabela. TD Atributos Descrição atributo ALIGN ANTECEDENTES BGCOLOR BorderColor

Page 253: Programação de jogos em PHP

BORDERCOLORDARK BORDERLIGHTCOLOR CLASS COLSPAN ALTURA ID Nowrap ROWSPAN ESTILO VALIGN WIDTH Define o alinhamento horizontal do elemento Define a imagem de fundo do elemento Define a cor de fundo do elemento Define a cor da borda Define a cor da parte escura da fronteira Define a cor da parte clara da fronteira Define a classe folha de estilo este elemento deve usar Define a quantidade de células dessa célula deve abranger Define a altura do elemento Define a identificação do elemento Define o navegador para não quebrar o texto automaticamente Define a quantidade de linhas que esta célula deve abranger Define o estilo folhas de informações específicas para este elemento Define o alinhamento vertical deste elemento Define a largura deste elemento TEXTAREA Especifica um multi-linha de controle de entrada de texto de um formulário. TEXTAREA Atributos Descrição atributo ALIGN CLASS COLS Datafld DataFormat Datasrc ID NOME READONLY ROWS ESTILO TABINDEX WRAP Define o alinhamento horizontal do elemento Define a classe folha de estilo este elemento deve usar Define o número de colunas em caracteres na área de texto deve ter Define o campo de uma dada fonte de dados para vincular a este elemento Define a forma de tornar a fonte de dados especificado, como HTML ou texto Define a fonte dos dados para a ligação para este elemento Define a identificação do elemento

Page 254: Programação de jogos em PHP

Define o nome do elemento Define a área de texto para somente leitura Define o número de linhas em caracteres na área de texto deve ter Define o estilo folhas de informações específicas para este elemento Define a ordem de tabulação do elemento Define como o texto deve envolver 306 Apêndice A ■ HTML Referência da Linguagem TH Especifica uma célula de cabeçalho em uma tabela, o conteúdo é geralmente centrado e em negrito. Atributos TH Descrição atributo ALIGN ANTECEDENTES BGCOLOR BorderColor BORDERCOLORDARK BORDERLIGHTCOLOR CLASS COLSPAN ALTURA ID Nowrap ROWSPAN ESTILO VALIGN WIDTH Define o alinhamento horizontal do elemento Define a imagem de fundo do elemento Define a cor de fundo do elemento Define a cor da borda Define a cor da parte escura da fronteira Define a cor da parte clara da fronteira Define a classe folha de estilo este elemento deve usar Define a quantidade de células dessa célula deve abranger Define a altura do elemento Define a identificação do elemento Define o navegador para não quebrar o texto automaticamente Define a quantidade de linhas que esta célula deve abranger Define o estilo folhas de informações específicas para este elemento Define o alinhamento vertical deste elemento Define a largura deste elemento TÍTULO Especifica o título do documento, que está contido no título do documento. TR Cria uma linha em uma tabela. TR Atributos Descrição atributo ALIGN ANTECEDENTES

Page 255: Programação de jogos em PHP

BGCOLOR BorderColor BORDERCOLORDARK BORDERLIGHTCOLOR CLASS ALTURA ID ESTILO VALIGN WIDTH Define o alinhamento horizontal do elemento Define a imagem de fundo do elemento Define a cor de fundo do elemento Define a cor da borda Define a cor da parte escura da fronteira Define a cor da parte clara da fronteira Define a classe folha de estilo este elemento deve usar Define a altura do elemento Define a identificação do elemento Define o estilo folhas de informações específicas para este elemento Define o alinhamento vertical deste elemento Define a largura deste elemento HTML Referência da Linguagem 307 U Sublinha o texto especificado. U Atributos Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento UL Cria uma lista não-ordenada. Itens da lista são especificados com a tag LI. Atributos UL Descrição atributo CLASSE Define a classe folha de estilo este elemento deve usar ID Define a identificação do elemento ESTILO Define estilo folhas de informações específicas para este elemento TYPE Sets the type of bullet that LI will create Esta página foi intencionalmente deixada em branco apêndice B PHP Linguagem Referência T seu apêndice é um guia completo para todas as funções PHP disponíveis para você. Cada função é dividido em seções que a função deve ser abrangida. Em seguida, cada função é listado com os parâmetros que recebe, o que a função retorna, e um breve descrição do que a função faz. Funções Apache Descrição Retorna a função

Page 256: Programação de jogos em PHP

apache_lookup_uri Class (string nomedoarquivo) Retorna uma classe com propriedades sobre o URI especificado. apache_note (String note_name cadeia Recupera o valor na tabela de notas pedido de uma nota específica [, String note_value]) nome. Se o note_value for especificado, ele irá definir a note_name o valor de note_value. getallheaders () Retorna um array de cabeçalhos de solicitação HTTP da Apache. virtual (string filename) Integer Executa um Apache sub-pedido para incluir o arquivo especificado. Funções para Array Descrição Retorna a função Array Matriz (...) Cria e retorna uma matriz com os valores fornecidos. array_keys Array (matriz) Retorna uma matriz que contém todas as chaves do array especificado. array_merge Array (arrays) Mescla as matrizes fornecidas em um array singular. array_pop (array) Mixed Pops o último elemento do array e retorna. array_push (array, as variáveis) Integer Empurra as variáveis fornecidas para o fim da matriz especificada. array_shift (array) Mixed Remove o primeiro elemento da matriz eo retorna. 309 310 Apêndice B ■ PHP Referência da Linguagem Descrição Retorna a função array_slice array (, offset [Length]) array_splice entrada (, offset [Comprimento] [substituição]) Matriz Matriz Retorna uma sub-matriz da matriz especificada no início do índice offset. Se o comprimento for especificado, então ele irá retornar um array a partir de índice compensado com um comprimento especificado. Irá remover um sub-array da entrada e substituí-lo com a matriz substituição. Adiciona as variáveis para o início da matriz. Retorna um array contendo todos os valores da matriz. Atravessa a matriz fornecida, aplicando a lógica de um determinado função para os elementos do array. Classifica um array em ordem decrescente, mantendo os valores-chave. Classifica um array em ordem crescente, mantendo os valores-chave. Mescla as variáveis especificadas em uma única matriz. Retorna a contagem de elementos na matriz especificada. Retorna o elemento atual na matriz especificada. Retorna um elemento de quatro sub-array que contém a chave eo valor do elemento atual. A chave está contida nos índices 0 e "key", eo valor está contido em índices 1 e "value". Define o último elemento da matriz para o índice atual e retorna o valor do último elemento.

Page 257: Programação de jogos em PHP

Isto irá importar variáveis na tabela de símbolos a partir do especificado array. Os parâmetros extract_type diz extract () o que fazer se um colisão é detectada, eo parâmetro prefixo especifica um prefixo para os elementos a serem inseridos. Retorna true se o valor existe em qualquer lugar na matriz, caso contrário ele retorna falso. Retorna a chave do elemento atual do array. Classifica a matriz por seus valores essenciais. Cria uma matriz das variáveis fornecidas. Move o ponteiro do índice atual para o próximo índice na matriz. Isso irá retornar false se você tiver atingido o último índice da matriz. Retorna o elemento atual da matriz. Move o ponteiro do índice atual para o índice anterior na matriz. Isso irá retornar false se você alcançou o primeiro índice da matriz. Retorna um array de inteiros entre baixa e alta. Retorna o primeiro elemento do array e define o índice atual para o primeiro índice disponíveis na matriz. Classifica a matriz em ordem decrescente. Classifica o array em uma ordem aleatória Retorna o número de elementos na matriz fornecida. Classifica o array em ordem crescente. Classifica a matriz usando a lógica da função especificada. Classifica o array pelos valores-chave usando a lógica do especificado função. Classifica a matriz usando a lógica da função especificada. array_unshift (array, as variáveis) Integer array_values Array (matriz) array_walk (array função, Bool [Parâmetro]) arsort void (matriz) asort void (matriz) compacta Array (nome de variáveis) count (array) Integer atual (matriz) Mixed cada Array (matriz) end (array) Mixed extract (array [, extract_type] int [, Prefixo]) in_array (array, valor) Boolean chave (matriz) Mixed ksort (array) Integer anular a lista (variáveis) seguinte (matriz) Mixed pos (array) Mixed prev (array) Mixed Matriz intervalo (baixo, alto) reset (array) Mixed rsort void (matriz) vazio shuffle (array) sizeof (array) Integer

Page 258: Programação de jogos em PHP

vazio sort (array) uasort void (função de matriz) uksort void (função de matriz) usort void (função de matriz) Referência da Linguagem PHP 311 Funções Aspell Descrição Retorna a função aspell_check (dicionário, a palavra) Retorna true se a grafia da palavra é reconhecida na dicionário especificado. aspell_check_raw (dicionário, Boolean Verifica a ortografia da palavra com o dicionário, sem palavra) mudando a string em tudo. aspell_new (master, pessoal) Carrega um novo dicionário inteiro e retorna um identificador de conexão para o novo dicionário. aspell_suggest Array (dicionário, a palavra) Retorna uma matriz de sugestões de ortografia para a palavra especificada. Funções BCMath Descrição Retorna a função bcadd (string1, string2, [escala]) String Retorna a soma de string1 e string2. O parâmetro opcional escala especifica o número de casas decimais para sair. bccomp (string1, string2, Integer Compara string1 e string2. Se eles forem iguais ele irá retornar 0, [Escala]), se string1 for maior que string2 ele retornará 1, e se string2 é maior que string1, então ele irá retornar -1. O parâmetro opcional escala especifica o número de casas decimais para sair. bcdiv (string1, string2, [escala]) String Divide string1 por string2. A escala parâmetro opcional especifica o número de casas decimais para sair. bcmod String (string1, string2) Retorna o módulo de string1 e string2. bcmul (string1, string2, [escala]) Multiplica A escala parâmetro opcional especifica o número de decimal string1 por lugares para sair. string2. bcpow (strin1, string2, [escala]) String Toma string1 ao poder de string2. O parâmetro opcional escala especifica o número de casas decimais para sair. bcscale String (escala) Define o padrão valor do parâmetro de escala. bcsqrt (string1, [escala]) String Retorna a raiz quadrada de string1. A escala parâmetro opcional especifica o número de casas decimais para sair. bcsub (string1, string2, [escala]) String Subtrai string2 string1 partir. A escala parâmetro opcional especifica o número de casas decimais para sair. Funções de calendário Descrição Retorna a função easter_date ([ano]) easter_days ([ano])

Page 259: Programação de jogos em PHP

FrenchToJD (mês, dia, ano) GergorianToJD (mês, dia, ano) JDDayOfWeek (JULIANDAY, modo) JDMonthName (JULIANDAY, modo) JDToFrench (JULIANDAY) Número inteiro Número inteiro Número inteiro Número inteiro Misturado Corda Corda Retorna o timestamp para a meia-noite no dia de Páscoa do especificado ano. Se o ano não é especificado, então o ano corrente é assumido. Retorna o número de dias após 21 de março em que a Páscoa Dia cai. Se o ano não é especificado, então o ano corrente é assumido. Converte uma data no calendário Republicano da França para um dia Julian. Converte a data gregoriana fornecida a um dia Julian. Retorna o dia da semana do Dia Julian especificado no modo especificado. Retorna o nome do mês do Dia Julian especificado no especificado modo. Converte um dia no calendário Julian República Francesa. 312 Apêndice B ■ PHP Referência da Linguagem Descrição Retorna a função JDToGregorian String (JULIANDAY) JDToJewish String (JULIANDAY) JDToJulian String (JULIANDAY) JewishToJD String (judeu) JulianToJD String (mês, dia, ano) Converte um dia Julian em uma data gregoriana. Converte um dia Julian no calendário judaico. Converte uma contagem Julian Day para uma string representando uma data do calendário juliano. Converte uma data judaica para uma data do calendário juliano. Converte uma string representando uma data para um dia Julian Julian. Funções de Data e Hora Descrição Retorna a função checkdate (mês, dia, ano) Boolean Verifica se o mês especificado, dia e ano é uma data válida. Se for uma data válida, então é retornado true, caso contrário, false é retornado. date (formato, [timestamp]) Formatos de String a data. Se timestamp não for fornecido então a corrente timestamp é utilizado. getdate Array (timestamp) Retorna uma matriz com data / hora para o timestamp. gettimeofday () Retorna um array com as configurações para o tempo atual. gmdate format ([timestamp], String Retorna o timestamp para o GMT de data / hora que corresponde a

Page 260: Programação de jogos em PHP

[Minutos], [segunda], [meses], o tempo local. Qualquer um dos parâmetros opcionais que não são usados [Dia] de [ano], [is_dst]) estão a ser assumida a hora atual. gmstrftime (formato, [timestamp]) Formatos de String a hora GMT / CUT / data de acordo com o formato especificado. microtime (String) Retorna uma string contendo o microssegundos e segundos desde da época. mktime ([horas], [minutos], [segunda], Integer Retorna o timestamp para a data especificada. Qualquer um dos opcionais [Mês], [dia] de [ano], [is_dst]) Parâmetros não especificados são considerados o momento atual. strftime (formato, [timestamp]) Formatos de Cordas da data local / tempo de acordo com o formato especificado. time () Retorna um Integer timestamp atual. Funções DBA Descrição Retorna a função dba_close void (dbhandle) Fecha o banco de dados que é especificado. dba_delete (key, dbhandle) Exclui a entrada Boolean com a chave especificada no databse especificado. Se tiver êxito, em seguida, ele retorna true, caso contrário ele retorna falso. dba_exists (key, dbhandle) Retorna true se a chave especificada no banco de dados especificado existir, caso contrário, retorna false. dba_fetch String (chave, dbhandle) Retorna uma seqüência serializada com a chave especificada no banco de dados. dba_firstkey String (dbhandle) Retorna a primeira chave no banco de dados especificado. dba_insert (key, value, dbhandle) Insere Boolean um par chave / valor no banco de dados especificado. Retorna true em caso de sucesso, False on falha. dba_nextkey String (dbhandle) Retorna a chave ao lado do banco de dados. dba_open (modo, caminho, dbType) Integer Retorna um identificador para o banco de dados com o caminho especificado. Modos possíveis são "r", "w", "c", e "n". dba_optimize (dbhandle) Boolean Otimiza o banco de dados especificado. Se a otimização conseguiu então a função retornará true, caso contrário, retornará false. dba_popen (modo, caminho, dbType) Integer Abre o banco de dados em modo persistente. Retorna um identificador para o banco de dados com o caminho especificado. Modos possíveis são "r", "w", "C", e "n". Referência da Linguagem PHP 313 Descrição Retorna a função dba_replace (key, value, dbhandle) Substitui Boolean ou insere um par chave / valor no banco de dados especificado. dba_sync (dbhandle) Boolean Sincroniza o banco de dados. Retorna true em caso de sucesso, e falso em caso de falha. Funções diretório

Page 261: Programação de jogos em PHP

Descrição Retorna a função chdir (diretório) Boolean Define o diretório para o diretório atual. closedir void (dirHandle) Fecha o fluxo de diretório. dir Directory (diretório) Retorna um objeto que representa o diretório. Objeto opendir (diretório) Integer Abre o diretório especificado e retorna um manipulador para ela. readdir String (dirHandle) Retorna a próxima entrada no manipulador do diretório especificado. rewinddir (dirHandle) void Redefine o fluxo para o primeiro objeto no diretório. Carregando Extensão dinâmica Descrição Retorna a função dl (extensão) Integer Carrega uma extensão dinamicamente. Retorna 0 se o carregamento falhou e não-zero se o carregamento conseguiu. Funções de criptografia Descrição Retorna a função mcrypt_cbc (cifra, chave, dados, String criptografa ou descriptografa os dados no modo CBC. modo, [iv]) mcrypt_cfb (cifra, chave, dados, String criptografa ou descriptografa os dados no modo CFB. modo, iv) mcrypt_create_iv String (fonte, tamanho) Cria um vetor de inicialização da fonte usando random números. mcrypt_ecb (cifra, chave, dados, String criptografa ou descriptografa os dados no modo ECB. mode) mcrypt_get_block_size (cifra) Integer Retorna o tamanho do bloco da cifra, mcrypt_get_cipher_name String (cifra) Retorna o nome da cifra especificada. mcrypt_get_key_size (cifra) Integer Retorna o tamanho da chave para a cifra. mcrypt_ofb (cifra, chave, dados, String criptografa ou descriptografa os dados no modo OFB. modo, iv) Funções de execução Descrição Retorna a função escapeshellcmd String (comando) Escapes metacaracteres de shell no comando. exec (comando, matriz de [], String Executa o comando especificado. A matriz, se passada, vai receber [Return_var]) qualquer saída do comando. Se o return_var é especificado neste irá conter o código de resultado do comando. 314 Apêndice B ■ PHP Referência da Linguagem Descrição Retorna a função passthru (comando, [return_var]) void Executa o comando especificado e exibe a saída crua. sistema (comando, [return_var]) String Executa o comando especificado e exibe a saída. Formas de Dados Funções Format

Page 262: Programação de jogos em PHP

Descrição Retorna a função fdf_close (fdfdoc) fdf_create () fdf_get_file (fdfdoc) fdf_get_status (fdfdoc) fdf_get_value (fdfdoc, nome do campo) fdf_next_field_name (fdfdoc, fieldname) fdf_open (filename) fdf_save (filename) fdf_set_ap (fdfdoc, nome do campo, filename rosto, númeropágina) fdf_set_file (fdfdoc, filename) fdf_set_status (fdfdoc, status) fdf_set_value (fdfdoc, nome do campo, valor, is_name) Bbool Número inteiro corda corda corda corda Número inteiro Bool Bool Bool Bool Bool Fecha o documento FDF Cria um documento novo FDF. Retorna o valor da chave / F no documento FDF. Retorna o valor de chave / STATUS no documento FDF. Retorna o valor do campo especificado no documento FDF. Retorna o nome do campo que se segue o nome do campo especificado. Abre um documento FDF. Salva um documento FDF. Define a aparência do campo com o nome no documento FDF. Define o valor da chave / F no documento FDF. Define o valor da chave / STATUS no documento FDF. Define o valor do nome do campo especificado no documento FDF. O argumento is_name especifica se ou não o valor é ser um nome de PDF (1) ou uma string (0). Funções do sistema de arquivos Descrição Retorna a função Cordas basename (path) Retorna o componente nome de arquivo de um caminho totalmente qualificado. chgrp (filename, grupo) Bool Altera o grupo do nome do arquivo. chmod (filename, mode) Bool Altera o modo de o nome do arquivo. chown (usuário filename) Bool Altera o proprietário do nome do arquivo. clearstatcache () void Limpa o cache do Estado.

Page 263: Programação de jogos em PHP

cópia (fonte, destino) Bool Cópias um arquivo da origem para o destino. dirname String (path) Retorna o componente diretório de um caminho totalmente qualificado. diskfreespace float (dir) Retorna a quantidade de espaço livre no diretório especificado. fclose (fp) Bool Fecha um fluxo de arquivo. Verifica feof (fp) Boolean para ver se você está no final do fluxo de arquivo especificado. Se você está no final do corrente feof () irá retornar true, caso contrário ele retornará falso. fgetc String (fp) Lê o próximo caractere do fluxo de arquivo. fgetcsv (fp, comprimento, [delimitador]) Retorna um array com a próxima linha separados por vírgulas ou um especificada delimitador. fgets String (p, comprimento) Lê uma linha de até length-1. fegetss String (fp, comprimento) Lê uma linha de até length-1, enquanto que eliminasse todas as tags HTML. Matriz de arquivo (filename) Lê todo o arquivo especificado em uma matriz. file_exists (filename) Retorna true se o arquivo existe, e false se o arquivo não existe. Referência da Linguagem PHP 315 Descrição Retorna a função fileatime (filename) Integer Retorna o tempo que o arquivo foi acessado pela última vez. filectime (filename) Integer Retorna o tempo que o arquivo foi modificado pela última vez. grupo de arquivos (filename) Integer Retorna o ID do grupo proprietário. fileinode (filename) Integer Retorna o número inode para o arquivo. filemtime (filename) Integer Retorna o tempo que o arquivo foi modificada pela última vez. fileowner (filename) Integer Retorna o ID do dono do arquivo. fileperms (filename) Integer Retorna as permissões do arquivo especificado. filesize (filename) Integer Retorna o tamanho em bytes do arquivo. filetype String (nome) Retorna o tipo de arquivo. flock (fp, operação) Define Boolean ou libera um bloqueio no fluxo de arquivo especificado. fopen (filename, mode) Integer Abre um arquivo no modo especificado. Saídas fpassthru (fp) Integer dados a partir da posição atual no arquivo até o fim do arquivo. fputs (fp, string, [length]) Integer Grava a seqüência especificada para o fluxo de arquivos. fread String (fp, comprimento) Lê bytes de comprimento do fluxo de arquivo especificado. fseek (fp, offset) Integer Move o ponteiro de arquivo para compensar no fluxo de arquivo especificado. ftell (fp) Integer Retorna a posição atual do ponteiro de arquivo. fwrite (fp, string, [length]) Integer Escreve string para o stream de arquivo especificado.

Page 264: Programação de jogos em PHP

Verifica is_dir (filename) Boolean para ver se o arquivo especificado é um diretório. is_executable (filename) Boolean Verifica para ver se o arquivo especificado é um executável. Verifica is_file (filename) Boolean para ver se o arquivo especificado é um arquivo. Verifica is_link (filename) Boolean para ver se o arquivo especificado é um link simbólico. is_readable (filename) Boolean Verifica para ver se o arquivo especificado é legível. is_writable (filename) Boolean Verifica para ver se o arquivo especificado é gravável. ligação (link de destino) Boolean Cria um link. linkinfo (path) Integer Retorna informações sobre o link especificado. lstat Array (filename) Retorna informações sobre o arquivo especificado. mkdir (nome do caminho, o modo) Boolean Cria um diretório com o modo especificado. pclose (fp) Integer Fecha um ponteiro de arquivo a um cano que foi aberto com a popen () função. popen (comando, modo) Integer Abre uma pipe usando o comando especificado. readfile (filename) Integer Lê e saídas no arquivo especificado. readlink String (path) Retorna o destino do link simbólico especificado. rename (de, para) Boolean Renomeia um arquivo de um nome de arquivo para um nome de arquivo. rewind (fp) Boolean Redefine o ponteiro do arquivo para o início do fluxo de arquivo especificado. rmdir (path) Boolean Remove o diretório especificado. set_file_buffer (fp, buffer) Integer Define o tamanho do buffer para o fluxo de arquivo. status Array (filename) Retorna informações sobre o arquivo especificado. symlink (link de destino) Boolean Cria um link simbólico. tempnam (dir, prefixo) String Cria um nome de arquivo exclusivo temporário no diretório especificado. touch (nome, tempo) Boolean Define o tempo de modificação do nome do arquivo especificado. umask ([mask]) Integer Define umask específicas do PHP e retorna o umask de idade. unlink (filename) Exclui o arquivo especificado Boolean. 316 Anexo B ■ PHP Referência da Linguagem Geral Funções matemáticas Descrição Retorna a função abs (número) Mixed Retorna o valor absoluto do número. Float acos (arg) Retorna o arco cosseno de arg. Float asin (arg) Retorna o pecado de arg. atan Float (arg) Retorna o arco de tan arg. atan2 (y, x) Float Retorna o arco de tan y e x. Cordas base_convert (número, base1, base2) Converte número de base1 a base2.

Page 265: Programação de jogos em PHP

Bindec (binário) Integer Converte uma string binária para uma string decimal. Float ceil (número) Retorna o teto de um número. cos Float (arg) Retorna o cosseno de arg. Decbin String (número) Converte um número decimal para um número binário. Dechex String (número) Converte um número decimal para um número hexadecimal. Decoct String (número) Converte um número decimal para um número octal. Float exp (arg) Retorna e à potência de arg. Float chão (número) Retorna o piso de um número. Integer getrandmax () Mostrar o maior número aleatório que pode ser devolvido de rand (). Hexdec (número) Integer Converte um número hexadecimal em um decimal. Float log (arg) Retorna o logaritmo natural de arg. Float log10 (arg) Retorna o log base 10 de arg. max (arg1, arg2, ...) Mixed Retorna o maior valor na lista de argumentos. min (arg1, arg2, ...) Mixed Retorna o menor valor na lista de argumentos. Integer mt_getrandmax () Retorna o maior valor do mt_rand () pode retornar. mt_rand ([min], [max]) Retorna um Integer valor de Mersenne Twister aleatória. mt_srand (semente) Sementes anular a Mersenne Twister gerador de números aleatórios, number_format (número, [dex_place] Formatos, String o número especificado para um determinado número de [Dec_point], [milhares]) casas decimais. Octdec (número) Integer Converte um número octal de um número decimal. pi () retorna Float pi. pow Float (x, y) Retorna x elevado à potência de y. rand ([min], [max]) Integer Retorna um número aleatório. round (número de precisão), Float Retorna o valor arredondado do número com a precisão especificada. Float sin (arg) Retorna o pecado de arg. srand (semente) Sementes anular o gerador de números aleatórios. Float tan (arg) Retorna a tangente de arg. Funções para HTTP Descrição Retorna a função header (string) nome setcookie ([valor], [expirar], [Caminho], [domínio], [seguro]) Número inteiro Boolean Envia o cabeçalho HTTP especificado. Cria um cookie no computador do cliente com o nome especificado e valor. Referência da Linguagem PHP 317 Funções imagem Descrição Retorna a função Getimagesize (filename Array, Retorna o tamanho da imagem. [Imageinfo])

Page 266: Programação de jogos em PHP

Imagearc (img, x, y, largura, Integer Desenha um elipse parcial na imagem especificada, centrado em começar a altura, final, col) x, y, com uma largura específica e altura. Imagechar (img, font, x, y, Integer Desenha o caractere especificado em x, y na imagem. cor do caractere) Imagecharup (img, font, x, y, Integer Desenha o caractere especificado para cima na imagem. cor do caractere) Imagecolorallocate (img, vermelho, Integer Atribui o valor de cor RGB especificado para a imagem. verde, azul) Imagecolorat (img, x, y) Integer Devolve o índice da cor em x, y. Imagecolorclosest (img, vermelho, Integer Retorna o índice da cor mais próxima da cor verde, azul paleta) para a imagem. Imagecolorexact (img, vermelho, Integer Retorna o índice da cor especificada na cor verde, azul paleta) da imagem. Imagecolorresolve (img, vermelho, Integer Finds a cor especificada na paleta e, se ele não existe então verde, azul) retorna o índice da cor mais próxima na paleta. ImageColorSet (img, índice, vermelho, Boolean Define o índice especificado para o valor de cor RGB. verde, azul) Imagecolorsforindex Array (img, index) Retorna um array contendo os valores RGB para o índice na paleta de cores. Imagecolorstotal (img) Integer Retorna o número de cores na paleta especificada imagens coloridas. Imagecolortransparent (img, [color]) Integer cor Define como a cor transparente na paleta. Imagecopyresized (dest_img, Integer Copia uma área da imagem de origem para uma matriz de src_img, destX, destY, srcX, imagem de destino. Se as alturas são diferentes, então o destino srcY, destWidth, destHeight, srcWidth, srcHeight) imagem é redimensionada. Imagecreate (largura, altura) Integer Cria uma nova imagem. Imagecreatefromgif (filename) Integer Cria uma nova imagem a partir do arquivo especificado. ImageDashedLine (img, x1, y1, x2, y2, cor) Integer Desenha uma linha tracejada na imagem do ponto x1, y1 a ponto x2, y2. Imagedestroy (img) Integer Destrói a imagem especificada. Imagefill (img, x, y, cor) Integer Preenche a imagem inicial no ponto x, y. ImageFilledPolygon (img, pontos, num_points, cor)

Page 267: Programação de jogos em PHP

Integer Desenha um polígono preenchido a imagem entre os pontos. ImageFilledRectangle (img, x1, y1, x2, y2, cor) Integer Desenha um retângulo preenchido a imagem especificada. ImageFillToBorder (img, x, y, Integer Executa um preenchimento entre a cor da borda especificadas de partida cor da borda) no ponto x, y. Imagefontheight (fonte) Integer Retorna a altura da fonte especificada em pixels. Imagefontwidth (fonte) Integer Retorna a largura da fonte especificada em pixels. Imagegif (img, [nome]) Integer Envia a imagem para um arquivo ou para o navegador. Imageinterlace (img, [interlace]) Integer Ativa ou desativa o entrelaçamento na imagem. Imageline (img, x1, y1, x2, y2, Integer Desenha uma linha na imagem do ponto x1, y1 ao ponto x2, y2. cor) 318 Apêndice B ■ PHP Referência da Linguagem Descrição Retorna a função Imageloadfont (filename) Integer Carrega uma fonte bitmap do arquivo. Imagepolygon (img, pontos, Integer Desenha um polígono na imagem, bem como preencher polígono mas não num_points, cor) preencher a imagem. ImagePSBBox (texto, fonte, tamanho Array, Calcula as coordenadas para a caixa delimitadora da área de texto usando largura, espaço, ângulo) uma fonte PostScript. ImagePSEncodeFont (filename) Integer Carrega um vetor de codificação de caracteres específicos para um tipo de letra PostScript. Imagepsfreefont void (fontindex) Libera a fonte PostScript da memória. Imagepsloadfont Integer (filename) Carrega uma fonte PostScript na memória. Imagepstext (img, texto, fonte Array, Desenha o texto para a imagem usando uma fonte PostScript. tamanho, em primeiro plano, fundo, x, y, [espaço], [tensão], [Ângulo], [antialias_steps]) ImageRectangle (img, x1, y1, Integer Desenha um retângulo com a imagem. Atua como x2, y2 ImageRectangleFill, cor) () mas o retângulo não é preenchida quando ele é desenhado. ImageSetPixel (img, x, y, cor) Integer Define o pixel no ponto x, y para uma cor. Imagestring (img, font, x, y, Integer Desenha uma string a partir de x, y para a imagem. tamanho, cor) Imagestringup (img, font, x, y, Integer Desenha uma string que começa no ponto x, y para cima enfrentando. tamanho, cor) Imagesx (img) Integer Obtém a largura da imagem. Imagesy (img) Integer Obtém a altura da imagem.

Page 268: Programação de jogos em PHP

Imagettfbbox (tamanho, ângulo Array, Retorna uma caixa delimitadora para uma fonte TrueType. texto, pia batismal) Imagettftext (img, texto, Array tamanho, Desenha o texto na imagem usando a fonte TrueType especificado. ângulo, x, y, cor) IMAP Funções Descrição Retorna a função imap_8bit String (string) Converte uma string de 8 bits em uma seqüência de impressão. imap_alerts () Retorna um array de todas as mensagens de alerta IMAP que tenham ocorrido. imap_append (fluxo de caixa de correio, Anexa Boolean uma mensagem para a caixa de correio especificada. mensagem, flags) imap_base64 String (texto) decodifica o texto base 64 codificado especificado. imap_binary String (string) Converte uma string de 8 bits em uma seqüência de base 64. imap_body (stream, message_num, String Retorna o texto da mensagem número especificado. flags) imap_check Array (stream) Obtém informações sobre a caixa de correio especificada. imap_clearflag_full (stream, Boolean Limpa uma bandeira específica sobre o fluxo. sequência, a bandeira, as opções) imap_close (stream, bandeiras) Boolean Fecha um aberto anteriormente stream IMAP. imap_create caixa de correio (stream, Boolean Cria uma caixa de correio. caixa de correio) imap_delete (stream, message_num) Boolean Marca uma mensagem para exclusão. imap_delete caixa de correio (stream, Exclui Boolean uma caixa de correio. caixa de correio) Referência da Linguagem PHP 319 Descrição Retorna a função imap_errors () Retorna um array de todos os erros que ocorreram IMAP. imap_expunge (stream) Exclui Boolean todas as mensagens marcadas. imap_fetchbody (stream String, Obtém a seção especificada da mensagem. message_num, part_num, flags) imap_fetchheader (stream String, Obtém o cabeçalho para o número da mensagem especificada. message_num, flags) imap_fetchstructure stream (, Array Retorna a estrutura da mensagem. message_num) imap_getmailboxes (stream Array, Retorna uma matriz de caixas de correio. ref, pat) imap_getsubscribed (stream, Array Retorna um array de todas as caixas de correio na qual um usuário está ref, pat) subscrito.

Page 269: Programação de jogos em PHP

imap_header (stream, message_num, Object Retorna um objeto que representa o cabeçalho do e-mail. fromlength, subjectlength, defaulthost) imap_headers Array (stream) Retorna uma matriz que contém todos os cabeçalhos para cada mensagem no fluxo. imap_last_error (String) Obtém o último erro que ocorreu em IMAP. imap_listmailbox Array (stream, ref, pat) Retorna uma matriz que contém todos os nomes de caixa de correio. imap_listsubscribed (stream, Array Retorna um array que contém todas as caixas de correio subscritas em ref, pat) o fluxo. imap_mail_copy stream (, Boolean Copia um conjunto de mensagens para outra caixa postal. messagelist, caixa de correio, flags) imap_mail_move stream (, Boolean Move um conjunto de mensagens para outra caixa postal. caixa messagelist) imap_mailboxmsginfo Array (stream) Obtém informações sobre a caixa de correio atual. imap_msgno (stream, UID) Integer Retorna o número de mensagens para o UID. imap_num_msg (stream) Integer Obtém o número total de mensagens na caixa postal. imap_num_recent (stream) Integer Obtém o número total de novas mensagens na caixa postal. imap_open (caixa de correio, nome de usuário, Integer Abre um fluxo IMAP para uma caixa de correio específica. senha, flags) imap_ping (stream) Boolean Pings o fluxo IMAP. imap_qprint String (string) Converte uma string de impressão para uma string de 8 bits. imap_rename caixa de correio (stream, Renomeia Boolean uma caixa de correio a partir oldname para newname. oldname, newname) imap_reopen (fluxo de caixa de correio, Boolean Reabre o fluxo IMAP. [Flags]) imap_rfc822_parse_adrlist (endereço Array, Analisa uma string de endereço e retorna uma matriz que contém o default_host caixa de correio), de acolhimento, nome pessoal, e uma fonte de domínio. imap_rfc822_write_address (caixa de correio String, retorna um endereço de e-mail. host, pessoal) imap_scanmailbox Array (stream, string) Retorna uma matriz de mensagens que correspondam à seqüência de pesquisa. imap_setflag_full stream (, Boolean Define o sinalizador especificado. sequência, a bandeira, as opções)

Page 270: Programação de jogos em PHP

imap_sort (stream, critérios, Array Retorna um array de números de mensagens que atendem aos critérios de pesquisa. reverso, opções) imap_status stream (, Object caixa de correio, Obtém informações sobre a caixa de correio. opções) Referência da Linguagem PHP 319 Descrição Retorna a função imap_errors () Retorna um array de todos os erros que ocorreram IMAP. imap_expunge (stream) Exclui Boolean todas as mensagens marcadas. imap_fetchbody (stream String, Obtém a seção especificada da mensagem. message_num, part_num, flags) imap_fetchheader (stream String, Obtém o cabeçalho para o número da mensagem especificada. message_num, flags) imap_fetchstructure stream (, Array Retorna a estrutura da mensagem. message_num) imap_getmailboxes (stream Array, Retorna uma matriz de caixas de correio. ref, pat) imap_getsubscribed (stream, Array Retorna um array de todas as caixas de correio na qual um usuário está ref, pat) subscrito. imap_header (stream, message_num, Object Retorna um objeto que representa o cabeçalho do e-mail. fromlength, subjectlength, defaulthost) imap_headers Array (stream) Retorna uma matriz que contém todos os cabeçalhos para cada mensagem no fluxo. imap_last_error (String) Obtém o último erro que ocorreu em IMAP. imap_listmailbox Array (stream, ref, pat) Retorna uma matriz que contém todos os nomes de caixa de correio. imap_listsubscribed (stream, Array Retorna um array que contém todas as caixas de correio subscritas em ref, pat) o fluxo. imap_mail_copy stream (, Boolean Copia um conjunto de mensagens para outra caixa postal. messagelist, caixa de correio, flags) imap_mail_move stream (, Boolean Move um conjunto de mensagens para outra caixa postal. caixa messagelist) imap_mailboxmsginfo Array (stream) Obtém informações sobre a caixa de correio atual. imap_msgno (stream, UID) Integer Retorna o número de mensagens para o UID. imap_num_msg (stream) Integer Obtém o número total de mensagens na caixa postal. imap_num_recent (stream) Integer Obtém o número total de novas mensagens na caixa postal.

Page 271: Programação de jogos em PHP

imap_open (caixa de correio, nome de usuário, Integer Abre um fluxo IMAP para uma caixa de correio específica. senha, flags) imap_ping (stream) Boolean Pings o fluxo IMAP. imap_qprint String (string) Converte uma string de impressão para uma string de 8 bits. imap_rename caixa de correio (stream, Renomeia Boolean uma caixa de correio a partir oldname para newname. oldname, newname) imap_reopen (fluxo de caixa de correio, Boolean Reabre o fluxo IMAP. [Flags]) imap_rfc822_parse_adrlist (endereço Array, Analisa uma string de endereço e retorna uma matriz que contém o default_host caixa de correio), de acolhimento, nome pessoal, e uma fonte de domínio. imap_rfc822_write_address (caixa de correio String, retorna um endereço de e-mail. host, pessoal) imap_scanmailbox Array (stream, string) Retorna uma matriz de mensagens que correspondam à seqüência de pesquisa. imap_setflag_full stream (, Boolean Define o sinalizador especificado. sequência, a bandeira, as opções) imap_sort (stream, critérios, Array Retorna um array de números de mensagens que atendem aos critérios de pesquisa. reverso, opções) imap_status stream (, Object caixa de correio, Obtém informações sobre a caixa de correio. opções) 320 Apêndice B ■ PHP Referência da Linguagem Descrição Retorna a função Boolean imap_subscribe (caixa de correio do córrego,) Subscreve à caixa de correio. imap_uid (stream, message_num) Integer Retorna o UID para a mensagem. imap_undelete (stream, desmarca Boolean uma mensagem para exclusão. message_number) Boolean imap_unsubscribe (caixa de fluxo) unsubscribes da caixa de correio. Funções Informix Descrição Retorna a função ifx_affected_rows (id) ifx_blobinfile_mode (modo) ifx_byteasvarchar (modo) ifx_close ([vinculada]) Número inteiro vazio vazio Número inteiro ifx_connect ([banco], [userid], Integer [Senha]) ifx_copy_blob (id) Integer ifx_create_blob (tipo, modo de param) Integer

Page 272: Programação de jogos em PHP

Retorna o número de linhas que foram afetados pela consulta. Define o modo padrão para o comando SELECT, Define o modo de byte padrão para as declarações SELECT. Fecha a conexão atualmente aberto. Abre uma conexão ao banco de dados Informix. Cópias de um objeto BLOB. Cria um BLOB. Cria um objeto char. Executa uma instrução SQL preparada. Retorna o último erro que ocorreu em Informix. Retorna o último erro que ocorreu ou a mensagem de erro para a código especificado. Obtém uma linha do banco de dados. Retorna uma matriz de nomes de campos e suas propriedades. Retorna uma matriz de nomes de campos e seus tipos. Libera o objeto BLOB da memória. Libera o objeto Char especificado da memória. Libera o conjunto de resultados de memória. Libera o objeto SLOB da memória. Retorna o objeto BLOB especificado. Retorna o objeto especificado char. Retorna o conteúdo de sqlca.sqlerrd [0-5], após uma consulta tenha sido executado. Saídas o recorde estabelecido como uma tabela HTML. Define o valor de retorno padrão para NULL. Obtém o número de campos no conjunto de registros. Obtém o número de linhas no conjunto de registro. Abre uma conexão persistente com um banco de dados. Prepara uma consulta SQL para executar. Executa a consulta SQL especificada no banco de dados aberto. Define o modo de texto padrão para as declarações SELECT. Atualiza o conteúdo de um objeto BLOB. ifx_create_char (param) Integer ifx_do (id) Integer ifx_error (String) ifx_errormsg ([errorcode]) String ifx_fetch_row (id, [posição]) ifx_fieldproperties (id) ifx_fieldtypes (id) ifx_free_blob (id) ifx_free_char (id) ifx_free_result (id) ifx_free_slob (id) ifx_get_blob (id) ifx_get_char (id) ifx_getsqlca (id) ifx_htmltbl_result (id, [Html_table_options]) ifx_nullformat (modo) ifx_num_fields (id)

Page 273: Programação de jogos em PHP

ifx_num_rows (id) ifx_pconnect ([banco], [Userid], [senha]) Matriz Matriz Matriz Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Matriz Número inteiro vazio Número inteiro Número inteiro Número inteiro ifx_prepare consulta ([ligada], Integer [Cursor_type], [blobidarray]) ifx_query consulta ([ligada], Integer [Cursor_type], [blobidarray]) ifx_textasvarchar void (modo) ifx_update_blob (id, conteúdo) Boolean Referência da Linguagem PHP 321 Descrição Retorna a função ifx_update_char (id, o conteúdo) ifxus_close_slob (id) ifxus_create_slob (modo) ifxus_open_slob (id, mode) ifxus_read_slob (id, bytes) ifxus_seek_slob (modo id, offset) ifxus_tell_slob (id) ifxus_write_slob (id, string) Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Atualiza o conteúdo do objeto char. Libera o objeto SLOB especificado da memória. Cria um objeto SLOB. Abre um objeto SLOB. Lê um número especificado de bytes de um objeto SLOB. Define a posição atual do ponteiro no objeto SLOB. Obtém a posição atual do ponteiro no objeto SLOB. Escreve uma string para o objeto SLOB.

Page 274: Programação de jogos em PHP

Funções LDAP Descrição Retorna a função ldap_add (parâmetros link_id, dn, de entrada) ldap_bind (parâmetros link_id, [bind_rdn], [Senha]) ldap_close (parâmetros link_id) ldap_connect ([hostname], [porta]) ldap_count_entries Integer (parâmetros link_id, resultado) Boolean Boolean Boolean Número inteiro Adiciona uma entrada para o dn especificado. Vincula o diretório LDAP com um RDN especificado e uma senha. Fecha uma conexão aberta para o diretório LDAP. Conecta a um servidor LDAP. Retorna o número de entradas na pesquisa. Exclui um dn partir de um diretório no LDAP. Converte um dn especificado para um nome de user-friendly. Divide um dn em suas partes componentes. Recupera o primeiro atributo na entrada. Obtém o ID de resultado para a entrada especificada. Libera o resultado especificado da memória. Obtém os atributos para a entrada especificada. Obtém o dn da entrada. Retorna uma matriz de entradas. Obtém uma matriz de valores para os atributos especificados. Realiza uma pesquisa LDAP_SCOPE_ONELEVEL com o especificado filtros. Adiciona um atributo para o link especificado. Substitui um atributo no link especificado. Modifica a entrada especificada. Obtém o próximo atributo no conjunto de resultados. Obtém a próxima entrada para o conjunto de resultados especificado. Executa uma pesquisa usando LDAP_SCOPE_BASE os filtros especificados. Realiza uma pesquisa LDAP_SCOPE_SUBTREE com os filtros especificados. Desassocia o diretório LDAP especificado. ldap_delete (lnk_id, dn) Boolean ldap_dn2ufn (dn) Integer ldap_explode_dn (dn, [atributos]) Array ldap_first_attrbitute (parâmetros link_id, String ber_id, resultado) ldap_first_entry (parâmetros link_id, resultado) Integer ldap_free_result (resultado) Boolean ldap_get_attributes (parâmetros link_id, Array resultado) ldap_get_dn String (parâmetros link_id, resultado) ldap_get_entries Array (parâmetros link_id, resultado) ldap_get_values resultado (parâmetros link_id, Array, atributos)

Page 275: Programação de jogos em PHP

ldap_list (parâmetros link_id, base_dn, Integer filtro, [atributos]) LDAP_MOD_ADD (parâmetros link_id, dn, entrada) Boolean LDAP_MOD_REPLACE (parâmetros link_id, dn, Boolean entrada) ldap_modify (parâmetros link_id, dn, entrada) Boolean ldap_next_attribute (parâmetros link_id, String ber_id, resultado) ldap_next_entry (parâmetros link_id, resultado) Integer ldap_read (parâmetros link_id, base_dn, Integer filtro, [atributos]) ldap_search (parâmetros link_id, base_dn, Integer filtro, [atributos]) ldap_unbind (parâmetros link_id) Boolean 322 Apêndice B ■ PHP Referência da Linguagem Função e-mail Descrição Retorna a função mail (para, assunto, mensagem, Boolean Envia um e-mail do administrador do PHP para o especificado e-mail [Cabeçalhos]) conta. Opções de PHP Descrição Retorna a função error_log (mensagem, message_type, [Dest], [cabeçalhos]) error_reporting ([nível]) extension_loaded (extension_name) get_cfg_var (var) get_current_user () get_magic_quotes_gpc () get_magic_quotes_runtime () getenv (var) getlastmod () getmyinode () getmypid () getmyuid () getrusage ([que]) phpinfo () phpversion () putenv (valor) Integer Envia uma mensagem de erro. Integer Define ou retorna o nível atual de relatórios de erro. Retornam true se a extensão especificada é carregado, caso contrário, retorna false. String Retorna o valor da configuração do PHP especificada. String Retorna o valor do usuário atual. Longo Retorna as configurações atuais para magic quotes. Longo Retorna as configurações atuais para magic quotes. String Retorna o valor de uma variável de ambiente específico. Retorna o tempo inteiro quando a página atual foi modificada pela última vez. Retorna o inteiro inode do script atual em execução.

Page 276: Programação de jogos em PHP

Integer Retorna o ID do processo que o PHP está sendo executado. Integer Retorna o ID de usuário para o dono do script PHP atual. Array Retorna o uso de recursos atual. Saídas inteiro todas as informações de configuração sobre a configuração do PHP. String Retorna a versão atual do PHP que você está executando. void Define o valor da variável de ambiente. set_magic_quotes_runtime (ajuste) Boolean Ativa ou desativa magic quotes. set_time_limit void (seonds) Define o tempo limite para scripts PHP. Funções diversas Descrição Retorna a função connection_aborted () Integer Indica que uma conexão foi abortada por um usuário. connection_status () Integer Obtém o status da conexão. Boolean connection_timeout () Indica que o script foi excedido. die (mensagem) void Saídas a mensagem e mata a execução do script. eval (string) Mixed Avalia a string como código PHP. vazio exit () Interrompe a execução do script atual. function_exists (nome) Boolean Verifica para ver se ou não uma função existe. ignore_user_abort ([definição]) Define Integer ou retorna se desconectar um cliente irá parar a execução de um script. iptcparse Array (iptcblock) Analisa o iptcblock em um array. vazamento (bytes) void vazamentos a quantidade especificada de memória. pack (formato, [args]) String Packs o argumento em uma string binária. Referência da Linguagem PHP 323 Descrição Retorna a função vazio register_shutdown_ Especifica uma função para executar quando o script atual termina. function (função) serialize (dados) String vazio do sono (segundos) uniqid (prefixo) String unserialize (dados) Mixed usleep void (microssegundos) Serializa os dados em uma string. Pausa a execução do script para a quantidade especificada de segundos. Gera um ID único baseado no tempo atual. Deserializa a cadeia. Interrompe o script para o valor especificado de microssegundos. Funções de rede Descrição Retorna a função checkdnsrr (host, [tipo]) CloseLog () debugger_off () debugger_on (servidor) fsockopen (porto, hostname, [Error_num], [error_str], [Tempo])

Page 277: Programação de jogos em PHP

gethostbyaddr (ip_address) gethostbyname (host) gethostbynamel (hostname) getmxrr (mxhost, hostname, [Peso]) openlog (identidade, opção, instalação) pfsockopen (porto, hostname, [Error_num], [eror_str], [Tempo]) Pesquisas inteiro arquivos DNS para o host e tipo específico de registro. Fecha o fluxo inteiro aberto para o registro atual. Integer Desativa o depurador remoto. Inteiro permite que o depurador remoto. Integer Abre uma conexão de soquete para o host e porta especificados. String Retorna o nome do host. String Retorna o endereço IP do host. Array Retorna uma matriz de endereços IP que o host específico contém. Integer Retorna o registro MX para o nome de host específico de DNS. Integer Abre um fluxo para o arquivo de log. Integer Abre uma conexão de soquete persistente para o host e porta especificados. stream_set_blocking (modo de fluxo) Bool Define o modo de bloqueio ou um soquete específico. syslog (mensagem de prioridade), Integer Grava uma mensagem para o fluxo de abrir arquivo de log. Funções NIS Descrição Retorna a função yp_err_string (errorcode) yp_errno () yp_first (domínio, mapa) yp_get_default_domain () yp_master (domínio, mapa) yp_match (domínio, mapa, key) yp_next (domínio, mapa, key) yp_order (domínio, mapa) String Obtém o último erro que ocorreu. Integer Retorna o código de erro para o último erro que ocorreu. Array Obtém o par chave / valor a partir do primeiro mapa. Retorna o inteiro máquina padrão do nome de domínio NIS. String Obtém o par chave / valor para o NIS mestre do domínio. String Obtém o valor da chave especificada. Cadeia Recupera o par chave / valor próximo do ponteiro. Integer Retorna o número de ordem do mapa. 324 Apêndice B ■ PHP Referência da Linguagem Perl-Compatible Regular Expression Funções Descrição Retorna a função preg_grep (entrada padrão) preg_match (padrão de entrada, [Jogos])

Page 278: Programação de jogos em PHP

preg_match_all (padrão de entrada, fósforos, [ordem]) preg_quote (string) preg_replace (padrão, string de substituição) Matriz Número inteiro Número inteiro Corda Misturado Retorna uma matriz dos padrões de correspondência a partir da entrada. Executa uma expressão regular na entrada. Corresponde a todos os padrões na entrada. Escapa os caracteres especiais de expressão. Substitui a string com substituição, se corresponde ao padrão. Regulares funcitons Expressão Descrição Retorna a função ereg (padrão, string, [regs]) ereg_replace (padrão, string de substituição) eregi (padrão, string, [regs]) eregi_replace (padrão, string de substituição) split (padrão, string, [limite]) sql_regcase (string) Boolean Corda Boolean Corda Matriz Corda Pesquisas seqüência de caracteres especificada para cordas que correspondem a regularidade padrão de expressão. Substitui a string com substituição, se corresponde ao padrão. Realiza uma busca case-insensitive na corda para o regular padrão de expressão. Substitui qualquer cadeia com substituição, se corresponde ao padrão, insensível a caso. Divide a string em uma matriz usando a expressão regular especificada padrão. Retorna uma expressão regular a partir de uma combinação case-insensitive do seqüência de caracteres especificada. Semáforo e Funções de Memória Compartilhada Descrição Retorna a função sem_acquire (sem_id) Boolean adquire um semáforo. sem_get (key, [max_acquire], [perm]) Retorna um Integer ID semáforo.

Page 279: Programação de jogos em PHP

sem_release (sem_id) Boolean Releases um semáforo específico da memória. shm_attach (key, [memsize], [perm]) Integer Cria um segmento de memória compartilhada. shm_detach (shm_id) Boolean Desconecta o segmento de memória compartilhada. shm_get_var (shm_id, variable_key) Retorna Mixed uma variável a partir da memória compartilhada. shm_put_var (shm_id, key, value) Integer Coloca uma variável no segmento de memória compartilhada. shm_remove (shm_id) Exclui Integer um segmento de memória compartilhada. shm_remove_var (shm_id, key) Integer Remove uma variável do segmento de memória compartilhada. Funções para Sessão Descrição Retorna a função session_decode (string) Boolean Decodifica dados da sessão. session_destroy () Boolean Encerra a sessão atual. session_encode () String Codifica os dados da sessão. Referência da Linguagem PHP 325 Descrição Retorna a função session_id ([sid]) Define String ou recebe o id da sessão atual. Verifica session_is_registered (var) Boolean se a variável especificada está registrado na sessão atual. session_module_name ([módulo]) os conjuntos de cordas ou obtém o nome do módulo da sessão atual. session_name ([nome]) os conjuntos de cordas ou obtém o nome da sessão atual. session_register (var) registra a variável Boolean especificado na sessão atual. session_save_path ([caminho]) String Define ou obtém o caminho atual onde as sessões estão sendo salvos. session_start () Boolean Inicia uma sessão. session_unregister (var) Boolean Cancela o registro de uma variável com a sessão atual. Funções SNMP Descrição Retorna a função snmp_get_quick_print () snmp_set_quick_print (Boolean) snmpget (comunidade, hostname, object_id, [tempo], [tentativas]) snmpset (comunidade, hostname, object_id, valor, tipo, [Tempo], [tentativas]) snmpwalk (comunidade, hostname, object_id, [tempo], [tentativas]) snmpwalkoid (comunidade, hostname, object_id [tempo], [tentativas]) Boolean vazio Corda Boolean Matriz

Page 280: Programação de jogos em PHP

Matriz Retorna o valor da configuração quick_print. Define o valor da configuração quick_print. Obtém um objeto SNMP. Define o objeto SNMP. Obtém uma matriz de todos os objetos SNMP. Obtém uma matriz de IDs de objetos e seus correspondentes valores. Funções para String Descrição Retorna a função addslashes (string) bin2hex (string) chop (string) chr (ascii) chunk_split string ([chunk_len], [End]) convert_cyr_string (string, de, para) crypt (string, [sal]) echo (string) explode (string separador,) flush () get_meta_tags (filename, [Include_path]) htmlentities (string) htmlspecialchars (string) implode (delimitador, array) Corda Corda Corda Corda Corda Corda Corda vazio Matriz vazio Matriz Corda Corda Corda Adiciona barras de escape para a cadeia. Converte a seqüência binária em uma string hexadecimal. Remove espaços em branco. Retorna o caractere para o código ASCII. Divide a string em pequenos pedaços, inserindo o final em cada personagem chunk_len especificado. Converte a seqüência de um conjunto cirílico para outro. DES-criptografa a string usando o valor sal. Saídas de uma string para a tela.

Page 281: Programação de jogos em PHP

Divide a string em um array. Libera o buffer de saída. Obtém uma matriz de todas as tags META do arquivo especificado. Converte a string em uma entidade HTML. Converte todos os caracteres HTML especiais na string em um HTML entitity. Faz exatamente o oposto da função de explodir. Ele se junta ao matriz em uma única string usando o delimitador especificado. 326 Apêndice B ■ PHP Referência da Linguagem Descrição Retorna a função join (delimitador, array) ltrim (string) md5 (string) nl2br (string) ord (string) parse_str (string) print (string) printf (string, [arg]) Corda Corda Corda Corda int vazio Número inteiro vazio Junta-se a matriz em uma única string usando o delimitador especificado. Retira o espaço em branco do início da string. Calcula o hash MD5 da seqüência especificada. Insere a tag <BR> antes de toda a linha de quebra na seqüência. Retorna o valor ASCII especificado da primeira letra do string. Analisa a string em variáveis como se fosse uma seqüência de consulta. Imprime a seqüência especificada. Saídas de uma string formatada. Converte uma string quoted printable para uma string de 8 bits. Escapa os caracteres meta na cadeia. URL-encoded Decodifica uma string. Codifica uma string para uma string URL-codificado. Define as informações de localização de funções na categoria especificada. Calcula a similaridade entre string1 e string2. Calcula a chave soundex para a cadeia. Retorna uma string formatada. Substitui todas as ocorrências do padrão com a substituição na string. Encontra a primeira ocorrência de string2 em string1. Compara string1 string2 contra. Retorna o número de caracteres no início de string1that não coincidir com o início das personagens em string2. Tiras todas as tags HTML e PHP a partir da seqüência de caracteres especificada. Remove todas as barras de escape caracter da cadeia.

Page 282: Programação de jogos em PHP

Retorna o comprimento em caracteres do string. Encontra a primeira ocorrência de string2 em string1. Retorna a seqüência especificada na ordem inversa. Localiza a última ocorrência de string2 em string1. Encontra a primeira ocorrência de string2 em string1. Tokeniza string1 em segmentos separados por string2. Converte todos os caracteres na string para minúsculas. Converte todos os caracteres na string para maiúscula. Substitui todas as ocorrências de partir em cadeia com a. Retorna os caracteres na string a partir do ponto inicial especificado. Converte o primeiro caractere da string para maiúsculas. Converte o primeiro caractere de cada palavra em maiúsculas. quoted_printable_decode (string) Quotemeta (string) rawurldecode (string) rawurlencode (string) setlocale (categoria, local) similar_text (string1, string2, [Por cento]) soundex (string) sprintf (formato, [args]) str_replace (padrão de substituição, Corda Corda Corda Corda Corda int Corda Corda Corda string) strchr (string1, string2) strcmp (string1, string2) strcpsn (string1, string2) strip_tags (string) stripslashes (string) strlen (string) strpos (stirng1, string2) strrev (string) strrpos (string1, string2) strstr (string1, string2) strtok (sring1, string2) strtolower (string) strtoupper (string) strtr (string, de, para) Corda int int Corda

Page 283: Programação de jogos em PHP

Corda int int Corda int Corda Corda Corda Corda Corda substring (início string, [length]) String ucfirst String (string) ucwords String (string) Funções URL Descrição Retorna a função base64_decode String (string) base64_encode (string) String parse_url Array (URL) Decodifica o base64 seqüência de caracteres especificada. Retorna uma string base64 codificado. Quebra a URL especificada em um array. Referência da Linguagem PHP 327 Descrição Retorna a função urldecode String (string) da corda Decodifica uma URL codificada. urlencode (string) String URL codifica uma string. Funções variável Descrição Retorna a função doubleval (var) Converte a variável Integer para um casal. Verifica vazia (var) Boolean para ver se a variável tem um valor diferente de zero. gettype String (var) Obtém o tipo de dados da variável. intval (var, [base]) Integer Obtém o valor da variável usando a base especificada. Verifica is_array (var) Boolean para ver se a variável é um array. is_double Cheques (var) Boolean para ver se a variável é um duplo. Verifica is_float (var) Boolean para ver se a variável é um float. Verifica is_int (var) Boolean para ver se a variável é um int. Verifica is_long (var) Boolean para ver se a variável é um longa. Verifica is_object (var) Boolean para ver se a variável é um objeto. is_real (var) Boolean Verifica se a variável é um número real. Verifica is_string (var) Boolean para ver se a variável é uma string. isset (var) Boolean Verifica se a variável foi definida ainda. settype (var, tipo) Boolean Define a variável para o tipo especificado. strval String (var) Retorna o valor string da variável. unset void (var) unsets uma variável definida. Funções da WDDX Descrição Retorna a função wddx_add_vars (packet_id, vars) Boolean Serializa as variáveis em seguida, adiciona-los ao packet_id especificado. wddx_deserialize (pacote) Mixed Desserializa o pacote especificado.

Page 284: Programação de jogos em PHP

wddx_packet_end String (packet_id) Termina o pacote especificado. wddx_packet_start ([comentário]) Integer Inicia um novo pacote. wddx_serialize_value (var, String Serializa um único valor para o pacote. [Comentário]) wddx_serialize_vars String (vars) Serializa uma matriz de variáveis para o pacote. Funções de compressão Descrição Retorna a função gzclose (gz) Integer Fecha um fluxo de arquivo gz. gzeof Integer (gz) Verifica se você está no final do fluxo de arquivo gz. Array (filename) gzfile Lê todo o conteúdo de um arquivo gz para uma matriz. gzgetc String (gz) Obtém um caractere do fluxo de arquivo gz. gzgets String (comprimento gz) Obtém uma linha do fluxo de arquivo gz. gzgetss String (comprimento gz) Obtém uma linha do fluxo de arquivo gz stripping de HTML. 328 Apêndice B ■ PHP Referência da Linguagem Descrição Retorna a função gzopen (filename, mode) gzpassthru (gz) gzputs (gz string, [length]) gzread (comprimento gz) gzrewind (gz) gzseek (gz, offset) gztell (gz) readgzfile (filename) gzwrite (gz string, [length]) Número inteiro Número inteiro Número inteiro Corda Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Abre o arquivo gz especificado. Saídas do arquivo gz do ponteiro de arquivo atual. Escreve a string para o stream de arquivo gz. Lê a quantidade especificada de bytes do fluxo de arquivo gz. Redefine o ponteiro do arquivo para o início do fluxo do arquivo gz. Define o ponteiro do arquivo para o deslocamento no fluxo de arquivo gz. Obtém a posição atual do ponteiro de arquivo no fluxo do arquivo gz. Lê o arquivo e gera o conteúdo. Escreve a string para o stream de arquivo gz. Funções para analisar XML Descrição Retorna a função utf8_decode String (string) utf8_encode (string) String xml_error_string (código) String xml_get_current_byte_index (parser) Integer

Page 285: Programação de jogos em PHP

xml_get_current_column_ Integer número (analisador) xml_get_current_line_number (parser) Integer xml_get_error_code (analisador) Integer xml_parse parser (, dados Boolean [Is_final]) xml_parser_create ([codificação]) Integer xml_parser_free (parser) Boolean xml_parser_get_option analisador (Mixed, opção) xml_parser_set_option parser (, Boolean valor da opção) xml_set_character_data_handler Boolean (Manipulador parser) xml_set_default_handler parser (, Boolean manipulador) xml_set_element_handler parser (, Boolean start_element_handler, end_element_handler) xml_set_external_entity_ref_ Boolean handler (manipulador parser) xml_set_notation_decl_ Boolean handler (manipulador parser) xml_set_processing_instruction_ Boolean handler (manipulador parser) xml_set_unparsed_entity_decl_ Boolean handler (manipulador parser) Converte a string UTF-8 para um string ISO-8859-1. Converte um string ISO-8859-1 para uma string UTF-8. Retorna o erro para o código especificado. Retorna o índice do byte atual. Retorna o número da coluna atual o analisador está ligado. Retorna o número da linha atual o analisador está ligado. Retorna o último código de erro que ocorreu. Analisa os dados. Cria um parser XML. Destrói o parser XML. Obtém o valor da opção especificada. Define o valor da opção especificada Registra um caráter manipulador de dados. Define o manipulador padrão. Define o manipulador elemento. Define o manipulador de referência externa. Define o manipulador de declaração de notação. Define o manipulador de instrução de processamento. Define o manipulador de declaração não analisada entidade. apêndice C Suporte de depuração- Aplicações

Page 286: Programação de jogos em PHP

Eu n deste apêndice, você vai aprender como depurar suas aplicações PHP para descobrir erros, o que é muito importante. Eu só chamar esta seção de suporte, porque você pode ter dificuldade em obter alguns exemplos de trabalhar se a sua versão PHP é diferente ou se você usa uma configuração especial. Este anexo vai lhe dar as habilidades necessárias para corrigir os erros à medida que surgir. Com a prática, de depuração vai se tornar uma segunda natureza para você. Você pode quebrar erros em três grandes categorias. ■ Sintaxe / compilação erros ■ Semântica / runtime erros ■ Os erros lógicos Erros de sintaxe Erros de sintaxe são levantadas pelo analisador quando há código incorreto. Estes são os mais fáceis erros para rastrear porque o analisador informa qual linha o erro ocorreu. Tomar a seguinte linha de código, por exemplo: $ X = $ ponto ["x"; Isso irá produzir um erro de interpretação que se parece com a Figura C.1. 329 330 Apêndice C ■ Suporte Debugging Applications- Figura C.1 Um erro de interpretação. O erro diz que o analisador encontrou um personagem inesperado, e diz-lhe o caráter que o analisador estava esperando. Ele ainda diz que linha o erro ocorreu. O correção para esse erro é bastante simples: $ X = $ ponto ["x"]; Isso é simples, mas que se você fez algo parecido com isto: <? Php for ($ i = 0; $ i <$ count; $ i + +) ?> <b> item de menu </ b> <? Php echo ($ i); } ?> Isto produz o erro mostrado na Figura C.2. Figura C.2 Outro erro de interpretação. Apoio Debugging Applications-331 O erro está apontando para a faixa no final do código. Mas esta braçadeira deve estar lá, certo? Portanto, deve haver um erro em algum lugar antes da linha 7. Com certeza, o início cinta foi perdida após o início do loop for. Uma maneira de corrigir este erro é adicionar o cinta. Outra forma perfeitamente legítima para corrigir este erro é remover a chave final totalmente.

Page 287: Programação de jogos em PHP

Lembre-se, um loop for não tem que ter chaves se houver apenas uma linha de código para executar. Erros de semântica Erros semânticos são um pouco mais difícil de rastrear do que erros de sintaxe. Os erros podem ser um pouco vaga mesmo que eles dão números de linha. Dê uma olhada no seguinte exemplo: <? Php socket_create ($ socket, 'localhost', 'tcp'); ?> Isso gera o erro mostrado na figura C.3. Esse erro diz que o segundo parâmetro é suposto ser um longo, mas uma seqüência foi dada. Mas o segundo parâmetro é perfeitamente legítimo. É o terceiro parâmetro que é incorreto. Deve ler-se: socket_create ($ socket, "localhost", SOL_TCP); Veja o que quero dizer quando digo que os erros são um pouco vagos? Esses erros são ainda bastante fácil de rastrear. Normalmente, quando você olha para a linha de código especificado por um momento, a corrigir amanhece em você. Se a correção não vem para você, então vá para www.php.net e digite o nome da função na caixa de pesquisa. Isso fará com que a documentação para o particular função que você possa determinar onde você errou. Figura C.3 Um erro de semântica. 332 Apêndice C ■ Suporte Debugging Applications- Erros de lógica Das três categorias gerais de erros, erros de lógica são os mais difíceis de rastrear. O razão para isso é porque o código está sintaticamente correta e executado. O código só não executados conforme o esperado. A parte mais frustrante de erros de lógica é que o código que você escreveu pode olha como ele está trabalhando, mas então algo inesperado ocorre mais tarde para baixo da linha. Dê uma rápido olhar para o exemplo de código a seguir e veja se você consegue identificar o erro de lógica. <? Php $ SomeArray = array ("Faca", "Gun", "Saúde", "The Shield"); for ($ loop = 0; $ laço <count ($ someArray); $ laço + +) { if ($ someArray [$ loop] == "Saúde") { unset ($ someArray [$ loop]); } echo ("$ loop = $ someArray [$ loop] <br>"); } ?>

Page 288: Programação de jogos em PHP

Você achou o erro? Dê uma olhada na Figura C.4 para ver o resultado deste exemplo e ver se você pode descobrir o que está acontecendo. Note como a saída pára no terceiro elemento na matriz. Não deve dizer a última linha 3 = Shield? O erro de lógica aqui é que você está iterando o número de elementos na matriz. Uma vez que você acertar o "Saúde" elemento que você remover o índice na matriz. Isto resulta na contagem da matriz que está sendo diminuída por um. Assim, quando o laço começa a próximo conjunto deve imprimir 3 = Shield. O índice é agora maior do que a contagem da matriz. Figura C.4 Um erro de lógica. Apoio Debugging Applications-333 Note que não há erros nesta página. Como eu mencionei, erros de lógica pode ser difícil rastrear quando algo não funcionar como esperado. Há realmente uma quarta categoria, os erros ambientais, mas você não tem absolutamente nenhum controle sobre estes. Um erro ambiental é quando há um bug inerentes ao programa você está usando. Se você tiver um erro untraceable, as chances são bastante altas que é um erro ambiental. No entanto, você não pode apenas giz até difícil de encontrar erros de lógica como ambientais erros. Se você acredita ter executado em um erro ambiental ir para a Web site e dê uma olhada nos fóruns e listas de bug conhecido. Se você encontrar algo relacionado para o seu problema, então não é mais provável um reparo fácil para ele. Normalmente, a correção vem na forma de uma atualização ou uma configuração. PHP e Relatório de erros PHP é capaz de quatro níveis de relatórios de erros. PHP relatórios erros fatais, erros de interpretação, advertências e avisos. Você pode definir o seu nível desejado de relatórios de erros no arquivo php.ini sob o cabeçalho erros. Ou você pode definir o nível de relatórios de erros em tempo real para o seu aplicação. Para definir o nível de relatório de erros em tempo real você pode usar a seguinte função: int error_reporting (int level); A função error_reporting () tem um número inteiro de o nível de informação que você gostaria. Cada um dos quatro níveis de erros tem um valor inteiro. ■ 1 - Erros fatais ■ 2 - Advertências ■ 4 - Erros Parser ■ 8 - Avisos Então, para descobrir o nível de relatório de erros que você gostaria, você simplesmente adicionar os valores

Page 289: Programação de jogos em PHP

juntos. Este é muito parecido com as permissões em uma máquina UNIX. Por exemplo, se você gostaria de relatar somente erros fatais e avisos que você faria o seguinte: error_reporting (3); Veja como isso funciona? Dê uma olhada em mais um. Digamos que você queria relatório avisos apenas, avisos e erros fatais. Você usaria a seguinte linha: error_reporting (11); Da mesma forma, se você forneceu 0 como o valor para o nível de erros, então não seria relatados. Esta é uma função útil para usar. Enquanto você estiver desenvolvendo um aplicativo que você pode ligar seus erros para que você possa depurar problemas. Mas quando você colocar algo em produção você poderia simplesmente definir o nível de relatório de erros a 0 e não tenho medo que um usuário ver um grande erro desagradável no meio de uma página. 334 Apêndice C ■ Suporte Debugging Applications- Tratamento de erros Tratamento de erros em PHP é bastante simples. Na maioria das vezes uma função retornará 0 se falhar por uma razão ou outra, de modo a travar este você sempre pode usar uma instrução if. <? Php if (! someFunction ($ valor)) { echo ("Ocorreu um erro"); retorno; } ?> Isto permite-lhe fazer o que quiser quando ocorre um erro. Você pode apenas permitir que os usuários sabe alguma coisa deu errado, ou você poderia até mesmo ir tão longe a ponto de levá-los a uma detalhada página de erro que lhes permite e-mail do administrador com uma notificação do erro. No entanto, existem algumas funções que irá gerar um erro se ele falhar. Se este for o caso você pode suprimir o erro usando o símbolo (@). <? Php if (! @ mysql_connect ($ db, $ username, $ password)) { echo ("Ocorreu um erro ao tentar abrir o banco de dados"); retorno; } ?> Isso irá suprimir a mensagem de erro do PHP, mas a função ainda retornará 0, permitindo que você sabe que ele falhou. Estar ciente que se você suprimir um erro fatal nenhuma mensagem será exibida

Page 290: Programação de jogos em PHP

mas o processamento do script será interrompido mortos em suas faixas. Então, eu recomendo execução seu código sem a supressão quando o teste para ver onde ocorrem erros e adicionando o supressão em quando terminar a depuração do seu código. Se você suprimir as mensagens de erro que você sempre pode recuperar a mensagem de erro completa através do $ Php_errormsg variável. Esta variável sempre conterá o último erro que ocorreu no Interpretador PHP. Ao escrever este livro eu tive um erro que ocorreu ao tentar escrever para um arquivo db que eu criei e eu tinha erros desligado. Então, toda vez que eu executou o script seria nada aparecem na tela eo arquivo não foi jamais criado. Levei alguns minutos para perceber o que estava acontecendo. Quando finalmente consegui, eu tenho uma mensagem de erro que parecia Figura C.5. Primeiro pensei comigo mesmo: "Que diabos é isso, não faz sentido em tudo." Mesmo que esta erro foi bastante enigmático, ele me deu uma direção. Uma vez que estava tendo um problema com o linha dba_open (), eu pensei que não deve ter incluído as extensões db. Quando eu chequei a Apoio Debugging Applications-335 Figura C.5 mensagem de erro. arquivo php.ini eu descobri que eu tinha incluído as extensões db. Então, depois de várias horas de Pesquisando nos Fóruns, corri a função phpinfo (). Quando eu fiz isso eu descobri que o versão do PHP que eu estava correndo não suportam o formato db2, mas apoiou a db3 formato. Uma vez eu fiz isso tudo simples mudança funcionou perfeitamente. Ele só vai para mostram que usando esses erros não podem levar você a uma correção imediata, mas vai pelo menos um ponto você na direção certa. Problemas de aplicação e instalação Ao instalar o PHP ou um dos outros aplicativos incluídos no CD você pode executar em alguma configuração ou problemas de configuração. Eu não posso cobrir todas as questões neste livro, mas posso recomendo apenas ir ao site do fabricante na Web e olhando para sua documentação. Estas empresas têm feito um grande trabalho de detalhamento muito comum que problemas ocorrer durante a instalação e configuração. Se o problema não está na documentação disponível, há sempre suporte ao cliente.

Page 291: Programação de jogos em PHP

A única coisa que eu vou incluir neste livro é o conjunto de perguntas frequentes listados no www.php.net. Eu imagino que estes serão os problemas mais comuns que você vai correr em e quero poupar o tempo de tentar encontrar essas respostas em todos os seus próprios. 1. Eu peguei a última versão do PHP usando o serviço de CVS anônimo, mas não há configure script! Você deve ter o pacote autoconf GNU instalado para que você possa gerar o configurar script de configure.in. Basta executar. Buildconf / no diretório de nível superior depois de obter os fontes do servidor CVS. (Além disso, a menos que você execute configure com o - enable-mantenedor modo de opção, o script configure não irá receber automaticamente 336 Apêndice C ■ Suporte Debugging Applications- reconstruída quando o arquivo configure.in é atualizado, então você deve certificar-se de fazer isso manualmente quando você percebe configure.in mudou. Um sintoma disso é encontrar coisas como a variável @ @ em seu Makefile após configurar ou config.status é executado.) 2. Estou tendo problemas para configurar PHP para trabalhar com Apache. Ele diz que não pode encontrar httpd.h, mas é exatamente onde eu disse que é! Você precisa dizer ao script configure / setup a localização do nível superior do seu Apache árvore de código fonte. Isto significa que você quiser especificar - with-apache = / caminho / para / apache e não - with-apache = / caminho / para / apache / src. 3. Ao configurar PHP, você se deparar com um erro semelhante ao seguinte: 3. Ao configurar PHP, você se deparar com um erro semelhante ao seguinte: verificação de arquivos raiz lex saída ... . / Configure: lex: comando não encontrado configure: error: não consegue encontrar a saída de lex; desistir Não deixe de ler as instruções de instalação cuidadosamente e note que você precisa ambos Flex e Bison instalado para compilar o PHP. Dependendo da configuração, você irá instalar Bison e Flex a partir de qualquer fonte ou um pacote, como um RPM. 4. Quando eu tento iniciar o Apache, recebo a mensagem o seguinte: fatal: erro de realocação: arquivo / path/to/libphp4.so: ap_block_alarms símbolo: o símbolo de referência não encontrada Este erro normalmente aparece quando você compilar o programa principal Apache como um DSO biblioteca para uso compartilhado. Tente reconfigurar o Apache, certificando-se de utilizar pelo menos o sinalizadores a seguir:

Page 292: Programação de jogos em PHP

-Enable-shared = max-enable-regra = SHARED_CORE Para mais informações, leia o top-level arquivo de instalação do Apache. 5. Quando eu executo o configure, ele diz que não consegue encontrar os arquivos de inclusão ou biblioteca de GD, gdbm, ou algum outro pacote! Você pode fazer o olhar script configure para arquivos de cabeçalho e bibliotecas em não-padrão locais, especificando flags adicionais para passar para o pré-processador C e linker, tais como: CPPFLAGS =- I / caminho / para / include LDFLAGS =- L / caminho / para / biblioteca. / Configure Se você estiver usando uma variante csh para o seu login shell (por quê?), Seria: env CPPFLAGS =- I / caminho / para / include LDFLAGS =- L / caminho / para / biblioteca. / configure 6. Quando se está compilando o arquivo de idioma parser.tab.c, dá-me erros que dizem yytname não declarado. Você precisa atualizar sua versão do Bison. Você pode encontrar a versão mais recente em www.gnu.org / software / bison / bison.html. Apoio Debugging Applications-337 7. Quando eu executo o make, que parece estar a correr bem, mas depois falha ao tentar vincular a aplicação final, reclamando que não consegue encontrar alguns arquivos. Algumas versões antigas de fazer não colocar corretamente as versões compiladas dos arquivos em as funções de diretório em que o mesmo diretório. Tente executar funções cp *. o e então re-executar o make para ver se isso ajuda. Se isso acontecer, você realmente deve atualizar para uma versão recente do GNU make. 8. Quando liga PHP, ele reclama de uma série de referências indefinidas. Dê uma olhada na linha de ligação e certifique-se que todas as bibliotecas apropriadas são sendo incluído no final. Mais comuns que você pôde ter faltado são "-ldl" e todas as bibliotecas necessárias para qualquer suporte de banco de dados que você incluiu. Se você está ligando com o Apache 1.2.x, você não se esqueça de adicionar o apropriado informações para a linha EXTRA_LIBS do arquivo de configuração e re-executar novamente Roteiro do apache configurar? Veja o arquivo de instalação que vem com a distribuição de mais informações. Algumas pessoas também relataram que eles tinham que acrescentar "-ldl" imediatamente a seguir libphp4.a quando a vinculação com Apache. 9. Eu não consigo descobrir como compilar o PHP com Apache 1.3. Isso é realmente muito fácil. Siga estes passos cuidadosamente:

Page 293: Programação de jogos em PHP

1. Pegar as últimas Apache 1.3 distribuição de www.apache.org/dist/httpd/. 2. Ungzip e descompacte-o em algum lugar, por exemplo / usr/local/src/apache-1.3. 3. Compile PHP rodando primeiro. / Configure - with-apache = / <caminho> / apache-1.3 (Substituto <caminho> com o caminho real para o seu diretório Apache-1.3). 4. Digite make seguido por make install para compilar o PHP e copiar os arquivos necessários para a árvore de distribuição Apache. 5. Altere os diretórios para a sua / <path> / apache-1.3/src diretório e editar o arquivo de configuração. Adicione ao arquivo: modules/php4/libphp4.a AddModule. 6. Tipo:. / Configure seguido por fazer. Agora você deve ter um httpd PHP binário! Nota Você também pode usar o Apache novo script. / Configure. Veja as instruções no README.configure arquivo, que é parte da sua distribuição Apache. Também ter um olhar para o arquivo de instalação na distribuição PHP. 10. Eu segui todos os passos para instalar a versão módulo do Apache em UNIX e meus scripts PHP aparece no meu browser ou eu estou sendo solicitado para salvar o arquivo. Isto significa que o módulo PHP não está recebendo invocado por algum motivo. Três coisas para verificar antes de pedir mais ajuda: 338 Apêndice C ■ Suporte Debugging Applications- Certifique-se que o binário httpd você está executando é o binário httpd reais nova você acabou de construir. Para fazer isso, tente executar: / caminho / para / binary / httpd-l. Se você não vê mod_php4.c listado, então você não está executando o binário do direito. Encontrar e instalar o binário correto. 1. Certifique-se de ter adicionado o tipo MIME correto para um de seus Apache. Conf arquivos. Ele deve ser:. Application/x-httpd-php3 AddType php3 (para PHP 3) ou AddType application / x-httpd-php. php (para PHP 4) 2. Também certifique-se que esta linha AddType não está escondido dentro de um ou <Virtualhost> Bloco <Directory> que a impediria de aplicar para o local de sua script de teste. 3. Finalmente, a localização padrão dos arquivos de configuração do Apache mudou entre Apache 1.2 e Apache 1.3. Você deve verificar para se certificar de que a configuração arquivo que você está adicionando a linha AddType para que realmente está sendo lido. Você pode colocar um

Page 294: Programação de jogos em PHP

erro de sintaxe óbvio em seu arquivo httpd.conf ou alguma outra mudança óbvio que vai dizer se o arquivo está sendo lido corretamente. 11. Ele diz para usar - activate-module = src/modules/php4/libphp4.a, mas esse arquivo não existir, então eu mudei para - activate-module = src/modules/php4/libmodphp4.a e ele não funciona? O que está acontecendo? Note que o arquivo libphp4.a não é suposto existir. O processo do Apache irá criá-lo! 12. Quando tento compilar o Apache com o PHP como um módulo estático usando - activatemodule = src/modules/php4/libphp4.a ele me diz que meu compilador não é ANSIcompliant. Esta é uma mensagem de erro do Apache enganosa que foi corrigido no mais recente versões. 13. Quando tento compilar o PHP com - with-apxs Recebo mensagens de erro estranho. Há três coisas para verificar aqui. Primeiro, por alguma razão quando Apache constrói o apxs script Perl, que às vezes acaba sendo construído sem o compilador adequado e bandeiras variáveis. Encontre seu script apxs (tente o comando que apxs). É às vezes, encontrado em / usr / local / apache / bin / apxs ou / usr / sbin / apxs. Abri-lo e verificar se há linhas semelhantes a estas: my $ CFG_CFLAGS_SHLIB = ""; my $ CFG_LD_SHLIB = ""; my $ CFG_LDFLAGS_SHLIB = ""; # Substituído via Makefile.tmpl # Substituído via Makefile.tmpl # Substituído via Makefile.tmpl Se é isso que você vê, você encontrou o seu problema. Podem conter apenas espaços ou outros valores incorretos, como o 'q ()'. Alterar essas linhas para dizer: Apoio Debugging Applications-339 my $ CFG_CFLAGS_SHLIB = '-fpic DSHARED_MODULE "; # substituído via Makefile.tmpl my $ CFG_LD_SHLIB = 'gcc'; # substituído via Makefile.tmpl my $ CFG_LDFLAGS_SHLIB = q (compartilhado); # substituído via Makefile.tmpl O segundo problema possível só deve ser um problema no Red Hat 6.1 e 6.2. O apxs roteiro navios Red Hat está quebrado. Procure esta linha: my $ CFG_LIBEXECDIR = "módulos"; # substituído via APACI instalar Se você ver a linha acima, mude para isto: my $ CFG_LIBEXECDIR = '/ usr / lib / apache'; # substituído via APACI instalar Última, se você reconfigurar / reinstalar o Apache, adicionar um make clean para o processo depois . / Configure e antes de fazer.

Page 295: Programação de jogos em PHP

14. Durante o make, eu recebo erros no microtime, e um monte de coisas RUSAGE_. Durante a parte da instalação fazer se você encontrar problemas que se parecem semelhante a esta: microtime.c: Em função php_if_getrusage `': microtime.c: 94: tamanho de armazenamento de `usg 'não é conhecido microtime.c: 97: (use primeiro esta função) `RUSAGE_SELF 'não declarado microtime.c: 97: (Cada identificador não declarado é relatado somente uma vez microtime.c: 97: para cada função parece pol) microtime.c: 103: `RUSAGE_CHILDREN 'não declarado (use primeiro esta função) make [3]: *** [microtime.lo] Error 1 make [3]: Saindo do diretório `/ home/master/php-4.0.1/ext/standard ' make [2]: *** [all-recursive] Erro 1 make [2]: Saindo do diretório `/ home/master/php-4.0.1/ext/standard ' make [1]: *** [all-recursive] Erro 1 make [1]: Saindo do diretório `/ home/master/php-4.0.1/ext ' make: *** [all-recursive] Erro 1 em seguida, o sistema está falido. Você precisa corrigir o seu / usr / include arquivos pela instalação de um glibc-devel pacote que corresponda ao seu glibc. Isto não tem absolutamente nada a ver com PHP. Para provar isso a si mesmo, tente este teste simples: $ Cat test.c> <<X # Include <sys/resource.h> $ Gcc-E test.c> / dev / null Se que cospe erros, você sabe seus arquivos incluem estão bagunçados. X 340 Apêndice C ■ Suporte Debugging Applications- 15. Ao compilar o PHP com MySQL, configurar corre bem, mas durante o make recebo uma de erro semelhante à seguinte: ext / mysql / libmysql / my_tempnam.o (texto 0 x46.) Em função my_tempnam ': / php4/ext/mysql/libmysql/my_tempnam.c: 103: O uso de tempnam 'é perigoso, a melhor utilização mkstemp', o que está errado? Primeiro, é importante perceber que este é um aviso e não um erro fatal. Porque esta é muitas vezes a saída visto pela última vez durante a fazê-lo pode parecer um erro fatal, mas é não. Claro, se você definir o seu compilador para morrer na Avisos, ele irá. Também tenha em mente que suportam o MySQL é ativado por padrão. Nota A partir do PHP 4.3.2, você também verá o seguinte texto após a construir (fazer) completa: Compilação completa (é seguro ignorar advertências sobre tempnam e tmpnam).

Page 296: Programação de jogos em PHP

16. Eu quero atualizar meu PHP. Onde posso encontrar a linha. / Configure que foi usado para edificarei a minha instalação atual do PHP? Ou você olhar para arquivo config.nice, na árvore de origem de sua instalação atual do PHP, ou, se este não estiver disponível, basta executar o php_info () função. Em cima da saída da linha. / configure que foi usado para construir esta instalação do PHP é mostrado. 17. Quando compilar o PHP com a biblioteca GD-lo ou dá erros de compilação estranho ou segfaults na execução. Verifique se o seu GD biblioteca e PHP estão ligadas contra a mesma, dependendo bibliotecas (por exemplo, libpng). Essa é a completa secção de Perguntas Frequentes do www.php.net. Agora você não têm de fumble em torno da Internet. Você pode apenas ir direto para este apêndice para encontrar a maior parte de sua configuração e respostas de instalação. apêndice D GD SDK Língua Referência Este apêndice é a referência de idioma para GD Boutell de biblioteca de gráficos. Cada função é listado com os parâmetros que recebe, o que a função retorna, e um breve descrição do que a função faz. Funções da GD Descrição Retorna a função Getimagesize (filename, [image_info) Array Image2wbmp (imagem, [nome], [limite]) Integer Imagealphablending (imagem, blendmode) Integer Imagearc (imagem, cx, cy, largura, altura, Integer início, fim, col) Imagechar (imagem, a pia batismal, x, y, c, col) Integer Imagecharup (imagem, a pia batismal, x, y, c, col) Integer Imagecolorallocate (img, vermelho, verde, azul) Integer Imagecolorat (img, x, y) Integer Imagecolorclosest (img, vermelho, verde, azul) Integer Imagecolorclosestalpha (imagem, vermelho, Integer verde, azul, alfa) ImageColorClosestHwb (imagem, vermelho, verde, azul) Integer Obtém o tamanho da imagem. Salva a imagem como um WBMP. Switches alpha blending ligado ou desligado através da criação blendmode de verdadeiro ou falso, respectivamente. Desenha um elipse parcial na imagem especificada. O ponto central do arco é em cx, cy. Desenha um caractere horizontalmente sobre o especificado

Page 297: Programação de jogos em PHP

imagem. Desenha um personagem verticalmente sobre a imagem especificada. Atribui o valor de cor RGB especificado para o imagem. Retorna o índice da cor em x, y. Retorna o índice da cor mais próxima da cor paleta para a imagem. Retorna o índice da cor mais próxima da cor especificada além da paleta de alfa para o imagem especificada. Retorna o índice da cor com o matiz, branco, e escuridão mais próximo do valor RGB especificado. 341 342 Apêndice D ■ GD SDK Referência da Linguagem Descrição Retorna a função Imagecolordeallocate (imagem, índice) Imagecolorexact (img, vermelho, verde, azul) Imagecolorexactalpha (imagem, vermelho, verde, blue, alfa) Imagecolorresolve (img, vermelho, verde, azul) ImageColorResolveAlpha (img, vermelho, verde, blue, alfa) ImageColorSet (img, índice, vermelho, verde, azul) Imagecolorsforindex (img, índice) Imagecolorstotal (img) Imagetruecolortopalette (imagem, dither, cores) Imagecolortransparent (img, [color]) Imagecopy (dest_image, src_image, dest_x, dest_y, src_x, src_y, src_w, src_h) Imagecopymerge (dest_image, src_image, dest_x, dest_y, src_x, src_y, src_w, src_h, pct) ImageCopyMergeGray (dest_image, src_image, dest_x, dest_y, src_x, src_y, src_w, src_h, pct) Imagecopyresampled (dest_image, src_image, dest_x, dest_y, src_x, src_y, dest_w, dest_h, src_w, src_h) Imagecopyresized (dest_img, src_img, destX, destY, srcX, srcY, destWidth, destHeight, srcWidth, srcHeight) Imagecreate (largura, altura) Imagecreatefromgif (filename) Imagecreatefromjpeg (filename) Imagecreatefromjpeg (filename) Imagecreatefromstring (string) Imagecreatefromwbmp (filename) Imagecreatefromxbm (filename) ImageCreateFromXpm (filename) Imagecreatetruecolor (largura, altura) ImageDashedLine (img, x1, y1, x2, y2, cor)

Page 298: Programação de jogos em PHP

Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Boolean Matriz Número inteiro vazio Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Desaloca uma cor na imagem especificada. Retorna o índice da cor especificada na cor paleta da imagem. Retorna o índice da cor especificada na cor paleta mais o canal alfa para a imagem. Encontra a cor especificada na paleta. Se ele não existir, ele retorna o índice da cor mais próxima na paleta. Encontra a cor especificada na paleta. Se ele não existir, ele retorna o índice da cor mais próxima na paleta mais o canal alfa imagens. Define o índice especificado para o valor de cor RGB. Retorna um array contendo os valores RGB para o índice especificado na paleta de cores. Retorna o número de cores nas imagens especificado paleta de cores. Converte uma imagem true-color em uma imagem paletizadas. Define a cor transparente na paleta. Cópias uma área da imagem de origem para o imagem de destino. Cópias uma área da imagem de origem para o imagem de destino. O montante da mesclagem é especificado pelo pct valor (0-100). Funciona exatamente como imagecopymerge (), mas o área que está sendo copiado é primeiro convertido para tons de cinza.

Page 299: Programação de jogos em PHP

Cópias e resamples a área da fonte imagem. Cópias uma área da imagem de origem para um array da imagem de destino. Se as alturas são diferentes então a imagem de destino é redimensionada. Cria uma nova imagem. Cria uma nova imagem a partir do arquivo especificado. Cria uma nova imagem a partir do arquivo especificado. Cria uma nova imagem a partir do arquivo especificado. Cria uma nova imagem a partir dos dados da string. Cria uma nova imagem a partir do arquivo. Cria uma nova imagem a partir do arquivo. Cria uma nova imagem a partir do arquivo. Cria uma imagem nova cor verdadeira da largura pela altura. Desenha uma linha tracejada na imagem do ponto x1, y1 ao ponto x2, y2. GD SDK Referência da Linguagem 343 Descrição Retorna a função Imagedestroy (img) Imageellipse (imagem, x, y, largura, altura, cor) Imagefill (img, x, y, cor) Imagefilledarc (imagem, x, y, largura, altura, início, fim, estilo, cor) Imagefilledellipse (imagem, x, y, largura, altura, cor) ImageFilledPolygon (img, pontos, num_points, cor) ImageFilledRectangle (img, x1, y1, x2, y2, cor) ImageFillToBorder (img, x, y, borda, cor) Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Destrói a imagem especificada. Desenha uma elipse com o ponto de centro em x, y. Preenche a imagem inicial no ponto x, y. Desenha um arco preenchido centrada no ponto x, y. Desenha uma elipse preenchida na imagem com o seu centro ponto em x, y. Desenha um polígono preenchido na imagem entre o pontos. Desenha um retângulo preenchido a imagem especificada. Executa um preenchimento entre a borda especificada cor inicial no ponto x, y.

Page 300: Programação de jogos em PHP

Retorna a altura da fonte especificada em pixels. Retorna a largura da fonte especificada em pixels. Corrige a gama para a imagem especificada. Envia a imagem para um arquivo ou para o navegador. Transforma interlacing ligado ou desligado na imagem. Envia a imagem para um arquivo ou para o navegador. Desenha uma linha na imagem a partir de ponto x1, y1 para ponto x2, y2. Envia a imagem para um arquivo ou para o navegador. Desenha um pixel no ponto x, y na cor especificada. Desenha um polígono na imagem, bem como polígono preencher a não ser que não preenche a imagem. Desenha um retângulo com a imagem. Atua como ImageRectangleFill (), mas o retângulo não é preenchido quando ela é desenhada. Desenha uma string a partir de x, y para a imagem. Desenha o texto de partida no ponto x, y no especificado Fonte TrueType. Desenha o texto de partida no ponto x, y no especificado Fonte TrueType. Cria um arquivo WBMP da imagem especificada. Imagefontheight (fonte) Imagefontwidth (fonte) ImageGammaCorrect (imagem, inputgamma, outputgamma) Imagegif (img, [nome]) Imageinterlace (img, [interlace]) Imagejpeg (imagem, [nome], [qualidade]) Imageline (img, x1, y1, x2, y2, cor) Imagepng (imagem, [nome]) ImageSetPixel (imagem, x, y, cor) Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Número inteiro Imagepolygon (img, pontos, num_points, cor) Integer ImageRectangle (img, x1, y1, x2, y2, cor) Integer Imagestring (img, font, x, y, string, cor) Integer ImageTTFString (imagem, tamanho, ângulo, Array x, y, cor, fontfile, texto) Imagettftext (imagem, tamanho, ângulo, Array x, y, cor, fontfile, texto) Imagewbmp (imagem, [nome], [frente]) Integer INDEX AB

Page 301: Programação de jogos em PHP

ActionScript fundo Filmes Flash, 275-278 Battle Tank, 196, 205-208 Ming, 258 filmes em Flash, 260 add () função, 263 Battle Tank addEntry () função, 267-268 fundo, 196, 205-208 addFill () função, 265-270 balas, 198-199, 204 algoritmos, TCP / IP, 14 coordenadas, 205-208 animando filmes Flash, CSS 271-275, 196-197 Servidores Apache, a instalação, 18-21 globals, 198-199 arcos, desenho, 174-178 gravidade, 198-199, 204 argumentos, estofamento, 64-65 imagens, 195-198, 201, 205-208 operadores aritméticos, 78 soquetes integração, 224-228 array () função, 105 interface, 197-198 arrays loops, 201-205 Tabuleiro de xadrez jogo, 140-141 menu, 199-200 declarando, 104-105 visão geral, 193-195 para instruções, 106-108 estados, 194-195, 198-199 índices, tabelas 104-106, 197-198 inicializar, 104-105 tanques, 196-197 looping, 106-110 variáveis, 199-200, 204 multi-dimensional, 110-112 operadores binários, 79-80 visão geral, 103-104 soquetes de ligação, 215-216 classificação, 112-117 bitmaps, filmes Flash, 269-270 strings, 105-106 bits. Veja operadores tic-tac-toe, 117-132 operadores bit a bit, 82-85 declarações enquanto, 108-110 blocos, código 56 arsort () função, 115 placas asort () função, 115 Chess, 140-141 atribuição de cor, imagens, impressão 161-162, 111-112 atalhos atribuição, variáveis, 85-86 tag HTML <BODY>, 33-36 Boolean tipo de dados, 57 <BR> Tag HTML, 36 C Índice 345 browsers. Ver clientes balas, Tank Battle, 198-199, 204 CAddWeaponsCmd () da classe, 245-248 Sistema cartesiano. Veja coordenadas maiúsculas e minúsculas, variáveis, 57 CCommand () da classe, 235-240 CCreateAccountCmd () da classe, 240-245 CGame () da classe, 235, 251-255 CheckFull () função, 126-128 CheckWin () função, 126-128 Jogo de xadrez banco de dados, 140-155 globals definição, 141-142 DrawBoard () função, 147-155 ObterCasa () função, 153 histórico de movimentação, 154-155

Page 302: Programação de jogos em PHP

MovePiece () função, 147 peças, 143-151 ProcessInput () função, 151-155 PutPiece () função, 147 render () função, 143-151 StartBoard () função, 147 estados, 141-142 TakePiece () função, 147 UpdateMoveList () função, 153-154 entrada do usuário, 151-155 classes. Veja também as funções CAddWeaponsCmd (), 245-248 CCommand (), 235-240 CCreateAccountCmd (), 240-245 CGame (), 235, 251-255 CLockTableCmd (), 243 CommandFactory (), 248-255 CRenderCmd (), 243-244 CUnlockTableCmd (), 243 CVerifyAccountInfoCmd (), 243 Ming, 258-259 SWFAction (), 276-278 SWFBitmap (), 269-270 SWFDisplayItem (), 271-275 SWFFill (), 265-270 SWFGradient (), 267-268 SWFMorph (), 273-275 SWFMovie (), 259-261 SWFShape (), 262, 269-270 clientes criação, 223-224 páginas, interpretando, 4 relação de servidores, 3-5 sockets, 213 CLockTableCmd () da classe, 243 blocos de código, 56 cor Filmes em Flash, 260 imagens, 166 atribuindo, 161-162 convertendo, 165 enchimento, 162-163 número, 165-166 visão geral, 161 transparência. Ver a transparência fábrica de comando, criando, 248-255 linha de comando, a execução de scripts, 220 CommandFactory () da classe, 248-255 comandos linha de comando, a execução de scripts, 220

Page 303: Programação de jogos em PHP

a criação de fábrica de comando, 248-255 Kiddy Cartel, 234-255 sub-comandos, 240-245 su, 26 tabelas, 243 operadores de comparação, 78-79 ComputerMove () função, 128-131 ComputerRandomMove () função, 128-131 operadores concatenação, 81 lógica condicional. Ver declarações conectando Kiddy Cartel de banco de dados, 232 servidores, 220-223 constantes definição de, 118 visão geral, 58-59 convertendo cor, 165 cookies, passando, 6 coordenadas Battle Tank, 205-208 imagens, desenho, 167 copiar imagens, 185-191 função count (), 107 Criar função TABLE, 231-232 346 Index a criação de clientes, 223-224 comandos fábrica de comando, 248-255 Kiddy Cartel, 234-255 sub-comandos, 240-245 bases de dados, 134-136 diretórios, 117 mensagens de erro, 95-98 Filmes Flash, 259-261 imagens, 160-161 páginas, 56 servidores, 220-223 sockets, 215 tabelas, 231-232 CRenderCmd () da classe, 243-244 CSS, Tank Battle, 196-197 CUnlockTableCmd () da classe, 243 atual (função), 109-110 CVerifyAccountInfoCmd () da classe, 243 D tipos de dados arrays Tabuleiro de xadrez jogo, 140-141

Page 304: Programação de jogos em PHP

declarando, 104-105 para instruções, 106-108 índices, 104-106 inicializar, 104-105 looping, 106-110 multi-dimensional, 110-112 visão geral, 103-104 classificação, 112-117 strings, 105-106 tic-tac-toe, 117-132 enquanto declarações, 108-110 Boolean, 57 declarando, de 57 anos Filmes Flash, 275-278 strings índices de array, 105-106 formatar números, 65 funções, 61-65 operadores. Veja operadores argumentos padding, 64-65 correspondência de padrão, 66-71 Tipo de fundição, 58 tipo de malabarismo, 57-58 variáveis Batalha de Tanques, 199-200, 204 maiúsculas e minúsculas, 57 constantes, 58-59 declarando, de 57 anos valores dinâmicos, 58 funções, 60-61 nomeação, 59-60 operadores. Veja operadores variáveis de sessão, 5-13 operadores de atalho, 85-86 Tipo de fundição, 58 tipo de malabarismo, 57-58 variável, 58 abstração de dados (DBA), 134 bases de dados Jogo de xadrez, 140-155 ligação, 232 criação, 134-136 DBA, 134 entradas exclusão, 140 inserção, 137-139 atualização, 139-140 Kiddy Cartel, 231-232 looping, 136-137 MySQL

Page 305: Programação de jogos em PHP

instalação, 230-231 PEAR, 229 não-relacionais, 134 orientada a objeto, 133 abertura, 134-136 visão geral, 133-134 relacional, 133, 231-233 DBA (abstração de banco de dados), 134 dba_close (função), 140 dba_delete (função), 140 dba_fetch () função, 136-137 dba_firstkey () função, 136-137 dba_insert () função, 137-139 dba_open () função, 134-136 dba_replace () função, 139 dba_sync () função, 139-140 depuração jogos, 155 instalação, 29-30 ponto e vírgula, 56 Índice 347 servidor estados, 5 declarando arrays, 104-105 tipos de dados, 57 funções, 95 variáveis, 57 função define (), 59 defined () função, 59 definição constantes, 118 globals Battle Tank, 198-199 Jogo de xadrez, 141-142 tic-tac-toe, 118 DELETE FROM função, 233 exclusão entradas do banco de dados, 140 registros, 233 delimitadores, selecionando, 56 diretórios, criando, 117 <DIV> Tag HTML, 197 dl (função), 159 fazer declarações, 93-94 documentos. Ver arquivos DrawBoard (função) Jogo de xadrez, 147-155 tic-tac-toe, 125-126 DrawCurve () função, 263, 264 drawCurveTo () função, 264-265

Page 306: Programação de jogos em PHP

desenho. Veja também imagens Filmes Flash, 262-265 imagens, 167 arcos, 174-178 coordenadas, 167 elipses, 174-178 linhas, 167-169 pixels, 167-169 polígonos, 172-174 retângulos, 169-172 drawLine () função, 262-263 drawLineTo () função, 262-263 valores dinâmicos, variáveis, 58 E função each (), 108-110 elipses, desenho, 174-178 else, 88-90 empty () função, 61 sockets permitindo, 219 Endgame () função, 124-125, 199-200 entradas, bases de dados exclusão, 140 inserção, 137-139 atualização, 139-140 ereg () função, 69-70 ereg_replace (função), 70 eregi (função), 70 eregi_replace (função), 70 mensagens de erro, criando, 95-98 Execute () função, 239, 243-248 expressões funções, 69-71 correspondência de padrão, 66-69 F arquivos HTML formatos, 37-38 visão geral, 32-33 inclusive, 99 fazer, 24 enchimento cores, imagens, 162-163 objetos, filmes Flash, 265-270 Flash Ming ActionScript, 258 classes, 258-259 instalação, 258 visão geral, 257-259 filmes

Page 307: Programação de jogos em PHP

ActionScript, 275-278 animação, 271-275 cor de fundo, 260 bitmaps, 269-270 criação, 259-261 tipos de dados, 275-278 desenho, 262-265 objetos de enchimento, 265-270 imagens, 262-265 morphing, 273-275 impressão, 260 tamanho, 259-261 velocidade, 260 Índice 348 fopen () função, 269-270 para as demonstrações. Ver loops <FORM> Tag HTML, 48-51 formatação números, strings, 65 texto, tags HTML, 35 formas HTML, 48-51 processamento, 71-75 fread () função, 269-270 funções. Veja também as classes add (), 263 addEntry (), 267-268 addFill (), 265-270 array (), 105 arrays, classificação, 112-117 arsort (), 115 asort (), 115 CheckFull (), 126-128 CheckWin (), 126-128 ComputerMove (), 128-131 ComputerRandomMove (), 128-131 count (), 107 CREATE TABLE, 231-232 current (), 109-110 dba_close (), 140 dba_delete (), 140 dba_fetch (), 136-137 dba_firstkey (), 136-137 dba_insert (), 137-139 dba_open (), 134-136 dba_replace (), 139 dba_sync (), 139-140 declarando, 95 define (), 59 defined (), 59

Page 308: Programação de jogos em PHP

DELETE FROM, 233 dl (), 159 DrawBoard () Jogo de xadrez, 147-155 tic-tac-toe, 125-126 DrawCurve (), 263-264 drawCurveTo (), 264-265 drawLine (), 262-263 drawLineTo (), 262-263 each (), 108-110 empty (), 61 Endgame (), 124-125, 199-200 ereg (), 69-70 ereg_replace (), 70 eregi (), 70 eregi_replace (), 70 Execute (), 239, 243-248 fopen (), 269-270 fread (), 269-270 GameInit (), 200-201, 206-207 getShape1 (), 273-275 getShape2 (), 273-275 ObterCasa (), 153 gettype (), 60 HandleSubCommand (), 239 Imagearc (), 174-178 Imagecolorallocate (), 161-162 Imagecolorat (), 166 ImageColorSet (), 166 Imagecolorstotal (), 165-166 Imagecolortransparent (), 163-165 Imagecopy (), 186-187 Imagecopymerge (), 189-191 Imagecopyresampled (), 188-189 Imagecopyresized (), 188-189 Imagecreate (), 160-161 Imagecreatefromjpeg (), 185 Imagecreatefromjpeg (), 185 Imagecreatetruecolor (), 160-161 Imagefill (), 162-163 Imagefilledarc (), 176-178 ImageFilledPolygon (), 174, 207-208 ImageFilledRectangle (), 171-172 Imageline (), 168-169 Imagepolygon (), 172-174 ImageRectangle (), 169-172 ImageSetPixel (), 167-169 Imagestring (), 179-180 Imagetruecolortopalette (), 165 ImageTTFBox (), 182-184

Page 309: Programação de jogos em PHP

Imagettftext (), 180-183 Imagewbmp (), 184-185 include (), 99 ini_set (), 7-13 INSERT INTO, 233 is_datatype (), 61 isset (), 60 key (), 109-110 krsort (), 116 ksort (), 115 Índice 349 list (), 108-110 move (), 271-275 movePenTo (), 262-263 MovePiece (), 147 moveTo (), 271-275 MyFilledPolygon (), 174 MyFilledRectangle (), 171-172 MyPolygon (), 173-174 MyRectangle (), 170 MyTTFBox (), 183-184 next (), 109-110 nextFrame (), 272-273 number_format (), 65 OnError (), 239 OnRollBack (), 239-248 output (), 260 visão geral, 94-95 parâmetros, 95-98 phpinfo (), 159, 219 prev (), 109-110 printf (), 64-65 ProcessInput (), 151-155 PutPiece (), 147 Query (), 248 recursão, 98-99 expressões regulares, 69-71 render () Jogo de xadrez, 143-151 tic-tac-toe, 119-123 Render (), 201-205, 225-228 RenderInterface (), 197-198 RenderTanks (), 196-197 RenderTerrain (), 196 reset (), 108-110 rotate (), 271-275 rsort (), 115 serialize (), 137-139 sessões, 10-13 setBackground (), 260

Page 310: Programação de jogos em PHP

setDimension (), 259-261 setLeftFill (), 265-270 setLine (), 262-265 setRate (), 260 setRightFill (), 265-270 settype (), 60 socket_bind (), 215-216 socket_create (), 215 socket_listen (), 215-216 sockets, 216-219 sort (), 113-114 split (), 71 sprintf (), 64-65 StartBoard (), 147 StartGame (), 124-125, 199-200 strings, 61-65 TakePiece (), 147 tic-tac-toe, 123-131 unset (), 61 UPDATE, 233 UpdateMoveList (), 153-154 usort (), 116-117 variáveis, 60-61 G GameInit () função, 200-201, 206-207 jogos Tanque de combate de fundo, 196, 205-208 balas, 198-199, 204 coordenadas, 205-208 CSS, 196-197 globals, 198-199 gravidade, 198-199, 204 imagens, 195-198, 201, 205-208 sockets integração, 224-228 interface, 197-198 loops, 201-205 menu, 199-200 visão geral, 193-195 estados, 194-199 tabelas, 197-198 tanques, 196-197 variáveis, 199-200, 204 placas Xadrez, 140-141 impressão, 111-112 Xadrez placas, 140-141 banco de dados, 140-155 globals definição, 141-142

Page 311: Programação de jogos em PHP

DrawBoard () função, 147-155 ObterCasa () função, 153 histórico de movimentação, 154-155 MovePiece () função, 147 peças, 143-151 ProcessInput () função, 151-155 350 Index jogos (continuação) PutPiece () função, 147 render () função, 143-151 StartBoard () função, 147 estados, 141-142 TakePiece () função, 147 UpdateMoveList () função, 153-154 entrada do usuário, 151-155 depuração, 155 Cartel Kiddy fábrica de comando, 248-255 comandos, 234-255 banco de dados, 231-232 visão geral, 229-230 regras, 233-235 especificações, 233-235 sub-comandos, 240-245 tabelas, 233 MMO. Ver Cartel Kiddy tic-tac-toe arrays, 117-132 CheckFull () função, 126-128 CheckWin () função, 126-128 ComputerMove () função, 128-131 ComputerRandomMove () função, 128-131 constantes definir, 118 globals definição de, 118 diretório, 117 DrawBoard () função, 125-126 Endgame () função, 124-125 funções, 123-131 HTML, 118-119 render () função, 119-123 StartGame () função, 124-125 estados, 119 instrução switch, 123 GD, 157-159 Web site da GemStone, 133 Método GET, 48, 71-75 getShape1 () função, 273-275 getShape2 () função, 273-275 ObterCasa () função, 153 gettype (função), 60

Page 312: Programação de jogos em PHP

gifs HTML, 37-38 suporte, 157 globals Battle Tank, 198-199 Jogo de xadrez, 141-142 tic-tac-toe, 118 gráficos. Veja as imagens gravidade, 198-199, 204 H HandleSubCommand () função, 239 <HEAD> Tag HTML, de 35 anos movimento, história, 154-155 HTML documentos, 32-33 formas, 48-51, 71-75 Método GET, 48, 71-75 imagens, 36-41, 44-48 formatos de arquivo, 37-38 tamanho, de 38 anos transparência, de 37 anos layouts, 44-48 PHP blocos de código, 56 comparação, 55 Método POST, 48, 71-75 tabelas, 41-48 Tag <BODY>, 33-36 <BR>, 36 <DIV>, 197 <FORM>, 48-51 <HEAD>, 35 <IFRAME>, 154-155 <IMG>, 39-41 <INPUT>, 48-51 <SELECT>, 49-51 <TABLE>, 41-48 <TD>, 42-48 <TEXTAREA>, 49-51 <TITLE>, 35 <TR>, 42-48 visão geral, 31-32 de impressão, 56 formatação de texto, 35 tic-tac-toe, 118-119 Eu if, 88-90 <IFRAME> Tag HTML, 154-155 Índice 351

Page 313: Programação de jogos em PHP

IIS (Internet Information Server), 14 instalação, 14-18 PWS comparação, 14-15 Imagearc () função, 174-178 Imagecolorallocate () função, 161-162 Imagecolorat (função), 166 ImageColorSet (função), 166 Imagecolorstotal () função, 165-166 Imagecolortransparent () função, 163-165 Imagecopy () função, 186-187 Imagecopymerge () função, 189-191 Imagecopyresampled () função, 188-189 Imagecopyresized () função, 188-189 Imagecreate () função, 160-161 Imagecreatefromjpeg () função, 185 Imagecreatefromjpeg () função, 185 Imagecreatetruecolor () função, 160-161 Imagefill () função, 162-163 Imagefilledarc (função), 176-178 ImageFilledPolygon () função, 174, 207-208 ImageFilledRectangle () função, 171-172 Imageline () função, 168-169 Imagepolygon () função, 172-174 ImageRectangle () função, 169-172 imagens. Veja também desenho Batalha de Tanques, 195-198, 201, 205-208 balas, 198-199, 204 cor, 166 atribuindo, 161-162 convertendo, 165 enchimento, 162-163 número, 165-166 visão geral, 161 cópia, 185-191 criação, 160-161 desenho, 167 arcos, 174-178 coordenadas, 167 elipses, 174-178 linhas, 167-169 pixels, 167-169 polígonos, 172-174 retângulos, 169-172 Filmes Flash, 262-265 animação, 271-275 bitmaps, 269-270 objetos de enchimento, 265-270 morphing, 273-275 GD, 157-158 gifs

Page 314: Programação de jogos em PHP

HTML, 37-38 suporte, 157 HTML, 36-48 formatos de arquivo, 37-38 tamanho, de 38 anos transparência, de 37 anos opacidade, 189-191 poupança, 184-185 tamanho, 187-189 texto, 179-184 translucidez, 189-191 transparência, 163-165 ImageSetPixel () função, 167-169 Imagestring () função, 179-180 Imagetruecolortopalette (função), 165 ImageTTFBox () função, 182-184 Imagettftext () função, 180-183 Imagewbmp () função, 184-185 <IMG> Tag HTML, 39-41 função include (), 99 arquivos, incluindo, 99 índices, arrays, 104-106 ini_set () função, 13/07 inicializar matrizes, 104-105 de entrada, os usuários, 151-155 <INPUT> Tag HTML, 48-51 INSERT INTO função, 233 inserindo entradas de banco de dados, 137-139 registros, 233 instalação GD, 158-159 IIS, 14-18 Ming, 258 MySQL, 230-231 PWS, 14-18 servidores Apache, 18-21 IIS, 14-18 PWS, 14-18 UNIX, 19-21 testes, 29-30 UNIX, 24-26 Windows, 26-29 interfaces, Battle Tank, 197-198 Internet Information Server. Consulte IIS 352 Index páginas interpretação, navegadores, 4 is_datatype (função), 61 isset (função), 60

Page 315: Programação de jogos em PHP

J jpg, HTML, 37-38 K key () função, 109-110 KEY, PRIMARY palavra-chave, 232 Cartel Kiddy comandos fábrica de comando, 248-255 criação, 234-255 sub-comandos, 240-245 banco de dados, 231-232 visão geral, 229-230 regras, 233-235 especificações, 233-235 tabelas, 233 krsort () função, 116 ksort () função, 115 L camadas, TCP / IP, 13-14 layouts, HTML, 44-48 bibliotecas GD, 157-159 Ming ActionScript, 258 classes, 258-259 instalação, 258 visão geral, 257-259 PEAR, 229 linhas, desenho, 167-169 list () função, 108-110 sockets de escuta, 215-216 tabelas de travamento, 243 lógica. Ver declarações operadores lógicos, 79-80 looping arrays, 106-110 Battle Tank, 201-205 bases de dados, 136-137 impressão de placas de jogo, 111-112 M fazer arquivos, 24 massivamente multiplayer online game (MMOG). Ver Cartel Kiddy padrões de correspondência funções, 69-71 expressões regulares, 66-69 operadores matemáticos. Veja operadores menu, Battle Tank, 199-200 métodos, 48-75 Ming

Page 316: Programação de jogos em PHP

ActionScript, 258 classes, 258-259 instalação, 258 visão geral, 257-259 MMO. Ver Cartel Kiddy morphing filmes Flash, 273-275 move () função, 271-275 histórico de movimentação, 154-155 movePenTo () função, 262-263 MovePiece () função, 147 moveTo () função, 271-275 filmes, Flash ActionScript, 275-278 animação, 271-275 cor de fundo, 260 bitmaps, 269-270 criação, 259-261 tipos de dados, 275-278 desenho, 262-265 objetos de enchimento, 265-270 imagens, 262-265 morphing, 273-275 impressão, 260 tamanho, 259-261 velocidade, 260 em movimento. Veja coordenadas multi-dimensional arrays, 110-112 MyFilledPolygon () função, 174 MyFilledRectangle () função, 171-172 MyPolygon () função, 173-174 MyRectangle () função, 170 MySQL instalação, 230-231 PEAR, 229 MyTTFBox () função, 183-184 Índice 353 N variáveis de nomeação, 59-60 seguinte (função), 109-110 nextFrame () função, 272-273 não-bancos de dados relacionais, 134 number_format () função, 65 números strings de formatação, de 65 anos as cores da imagem, 165-166 O objeto bancos de dados orientados, 133 objetos, filmes Flash, 265-270 ObjectStore site, 133 OnError () função, 239

Page 317: Programação de jogos em PHP

OnRollBack () função, 239-248 opacidade, imagens, 189-191 bases de dados de abertura, 134-136 operadores aritmética, 78 binário, 79-80 bit a bit, 82-85 comparação, 78-79 concatenação, 81 lógico, 79-80 visão geral, 77 precedência, 86-87 ternário, 80-81 variável atalhos atribuição, 85-86 output () função, 260 P argumentos padding, cordas, 64-65 páginas navegadores, interpretando, 4 criação, 56 parâmetros, passando, 95-98 passagem parâmetros, 95-98 sessões, 6-7 correspondência de padrão, as expressões regulares, 66-69 PEAR (PHP Extension e Aplicação Repositório), 229 Personal Web Server (PWS) IIS comparação, 14-15 instalação, 14-18 PHP blocos de código, 56 HTML comparação, 55 páginas navegadores, interpretando, 4 criação, 56 PHP Extension Repositório de Aplicações e (PEAR), 229 função phpinfo (), 159, 219 física, velocidade, 204 peças, jogo de xadrez, 143-151 pixels, desenho, 167-169 colocação. Veja coordenadas plataformas visão geral, 23-24 png arquivos, 37-38 polígonos, desenho, 172-174 portas, servidores, 5 Método POST, 48, 71-75 precedência, operadores, 86-87 prefixos, variáveis, 59-60

Page 318: Programação de jogos em PHP

prev () função, 109-110 Palavra-chave PRIMARY KEY, 232 printf () função, 64-65 impressão Filmes em Flash, 260 tabuleiros, 111-112 Tags HTML, 56 texto, 56 formas de processamento, 71-75 ProcessInput () função, 151-155 protocolos, sockets, 214-215 PutPiece () função, 147 PWS (Personal Web Server) IIS comparação, 14-15 instalação, 14-18 Q Query () função, 248 R registros, 233 retângulos, desenho, 169-172 recursão, funções, 98-99 expressões regulares funções, 69-71 correspondência de padrão, 66-69 354 Index bancos de dados relacionais, 133 MySQL instalação, 230-231 PEAR, 229 visão geral, 231-233 render () função Jogo de xadrez, 143-151 tic-tac-toe, 119-123 Render () função, 201-205, 225-228 RenderInterface () função, 197-198 RenderTanks () função, 196-197 RenderTerrain () função, 196 reset () função, 108-110 rotate () função, 271-275 rsort () função, 115 regras, Cartel Kiddy, 233-235 a execução de scripts, linha de comando, 220 S imagens de poupança, 184-185 scripts, linha de comando, 220 segurança sessões, passando, 6 tabelas, comandos, 243 <SELECT> Tag HTML, 49-51 delimitadores selecionando, 56

Page 319: Programação de jogos em PHP

ponto e vírgula, solução de problemas, 56 serialize () função, 137-139 servidores relacionamento com o cliente, 3-5 criação, 220-223 depuração estados, 5 instalação Apache, 18-21 IIS, 14-18 PWS, 14-18 UNIX, 19-21 múltiplas conexões, 220-223 portas, 5 sockets, 213 variáveis de sessão, os estados, 5-13 sessões funções, 10-13 passagem cookies, 6 de segurança, 6 URLs, 6-7 estados, as variáveis de sessão, 5-13 setBackground () função, 260 setDimension () função, 259-261 setLeftFill () função, 265-270 setLine () função, 262-265 setRate () função, 260 setRightFill () função, 265-270 settype (função), 60 atalhos, operadores de atribuição, 85-86 tamanho Filmes Flash, 259-261 HTML, de 38 anos imagens, 187-189 socket_bind () função, 215-216 socket_create () função, 215 socket_listen () função, 215-216 sockets Battle Tank, integrando, 224-228 vinculativo, 215-216 clientes, 213, 223-224 criando, 215 permitindo, 219 funções, 216-219 escuta, 215-216 protocolos, 214-215 servidores, 213, 220-223 tipos, 214 sort () função, 113-114 classificar matrizes, 112-117

Page 320: Programação de jogos em PHP

especificações, Cartel Kiddy, 233-235 velocidade, filmes em Flash, 260 split () função, 71 sprintf () função, 64-65 SQL MySQL instalação, 230-231 PEAR, 229 T-SQL, 231-233 StartBoard () função, 147 StartGame () função, 124-125, 199-200 declarações fazer, 93-94 outra coisa, 88-90 para, 94, 106-108 se, 88-90 visão geral, 86 switch, 90-93, 123 enquanto, 93-94, 108-110 estados Batalha de Tanques, 194-195, 198-199 Jogo de xadrez, 141-142 servidores, depuração, 5 variáveis de sessão, 5-13 tic-tac-toe, 119 strings. Ver texto também índices de array, 105-106 formatar números, 65 funções, 61-65 operadores. Veja operadores argumentos padding, 64-65 correspondência de padrão funções, 69-71 expressões regulares, 66-69 comando su, 26 sub-comandos, 240-245 apoio, gifs, 157 SWFAction () da classe, 276-278 SWFBitmap () da classe, 269-270 SWFDisplayItem () da classe, 271-275 SWFFill () da classe, 265-270 SWFGradient () da classe, 267-268 SWFMorph () da classe, 273-275 SWFMovie () da classe, 259-261 SWFShape () da classe, 262, 269-270 declarações switch, 90-93, 123 T <TABLE> Tag HTML, 41-48 tabelas Battle Tank, 197-198

Page 321: Programação de jogos em PHP

criação, 231-232 HTML, 41-48 comandos de bloqueio, 243 registros, 233 de segurança, 243 comandos de desbloqueio, 243 tags, HTML <BODY>, 33-36 <BR>, 36 <DIV>, 197 <FORM>, 48-51 <HEAD>, 35 <IFRAME>, 154-155 <IMG>, 39-41 <INPUT>, 48-51 Índice 355 <SELECT>, 49-51 <TABLE>, 41-48 <TD>, 42-48 <TEXTAREA>, 49-51 <TITLE>, 35 <TR>, 42-48 visão geral, 31-32 de impressão, 56 formatação de texto, 35 TakePiece () função, 147 tanques, 196-197 TCP / IP (Transmission Control Protocol / Internet Protocol), 13-14 <TD> Tag HTML, 42-48 operadores ternários, 80-81 terreno. Ver fundo testes. Veja debugging texto. Veja também strings formatação, 35 imagens, 179-184 de impressão, 56 <TEXTAREA> Tag HTML, 49-51 tic-tac-toe arrays, 117-132 CheckFull () função, 126-128 CheckWin () função, 126-128 ComputerMove () função, 128-131 ComputerRandomMove () função, 128-131 constantes definir, 118 globals definição de, 118 diretório, 117 DrawBoard () função, 125-126 Endgame () função, 124-125 funções, 123-131

Page 322: Programação de jogos em PHP

HTML, 118-119 render () função, 119-123 StartGame () função, 124-125 estados, 119 instrução switch, 123 <TITLE> Tag HTML, de 35 anos <TR> Tag HTML, 42-48 translucidez, 189-191 Transmission Control Protocol / Internet Protocol (TCP / IP), 13-14 transparência HTML, de 37 anos imagens, 163-165 356 Index solução de problemas. Veja debugging T-SQL visão geral, 231-233 Tipo de fundição, 58 tipo de malabarismo, 57-58 tipos, sockets, 214 U UNIX, 23 instalação, 24-26 servidores, 19-21 tabelas de desbloqueio, 243 unset (função), 61 ATUALIZAÇÃO função, 233 UpdateMoveList () função, 153-154 actualização das bases entradas, 139-140 registros, 233 Passando URLs, 6-7 entrada do usuário, jogo de xadrez, 151-155 usort () função, 116-117 V valores dinâmicas, 58 operadores aritmética, 78 binário, 79-80 bit a bit, 82-85 comparação, 78-79 concatenação, 81 lógico, 79-80 visão geral, 77 precedência, 86-87 ternário, 80-81 variável atalhos atribuição, 85-86 variáveis variáveis, 58 variáveis Batalha de Tanques, 199-200, 204

Page 323: Programação de jogos em PHP

maiúsculas e minúsculas, 57 constantes, 58-59 declarando, de 57 anos valores dinâmicos, 58 funções, 60-61 nomeação, 59-60 operadores aritmética, 78 binário, 79-80 bit a bit, 82-85 comparação, 78-79 concatenação, 81 lógico, 79-80 visão geral, 77 precedência, 86-87 ternário, 80-81 variável atalhos atribuição, 85-86 variáveis de sessão, 5-13 operadores de atalho, 85-86 Tipo de fundição, 58 tipo de malabarismo, 57-58 variável, 58 velocidade, 204 Web site da Versant, 133 WZ Teia páginas navegadores, interpretando, 4 criação, 56 servidores. Ver servidores sites, 133 enquanto declarações, 93-94, 108-110 Janelas, instalação, 26-29 ■ profissionais Comércio ■ Referência Got Game? VINDA DA PRIMAVERA 2004! Jogo 3D OpenGL Programming Beginning All in One Programação Jogo 1-59200-136-X ■ ■ $ 49,99 1-59200-369-9 $ 29,99 The Dark Side J2ME 3D Game Engine Programação de Jogos Jogo Texturing Programação ■ 1-59200-350-8 $ 39,99 1-59200-351-6 ■ ■ $ 59,99 1-59200-118-1 $ 59,99 Chamada 1.800.354.9706 à ordem Ordem em linha na www.courseptr.com divisão A do Curso de Tecnologia ™   Take Your Jogo para o XTREME!

Page 324: Programação de jogos em PHP

Xtreme Games LLC foi fundada para ajudar os desenvolvedores de jogos pequenos ao redor do mundo a criar e publicar os seus jogos no comercial de mercado. Xtreme Games ajuda os desenvolvedores a mais jovem entrar no campo de programação de jogos, isolando-os de jurídicos complexos e questões de negócios. Xtreme Games tem centenas de desenvolvedores ao redor o mundo. Se você estiver interessado em se tornar um deles, então visite-nos em www.xgames3d.com. www.xgames3d.com Contrato de Licença / Aviso de Garantia Limitada Ao abrir o recipiente disco selado neste livro, você concorda com os seguintes termos e condições. Se, após a leitura do seguinte acordo de licença e aviso de garantia limitada, você não pode concordar com os termos e condições estabelecidos, devolver o livro fechado não utilizados com disco para o lugar onde você o comprou para um reembolso. Licença: O software incluído é protegido pelo detentor dos direitos autorais (s) indicado no software disco. Você está licenciado para copiar o software em um único computador para uso por um único usuário e um disco de backup. Você não pode reproduzir, fazer cópias ou distribuir cópias, alugados ou arrendar o software, no todo ou em parte, exceto com permissão por escrito do detentor dos direitos autorais ( s). Você pode transferir o disco fechado apenas em conjunto com esta licença, e somente se você destruir todas as outras cópias do software e da transferência concorde com os termos do licença. Você não pode descompilar, desmontar ou fazer engenharia reversa do software. Aviso de Garantia Limitada: O disco incluído é garantido pela PTR Curso de estar livre de defeitos físicos em materiais e de fabricação por um período de 60 (sessenta) dias desde a compra do usuário final do livro / disco combinação. Durante o prazo de sessenta dias da garantia limitada, Curso PTR irá fornecer um disco de substituição sobre o retorno de um disco com defeito. Responsabilidade limitada: O único recurso por violação desta garantia limitada será composto inteiramente de substituição de o disco com defeito. EM HIPÓTESE ALGUMA A CURSO PTR OU O AUTOR SE RESPONSABILIZA Por quaisquer outros danos, incluindo perda ou corrupção de dados, as mudanças no funcionais

Page 325: Programação de jogos em PHP

características do hardware ou sistema operacional, a interação com outros softwares nocivos, ou quaisquer outros danos especiais, incidentais ou conseqüentes que possam surgir, mesmo que CURSO PTR e / ou o autor tenha sido previamente notificado de que a possibilidade de tal danos existe. Renúncia de Garantias: CURSO PTR e autor especificamente rejeitam todas e quaisquer outras garantias, seja explícitas ou implícitas, inclusive garantias de comerciabilidade adequação, para uma determinada tarefa ou finalidade, ou ausência de erros. Alguns estados não permitem a EXCLUSÃO de garantias implícitas ou limitação de danos incidentais ou conseqüenciais, por isso estas limitações poderão não aplicar a você. Outros: Este Contrato é regido pelas leis do Estado de Massachusetts sem levar em conta escolha de princípios legais. A Convenção das Nações de Contratos para a Venda Internacional de Bens é especificamente negada. Este acordo constitui o acordo integral entre você e PTR Curso de utilização do software.