quarta-feira, dezembro 21, 2011

Beco 203

No aplicativo do Beco é possível ver as últimas notícias, eventos e festas da sua região SP/RS.

Também está disponível nessa versão o acesso a redes sociais como Twitter e Facebook. Neles você pode fazer login, re-twittar e curtir os posts.

Mais um aplicativo desenvolvido pela DigitalDesk e mais para meu currículo.



Beco 203 na APP Store

segunda-feira, outubro 31, 2011

Colda Kasar's Domain

Meu primeiro jogo na AppStore! Para quem vem acompanhando desde que fiz meu primeiro jogo, sabe que pra mim é muito mais do que uma conquista.

Durante muito tempo desenvolvi protótipos de jogos e sem sucesso nunca havia publicado nenhum deles. Até mesmo o jogo que eu desenvolvi para meu TCC acabei não dando continuidade e se perdeu com o tempo.

Em 2011 fiz uma parceria com a DigitalDesk e consegui concluir esse que é um dos meus sonhos e objetivos na vida. Agora se o jogo será um sucesso eu ainda não sei. Espero que gostem do jogo e que ele seja a porta de entrada para meu futuro com os games.

Veja mais em:
Facebook
Hot site
AppStore

quarta-feira, agosto 24, 2011

Curso de .NET Avançado -120 horas

OBJETIVOS

O curso tem como objetivo formar profissionais com qualificação em desenvolvimento voltado a web, utilizando as mais avançadas ferramentas do mercado. O aluno aprenderá desde conceitos básicos de web até desenvolver e gerenciar conteúdo do site utilizando autenticação e banco de dados.

PÚBLICO-ALVO

Profissionais com conhecimentos básicos em programação.

MATRÍCULAS

Até 29/09/2011 na APM-Liberato, das 8h às 21h, mediante o pagamento da primeira parcela, a apresentação do comprovante de residência e cópia do RG e do CPF (se menor de idade, apresentar documentos do pai/mãe ou responsável). Endereço: Rua Inconfidentes 395, bairro Primavera – Novo Hamburgo/RS – Fone: 3584-2029.


segunda-feira, junho 06, 2011

Objective-C custom button

Aqui um snippet de código que usei para customizar um botão no objective-c.

O código adiciona uma linha superior com efeito 3D, muda a cor da borda, adiciona um background em degrade e cria uma borda arredondada. Isso da a impressão de um botão mais dinâmico.

Para utilizar o código abaixo é preciso adicionar a biblioteca QuartzCore e criar uma view com um botão dentro. Feito isso é só chamar o método da seguinte maneira:
[self drawCustomViewButton:myCustomView];

#import <QuartzCore/QuartzCore.h>

- (void)drawCustomViewButton:(UIView*)v {
v.layer.cornerRadius = 3;
v.layer.borderWidth = 1;
v.layer.borderColor = [[UIColor colorWithRed:1/255.0 green:1/255.0 blue:1/255.0 alpha:1.0] CGColor];
CALayer *line = [CALayer layer];
line.frame = CGRectMake(3, 1, v.frame.size.width-6, 1);
line.backgroundColor = [[UIColor colorWithRed:200/255.0 green:200/255.0 blue:200/255.0 alpha:1.0] CGColor];
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = v.bounds;
gradient.colors = [NSArray arrayWithObjects:
  (id)[[UIColor colorWithRed:1/255.0 green:1/255.0 blue:1/255.0 alpha:1.0] CGColor], 
  (id)[[UIColor colorWithRed:200/255.0 green:200/255.0 blue:200/255.0 alpha:1.0] CGColor], nil];
gradient.cornerRadius = 3;
[v.layer insertSublayer:gradient atIndex:0];
[v.layer insertSublayer:line atIndex:1];
}

quinta-feira, abril 28, 2011

Convert NSString to DateTime

Para converter uma string em data basta passar o formato da data a ser convertida. No exemplo um formato de data padrão BR. Se caso mudar o formato de entrada não esqueça de mudar o formatador da data.

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"dd/MM/yyyy"];
NSDate *mydate = [dateFormat dateFromString:@"01/12/2010"];


