Luiz Pestana's Web Blog desenvolvimento de aplicativos e jogos

21mar/130

Extraindo PDFs de um Adobe Portifolio em C# / iTextSharp

Se você precisa extrair documentos de um PDF no formato Adobe Portifolio ou Adobe Collection basta fazer um loop em todos os objetos, salvando todos que forem PDFs.

Baixe a Lib iTextSharp: http://sourceforge.net/projects/itextsharp/

Segue o código:

PdfReader reader = new PdfReader("Portifolio.pdf"); // Seu arquivo collection
for (int x = 0; x < reader.XrefSize; x++) // Loop em todos os objetos
{
     PdfObject obj = reader.GetPdfObject(x);
     if ((obj != null) && (obj.IsDictionary()) && (obj.ToString().EndsWith("/Filespec")))
     {
          PdfDictionary filespec = (PdfDictionary)obj;
          PdfDictionary refs = filespec.GetAsDict(PdfName.EF);
          foreach (KeyValuePairkey in refs)
          {
               // Salvando sub arquivos
               FileStream fos = new FileStream(x + ".pdf", FileMode.CreateNew, FileAccess.Write);
               PRStream stream = (PRStream)reader.GetPdfObject(refs.GetAsIndirectObject(key.Key).Number);
               byte[] pdfb = PdfReader.GetStreamBytes(stream);
               fos.Write(pdfb, 0, pdfb.Length);
               fos.Flush();
               fos.Close();
          }
     }
}
reader.Close();
23abr/121

PS Suite

Já pensou em programar para PSP? (Playstation Portable), se você respondeu sim, provavelmente já se sentiu frustrado que nem eu. Mas agora com o PS Vita isso pode mudar com o lançamento do SDK oficial da Sony.

A Sony lançou no fim de abril, o open beta do SDK que possibilita você a programar Apps e Games para PS Vita e alguns outros devices com Android... Não foi agora que ela abriu as portas para o desenvolvimento no PS3, mas com esse SDK será possível vender na PS Store Apps e Games para Vita. Para isso, será necessária uma assinatura de U$99 anuais (o mesmo cobrado pela Apple) e ter conhecimentos em C#.Net, isso mesmo, eles implementaram o Mono Framework para rodar no Vita. Já é possível baixar o beta e sair programando, veja: http://www.playstation.com/pss/

Nas próximas semanas espero ver muitos Apps feito pela comunidade.

Eu já fiz alguns testes, e é bem simples, porém, ainda cheio de bugs.

Uma imagem do programa RPG 2ic (RPG Online) rodando em PS Vita:

10jan/120

Rodando Apenas um Processo C# (.Net)

Para se certificar que só haverá uma execução de seu programa, fiz um pequeno código que encerra a execução antiga desse mesmo exe, mantendo somente a recém executada.

Coloque isso antes do Application.Run();

foreach (Process proc in Process.GetProcesses())
if ((proc.ProcessName == Path.GetFileNameWithoutExtension(Application.ExecutablePath)) && (proc.Id != Process.GetCurrentProcess().Id)) proc.Kill();

Caso queira que mantena apenas a antiga, interrompendo a recém executada, é só trocar o proc.Kill(); por Application.Exit();

ps: Não se esqueça, o código utiliza o nome do executável, então caso use algum executável com um nome bem comum, pode ser que não funcione.

Espero ter ajudado... =)

21out/110

DropLink para Google Chrome!

Para quem já conhece o desprotetor de links DropLink sabe que quebra muitos galhos, agora, para quem não possui Windows, meu amigo David Ruiz desenvolveu um plugin para o navegador Google Chrome que pode ser baixado aqui.

Para quem não conhece o fantástico programa, clique aqui e saiba mais.

O comportamento é semelhante ao programa original, porém ele converte todos os links da página atual em um simples clique. Fantástico!!! (palmas)

11out/110

DropLink v0.4 lançada!

Olá Nerds de plantão, ligados nos filmes, músicas e afins...

Quem tenta baixar arquivos de alguns blogs já teve problemas com proteção de links que insistem em pedir o celular. É muito chato isso.

