Uma janela Carbon com OpenGL no MAC OSX

Olá pessoal, depois de procurar bastante sobre o assunto, descobri que para criar uma janela OpenGL no MAC OSX existem duas formas, usando o Carbon ou o Cocoa. Até aí sem muitas novidades, porém, é legal ficar atento que para desenvolver com Cocoa é necessário que se faça pelo menos algum código em Objective-C, que para alguns (eu) é um pânico geral, já o Carbon, biblioteca que já vem sendo utilizado antes do OSX e inclusive é utilizado pelo Cocoa, é possível desenvolver totalmente em C++.

Screen shot 2010-07-05 at 22.19.42

A Apple, talvez para forçar a utilização do Cocoa e do seu Objective-C, removeu os templates de uma aplicação Carbon das novas versões do XCode, e para criar um projeto utilizando o dito cujo junto com o OpenGL virou uma tarefa não tão simples como deveria. Mas, se você é que nem eu, que prefere manter seu jogo todo em C++, vou anexar um código básico de criação de janela no Carbon e contexto no OpenGL.

/*
 Exemplo retirado de http://luizpestana.gamedev.com.br/
 Desenvolvido por: Luiz Pestana
 Use da forma que quiser! =)
 */
#include <Carbon/Carbon.h>
#include <OpenGL/gl.h>
#include <Agl/agl.h>

// Algumas variaveis globais (Gambi!)
WindowRef window;
AGLContext openGLContext;
float colorRGB = 0;

// Callback para eventos do teclado:
OSStatus WindowOSXKeyHandle(EventHandlerCallRef eventhandler, EventRef event, void *userdata)
{
	OSStatus result = eventNotHandledErr;
	HICommand command;
	UInt32 eventClass, eventKind;
	char keyCode;

	eventClass = GetEventClass(event);
	eventKind = GetEventKind(event);

	switch (eventClass)
	{
		case kEventClassKeyboard:
			switch(eventKind)
			{
				case kEventRawKeyDown:
					GetEventParameter(event, kEventParamKeyMacCharCodes, typeChar, nil, sizeof(keyCode), nil, &keyCode);
					if (keyCode == 27) QuitApplicationEventLoop();
					break;
			}
			break;
	}

	return result;
}

// Callback para evento do timer:
void WindowOSXMainLoop(EventLoopTimerRef theTimer, void* userData)
{
	// Não deixa o MAC entrar em espera
	UpdateSystemActivity(UsrActivity);

	glClearColor(0.0F, 0.0F, 1.0F, 1.0F);
	glClearDepth( 1.0F );

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	

	glLoadIdentity();

	// Desenhando qualquer coisa no OpenGL
	glBegin(GL_TRIANGLES);
		glColor3f(sin(colorRGB), cos(colorRGB), sin(colorRGB)*cos(colorRGB));
		glVertex3f( 0.0f, 1.0f, 0.0f);
		glVertex3f(-1.0f,-1.0f, 0.0f);
		glVertex3f( 1.0f,-1.0f, 0.0f);
	glEnd();

	colorRGB += 0.001f;

	aglSwapBuffers(openGLContext);
}