segunda-feira, abril 25, 2011

WCF + Objective-C

Depois de muito tentar e procurar uma alternativa para fazer a conexão de um serviço WCF com minha aplicação, finalmente achei uma solução.

Bom primeiro devemos adicionar as variaveis no header da classe que irá conter a conexão.


NSMutableData *webData;
NSMutableString *soapResults;
NSURLConnection *conn;

NSXMLParser *xmlParser;
BOOL elementFound;


Depois na implementação o método que irá chamar o serviço.

NSString *SOAPEnvelope =
[NSString stringWithFormat:
@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<SOAP-ENV:Envelope \n"
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" \n"
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n" 
"xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" \n"
"SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" \n"
"xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"> \n"
"<SOAP-ENV:Body> \n"
"<HelloWorld xmlns=\"http://tempuri.org/\">"
"</HelloWorld> \n"
"</SOAP-ENV:Body> \n"
"</SOAP-ENV:Envelope>"];

//Debug
NSLog(@"SOAP ENVELOPE %@", SOAPEnvelope);

NSURL *url = [NSURL URLWithString:@"http://SERVER/WCFServiceName/ServiceName.svc"];  
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

//Header  
NSString *SOAPEnvelopeLength = [NSString stringWithFormat:@"%d", [SOAPEnvelope length]];  
[request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];  
[request addValue:@"http://tempuri.org/WCFServiceName/HelloWorld" forHTTPHeaderField:@"SOAPAction"];
[request addValue:SOAPEnvelopeLength forHTTPHeaderField:@"Content-Length"];

//Method & Body
[request setHTTPMethod:@"POST"];  
[request setHTTPBody:[SOAPEnvelope dataUsingEncoding:NSUTF8StringEncoding]];

// Connection
conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];

if (conn) {  
webData = [[NSMutableData data] retain];  
}

E depois adicione os métodos de comunicação com o serviço na mesma classe.

-(void) connection:(NSURLConnection *) connection
didReceiveResponse:(NSURLResponse *) response {
    [webData setLength: 0];
}

-(void) connection:(NSURLConnection *) connection
    didReceiveData:(NSData *) data {
    [webData appendData:data];
}

-(void) connection:(NSURLConnection *) connection
  didFailWithError:(NSError *) error {
    [webData release];
    [connection release];
}

-(void) connectionDidFinishLoading:(NSURLConnection *) connection {
    NSLog(@"DONE. Received Bytes: %d", [webData length]);
    NSString *theXML = [[NSString alloc]
            initWithBytes: [webData mutableBytes]
            length:[webData length]
            encoding:NSUTF8StringEncoding];
    //Debug
    NSLog(@"XML %@",theXML);
    [theXML release];

if (xmlParser) {
        [xmlParser release];
    }
    xmlParser = [[NSXMLParser alloc] initWithData: webData];
    [xmlParser setDelegate:self];
    [xmlParser setShouldResolveExternalEntities:YES];
    [xmlParser parse];
    [connection release];
    [webData release];
}

-(void) parser:(NSXMLParser *) parser
didStartElement:(NSString *) elementName
  namespaceURI:(NSString *) namespaceURI
 qualifiedName:(NSString *) qName
attributes:(NSDictionary *) attributeDict {
//Debug
NSLog(@"%@", elementName);
    if( [elementName isEqualToString:@"HelloWorldResult"]) {
        if (!soapResults) {
            soapResults = [[NSMutableString alloc] init];
        }
        elementFound = YES;
    }
}

-(void)parser:(NSXMLParser *) parser 
foundCharacters:(NSString *)string {
    if (elementFound) {
        [soapResults appendString: string];
    }
}

-(void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
 namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName {
    NSLog(@"SOAP RESULT %@", soapResults);
    if ([elementName isEqualToString:@"HelloWorldResult"]) {

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello"    
            message:soapResults   
            delegate:self  
            cancelButtonTitle:@"OK"
            otherButtonTitles:nil];
        [alert show];
        [alert release];
        [soapResults setString:@""];
        elementFound = FALSE;
    }
}

quinta-feira, abril 07, 2011

Desenvolvimento IPhone sem o uso do Interface Builder