Por isso desenvolvi um programinha, de muito fácil utilização (nem botão tem), e com ele basta que você arraste o link de download que você é redirecionado para o local correto. Remove o link protegido em menos de um segundo, é incrível!!!

Para mais detalhes e download do aplicativo, acessar a página dele clicando aqui.

30ago/110

Compactar e Descompactar strings em C# (.Net)

Trafegar ou armazenar strings é uma tarefa muito comum nos aplicativos e jogos, se você é programador, é muito provável que já tenha feito algum arquivo de texto com configurações ou enviado informações em string através da rede. Mas você já pensou que pode economizar tempo e espaço se utilizar compactação?

Em C# (.Net) a compactação e descompactação de strings é um processo simples, desde que saiba o caminho, e por isso resolvi colocar um exemplo de como utilizar o GZip para a tarefa.

Primeiro é necessário utilizar essas bibliotecas específicas:

using System.IO;
using System.IO.Compression;

Para compactar, utilize o código:

string stringNormal = "seutexto";

byte[] byteArr = Encoding.Unicode.GetBytes(stringNormal);

// Você pode trocar o MemoryStream pelo FileStream para salvar em arquivo.
MemoryStream memStream = new MemoryStream();
GZipStream gzStream = new GZipStream(memStream, CompressionMode.Compress, true);
gzStream.Write(byteArr, 0, byteArr.Length);
gzStream.Close();

// Caso utilize o FileStream, troque o código a seguir pelo Save.
memStream.Position = 0;
byteArr = new byte[memStream.Length];
memStream.Read(byteArr, 0, byteArr.Length);
memStream.Close();

// Aqui o byteArr contém o conteúdo compactado que pode ser trafegado

Para descompactar é bem semelhante, porém é necessário a utilização de uma array de buffer:

string stringNormal;


// Você pode trocar o MemoryStream 1 pelo FileStream para salvar em arquivo.
MemoryStream memStream1 = new MemoryStream();

// Carregar o byteArr com o conteúdo compactado, ou trocar o MemoryStream 2 para FileStream.
MemoryStream memStream2 = new MemoryStream(byteArr);

GZipStream gzStream = new GZipStream(memStream2, CompressionMode.Decompress, true);
int readBytes;
byte[] buffer = new byte[1024];
while ((readBytes = gzStream.Read(buffer, 0, buffer.Length)) != 0)
    memStream1.Write(buffer, 0, readBytes);
memStream2.Close();
gzStream.Close();

// Caso utilize o FileStream, troque o código a seguir pelo Save.
memStream1.Position = 0;
byteArr = new byte[memStream1.Length];
memStream1.Read(byteArr, 0, byteArr.Length);
memStream1.Close();

stringNormal = Encoding.Unicode.GetString(byteArr);

Espero que tenha ajudado, e comente caso tenha alguma dúvida, crítica ou sugestão. ...ou apenas para agradecer! =)

11ago/111

Catherine, pq não precisamos de mais tiros.

Recém lançado, Catherine não prometia muito, achei que seria mais um jogo para apenas conhecer. Porém depois de começar a jogar, me viciei, e vou explicar o pq nesse post.

No inicio, vem marcado a opção Easy, mas como sempre jogo no Normal ou Hard, selecionei o Normal. Ele logo avisa, caso você queira apenas prestar atenção na história, selecione o Easy.

O jogo tem uma temática bem legal, adulta, porém sem nada de outro mundo. A história é bem louca, misteriosa e os personagens são cativantes. Isso que está faltando nos jogos de hj, mais história, mais criatividade.

Você começa o jogo na pele de Vincent, um cara de 30 e alguns anos que namora Katherine e costuma ir beber com os amigos e jogar conversa fora. Em um dia ele conhece uma garota com quem começa a trair a namorada e conhecidencia ou não, ter pesadelos terríveis, que é onde o jogo rola.