// Procedimento de entrada:
int main(int argc, char* argv[])
{
	// Criando a Janela Carbon
	Rect windowRect;
	int	windowAttributes;

	SetRect(&windowRect, 10, 60, 800, 600);

	windowAttributes = kWindowStandardHandlerAttribute | kWindowCloseBoxAttribute | kWindowCollapseBoxAttribute | kWindowResizableAttribute | kWindowStandardDocumentAttributes;

	CreateNewWindow(kDocumentWindowClass, windowAttributes, &windowRect, &window);

	// Cor do fundo, não precisa, pois vamos desenhar com o OpenGL
	SetThemeWindowBackground(window, kThemeBrushBlack, true);

	// Definindo o título
	CFStringRef titleRef = CFStringCreateWithCString( kCFAllocatorDefault, "AnimaOSTest", kCFStringEncodingASCII);
	SetWindowTitleWithCFString(window, titleRef);

	// Instalando o responsavel por responder a todos os eventos padroes
	EventTargetRef target = GetWindowEventTarget(window);
	InstallStandardEventHandler(target);

	// Instalando o responsavel por responder a alguns eventos de teclado
	const EventTypeSpec kWindowEvents[] =
	{
		{ kEventClassCommand, kEventCommandProcess },
		{ kEventClassKeyboard, kEventRawKeyDown },
		{ kEventClassKeyboard, kEventRawKeyUp },
		{ kEventClassKeyboard, kEventRawKeyModifiersChanged }
	};
	EventHandlerUPP handlerUPP = NewEventHandlerUPP(WindowOSXKeyHandle);
	InstallWindowEventHandler(window, handlerUPP, GetEventTypeCount(kWindowEvents), kWindowEvents, NULL, NULL );

	// Instalando o responsavel por responder a um evento periodico
	EventLoopRef mainLoop = GetMainEventLoop();
	EventLoopTimerRef mainLoopTimer = nil;
	EventLoopTimerUPP timerUPP = NewEventLoopTimerUPP(WindowOSXMainLoop);
	InstallEventLoopTimer(mainLoop, kEventDurationNoWait, kEventDurationMillisecond, timerUPP, nil, &mainLoopTimer);
	DisposeEventLoopTimerUPP(timerUPP);

	// Mostra a janela
	ShowWindow(window);

	// Definindo um formato de pixel e um contexto OpenGL
	static GLint glAttributes[] =
	{
		AGL_DOUBLEBUFFER,	GL_TRUE,
		AGL_RGBA,			GL_TRUE,
		AGL_DEPTH_SIZE,		16,
		AGL_NONE
	};

	AGLPixelFormat openGLFormat = aglChoosePixelFormat(NULL, 0, glAttributes);
	if(openGLFormat == NULL)
		return 1;

	openGLContext = openGLContext = aglCreateContext(openGLFormat, NULL);
	if(openGLContext == NULL)
		return 1;

	aglDestroyPixelFormat(openGLFormat);

	aglSetDrawable(openGLContext, GetWindowPort(window));
	aglSetCurrentContext(openGLContext);

	// Entrando no loop infinito da aplicacao
	RunApplicationEventLoop();
}

Ah, e mais um detalhe, para fazer esse código funcionar, é necessário configurar o projeto de forma a não usar o Cocoa mas criar um aplicativo “.app”, e isso pode ser difícil, caso não tenha experiência com as variáveis de configuração do XCode. Por isso, faça download desse projeto básico aqui, e comece a desenvolver à partir dele, caso queira. Download: CarbonOpenGL.zip

, , , , ,

Nenhum comentário.

Home Theater Samsung on Protect Mode (HT-Z310)

Recentemente, meu Home Theater Samsung modelo HT-Z310 entrou no modo de proteção (Protection Mode), que ao ligar, mostra a mensagem PROTECT e desliga instantaneamente. Tentei atualizar o firmware e nada, levei em uma assistência autorizada da Samsung e não conseguiram descobrir qual era o problema pois estava “intermitente”.

IMG_0447

Normalmente, quando essa mensagem é mostrada, existe algum problema que o dispositivo se protege de um possível dano maior, talvez irreversível.

- A primeira coisa que devemos testar, é se algum dos cabos externos estão invertidos ou causando algum curto, para isso, desligamos tudo do HT, desligamos o HT segure o STOP até a luz do power piscar (essa função apaga a memória do aparelho), ligue o HT e verifique se a mensagem continua aparecendo, caso não, tente ligar cabo por cabo até detectar qual está causando o problema;

- Se mesmo sem nenhum cabo, o HT continuar em PROTECT, é necessário abri-lo e verificar se o problema está na placa de amplificação (que normalmente é onde apresenta problemas), para isso, retire o cabo flat cinza, q liga a placa da esquerda com a da direita, e ligue o HT, não deverá aparecer a mensagem PROTECT, então, já sabemos que o problema é na placa da direita.

IMG_0454

- Retire o cooler (ventilador) e teste se está funcionando, para isso, ligue em alguma fonte externa;

- Analise os capacitores de cor vermelha, caso algum esteja visivelmente estourado, é necessário uma substituição (mais detalhes nesse blog [link]);

- Caso todas ainda continue apresentando o problema, retire a placa de amplificação e isole com fita isolante alguns pontos que podem estar causando curto no aparelho, como na foto:

IMG_0452

No meu caso, as soldas do slot que recebe os fios de alimentação estavam entrando em contato com a carcaça do aparelho, dando curto, e até visivelmente marcando a lata em preto.

IMG_0453

Espero que tenha ajudado, pois sem custo algum, resolvi o problema.

, , , , , , , ,

1 Comentário

