O sharpdevelope que eu tenho é o 5.1 e exigiu instalar o .net framework 4.5 . Eu escolhi o sharpdevelope porque ao contrario do visual studio ele é gratuito e não tem tempo pra usar. Primeiramente pra iniciar nosso projeto deve-se ir até o menu File>>New>>Solution>>>C#>>windows applications>> windows aplication, deve colocar o nome do projeto, coloquei o nome "testando". O jogo utiliza vários comandos mal explicados nos livros como a matriz
string [,] mapa = new string[100,100];
que vamos utilizar pra guardar os pedaços do mapa horizontais e verticais.
Usaremos a abertura de arquivo que precisa de um using System.IO; no inicio do projeto
string rascunho;
// utiliza o leitor de arquivo texto
using (StreamReader leitor = new StreamReader ("mapa.txt"))
{
// lê uma linha e passa para o rascunho
rascunho = leitor.ReadLine ();
leitor.Close();
}
Esse código carrega um arquivo texto (.txt) chamado "mapa.txt". esse arquivo tem que ficar localizado junto com o executável do testando em
Meus documentos>> Documentos>>SharpDevelop Projects>> testando>> testando>> Bin>> Debug>> mapa.txt. Esse arquivo deve conter o algo assim
.##############c.#c
..c##..c###.#...##.
.##...###...#.####.
.................#.
##.#####.#######.#.
#.c.##......#c...#c
##########..###..#.
##........c.#...##.
#..##########......
....c...##........#
#######.##.########
As cerquilhas serão os bloqueios, os pontos serão os caminhos livres e as letras C serão os baus a serem coletados, não esquecer de serem 11 linhas porque menos daria um erro de leitura em nosso programa.
Junto com o executável também ficará as imagens do fundo que bloqueia, dá passagem e baú.
fundo1.png (dá passagem ao personagem)
fundo2.png (faz o bloqueio do cenario)
fundo3.png (é o baú a ser coletado)
Sugiro usar um programa de desenho vetorial pra fazer as imagens ou apertar o botão PrtSc (print screen) colar no paint e recortar. Deve-se também ter cuidado com o tamanho das imagens que usaremos, todas devem ter 64x64 pixels.
Também usaremos imagens para o personagem ir para direita, esquerda, pra cima e para baixo(também junto com o executável).
persona0.png
persona1.png
persona2.png
persona3.png
O personagem será configurado a ter o fundo branco ficar transparente.
O comando que carrega essas imagens é :
Bitmap fundo1;
fundo1 = new Bitmap ("fundo1.png");
Junto com o executavel também deve estar o arquivo de som .wav. Para economizar tempo de criar um som próprio eu tirei o arquivo de som do windows que fica em
C:/Windows/Media/Campainha.wav (que é o arquivo bing.wav quando colar na pasta do executável)
Para funcionar o arquivo de som no nosso programa precisar de using System.Media; no inicio e declarar o código:
SoundPlayer som;
som = new SoundPlayer ("ding.wav");
som.Play();
Outro código indispensável é o comando Graphics que desenha um bitmap em outro bitmap, ou então um bitmap na tela do MainForm (formulário)
Bitmap telaoculta;
// desenha o bitmap fundo1 no bitmap telaoculta
Graphics gfx1 = Graphics.FromImage (telaoculta);
gfx1.DrawImage(fundo1, 10, 10);
// prepara pra desenhar no formulario
Graphics gfx2 = this.CreateGraphics();
//desenha a telaoculta no formulario
gfx2.DrawImageUnscaled(telaoculta, 0,0);
Outro código importante é usar os botões do teclado, para isso eu coloquei os códigos no método KeyDown do MainForm :
void MainFormKeyDown(object sender, KeyEventArgs e)
{
// se apertar a seta direita
if (e.KeyCode == Keys.Left )
{
som.Play();
}
}
Para finalizar os preparativos temos que:
mudar a propriedade Size do MainForm para 640,480
Colocar um Timer no projeto
colocar um label para marcar os pontos;
Pra colocar o timer e o label clique em Design (perto da aba source no meio do projeto) então clique em Tool na lateral esquerda do projeto, então em Windows Forms e procurar na lista.
Outra coisa que eu ia esquecendo é que precisaremos abrir os métodos (na barra lateral direita com um raiozinho)
void MainFormLoad(object sender, EventArgs e)
que se acrescenta no projeto clicando duas vezes no MainForm
void Timer1Tick(object sender, EventArgs e)
tick que é o único método do timer (não esqueça também de deixar Enabled true nas propriedades do timer)
void MainFormKeyDown(object sender, KeyEventArgs e)
keydown que está nos métodos do MainForm
No mainformload carregaremos tudo antes de aparecer o formulário.
No Timer1tick calcularemos os codigos em tempo real
E no MainFormKeyDown colocaremos o reconhecimento do teclado
Então vou colocar o código completo:
Espero que não esqueçam de colocar ponto e virgula no final das linhas e fechar as Chaves ({}) de cada if e for.
Começar:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using System.Media;
namespace testando
{
/// <summary>
/// Description of MainForm.
/// </summary>
public partial class MainForm : Form
{
string [,] mapa = new string[100,100];
Bitmap [] persona = new Bitmap[4];
Bitmap fundo1;
Bitmap fundo2;
Bitmap fundo3;
Bitmap telaoculta;
int posmapx;
int posmapy;
int pose;
int xperso=2;
int yperso=2;
SoundPlayer som;
int pontos;
public MainForm()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();
//
// TODO: Add constructor code after the InitializeComponent() call.
//
}
void MainFormLoad(object sender, EventArgs e)
{
fundo1 = new Bitmap ("fundo1.png");
fundo2 = new Bitmap ("fundo2.png");
fundo3 = new Bitmap ("fundo3.png");
telaoculta = new Bitmap (640,480);
//carrega o personagem
for (int i =0 ; i< 4; i++)
{
persona[i] = new Bitmap ("persona"+i+".png");
persona[i].MakeTransparent (Color.White);
}
string rascunho;
// utiliza o leitor de arquivo texto
using (StreamReader leitor = new StreamReader ("mapa.txt"))
{
for (int linha = 0 ; linha < 10; linha ++)
{
// lê uma linha e passa para o rascunho
rascunho = leitor.ReadLine ();
for (int coluna=0 ; coluna < rascunho.Length; coluna ++)
{
// coloca no mapa o que leu no rascunho
mapa[coluna+1 , linha +1] = Convert.ToString(rascunho[coluna]);
}
}
leitor.Close();
}
som = new SoundPlayer ("ding.wav");
}
void Timer1Tick(object sender, EventArgs e)
{
string tijolo;
for (int linha = 0 ; linha < 11; linha ++)
{
for ( int coluna = 0 ; coluna < 8; coluna ++)
{
tijolo = mapa [posmapx + linha, posmapy + coluna];
// prepara pra desenhar na telaoculta
Graphics gfx = Graphics.FromImage (telaoculta);
// desenha as imagems do fundo
if (tijolo =="#") {gfx.DrawImage(fundo2,linha* 64, coluna*64);}
if (tijolo == "."){gfx.DrawImage (fundo1, linha*64, coluna*64);}
if (tijolo == "c"){gfx.DrawImage(fundo3, linha*64, coluna *64);}
if (tijolo == null) {gfx.DrawImage (fundo2, linha*64, coluna*64);}
}
}
// desenha o personagem
Graphics gfx1 = Graphics.FromImage (telaoculta);
gfx1.DrawImage(persona[pose], (xperso- posmapx)*64, (yperso - posmapy)*64);
// prepara pra desenhar no formulario
Graphics gfx2 = this.CreateGraphics();
//desenha a telaoculta no formulario
gfx2.DrawImageUnscaled(telaoculta, 0,0);
// pulando a tela pro inicio
if (xperso < 9){posmapx = 0;}
if (yperso < 7){posmapy = 0;}
// pulando pra segunda tela
if (xperso >=9 && xperso <= 18){posmapx = 9;}
if (yperso >=7 && yperso <= 14){posmapy = 7;}
// pulando pra terceira tela
if (xperso >=18 && xperso <=27){posmapx = 18;}
if (yperso >=14 && yperso <=21 ){posmapy=14;}
// faz coletar o cofre
if (mapa[xperso, yperso]== "c")
{
som.Play();
mapa[xperso, yperso] = ".";
pontos = pontos +10;
label1.Text = Convert.ToString (pontos);
}
}
void Label1Click(object sender, EventArgs e)
{
}
void MainFormKeyDown(object sender, KeyEventArgs e)
{
// se apertar a seta direita
if (e.KeyCode == Keys.Left && mapa[xperso-1, yperso] != "#" && mapa[xperso-1, yperso] != null)
{
if (xperso >0){xperso = xperso -1;}
pose = 3;
}
// se apertar a seta esquerda
if (e.KeyCode == Keys.Right && mapa[xperso+1, yperso] != "#" && mapa[xperso+1, yperso] != null)
{
xperso = xperso +1;
pose = 2;
}
// se apertar a seta cima
if(e.KeyCode == Keys.Up && mapa[xperso, yperso-1] != "#" && mapa[xperso,yperso-1]!= null)
{
if (yperso >0) {yperso= yperso -1;}
pose = 0;
}
// se apertar a seta baixo
if (e.KeyCode == Keys.Down && mapa[xperso, yperso+1] !="#" && mapa[xperso, yperso+1] != null)
{
yperso = yperso +1;
pose = 1;
}
}
}
}