Tal como tinha anunciado apresento agora a versão de um pequeno jogo que utiliza a tecnologia XNA.
Deste jogo destaco algumas funcionalidades que se podem aprender com o estudo do código fonte:
- Carregar conteúdos dentro das classes;
- Desenho de sprites;
- Atualização/reação em função do tempo/velocidade do computador;
- Utilização de som, com a ferramenta XACT3;
- Utilização de fontes para escrever no ecran;
A seguir apresento o ficheiro com o código fonte, o setup do jogo e a instalação do XNA.
Projeto e setup do jogo e do xna
sexta-feira, 17 de fevereiro de 2012
quarta-feira, 8 de fevereiro de 2012
Um jogo
Neste artigo vou apresentar um jogo desenvolvido com C# e SDL, o jogo é simples mas serve para demonstrar como utilizar a tecnologia SDL para apresentar sprites, reproduzir som e ler os inputs do utilizador através do teclado.
Os elementos gráficos e sonoros não são da minha autoria, tendo sido recolhidos de sites de partilha de arte para jogos como o opengameart.org.
Quanto ao código não é possível apresentar todo aqui mas o projeto está razoavelmente estruturado com classes para cada tipo de elemento do jogo. Praticamente em todas as classes existem dois métodos em comum que são o update e o render, o primeiro serve para atualizar o objeto e o segundo para o desenhar.
A seguir apresento uns print screens e o link para download do projeto. Deste vez inclui um setup, para o windows, feito com o InnoSetup que permite a quem pretender só jogar fazer a instalação sem se preocupar com mais nada, a não ser a crise, claro!
Tal como nos anteriores projetos feitos com o MonoDevelop funciona no Windows e no Linux. :)
Dentro em breve vou publicar uma versão do jogo feito com o C# da Microsoft e XNA 4.0.
Projeto e setup!
Os elementos gráficos e sonoros não são da minha autoria, tendo sido recolhidos de sites de partilha de arte para jogos como o opengameart.org.
Quanto ao código não é possível apresentar todo aqui mas o projeto está razoavelmente estruturado com classes para cada tipo de elemento do jogo. Praticamente em todas as classes existem dois métodos em comum que são o update e o render, o primeiro serve para atualizar o objeto e o segundo para o desenhar.
A seguir apresento uns print screens e o link para download do projeto. Deste vez inclui um setup, para o windows, feito com o InnoSetup que permite a quem pretender só jogar fazer a instalação sem se preocupar com mais nada, a não ser a crise, claro!
Tal como nos anteriores projetos feitos com o MonoDevelop funciona no Windows e no Linux. :)
Dentro em breve vou publicar uma versão do jogo feito com o C# da Microsoft e XNA 4.0.
Projeto e setup!
quarta-feira, 25 de janeiro de 2012
User Controls no Mono (ou Widgets)
No MonoDevelop também podemos criar controlos definidos por nós, os programadores, os passos são semelhantes aos do VB.Net, sendo a principal diferença que no Mono (Gtk) os controlos são chamados de Widgets.
Primeiro passo, criar o Widget, numa solução nova escolher biblioteca (ou Library):
Depois na janela da solução escolher adicionar novo widget:
De seguida configuramos o controlo de modo que tenha o comportamento pretendido, neste exemplo vou criar um widget que utiliza um controlo calendar para permitir ao utilizador indicar uma data e através de um botão calcular os anos e dias que já passaram desde essa data, assim fica qualquer coisa como isto:
O passo seguinte é compilar, assim criamos uma DLL que devemos adicionar como referência nos projetos em que a pretendemos utilizar.
Agora criamos um pequeno exemplo com este controlo, numa solução nova, adicionamos a referência
e quando vamos editar a interface podemos ver na toolbox o nosso controlo:
Agora é só arrastar para a janela e utilizar:
Projeto do Widget e da aplicação
Primeiro passo, criar o Widget, numa solução nova escolher biblioteca (ou Library):
Depois na janela da solução escolher adicionar novo widget:
Atribuimos um nome
O passo seguinte é compilar, assim criamos uma DLL que devemos adicionar como referência nos projetos em que a pretendemos utilizar.
Agora criamos um pequeno exemplo com este controlo, numa solução nova, adicionamos a referência
e quando vamos editar a interface podemos ver na toolbox o nosso controlo:
Agora é só arrastar para a janela e utilizar:
Projeto do Widget e da aplicação
sexta-feira, 20 de janeiro de 2012
User Control no Visual Basic 2010
O Visual Basic permite a criação de controlos por parte do programador, estes controlos podem ser, posteriormente, utilizados noutros projetos.
Começamos por criar um projecto no VB:
Depois adicionamos o user control:
De seguida criamos o nosso user control adicionando componentes e código de acordo com o pretendido. Neste exemplo o user control vai apresentar um relógio analógico, assim adicionamos uma picturebox, definimos o dock em fill, adicionamos um timer com interval em 1000 (1 segundo) e colocamos o seguinte código no controlo:
Public Class Relogio
Sub hora_analogica(ByVal x As PictureBox)
Dim meiox, meioy As Integer
Dim tamanhohx, tamanhohy, tamanhomx, tamanhomy, tamanhosx, tamanhosy As Integer
Dim hora, minuto, segundo As Integer
Dim phorax, phoray, pminutox, pminutoy, psegundox, psegundoy As Integer
Dim anguloh, angulom, angulos As Double
Dim tipo_letra As New Font("Arial", 10)
Dim corp As New Pen(Brushes.Black, 2)
Dim corv As New Pen(Brushes.Red, 2)
Dim cora As New Pen(Brushes.Blue, 2)
'limpa a picturebox
x.CreateGraphics.Clear(x.BackColor)
'achar o meio da imagem
meiox = x.Width / 2
meioy = x.Height / 2
'tamanho dos ponteiros
tamanhomx = meiox
tamanhomy = meioy
tamanhosx = tamanhomx * 0.8
tamanhosy = tamanhomy * 0.8
tamanhohx = tamanhomx * 0.5
tamanhohy = tamanhomy * 0.5
'desenhar mostrador
'12 horas
anguloh = ((0 / 12 * 360) - 90) * Math.PI / 180
phorax = meiox + Math.Cos(anguloh) * tamanhomx
phoray = meioy + Math.Sin(anguloh) * tamanhomy
x.CreateGraphics.DrawString("12", tipo_letra, Brushes.Black, phorax, phoray)
'6 horas
anguloh = ((6 / 12 * 360) - 90) * Math.PI / 180
phorax = meiox + Math.Cos(anguloh) * tamanhomx
phoray = meioy + Math.Sin(anguloh) * tamanhomy
x.CreateGraphics.DrawString("6", tipo_letra, Brushes.Black, phorax, phoray - 20)
' 3 horas
anguloh = ((3 / 12 * 360) - 90) * Math.PI / 180
phorax = meiox + Math.Cos(anguloh) * tamanhomx
phoray = meioy + Math.Sin(anguloh) * tamanhomy
x.CreateGraphics.DrawString("3", tipo_letra, Brushes.Black, phorax - 10, phoray)
'9 horas
anguloh = ((9 / 12 * 360) - 90) * Math.PI / 180
phorax = meiox + Math.Cos(anguloh) * tamanhomx
phoray = meioy + Math.Sin(anguloh) * tamanhomy
x.CreateGraphics.DrawString("9", tipo_letra, Brushes.Black, phorax, phoray)
'horas
hora = Now.Hour
If hora > 12 Then hora = hora - 12
anguloh = ((hora / 12 * 360) - 90) * Math.PI / 180
phorax = meiox + Math.Cos(anguloh) * tamanhohx
phoray = meioy + Math.Sin(anguloh) * tamanhohy
'ponteiro das horas
x.CreateGraphics.DrawLine(corp, meiox, meioy, phorax, phoray)
'minutos
minuto = Now.Minute
angulom = ((minuto / 60 * 360) - 90) * Math.PI / 180
pminutox = meiox + Math.Cos(angulom) * tamanhomx
pminutoy = meioy + Math.Sin(angulom) * tamanhomy
x.CreateGraphics.DrawLine(cora, meiox, meioy, pminutox, pminutoy)
'segundos
segundo = Now.Second
angulos = ((segundo / 59 * 360) - 90) * Math.PI / 180
psegundox = meiox + Math.Cos(angulos) * tamanhosx
psegundoy = meioy + Math.Sin(angulos) * tamanhosy
x.CreateGraphics.DrawLine(corv, meiox, meioy, psegundox, psegundoy)
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
hora_analogica(Me.PictureBox1)
End Sub
End Class
Depois executamos o Build do projeto, com esta tarefa concluída passamos a contar com o nosso componente na Tool Box:
Este icon só aparece se não estivermos no modo design do user control!
Feito isto podemos adicionar o nosso novo componente a qualquer formulário deste projeto do mesmo modo que se adiciona os restantes.
Se pretendermos utilizar este componente noutro projeto basta adicionar o componente criado utilizando a opção de adicionar elemento existente:
Projeto com o componente e uma aplicação que utiliza esse componente para download.
Começamos por criar um projecto no VB:
Depois adicionamos o user control:
De seguida criamos o nosso user control adicionando componentes e código de acordo com o pretendido. Neste exemplo o user control vai apresentar um relógio analógico, assim adicionamos uma picturebox, definimos o dock em fill, adicionamos um timer com interval em 1000 (1 segundo) e colocamos o seguinte código no controlo:
Public Class Relogio
Sub hora_analogica(ByVal x As PictureBox)
Dim meiox, meioy As Integer
Dim tamanhohx, tamanhohy, tamanhomx, tamanhomy, tamanhosx, tamanhosy As Integer
Dim hora, minuto, segundo As Integer
Dim phorax, phoray, pminutox, pminutoy, psegundox, psegundoy As Integer
Dim anguloh, angulom, angulos As Double
Dim tipo_letra As New Font("Arial", 10)
Dim corp As New Pen(Brushes.Black, 2)
Dim corv As New Pen(Brushes.Red, 2)
Dim cora As New Pen(Brushes.Blue, 2)
'limpa a picturebox
x.CreateGraphics.Clear(x.BackColor)
'achar o meio da imagem
meiox = x.Width / 2
meioy = x.Height / 2
'tamanho dos ponteiros
tamanhomx = meiox
tamanhomy = meioy
tamanhosx = tamanhomx * 0.8
tamanhosy = tamanhomy * 0.8
tamanhohx = tamanhomx * 0.5
tamanhohy = tamanhomy * 0.5
'desenhar mostrador
'12 horas
anguloh = ((0 / 12 * 360) - 90) * Math.PI / 180
phorax = meiox + Math.Cos(anguloh) * tamanhomx
phoray = meioy + Math.Sin(anguloh) * tamanhomy
x.CreateGraphics.DrawString("12", tipo_letra, Brushes.Black, phorax, phoray)
'6 horas
anguloh = ((6 / 12 * 360) - 90) * Math.PI / 180
phorax = meiox + Math.Cos(anguloh) * tamanhomx
phoray = meioy + Math.Sin(anguloh) * tamanhomy
x.CreateGraphics.DrawString("6", tipo_letra, Brushes.Black, phorax, phoray - 20)
' 3 horas
anguloh = ((3 / 12 * 360) - 90) * Math.PI / 180
phorax = meiox + Math.Cos(anguloh) * tamanhomx
phoray = meioy + Math.Sin(anguloh) * tamanhomy
x.CreateGraphics.DrawString("3", tipo_letra, Brushes.Black, phorax - 10, phoray)
'9 horas
anguloh = ((9 / 12 * 360) - 90) * Math.PI / 180
phorax = meiox + Math.Cos(anguloh) * tamanhomx
phoray = meioy + Math.Sin(anguloh) * tamanhomy
x.CreateGraphics.DrawString("9", tipo_letra, Brushes.Black, phorax, phoray)
'horas
hora = Now.Hour
If hora > 12 Then hora = hora - 12
anguloh = ((hora / 12 * 360) - 90) * Math.PI / 180
phorax = meiox + Math.Cos(anguloh) * tamanhohx
phoray = meioy + Math.Sin(anguloh) * tamanhohy
'ponteiro das horas
x.CreateGraphics.DrawLine(corp, meiox, meioy, phorax, phoray)
'minutos
minuto = Now.Minute
angulom = ((minuto / 60 * 360) - 90) * Math.PI / 180
pminutox = meiox + Math.Cos(angulom) * tamanhomx
pminutoy = meioy + Math.Sin(angulom) * tamanhomy
x.CreateGraphics.DrawLine(cora, meiox, meioy, pminutox, pminutoy)
'segundos
segundo = Now.Second
angulos = ((segundo / 59 * 360) - 90) * Math.PI / 180
psegundox = meiox + Math.Cos(angulos) * tamanhosx
psegundoy = meioy + Math.Sin(angulos) * tamanhosy
x.CreateGraphics.DrawLine(corv, meiox, meioy, psegundox, psegundoy)
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
hora_analogica(Me.PictureBox1)
End Sub
End Class
Depois executamos o Build do projeto, com esta tarefa concluída passamos a contar com o nosso componente na Tool Box:
Este icon só aparece se não estivermos no modo design do user control!
Feito isto podemos adicionar o nosso novo componente a qualquer formulário deste projeto do mesmo modo que se adiciona os restantes.
Se pretendermos utilizar este componente noutro projeto basta adicionar o componente criado utilizando a opção de adicionar elemento existente:
Projeto com o componente e uma aplicação que utiliza esse componente para download.
quinta-feira, 19 de janeiro de 2012
Criar e utilizar DLL no MonoDevelop
Tal como no Visual Basic também o Mono Develop permite criar DLL's a utilizar em outras aplicações.
Primeiro a DLL:
Eis o código:
using System;
using System.Collections.Generic; //namespace para as listas
namespace class_valores
{
public class valores
{
private List<int> lista;
//construtor
public valores ()
{
lista=new List<int>();
}
//construtor versao 2
public valores (int x)
{
lista=new List<int>();
lista.Add(x);
}
//destrutor
public void destroy()
{
lista.Clear();
}
//inserir um elemento
public void adiciona(int x)
{
lista.Add(x);
}
//delvove o numero de elementos
public int n_elementos()
{
return lista.Count;
}
//calcula e devolve a media
public double media()
{
double m;
int i,t;
t=0;
for(i=0;i<lista.Count;i++)
t=t+lista[i];
m=(double)t/(double)lista.Count;
return m;
}
//calcula e devolve a soma total
public int soma()
{
int t;
t=0;
foreach(int x in lista)
{
t+=x;
}
return t;
}
//devolve o maior
public int maior()
{
int m;
m=0;
if(lista.Count>0){
m=lista[0];
foreach(int x in lista){
if(x>m) m=x;
}
}
return m;
}
//devolve o menor
public int menor()
{
int m;
m=0;
if(lista.Count>0){
m=lista[0];
foreach(int x in lista){
if(x<m) m=x;
}
}
return m;
}
}
}
Agora a aplicação que vai utilizar a DLL.
Primeiro adicionamos a referência à DLL
Depois disto temos na lista das referências
Agora sim podemos inserir o código:
using System;
using Gtk;
using class_valores;
public partial class MainWindow: Gtk.Window
{
public class_valores.valores val = new class_valores.valores();
public MainWindow (): base (Gtk.WindowType.Toplevel)
{
Build ();
}
protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
Application.Quit ();
a.RetVal = true;
}
//Terminar
protected void OnButton2Clicked (object sender, System.EventArgs e)
{
val.destroy();
Application.Quit ();
//throw new System.NotImplementedException ();
}
//calcular
protected void OnButton1Clicked (object sender, System.EventArgs e)
{
int x;
x=Convert.ToInt16(this.entry1.Text);
val.adiciona(x);
this.lb_maior.Text=val.maior ().ToString();
this.lb_menor.Text=val.menor().ToString();
this.lb_soma.Text=val.soma().ToString();
this.lb_media.Text=val.media().ToString();
//throw new System.NotImplementedException ();
}
}
Primeiro a DLL:
Eis o código:
using System;
using System.Collections.Generic; //namespace para as listas
namespace class_valores
{
public class valores
{
private List<int> lista;
//construtor
public valores ()
{
lista=new List<int>();
}
//construtor versao 2
public valores (int x)
{
lista=new List<int>();
lista.Add(x);
}
//destrutor
public void destroy()
{
lista.Clear();
}
//inserir um elemento
public void adiciona(int x)
{
lista.Add(x);
}
//delvove o numero de elementos
public int n_elementos()
{
return lista.Count;
}
//calcula e devolve a media
public double media()
{
double m;
int i,t;
t=0;
for(i=0;i<lista.Count;i++)
t=t+lista[i];
m=(double)t/(double)lista.Count;
return m;
}
//calcula e devolve a soma total
public int soma()
{
int t;
t=0;
foreach(int x in lista)
{
t+=x;
}
return t;
}
//devolve o maior
public int maior()
{
int m;
m=0;
if(lista.Count>0){
m=lista[0];
foreach(int x in lista){
if(x>m) m=x;
}
}
return m;
}
//devolve o menor
public int menor()
{
int m;
m=0;
if(lista.Count>0){
m=lista[0];
foreach(int x in lista){
if(x<m) m=x;
}
}
return m;
}
}
}
Agora a aplicação que vai utilizar a DLL.
Primeiro adicionamos a referência à DLL
Depois disto temos na lista das referências
Agora sim podemos inserir o código:
using System;
using Gtk;
using class_valores;
public partial class MainWindow: Gtk.Window
{
public class_valores.valores val = new class_valores.valores();
public MainWindow (): base (Gtk.WindowType.Toplevel)
{
Build ();
}
protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
Application.Quit ();
a.RetVal = true;
}
//Terminar
protected void OnButton2Clicked (object sender, System.EventArgs e)
{
val.destroy();
Application.Quit ();
//throw new System.NotImplementedException ();
}
//calcular
protected void OnButton1Clicked (object sender, System.EventArgs e)
{
int x;
x=Convert.ToInt16(this.entry1.Text);
val.adiciona(x);
this.lb_maior.Text=val.maior ().ToString();
this.lb_menor.Text=val.menor().ToString();
this.lb_soma.Text=val.soma().ToString();
this.lb_media.Text=val.media().ToString();
//throw new System.NotImplementedException ();
}
}
No final é só correr.
quarta-feira, 18 de janeiro de 2012
Como criar e utilizar uma DLL em VB.NET
Com o Visual Basic podemos criar uma DLL com código que pretendemos reutilizar noutros projetos. Para isso devemos começar por criar um projeto do tipo Class Library
Este projeto abre um módulo do tipo class
Neste documento definimos o código e as propriedades da class:
Public Class Valores
'class que permite gerir uma lista de valores inteiros
Private lista As List(Of Integer)
'construtor
Public Sub New()
lista = New List(Of Integer)
End Sub
'construtor versão 2
Public Sub New(ByVal x As Integer)
lista = New List(Of Integer)
lista.Add(x)
End Sub
'destrutor
Public Sub Destroy()
lista.Clear()
End Sub
'inserir um elemento
Public Sub adiciona(ByVal x As Integer)
' Adiciona um elemento à class.
lista.Add(x)
End Sub
'devolve o numero de elementos
Public Function n_elementos() As Integer
Return lista.Count
End Function
'calcula e devolve a média
Public Function media() As Double
Dim m As Double
Dim i As Integer
For i = 0 To lista.Count - 1
m = m + lista(i)
Next
m = m / lista.Count
Return m
End Function
'calcula e devolve a soma total
Public Function soma() As Integer
Dim t As Integer
'ciclo for each
For Each x In lista
t = t + x
Next
Return t
End Function
'devolve o maior
Public Function maior() As Integer
Return lista.Max()
End Function
'devolve o menor
Public Function menor() As Integer
Return lista.Min()
End Function
End Class
De seguida compilamos, de preferência mudando para a versão Release:
Depois disto temos na pasta release a nossa DLL, esta deve ser adicionada ao projeto em que vai ser utilizada como uma referência:
Assim podemos utilizar a class do seguinte modo:
Imports class_valores
Public Class Form1
Dim val As New class_valores.Valores()
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim v As Integer
Try
v = Me.TextBox1.Text
Catch ex As Exception
MessageBox.Show("Erro verifique o tipo de dados!" & vbCrLf & ex.Message)
Exit Sub
End Try
'adiciona o elemento na class
val.adiciona(v)
'maior
Me.lb_maior.Text = val.maior()
'menor
Me.lb_menor.Text = val.menor()
'soma
Me.lb_soma.Text = val.soma()
'média
Me.lb_media.Text = val.media()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
val.Destroy()
End
End Sub
End Class
terça-feira, 17 de janeiro de 2012
Excepções (há delas para cada regra)
Um pequeno projecto para demonstrar o funcionamento das excepções em VB.NET (para Windows) e MonoDevelop (para Windows e Linux).
A parte mais importante do código está no click do botão verificar:
Dim n As Integer
Dim nome As String
Dim cp As String
Try
n = TextBox1.Text
nome = TextBox2.Text
cp = TextBox3.Text
If nome.Length < 3 Then
Throw New ArgumentException("Erro no preenchimento dos dados! O campo nome tem de ter pelo menos 3 caracteres.")
End If
'caso o código postal não tenha 4 caracteres iniciar uma excepção
If cp.Length <> 4 Then
Throw New ArgumentException("Erro no preenchimento dos dados! O campo código postal tem de ter 4 caracteres.")
End If
Catch ex As Exception
MessageBox.Show("Erro! " & ex.Message)
End Try
Versão C#
int n;
string nome,cp;
try{
n=Convert.ToInt16(entry1.Text);
nome=entry2.Text;
cp=entry3.Text;
if(nome.Length<3) {
throw new ArgumentException("Erro no nome. Tem de ter pelo menos 3 letras!");
}
if(cp.Length!=4){
throw new ArgumentException("Erro no codigo postal. Tem de ter 4 caracteres!");
}
}catch(Exception ex)
{
projeto_excepcoes.mensagem aviso= new projeto_excepcoes.mensagem();
aviso.Title="Erro";
aviso.texto="Erro!\n " + ex.ToString();
aviso.Run();
}
Downloads: Projecto VB Projecto MonoDevelop
Subscrever:
Mensagens (Atom)