Bom, depois de ver mais de dez vezes os vídeos abaixo, resolvi criar um complemento deles. Senti falta de ter o código final ou em partes para poder a companhar o vídeo, então ae vai minha extensão para o aprendizado. Para ficar mais claro o uso desse complemento sugiro ver os vídeos e acompanhar o código aqui postado conforme a evolução.

O primeiro passo a ser seguido é ver o vídeo abaixo e apenas VER, pois no primeiro é criado uma aplicação do tipo View-Based App e no segundo uma Window-Based App.(tive problemas na primeira vez que vi o 2o video e utilizei o mesmo projeto 'o_o). Então fica a dica, presta atenção no vídeo e depois faz utilizando a Window-Based App.



A segunda parte está dividida em 3 seções, que explicam bem o funcionamento do Obj-C e do IPhone.

Abaixo alguns passos mostrados no vídeo.

apagar o arquivo XIB dentro da pasta resources.

apagar a property Main nib file base name do arquivo projeto-info.plist

adicionar o nome da AppDelegate na main.m

int main(int argc, char *argv[])
{    
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, @"NomeDoProjetoAppDelegate");
    [pool release];
    return retVal;
}

no arquivo da AppDelegate.h, apagar a referencia do IB(Interface Builder) IBOutlet

@property (nonatomic, retain) IBOutlet UIWindow *window;

criar uma instancia da window no arquivo AppDelegate.m

window = [[UIWindow alloc] init];

novamente no AppDelegate.h, criar o controle abaixo

UINavigationController *navController;

adicionar um ViewController ao projeto clicando em Classes>Add>New File...

importar a ViewController na AppDelegate.h e criar uma variavel do tipo ViewController, com isso o código deve estar parecido com o abaixo.




#import
#import "NomeDoProjetoViewController.h"

@interface NomeDoProjetoAppDelegate : NSObject {
    UIWindow *window;
    UINavigationController *navController;
    NomeDoProjetoViewController *vcNomeDoProjeto;
}

@property (nonatomic, retain) UIWindow *window;

@end


criar uma instancia do ViewController inicializar o navController passando a view como parametro e por final adicionar o navController na window, isso tudo no arquivo AppDelegate.m

vcNomeDoProjeto = [[NomeDoProjetoViewController alloc] init];
navController = [[UINavigationController alloc] initWithRootViewController: vcNomeDoProjeto];

re-escrever o metodo INIT da ViewController - nessa parte encerra o vídeo, então o código será re-escrito abaixo junto com o vídeo a seguir.


- (id)init {
if (self = [super init]) {
}
return self;
}




criar uma View na pasta Classes - para isso clique na pasta Add>New File...

importar a View na ViewController.m, com isso o código deve estar parecido com isso:
Note que no meu caso criei a View com o nome MainView!

#import "NomeDoProjetoViewController.h"
#import "mainView.h"

@implementation NomeDoProjetoViewController

- (id)init {
if (self = [super init]) {
mainView *v = [[mainView alloc] initWithFrame:CGRectMake(0, 20, 320, 460)];
self.view = v;
[v release];
}
return self;
}

Nesse ponto termina o processo para desvincular o IB do seu projeto, a partir daqui o vídeo mostra como criar outros componentes e seus funcionamentos. Aconselho ver todos os vídeos para adquirir mais conhecimento da plataforma. Para ver os demais vídeos entre no canal da ToucheMobile no youtube.

sexta-feira, março 18, 2011

Oportunidade

Lanço aqui uma oportunidade para criação de uma micro empresa de games para IPhone e possivelmente Android.

A idéia é simples, o desenvolvimento do jogo seria tudo por minha conta. O que precisaria seria diretores de arte, criação de idéias e sonoplastia.

O objetivo é criar games ou até apps e com os lucro fazer uma divisão de igual pra igual. Assim todos podem dar seu melhor para a criação dos games/apps.

Gostaria de imediato já propor a idéia de um jogo simples que poderiamos lançar FREE para divulgar os demais projetos. Poderia ser um Arkanoid ou um jogo do genero, nada de novo e muito complexo.

Mas desde já deixo a palavra para os que se interessarem.