Os pesadelos de Vincent são uma espécie de puzzle bem diferente, onde você precisa arrumar os blocos para subir e alcançar uma determinada altura, antes que o chão se caia e você morra. Até aí tudo parece trivial, mas não é. A quantidade de blocos diferentes, técnicas, e maneiras de solucionar os puzzles fazem o jogo uma obra de arte. É impressionante a dificuldade do jogo estando no level Normal, imagina isso no Hard.

Terminei o jogo esses dias, e fiquei com muita vontade de continuar jogando, infelizmente, não tem mais. Sinto muita falta de  jogos assim, criativos, que mudam a história conforme suas decisões, que se preocupam em criar um clima misterioso e tenso. Não precisamos mais de FPS iguais, que matamos 10.093 pessoas sem nenhum motivo, sem ninguém ter feito nada p/ nós...

Por isso Catherine está de parabéns. Vale a pena jogar.

Categorias: Jogos 1 Comentário
30jul/117

Trocando o botão Home do iPhone 4

De uns meses para cá, o botão home do meu iPhone 4 apresentou problemas, hora funcionava, hora falhava. E começou a piorar cada dia que passava. Acessar o gerenciador de tarefas (duplo clique) começou a se tornar impossível. Eu como gosto de usa-lo muito rapidamente, comecei a ficar muito irritado.

No começo achei que era software, pois começou de uma hora para outra, mas depois de descobrir que uma batidinhas na coxa ele melhorava por algum tempo me levou a certeza que estava lidando com um problema de hardware.

Para não demorar tempos na assistência, acabei por realizando a troca eu mesmo. É difícil, pois é necessário desmonta-lo por completo para retirar o Home, mas vale a pena. Agora está perfeito.

Você vai precisar de:
- Apenas o flat do botão home;
- Kit manutenção de iPhone;
- Tutorial detalhado;

Categorias: Hardware 7 Comentários
27jul/11Off

SvnCleaner v0.1 lançada!

Olá dnovo, criei um aplicativo que remove pastas .svn de um diretório e seus subdiretórios. Já aproveitei para incluir uma opção para remoção de todos os Thumbs.db (Cache de Imagens do Windows), .DS_Store (Configuração de Pasta do MacOSX) e qualquer outro arquivo especificado.

Ideal para quem quer armazenar apenas oq interessa na hora de publicar o seu site ou armazenar em mídia.

Para mais detalhes e download do aplicativo, acessar a página dele clicando aqui.

8jul/113

Testes com Movimentação de Personagem

Hoje fiz um primeiro teste de movimentação com física e colisão para o meu mais novo projeto de jogo (logo mais passo detalhes sobre ele). Testei entre vários os tipos, aquele que a câmera segue de trás (Resident Evil 4 e 5, Uncharted, Tomb Raider...), com mouse para atacar e o teclado para andar (DeadNation, Alien Breed...), com o mouse para andar e atacar (Diablo, World of Warcraft...) e por fim teclado para andar e atacar (Resident Evil 1, 2 e 3).

A que eu mais me identifiquei foi a última, a qual você usa duas teclas para rotacionar o personagem e outras duas para andar para frente e para trás, assim como no clássico Resident Evil.


Após fazer alguns testes, segue o script da movimentação em LUA para Shiva 3D:

if ( nMX ~= 0 or nMY ~= 0 )
then       
   object.rotate ( hModelObj, 0, nMX, 0, object.kGlobalSpace )

   local dX, dY, dZ = object.getDirection ( hModelObj, object.kGlobalSpace )
   dynamics.addForce ( hDynObj, nMY * 300 * dX, 0, nMY * 300 * dZ, object.kGlobalSpace )

   dynamics.setLinearDamping ( hDynObj, 5 )
end
object.matchTranslation ( hModelObj, hDynObj, object.kGlobalSpace )

Observações:
- nMX e nMX variam entre -1, 0 e 1 conforme as teclas WASD estão apertadas;
- hModelObj é o modelo do personagem e kDynObj é o objeto de colisão.

Confesso que tenho uma inclinação a escolher a movimentação dos jogos que eu mais gostei, porém sei que não são as melhores e por isso quero a opinião de vocês.