Dica de C++: Vetor ou Lista de objetos diferentes

Hoje me perguntaram sobre vetores em C++, eles são cruciais em um jogo qualquer, para podermos dar quantidade a nossos objetos, sendo eles, inimigos, jogadores, armas, tiros, bolas, caixas… e etc…

É muito facil utiliza-los, porém a pergunta é um pouco mais avançada que sua simples utilização. Será possível utilizar um só vetor para objetos de classes diferentes?

A resposta é, sim, podemos utilizar de forma simplista, herança simples e um vetor para a classe mãe. Assim com um cast básico, podemos retornar objetos diferentes em um só vetor.

#include <iostream>
#include <vector>

// Classe Mãe
class Inimigo {
public:
   int life;
};

// Classe Filha
class Monstro : public Inimigo {
public:
   int tentacles;
};

// Classe Filha
class Zumbi : public Inimigo {
public:
   int arms;
};

int main (int argc, char * const argv[]) {
   // Vetor de objetos da classe mãe (ou filhos)
   std::vector<Inimigo*> inimigos;

   // Criando um objeto filho
   Monstro* louco = new Monstro();
   louco->life = 10;

   // Incluindo objeto filho no vetor
   inimigos.push_back(louco);

   // Criando outro objeto filho
   Zumbi* morto = new Zumbi();
   morto->life = 5;

   // Incluindo outro objeto filho no vetor
   inimigos.push_back(morto);

   // Resgatando o objeto filho do vetor
   louco = (Monstro*)inimigos.at(0);
   louco->tentacles = 3;

   // Resgatando outro objeto filho do vetor
   morto = (Zumbi*)inimigos.at(1);
   morto->arms = 2;

   // Imprimindo propriedades dos objetos
   std::cout << louco->life << "\n" << louco->tentacles << "\n";
   std::cout << morto->life << "\n" << morto->arms << "\n";

   return 0;
}

PS: Nesse exemplo, eu sei a posição certa de cada classe de objeto, mas poderia ser diferente, tomem cuidado

Nenhum comentário.

Rodando um Hello World no iPhone com XNA Touch

Olá pessoal, com ajuda do meu amigo José Antônio (mais conhecido como Jalf da comunidade SharpGames), consegui rodar o exemplo do XNA Touch no iPhone. É muito fácil. Para isso, você precisa necessariamente de um Mac com OS X e alguma determinação.

Veja uma tela para você se animar:

Picture-1

Mão na massa, para começar, é necessário instalar algumas coisas, sigam a ordem:

- Apple iPhone SDK (clique aqui);
- Mono Framework for Mac OS X (clique aqui);
- Mono Develop for Mac OS X (clique aqui);
- Mono Touch Trial (clique aqui);

Instalando isso tudo, precisamos baixar o XNA Touch, acessando esse site clicando aqui e depois em Download.

Descompacte o arquivo e você vai ter a pasta do XNA Touch com a estrutura:

- Samples (pasta de exemplos de como utilizar)
- StarterKits (jogos pré-prontos)
- XNATouch.Framework (arquivos do XNA Touch)

Abra o Mono Develop na sua pasta de aplicativos e em “Open a Solution” procure a pasta que você descompactou, selecione “Visual Studio Solution” para conseguir abrir o arquivo .SLN da raiz.

Aberta a solução, vá na pasta (dentro do Mono Develop) StarterKits e com o segundo botão no AlienGame, selecione a opção “Run Item”.

Pronto, agora o jogo deve abrir o simulador de iPhone e você pode sair matando aliens!

Agora se você já possui um jogo em XNA e quer portar, a dica do Jalf é a seguinte, crie um novo projeto com um arquivo desse conteúdo:

using MonoTouch.Foundation;
using MonoTouch.UIKit;
using XnaTouch;
using XnaTouch.Samples;
using XnaTouch.Samples.Storage; 

namespace XnaTouch.Samples.Storage
{
   [Register ("AppDelegate")]
   class Program : UIApplicationDelegate
   {
      private Game1 game; 

      public override void FinishedLaunching (UIApplication app)
      {
         // Fun begins..
         game = new Game1();
         game.Run();
      } 

      static void Main (string [] args)
      {
         UIApplication.Main (args,null,"AppDelegate");
      }
   }
}

Então, adicione todos os seus fontes já existentes para esse projeto. Você também pode adicionar “as link” se você quiser continuar mantendo uma única cópia compartilhada e substitua Microsoft.Xna.Framework por XnaTouch.Framework em todos os lugares do seu código.