Vale a pena deixar claro que todo o processo administrativo será feito pela minha pessoa, assim como os pagamentos e até um futuro contrato para garantir o lucro das partes envolvidas. E quem sabe até criar uma empresa com local fixo e quem puder fazer parte será bem vindo.

Um pouco sobre minha pessoa:
Formado em Ciência da Computação
Tenho 30 anos
Tenho mais de 15 anos de experiência em programação
Certificado Microsoft .Net MCAD e MCT

Att.
Daniel Colnaghi
danielcolnaghi.blogspot.com
danielcolnaghi@gmail.com

quarta-feira, outubro 20, 2010

Criando um web site - Sample WebSite Parte 1

A pouco tempo ministrei o curso 2310 - Developing Web Applications Using Microsoft Visual Studio 2008 e resolvi criar uma aplicação para mostrar um pouco mais da implementação na vida real.

Vou abordar essa aplicação em varias partes para não ficar muito extensa e focar mais no exemplo de cada artigo.

Banco de dados - inicialmente o banco vai conter três tabelas:
Usuario
Produto
UsuarioXProduto
A estrutura do projeto consiste em três camadas, Business Layer(Regras de Negocios), DBAccess(Acesso a Dados) e DB Model(Modelo do Banco).

Funcionamento:
DBModel - contém o modelo do banco de dados
Business Layer - contém todas as regras de negócios da aplicação
DBAccess - contém os métodos de acesso a dados

sexta-feira, outubro 01, 2010

TCP Client & Server

Essa semana precisei fazer um server e um client usando TCP. Depois de muita busca achei a melhor solução no livro C# CookBook 2nd Edition da Editora O´Reilly. Mas claro que no livro a solução não estava 100%, faltava declarar uns namespaces e um objeto.

No livro o autor cita que será usado o System.Net mas assim que comecei a ler o codigo percebi que ia precisar de outras namespaces, então declarei as seguintes:

using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO;

No meu caso utilizei as listadas a cima mas para seguir o exemplo do livro também é necessário declarar a seguinte namespace para utilizar o Trace:

using System.Diagnostics;

Com isso fiz a seguinte alteração no codigo, troquei o Trace.WriteLine por Console.WriteLine, assim consigo ver todos os resultados no console, quando o Trace aparece apenas no output do debug.

Como a classe é meio grande vou fatiar em pedaços para ficar mais claro mas fica o link para baixar o codigo.

A estrutura inicial da classe é a seguinte:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO;

namespace TCP_UDP_Server
{
    public class TCPServer
    {
        private TcpListener listener = null;
        private IPAddress address;
        private int port;
        private bool listening = false;
        private object _syncRoot;

        public TCPServer(IPAddress address, int port)
        {
            this.address = address;
            this.port = port;
            _syncRoot = this;
        }

        public void Listen()
        {
            //CODE HERE
        }

        public void StopListening()
        {
            if (listening)
            {
                lock (_syncRoot)
                {
                    listening = false;
                    listener.Stop();
                }
            }
        }

        private void ProcessClient(object client)
        {
            //CODE HERE
        }

        public IPAddress Address
        {
            get { return address; }
        }

        public int Port
        {
            get { return port; }
        }

        public bool Listening
        {
            get { return listening; }
        }
    }
}

No método Listen() é criado uma escuta para o endereço e a porta configurada. Após isso fica escutando a porta por mensagens do client(o client não vou comentar nesse post, vou criar outro só para explicar sua funcionalidade).

try
{
    lock (_syncRoot)
    {
        listener = new TcpListener(address, port);
        listener.Start();
        listening = true;
    }

    do
    {
        Console.Write("Looking for someone to talk to... ");

        TcpClient newClient = listener.AcceptTcpClient();
        Console.Write("Connected to new client");

        ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessClient), newClient);

    } while (listening);
}
catch (SocketException se)
{
    Console.WriteLine("SocketException: ", se.ToString());
}
finally
{
    StopListening();
}

E no método ProcessClient() é recebido o pacote e transformado em uma string. Ao receber os dados retorna uma mensagem para o client avisando o recebimento.

