web-archive-net.com » NET » C » CLUBTILT.NET

Total: 177

Choose link from "Titles, links and description words view":

Or switch to "Titles and links view".
  • club TILT
    Random 255 for Y 0 to ClientHeight 1 do begin for X 0 to ClientWidth 1 do Canvas Pixels X Y Z end end X e Y são os valores que irão apontar pixel a pixel todos os pontos dentro da imagem Z é uma cor que será definida aleatoriamente Nossa procedure pode ser chamada de um CLS especial colorido aleatoriamente Quem faz o trabalho sujo ou limpo como preferirem é a instrução Canvas Pixels X Y Z É o antigo Poke na área de vídeo Mas tem um porém isso é de uma lentidão exasperante Tente rodar esse programinha em não menos que um Pentium 4 de 2 5 Ghz e você vai ver como a coisa empaca Se pintar a tela à mão fazemos mais rápido O Windows não está preparado para lidar com uma coisa tão simples quanto um pixel A saída é fazer primeiro na memória e só depois mandar para o vídeo ou mais precisamente para o canvas do formulário que pode ser considerado como a nossa área particular de vídeo Para isso definimos um buffer que será a nossa imagem em memória globalmente falando é claro var Buffer TBitmap Ao inicializar o programa precisamos criar o buffer carregá lo com um padrão gráfico é a forma mais rápida e fácil de definir a estrutura do bitmap que no caso será padrão True Color procedure TForm1 FormCreate Sender TObject begin Buffer TBitmap Create Buffer LoadFromFile padrao2 bmp Buffer Width Form1 ClientWidth Buffer Height Form1 ClientHeight 35 end Não esquecer não vamos deixar para depois de destruir tudo o que foi feito na saída procedure TForm1 FormDestroy Sender TObject begin Buffer Free end Agora criamos um TSpeedButton2 e acrescentamos a seguinte programação procedure TForm1 SpeedButton2Click Sender TObject var X Y integer Z DWord begin Z Random 255 65536 Random 255 256 Random 255 for Y 0 to Buffer Height 1 do begin for X 0 to Buffer Width 1 do Buffer Canvas Pixels X Y Z end Canvas Draw 0 0 Buffer end A diferença é que fizemos o Poke na memória e no final mandamos o buffer para o vídeo todo de uma vez Canvas Draw 0 0 Buffer Muda alguma coisa mas quase não se percebe Ainda é um processo demorado e que não serve para animações e nem para usar em jogos mais elaborados Mas salvos pelo gongo existe uma função chamada ScanLine que atua não no pixel diretamente mas numa linha de pixels Mas antes é preciso criar uma variável pointer que apontará para a matriz da linha variável global var Buffer TBitmap P PByteArray Agora é usar o mesmo princípio da escrita em memória que acabamos de ver procedure TForm1 SpeedButton3Click Sender TObject var X Y integer R G B byte begin R Random 255 G Random 255 B Random 255 for Y 0 to Buffer height 1 do begin P Buffer ScanLine Y for X 0 to Buffer width 1 do begin P X 3 R P X 3 1

    Original URL path: http://www.clubtilt.net/club/tecs/tec12.htm (2016-04-30)
    Open archived version from archive

  • club TILT
    s que usaram as modificações feitas Dessa maneira é possível selecionar quais projetos usarão os componentes modificados e quais permanecerão com os componentes normais A inclusão desse diretório é feita na caixa de opções do projeto menu Project Options dentro da aba Directories Conditionals Na opção Search Path simplesmente adicione o diretório especificado A partir deste ponto todas as alterações em qualquer um dos arquivos do subdiretório Source VCL do Delphi terão efeito sobre os componentes usados no projeto As novas versões do RichEdit A borland literalmente parou no tempo com os RichEdits Desde sua primeira versão 1 0 para o windows 95 a Microsoft lançou três atualizações desse controle para as novos lançamentos de seu sistema operacional no entanto o Delphi continua atrasado com sua implementação original Mas isso vai mudar em um momento A versão do controle utilizada é determinada pela DLL carregada no momento de sua criação Para ativar as funções mais novas é preciso portanto alterar o código do RichEdit nativo do Delphi para utilizar uma biblioteca mais nova A seguinte tabela indica a versão do controle e a respectiva DLL que precisa ser carregada para utilizá lo Versão DLL 1 0 Riched32 dll 2 0 Riched20 dll 3 0 Riched20 dll 4 1 Msftedit dll A função que desejamos implementar transparência está presente na versão 2 0 do controle portanto será usada a biblioteca riched20 dll Alterando o código Tendo descoberto o que é preciso para implementar a transparência tudo o que falta é alterar o código da VCL Apenas uma função precisa ser alterada em um arquivo corrigindo três linhas de código O arquivo é o já citado comctrls32 pas localizado no subdiretório do Delphi source vcl A função que será alterada é a TRichEdit CreateParams e as únicas modificações que precisam ser feitas

    Original URL path: http://www.clubtilt.net/club/tecs/tec13.htm (2016-04-30)
    Open archived version from archive

  • club TILT
    ficar abaixo do botão anterior com as propriedades width 80 height 25 name sair transparent true e finalmente um TLabel deve ser colocado acima dos botões de comando com o nome label1 Lendo uma Skin Os temas serão arquivos zip onde as informações de cada item da interface gráfica serão gravadas Dentro desse arquivo existirá uma imagem para cada TImage criada anteriormente com o mesmo tamanho e nome dados e um arquivo chamado texto txt que guardará informações de configuração Mas como ler os arquivos zipados O Delphi não contém nenhuma forma nativa de ler esses arquivos portanto será preciso alguma biblioteca externa A TILT compilou uma DLL zipDll com funções básicas para leitura desses arquivos além de algumas funções úteis como transformar um arquivo em uma imagem ou em uma lista de strings Para utilizar essa DLL é preciso apenas importar a unit zipDllImport pas na seção de uses do projeto ou formulário e chamar as suas funções Lembre se sempre de que utilizando essa biblioteca o arquivo zipDll dll precisa sempre estar no mesmo diretório do executável do programa ou dentro da pasta windows system32 do sitema operacional Ler um arquivo zip consiste em uma sequência de passos bem definida abrir o pacote de arquivos ler quantos forem necessários e fechar o pacote Portanto todo o código de leitura de skin será executado dentro de um procedimento especial chamado lerSkin no formulário principal Esse método receberá um parâmetro string o nome do arquivo e não retornará nenhum valor A implementação básica para ler apenas o primeiro botão criado é procedure TForm1 lerSkin arq string var i integer texto TStrings begin zipCarregarArq arq figuras de fundo skin sair zipLerParaTImage fundo fundo bmp zipFecharArquivo end Aumentá lo para atualizar os outros botões é bem óbvio basta colocar uma chamada ao método zipLerParaTImage passando como parâmetros o destino da imagem e o nome do arquivo que está guardado no pacote zip Mas fazer isso para cada componente é um grande exercício de digitação Ao invés de criar uma linha de código para cada um dos botões logotipos ou outras imagens do jogo é possível utilizar um truque do sistema de interface gráfica do Delphi para automaticamente ler todas as imagens para todos os controles desejados bastando que eles tenham um nome do tipo controleX onde X é um número inteiro O truque consiste no uso da propriedade Controls que está presente nos componentes da VCL que lidam com painéis ou seja formulários panels notebooks etc Ela permite acessar os componentes que estão dentro desses controles que no caso de serem uma TImage podem receber um gráfico qualquer do arquivo de skins Portanto para colocar as imagens nos botões bt0 bt1 e bt2 ao invés de se utilizar diretamente o método zipLerParaTImage antes chama se o método zipAcharTImage que retorna o controle com o nome desejado e só então a imagem é colocada A seção de código a seguir faz exatamente isso ela deve ser colocada dentro do método lerSkin botões for

    Original URL path: http://www.clubtilt.net/club/tecs/tec14.htm (2016-04-30)
    Open archived version from archive

  • club TILT
    esses arquivos não executam qualquer tipo de compressão E essa é uma das razões pelas quais um formulário com imagens gera um programa tão grande elas foram salvas em arquivos não comprimidos A solução para esse dilema fica clara examinando o artigo Trocando de Peles aqui mesmo da TILT compactar todos os arquivos da aplicação e então colocar esse pacote dentro do resource file Agora sim essa parece a solução ideal a compactação gera um pacote reduzido que diminuirá o espaço total gasto pelo instalador e colocando o dentro do executável é possível criar um único volume que pode ser distribuído sozinho e melhor de tudo que pode ser customizado como qualquer programa ou jogo criado no Delphi Criando o arquivo de Recursos Os resource files extensão res são criados a partir de arquivos de script extensão rc com o auxílio de compiladores especiais Como a Borland é camarada o Delphi já vêm com um compilador chamado criativamente de Borland Resource Compiler Se a instalação foi feita corretamente o compilador pode ser executado simplesmente digitando se brc32 no prompt de comando Para simplificar as coisas criamos um arquivo de lotes que invoca o compilador para um pacote zip chamado de arquivos zip que deve conter todos os arquivos necessários para a execução do programa que será instalado Portanto para modificar o instalador além é claro de colocar suas próprias imagens tudo o que precisará ser feito é atualizar esse pacote rodar o bat e recompilar o projeto Mas apenas gerar o resource file não é o suficiente é preciso incluí lo na aplicação Isso é feito através da diretiva RESOURCE arquivos res ou R arquivos res que deve ser incluída logo após a declaração dos recursos do próprio formulário a sempre presente R dfm Inserir é simples o suficiente mas como extrair os recursos Para isso é preciso criar um objeto da classe TResourceStream que indique qual o nome tipo e local do recurso que se deseja pegar Colocando essa parte do código em um procedimento à parte ele fica procedure TForm1 lerZipDoResource var str TResourceStream begin arquivo zip str TResourceStream Create hInstance arquivos RT RCDATA str SaveToFile appdir arquivos zip str free end A variável hInstance indica que o recurso deve ser pêgo do próprio programa arquivos é o identificador do recurso que é escolhido no script que constrói o resource file e RT RCDATA é o tipo do recurso desejado tipo binário Com o arquivo zip retirado do executável e salvo disco rígido agora ficou até sem graça o resto do programa Ele usa os mesmos conceitos do artigo sobre skins abrir o arquivo zip ler o conteúdo e fechá lo O trecho mais importante desse código é o seguinte pegar o nome de todos os arquivos do zip arqs Text zipdllListarArqs extrair arquivos for i 0 to arqs Count 1 do begin se for um diretório e não arquivo pular if arqs i length arqs i then begin progbar Position progbar position 1 continue end arquivo final

    Original URL path: http://www.clubtilt.net/club/tecs/tec15.htm (2016-04-30)
    Open archived version from archive

  • club TILT
    esforço maior de programação do que com outros métodos nativos do Delphi A forma mais antiga em termos de compiladores Pascal da Borland de acesso à arquivos é o uso de funções padrão Essas funções simplificam os passos necessários para a abrir ler escrever e fechar tanto arquivos binários quanto do tipo texto que podem ser lidos linha à linha de maneira bem direta Elas são AssignFile Associa um nome de arquivo à uma variável de arquivo Rewrite Prepara um arquivo associado anteriormente para escrita Reset Prepara um arquivo associado anteriormente para leitura Write Escreve uma variável para um arquivo Read Lê uma variável de um arquivo Writeln Escreve uma linha para um arquivo tipo texto ReadLn Lê uma linha de um arquivo do tipo texto CloseFile Fecha um arquivo associado anteriormente Seja qual for o tipo de arquivo que será lido a estrutura básica de programação será a mesma Chama se o método AssignFile passando como argumentos uma variável que armazenará o handle do arquivo e o nome e caminho para o arquivo desejado Em seguida chama se a função Rewrite se essa for uma operação de escrita ou Reset caso deseje se executar uma operação de leitura Após todas as operações read write readLn e writeLn fecha se o arquivo com a função CloseFile A utilização dessas funções requer a definição de uma variável de arquivo que tem o mesmo propósito do handle quando a API do Windows foi utilizada armazenar uma referência ao arquivo aberto Porém em Pascal é possível utilizar três diferentes tipos de arquivo ou melhor de referência texto não tipificados e tipificados Arquivos do tipo texto têm seu handle definido como sendo do tipo TextFile e aceitam as funções readLn e writeLn para leitura e escrita de linhas Arquivos não tipificados são definidos apenas pela palavra file var arq file e não recebem qualquer formatação das funções de leitura escrita Arquivos tipificados o tipo utilizado no projeto de demonstração nas funções bin Pascal são entendidos como coleções de um determinado tipo de registro record ou seja todas as informações são salvas como registros em forma de lista Essa característica facilita a sua leitura já que não é preciso conhecer como exatamente as informações são salvas apenas o quê é salvo A definição desse tipo de arquivo é feita através da palavra chave file of tipo No caso da versão binária um arquivo tipificado é ideal para o propósito da aplicação já que os personagens serão armazenados sequencialmente Portanto a variável do arquivo é definida como file of TPersonagem e os métodos read e write lêem e escrevem itens para o array de personagens A versão texto é mais complicada em primeiro lugar é preciso ler uma linha do arquivo para uma variável auxiliar Em seguida quebra se essa linha de acordo com a posição de um caracter de controle os dois pontos neste caso Finalmente cada item da linha é convertido para o seu valor nativo conforme necessário Na função para escrita faz se

    Original URL path: http://www.clubtilt.net/club/tecs/tec16.htm (2016-04-30)
    Open archived version from archive

  • club TILT
    até aqui Então o propósito deste artigo é mostrar o caminho das pedras para facilitar um pouco as escolhas de cada um Vamos primeiro ao TCP A Borland criou um novo set de componentes TCP para o D7 assim chamados TcpClient e TcpServer aba Internet Uma olhada no exemplo de construção de um chat pasta demos nos mostra que a programação desses componentes é completamente diferente dos nossos velhos conhecidos ClientSocket e ServerSocket até então usados como base para a comunicação via TCP A docimentação dos novos componentes deixa a desejar e fazê los funcionar pode consumir muitas horas e dores de cabeça componente TcpClient componente TcpServer componente UdpSocket Mas por sorte ou por descuido a Borland deixou os velhos sockets no D7 só que sem instalá los na instalação default Basta fazer o seguinte Dê um close all menu file para fechar todo mundo Vá em Project Options aba Packages opção Add Ao aparecer o box para load apontando para a pasta Bin localize o arquivo dclsockets70 bpl e dê um clique duplo nele Pronto Se tudo correu bem então retomamos a programação com os conhecidos ClientSocket e ServerSocket agora incluidos na aba Internet Sockets aba internet no D7 após a instalação Com o componente UDP a coisa é mais complicada O antigo componente simplesmente desapareceu e foi substituido por um novo UdpSocket na pasta internet Porém seguindo a documentação precária dele ainda não foi possível fazer com que o mesmo funcionasse de forma simples e direta como vinha sendo feito até então A solução foi então lançar mão de um segundo pacote de componentes presente no D7 chamado Indy Trata se de uma vasta coleção de componentes específicos para desenvolver aplicações em rede e lá existem componentes UDP para todos os gostos Vamos usar 2 um cliente e

    Original URL path: http://www.clubtilt.net/club/tecs/tec17.htm (2016-04-30)
    Open archived version from archive

  • club TILT
    ir ig ib single x y integer nr ng nb single c TColor begin if bmp PixelFormat pf24bit then bmp PixelFormat pf24bit colortorgb cor b g r ir r 255 ig g 255 ib b 255 for x 0 to bmp width 1 do for y 0 to bmp height 1 do begin c getScanline bmp x y colortorgb c b g r nr r r ir if nr 255 then nr 255 ng g g ig if ng 255 then ng 255 nb b b ib if nb 255 then nb 255 c RGBToColor trunc nb trunc ng trunc nr setScanline bmp x y c end end A função de brilho é simplesmente um filtro branco aplicado à imagem procedure fxBrilho bmp TBitmap valor byte begin if bmp PixelFormat pf24bit then bmp PixelFormat pf24bit fxFiltro bmp RGBToColor valor valor valor end Espelhos e Scanline As funções fxEspelharHorz e fxEspelharVert são ainda mais simples que as anteriores elas apenas copiam os dados de um pixel da imagem para outro pixel na extremidade oposta No primeiro efeito isso é feito horizontalmente e no segundo verticalmente procedure fxEspelharHorz bmp TBitmap var x y integer aux TColor begin if bmp PixelFormat pf24bit then bmp PixelFormat pf24bit for y 0 to bmp Height 1 do for x 0 to bmp Width 1 div 2 do begin aux getScanline bmp bmp width 1 x y setScanline bmp bmp width 1 x y getScanline bmp x y setScanline bmp x y aux end end procedure fxEspelharVert bmp TBitmap var aux TColor x y integer begin if bmp PixelFormat pf24bit then bmp PixelFormat pf24bit for x 0 to bmp width 1 do for y 0 to bmp height 1 div 2 do begin aux getScanline bmp x y setScanline bmp x y getScanline bmp x bmp height 1 y setScanline bmp x bmp height 1 y aux end end O efeito fxScanline percorre a imagem verticalmente e à cada duas linhas preenche uma com a cor preto procedure fxScanline bmp TBitmap var x y integer begin if bmp PixelFormat pf24bit then bmp PixelFormat pf24bit y 0 while y bmp height do begin for x 0 to bmp width 1 do setScanline bmp x y clBlack y y 2 end end Filtros de Convolução Os efeitos de convolution filters são um dos mais famosos e usados no mundo do processamento gráfico Eles consistem no uso de uma matriz chamada kernel com tamanho que pode ser especificado que indica qual o peso das cores que estão ao redor de um pixel sendo lido Esses resultados são somados junto com um valor de bias e divididos por um número divisor e então retornados à imagem Ou seja o algoritmo para esse tipo de efeito percorre cada pixel da imagem somando os valores dos pixels adjacentes multiplicados antes pela matrix kernel e divindo o valor resultante por um divisor Diferentes kernels resultam em diferentes imagens e por esse motivo as funções fxBlur fxSharpen e fxEmboss se traduzem em chamadas para a

    Original URL path: http://www.clubtilt.net/club/tecs/tec18.htm (2016-04-30)
    Open archived version from archive

  • club TILT
    nascimento etc O record não é uma variável em si mesma mas uma definição de formato Para usá la teremos que declarar as variáveis efetivas ou melhor uma matriz de variáveis um array de Jogadores var Jogs array of Jogador Portanto quando quisermos fazer referência a um jogador em especial usamos o índice da matriz e a propriedade desejada Por exemplo para saber o nome do jogador 5 Jogs 5 Nome O apelido dele Jogs 5 Nick o valor do passe Jogs 5 Passe e assim por diante A declaração acima é de um array dinâmico ou seja não tem um número predeterminado de entradas e cada vez que um jogador for incluído na estrutura será preciso aumentar a quantidade de itens na matriz que começa invariavelmente com zero Para isso usamos a função SetLength array quantidade e uma variável para controlar a quantidade de jogadores var TotJogs integer Imagine que está montando um utilitário para criar e editar jogadores e ao clicar um botão cria se um determinado jogador procedure TForm1 SpeedButton1Click Sender TObject begin TotJogs TotJogs 1 SetLength Jogs TotJogs Jogs TotJogs 1 Nome Nome do jogador Jogs TotJogs 1 Nick Apelido dele Jogs TotJogs 1 Nasc StrToDate 10 10 80 Jogs TotJogs 1 Passe StrToCurr 100000 00 Jogs TotJogs 1 Clube índice da lista de nomes dos times Jogs TotJogs 1 Titular true end O ideal seria apontar para TEdits que permitissem a digitação alteração dessas características ou propriedades Para completar esse pequeno utilitário é preciso gravar o cadastro em um arquivo para que outro programa tenha acesso a essa informação procedure TForm1 SpeedButton2Click Sender TObject var ArqJog file of Jogador Tm integer begin AssignFile ArqJog jogadores dat Rewrite ArqJog for Tm 0 to TotJogs 1 do Write ArqJog Jogs Tm CloseFile ArqJog end Sabemos quantos jogadores existem no cadastro e portanto basta fazer um looping e gravar um a um A operação inversa usa um conceito diferente para o looping uma vez que não se sabe o número exato de jogadores que serão carregados procedure TForm1 SpeedButton3Click Sender TObject var ArqJog file of Jogador begin TotJogs 0 AssignFile ArqJog jogadores dat Reset ArqJog while not eof ArqJog do begin TotJogs TotJogs 1 SetLength Jogs TotJogs Read ArqJog Jogs TotJogs 1 end CloseFile ArqJog end O arquivo é aberto e lido até que seu final seja encontrado eof End Of File Esta é portando a base do cadastro de jogadores sobre a qual iremos montar o simulador dos nossos sonhos Claro não precisa ser necessariamente um simulador de campeonato de futebol como já falei O terceiro aspecto característico deste tipo de jogo é a mecânica funcional da partida Obviamente estamos considerando que essas operações ocorrerão dentro do servidor com acesso total aos cadastros específicos do jogo As questões relevantes aqui irão aparecer numa análise mais detalhada do que se pretende fazer do jogo Por exemplo no caso do simulador de campeonato de futebol a base dos dados é o cadastro dos jogadores e de um segundo cadastro

    Original URL path: http://www.clubtilt.net/club/tecs/tec19.htm (2016-04-30)
    Open archived version from archive