Para maiores esclarecimentos, acesse: http://xnatouch.codeplex.com/!

Não deixem de me seguir no twitter, estou sempre postando novidades sobre o assunto: http://www.twitter.com/luizpestana/

Sucesso!

Nenhum comentário.

UNITY 3D agora é free!

Tentei fazer download da engine Unity no inicio da semana, mas já tinha expirado meu período de avaliação e não consegui instalar, agora veio a notícia (graças ao nosso amigo xandeck) no GameDevBR que a versão Indie agora é gratuita para uso pessoal e comercial. É uma revolução no mundo dos games!

editor-broadPara fazer download, basta acessar o link: https://store.unity3d.com/shop/

Nenhum comentário.

Facebook Connect para iPhone

Descobri esse recurso fundamental para jogos e aplicativos de iPhone jogando Tower Bloxx. Esse jogo é bem simples, o objetivo é empilhar um edifício com mais andares possível, sem deixar cair. Mas uma coisa que me chamou a atenção foi ele conectar no meu Facebook e colocar a foto dos meus amigos que já jogaram e seus respectivos records no próprio jogo, me incentivando a supera-los. Veja uma foto do game:

Tower-Bloxx-Deluxe_2

Achei que tinha sido um recurso desenvolvido para esse jogo, mas não, vi o mesmo recurso em outros jogos, como Tap Tap Revolution. Como um programador de jogos, resolvi investigar e encontrei a SDK para isso, e incrivelmente tem um vídeo que mostra que a integração não demora mais que 5 minutos.

abndck6a

Acesse o site do Facebook Developers assista o vídeo e baixe o SDK. Após isso, não deixe de implementar esse recurso super bacana em seu jogo ou app.

Nenhum comentário.

É dada a largada para a Campus Party Brasil 2010

A partir desta terça-feira, dia 20, os participantes veteranos podem se inscrever para a terceira edição brasileira do maior evento de internet, tecnologia e entretenimento em rede.

São Paulo, 20 de outubro de 2009 – A maior festa da internet brasileira já tem data marcada. Será de 25 a 31 de janeiro de 2010, no Centro de Exposições Imigrantes, em São Paulo, e os “campuseiros” veteranos que participaram das duas últimas edições podem se inscrever a partir desta terça-feira, dia 20, pelo site www.campus-party.com.br.

Até o dia 25 de outubro, os ingressos estarão no valor promocional de R$ 100,00. Os serviços de acampamento e de alimentação são opcionais e não estão inclusos no valor do ingresso. Os campuseiros de outros estados brasileiros que tem interesse em participar da terceira edição da Campus Party podem organizar caravanas para irem ao evento. Como forma de apoio, a organização da Campus Party dará 50% de desconto no valor do ingresso.

Sobre a Campus Party

Criada na Espanha em 1997, a Campus Party transformou-se, em 12 anos de existência, no maior evento mundial que integra tecnologia, conteúdo digital e entretenimento em rede. Os participantes mudam-se com seus computadores, malas e barracas para dentro de uma arena, onde se conectam a uma rede super veloz e convivem em torno de oficinas, palestras, conferências, competições e atividades de lazer.

Em sua terceira edição no Brasil, a Campus Party se consolida como o principal ponto de encontro físico das redes sociais da internet interativa, proporcionando aos visitantes a troca livre de conteúdos, as últimas novidades tecnológicas e o compartilhamento de experiências ligadas ao mundo digital. Participam do encontro estudantes, professores, cientistas, jornalistas, pesquisadores, artistas, empresários e milhares de visitantes amantes da tecnologia e internet.

SERVIÇO:

Campus Party Brasil

3ª Edição
De 25 a 31/01/2010
Centro de Exposições Imigrantes
Rodovia dos Imigrantes, km 1,5
São Paulo – SP

Inscrições

Pelo site www.campusparty.com.br
Preço do Ingresso: R$ 140,00
Camping (opcional): R$ 15,00
Pacote Alimentação (opcional): valor será informado posteriormente.

Promoção

De 20/10 a 25/10, para campuseiros veteranos (que participaram em 2008 e 2009), o valor do ingresso será de R$ 100,00.

Acompanhe!