TcpClient newClient = (TcpClient)client;
try
{
    byte[] bytes = new byte[1024];
    StringBuilder clientData = new StringBuilder();

    using (NetworkStream ns = newClient.GetStream())
    {
        ns.ReadTimeout = 60000;
        int bytesRead = 0;
        do
        {
            try
            {
                bytesRead = ns.Read(bytes, 0, bytes.Length);
                if (bytesRead > 0)
                {
                    clientData.Append(Encoding.ASCII.GetString(bytes, 0, bytesRead));
                    ns.ReadTimeout = 3000;
                }
            }
            catch (IOException ioe)
            {
                Console.WriteLine("Read time out: "+ ioe.Message);
                bytesRead = 0;
            }
        } while (bytesRead > 0);

        Console.WriteLine("Client says: " + clientData.ToString());

        bytes = Encoding.ASCII.GetBytes("Thanks call again!");

        ns.Write(bytes, 0, bytes.Length);
    }
}
finally 
{
    if (newClient != null)
        newClient.Close();
}

sexta-feira, maio 21, 2010

PAC MAN!

Pacman completa 30 anos, e o google não podia ficar de fora. Criou uma versão comemorativa do game na tela inicial. Eu como sou viciado em games não pude deixar de dar uma conferida no game. Para quem não conhece ou nunca jogou fica uma imagem da versão original, ou umas dela.

quinta-feira, abril 22, 2010

Bordas usando apenas CSS

Li em algum artigo sobre como fazer bordas sem usar javascript ou imagem. Achei interessante e útil então vou deixar arquivado aqui. Vou ficar devendo o link, mas assim que achar posto aqui.

A técnica é simples, basta criar divs ou outro elemento com margens diferentes na parte superior e inferior do conteúdo. De forma que uma margem fique menor ou maior que a outra gradativamente.

O CSS fica assim:

/*ROUNDED BORDER DIV*/
#Borda h1, #Borda h2, #Borda p {margin:0 10px; letter-spacing:1px; padding:0;}
#Borda h1 {font-size:2.5em; color:#fff;}
#Borda h2 {font-size:2em;color:#06a; border:0;}
#Borda p {padding-bottom:0.5em;}
#Borda h2 {padding-top:0.5em;}
#Borda {background: transparent;}

.xtop, .xbottom {display:block; background:transparent; font-size:1px;}
.xb1, .xb2, .xb3, .xb4 {display:block; overflow:hidden;}
.xb1, .xb2, .xb3 {height:1px;}
.xb2, .xb3, .xb4 {background:#E5E5E5; border-left:1px solid #CCC; border-right:1px solid #CCC;}
.xb1 {margin:0 5px; background:#CCC;}
.xb2 {margin:0 3px; border-width:0 2px;}
.xb3 {margin:0 2px;}
.xb4 {height:2px; margin:0 1px;}

.Conteudo {display:block; background:#E5E5E5; border:0 solid #CCC; border-width:0 1px;}


E no HTML.

<div id="Borda">
    <b class="xtop">
        <b class="xb1"></b>
        <b class="xb2"></b>
        <b class="xb3"></b>
        <b class="xb4"></b>
    </b>
    <div class="Conteudo">
        CONTENT
    </div>
    <b class="xbottom">
        <b class="xb4"></b>
        <b class="xb3"></b>
        <b class="xb2"></b>
        <b class="xb1"></b>
    </b>
</div>

terça-feira, janeiro 26, 2010

ASP.NET e C# definindo a cultura do site

Para definir a cultura, basta colocar o codigo abaixo no web config.
<system.web>
    <globalization requestEncoding="iso-8859-1" responseEncoding="iso-8859-1" culture="pt-br" uiCulture="pt-br"/>
</system.web>
Caso não funcione, tente fazer um override no método abaixo para forçar a cultura. Se funcionar provavelmente a cultura está sendo alterada em outro lugar.
protected override void OnLoadComplete(EventArgs e)
{
    base.OnLoadComplete(e);
    Page.Culture = "pt-br";
}
Neste caso, re-veja o código da MasterPage ou na própria pagina verifique a primeira linha no aspx onde define a herança e os vinculos.
<%@ ... Culture="pt-br" %>

terça-feira, janeiro 19, 2010

Executando um processo C# :: Code Snippet

Utilizar a System.Diagnostics e System.Security.
Process p;
Process[] processos;
processos = Process.GetProcessesByName("calc");

if (processos.Length == 0)
{
    p = new Process();
    ProcessStartInfo info = new ProcessStartInfo();
    //para executar o processo com um usuario e senha
    //info.UserName = "user";
    //info.Password = SecureString("pass");
    //info.UseShellExecute = false;
    info.FileName = "calc";
    p.StartInfo = info;
    p.Start();
}
protected SecureString SecureString(string pass)
{
    SecureString ss = new SecureString();
    foreach (char c in pass)
    {
        ss.AppendChar(c);
    }
    return ss;
}

segunda-feira, dezembro 21, 2009

Alterando o app.config

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
AppSettingsSection configSection = config.AppSettings;

try
{
    if (configSection != null)
    {
        if (configSection.IsReadOnly() == false && configSection.SectionInformation.IsLocked == false)
        {
            configSection.Settings["myKey"].Value = "newValue";
            config.Save();
        }
    }
}
catch (ConfigurationException ex)
{
    MessageBox.Show(ex.Message, "Configuration Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

terça-feira, dezembro 15, 2009

C# Process Show() Hide()

Aqui vai um código bem curto de como manipular o estado(Show/Hide) de um processo. O exemplo foi feito em uma aplicação windows e parte do código foi ocultada para simplificar.

using System.Diagnostics;
using System.Runtime.InteropServices;

namespace MyApp
{
    public partial class frmApp : Form
    {
        private const int SW_HIDE = 0;
        private const int SW_RESTORE = 9;
        private int hWnd; 

        [DllImport("User32")]
        private static extern int ShowWindow(int hwnd, int nCmdShow);

        private void btnShow_Click(object sender, EventArgs e)
        {
            //Seleciona o primeiro processo
            Process p = Process.GetProcesses()[0];
            hWnd = (int)p.MainWindowHandle;
            ShowWindow(hWnd, SW_RESTORE);
        }
    }
}
Parte do exemplo foi retirado do site C# Corner

Abaixo a tabela completa dos estados retirado do site DaniWeb:
0 SW_HIDE
1 SW_SHOWNORMAL
1 SW_NORMAL
2 SW_SHOWMINIMIZED
3 SW_SHOWMAXIMIZED
3 SW_MAXIMIZE
4 SW_SHOWNOACTIVATE
5 SW_SHOW
6 SW_MINIMIZE
7 SW_SHOWMINNOACTIVE
8 SW_SHOWNA
9 SW_RESTORE
10 SW_SHOWDEFAULT
11 SW_FORCEMINIMIZE
11 SW_MAX

quinta-feira, setembro 10, 2009

XNA Tower Defence

Tower Defence é um estilo de jogo muito conhecido na web, com muitas variações e bem aceito quando os gráficos são bons e a jogabilidade é desafiadora. Essa foi a motivação para iniciar o desenvolvimento deste jogo. Ainda sem nome e sem uma versão de testes mas em constante desenvolvimento, o objetivo é disponibilizar a versão até o fim do mês.

Gostaria de participar da produção desse jogo? Entre em contato e descreva a aérea de interesse!

Jogo: Tower Defence
Plataforma: PC e XBOX 360
Comandos: Controle do XBOX360 - Direcional esquerdo e RT
Jogadores: De 1 a 4
Pré-requisitos:
Controle XBOX 360
Ultima versão do DirectX
Microsoft XNA Framework Redistributable 3.1

segunda-feira, agosto 31, 2009

XNA Game Programming

Estou desenvolvendo um game que servirá de exemplo em meu primeiro tutorial. É coisa simples para facilitar o entendimento dos programadores iniciantes, tanto em XNA como em linguagem de programação.

Em todo caso, se alguem tiver interesse em fazer a arte ou o som do game é só entrar em contato.

Plataforma: PC e XBOX 360
Comandos: PC - setas, espaço e R, XBOX - LD, A e Y
Pré-requisitos: Ultima versão do DirectX.