Site: www.campusparty.com.br
Blog: www.campus-party.com.br/blogoficial
Twitter: www.twitter.com/cpbrasil
Youtube: www.youtube.com/campusparty
Facebook: www.facebook.com/campuspartybrasil
Orkut: www.orkut.com.br/Main#Community?cmm=30937933

Nenhum comentário.

Como se inscrever na Campus Party Brasil 2010

Olá pessoal,

Devido a muitas dúvidas, criei um tutorial para se inscrever na Campus Party 2010, e assim, não ficar de fora do maior evento de internet e redes sociais do mundo.

1 – Acesse o site: http://www.campus-party.com.br/, se você não possui um registro, clique em “Cadastre-se”, se já possui, digite seu email, senha, clique em “Login” e pule para a etapa 6:

Picture 0

2 – Leia as dicas e clique no botão “Cadastro” no topo do texto:

Picture 10

3 – Leia os termos e clique em “Aceito” caso esteja de acordo:

Picture 11

4 – Digite seu RG e EMAIL, clique em “Confirmar”:

Picture 12

5 – Complete seus dados e clique em “Cadastrar”:

Picture 13

6 – Após estar dentro do sistema, clique no botão azul ou no link escrito “Campus”:

Screen shot 2009-10-21 at 11.42.02

7 – Logo após, caso não tenha um código promocional, clique em “Pagamento” bem abaixo da foto:

Picture 1

8 – Selecione sua Zona Temática e logo após a Área de Conteúdo:

Picture 2

9 – Marque as opções de serviços que deseja contratar e clique em “Confirmar Serviços”:

Picture 3

10 – Clique no banner do PagSeguro para abrir um PopUp (Verifique se seu navegador não tenha bloqueado o PopUp):

Picture 4

11 – Quando abrir o PopUp do PagSeguro, escolher o método de pagamento, no meu caso Boleto:

Picture 5

12 – Verifique as informações de pagamento e clique em continuar:

Picture 6

13 – O PopUp do boleto deve abrir, caso tenha escolhido outro método de pagamento, a tela do cartão deverá aparecer (imprima):

Picture 7

14 – Quando fechar a tela do boleto, a tela do sistema mostrará essa mensagem, clique em Fechar (Cerrar):

Picture 8

15 – Para verificar se seu cadastro está pré-inscrito, clique em “Pagamento” novamente e verifique se a mensagem “Pagamento Pendente” é mostrada, se sim, basta realizar o pagamento para confirmar sua inscrição:

Picture 9

E seja bem vindo(a) ao Campus Party Brasil 2010, não se esqueça de seguir o profile oficial no Twitter e utilizar nossa tag oficial para postar:

cpartybr

7 Comentários

Seja Bem Vindo(a) ao meu Blog!

Estou criando esse novo blog para colocar as ideias em ordem. Espero que fique melhor que o antigo, pois não sou muito bom em montar blogs.

Fique à vontade de comentar em meus posts, até pq a internet é livre.

Abraços!

Nenhum comentário.

QR Code Generator v0.1b

Desenvolvi um software para gerar e ler códigos bi-dimensionais que suporta muito mais informações que um simples código de barras. O padrão QR Code é internacional, e já possui leitores específicos e programas para dispositivos móveis. Uma das utilidades que está sendo muito utilizada é para divulgar endereços e telefones em lugares onde as pessoas possivelmente não tenham muito tempo para anotar, ou apenas para facilitar esse trabalho, a pessoa simplesmente mira a câmera do celular para a imagem e a informação já está disponível para ser acessada, assim como cartões de visita e em apresentações. Testei bastante e está 100%, caso ache algum bug por favor me informe por comentário que irei corrigir assim que possivel.
Segue uma imagem do programa:

qrgenerate_banner

Para usa-lo é simples, basta digitar tudo oq você quiser colocar em “Data” e apertar “Encode”. Pronto, sua imagem está gerada e você pode salvar em arquivo ou imprimir. Para decodificar uma imagem é só utilizar o botão “Open Image” e depois a opção desejada, salvar em arquivo ou copiar para a área de transferência.

É necessário ter o framework.net 3.5 instalado, e funciona em qualquer versão do windows. E caso seja windows vista, ele poderá bloquear o programa por vir da internet, para desbloquear clique com o segundo botão e “Desbloquear”.

Bom, o programa está para download aqui, e é grátis (free). Por enquanto apenas em inglês, caso tenha muita demanda eu traduzo.

Valew!

1 Comentário

Get Adobe Flash playerPlugin by wpburn.com wordpress themes