You are on page 1of 10

Para concluir con este captulo, vamos a crear un escenario algo ms elaborado:

un campo de ftbol.
La clase CampoFutbol
Dentro de la carpeta escenario vamos a crear una nueva clase que
llamaremosCampoFutbol cuyo cdigo ser:
package mi.pong.escenario
{
import com.senocular.utils.KeyObject;
import flash.display.GradientType;
import flash.display.Sprite;
import flash.display.Stage;

/**
* ...
* @author ASL
*/
public class CampoFutbol extends Escenario
{
private var verdeG1_1:uint = 0x01B101;
private var verdeG1_2:uint = 0x02D202;
private var verdeG2_1:uint = 0x25FC25;
private var verdeG2_2:uint = 0x00FB00;

public function CampoFutbol(stage:Stage, keyObject:KeyObject)
{
super(stage, keyObject);
}

public override function creaEscenario()
{
var nZonas:uint = 8;
var anchoZona:Number = stageRef.stageWidth / nZonas;

for (var i:uint = 0; i < nZonas; i++) {
var zona:Sprite = creaZona(i, anchoZona);
zona.y = 0;
zona.x = (stageRef.stageWidth / nZonas) * i;
addChild(zona);
}

dibujaLineas();
}

private function creaZona(i:uint, anchoZona:Number):Sprite
{
var zona:Sprite = new Sprite();
if ( i % 2 != 0)
zona.graphics.beginGradientFill(GradientType.LINEAR, [verdeG1_1,
verdeG1_2], [1, 1], [0, 255]);
else
zona.graphics.beginGradientFill(GradientType.LINEAR, [verdeG2_1,
verdeG2_2], [1, 1], [0, 255]);

zona.graphics.drawRect(0, 0, stageRef.stageWidth / 8,
stageRef.stageHeight);
zona.graphics.endFill();
return zona;
}

private function dibujaLineas():void
{
var margen:Number = 15;
var anchoLinea:Number = 5;
var linea:Sprite = new Sprite();
linea.graphics.beginFill(0xFFFFFF);
// Lnea del centro
linea.graphics.drawRect(stageRef.stageWidth / 2 - anchoLinea / 2,
margen, anchoLinea, stageRef.stageHeight - 2 * margen);
// Lneas de fondo
// Izquierda
linea.graphics.drawRect(margen, margen, anchoLinea,
stageRef.stageHeight - 2 * margen);
// Derecha
linea.graphics.drawRect(stageRef.stageWidth - margen - anchoLinea,
margen, anchoLinea, stageRef.stageHeight - 2 * margen);
// Lneas de banda
// Superior
linea.graphics.drawRect(margen, margen - anchoLinea,
stageRef.stageWidth - margen * 2, anchoLinea);
// Inferior
linea.graphics.drawRect(margen, stageRef.stageHeight - margen,
stageRef.stageWidth - margen * 2, anchoLinea);
linea.graphics.endFill();
addChild(linea);

// Crculo central
var centro:Sprite = new Sprite();
var radioCentro:Number = stageRef.stageHeight / 3;
centro.graphics.beginFill(0xFFFFFF);
centro.graphics.drawEllipse(stageRef.stageWidth / 2 - radioCentro /
2, stageRef.stageHeight / 2 - radioCentro / 2, radioCentro,
radioCentro);
centro.graphics.drawEllipse(stageRef.stageWidth / 2 - radioCentro /
2 + anchoLinea, stageRef.stageHeight / 2 - radioCentro / 2 +
anchoLinea, radioCentro - anchoLinea*2, radioCentro - anchoLinea*2);
centro.graphics.endFill();
addChild(centro);
}

}

}


Dos cosas importantes en este cdigo:
- La clase CampoFutbol es heredera de la clase Escenario, con lo cual, hereda
todas sus funciones. Sin embargo, nosotros queremos redefinir una de las
funciones:creaEscenario, porque queremos que la creacin de este escenario sea
distinta a la del padre. Para realizar este cometido utilizamos la palabra
clave override, que sobreescribe al mtodo del padre. Es decir, ser este
mtodo el que se utiliza y no el heredado.
- Todas las funciones utilizadas en el atributo graphics corresponden a mtodos de
dibujado que proporciona Flash. Podis encontrar ms informacin aqu.
Ahora, para verlo en accin, ve a la clase Main y cambia la clase al escenario:
var escenario:Escenario = new CampoFutbol(stage, key);

Nuestro marcador Flash
Para la creacin de nuestro marcador, vamos a utilizar nicamente
un texto dinmico de Flash, que variar segn vare el nmero de
goles de cada jugador.
As que, creamos un nuevo smbolo en Flash: men Insertar -> Nuevo
smbolo De nombre Marcador y de tipo Clip de pelcula. De
momento, como an no la hemos creado, no asociamos el smbolo con
ninguna clase ActionScript.
Ahora, escogemos la Herramienta de Texto (T), clickamos en el
centro de nuestro smbolo recin creado y escribimos un 0.
En la ventana propiedades, hemos de asegurarnos de que es un Texto
dinmico (lo cual nos permitir variarlo mientras se est
ejecutando Flash. Como nombre de instancia (que nos servir para
acceder al texto desde cdigo ActionScript)
escribimos puntuacion_text.
Puedes escoger el formato que quieras para el texto. Yo he elegido
como Familia:Tahoma; Estilo: Regular; Tamao: 30.0
pt y Color: Blanco.
Y ya tenemos nuestro marcador.
Cdigo del marcador
En FlashDevelop, creamos una clase llamada Marcador dentro de la
carpeta objeto, pero fuera de colisionable y colsionador. El
cdigo ActionScript para Marcador ser el siguiente:
1
2
3
4
5
6
7
8
9
package mi.pong.objeto
{
import flash.display.MovieClip;
import flash.display.Stage;

/**
* ...
* @author ASL
*/
public class Marcador extends MovieClip
{
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
protected var id:uint; // Identificador para el marcador, normalmente el nmero de jugador
protected var puntuacion:int = 0;

/**
* Constructor del Marcador.
* @param stage Stage de referencia.
* @param id_jugador Jugador al que representa.
*/
public function Marcador(stage:Stage, id_jugador:uint)
{
id = id_jugador;
iniciaPosicion(stage);
}

/**
* Establece una nueva puntuacin en el marcador.
* @param nueva_puntuacion Nueva puntuacin.
*/
public function setPuntuacion(nueva_puntuacion:int)
{
puntuacion = nueva_puntuacion;
puntuacion_text.text = puntuacion.toString();
}

/**
* Suma la puntuacin a la ya acumulada.
* @param acum_puntuacion Puntuacin a sumar.
*/
public function sumaPuntuacion(acum_puntuacion:int)
{
puntuacion += acum_puntuacion;
puntuacion_text.text = puntuacion.toString();
}

/**
* Inicia la posicin del marcador, en relacin a un Stage de
* referencia.
* @param stage Stage de referencia.
*/
public function iniciaPosicion(stage:Stage)
{
puntuacion_text.text = puntuacion.toString();
var separacion:uint = 15;
x = (stage.stageWidth / 2) + ((this.width + separacion) * id) - (this.width + separacion) / 2;
y = width / 2 + separacion;
}

}
}

56
57
58
59
60
61

- Para cambiar el texto del marcador que hemos creado en Flash,
utilizamospuntuacion_text.text. Recuerda que puntuacion_text es el nombre que
dimos a la instancia de texto dinmico en el marcador.
Aadiendo los marcadores al escenario
Lo primero, en la clase Escenario creamos un Vector que albergue los
maracadores:
1
protected var marcadores:Vector.<Marcador>;
Y modificamos el constructor:
1
2
3
4
5
6
7
8
9
10
11
12
13
public function Escenario(stage:Stage, keyObject:KeyObject)
{
stageRef = stage;
key = keyObject;
colisionables = new Vector.<IColisionable>;
colisionadores = new Vector.<IColisionador>;
marcadores = new Vector.<Marcador>;
creaPongs(2);
creaMarcadores(2);
creaEscenario();
creaBolas(1);
addEventListener(Event.ENTER_FRAME, bucle, false, 0, true);
}
dnde, aparte de crear el Vector de marcadores, adems llamamos a la nueva
funcincreaMarcadores cuya definicin es la siguiente:
1
2
3
4
/**
* Aade un nmero de marcadores al escenario.
* @param num_marc Nmero de marcadores.
*/
public function creaMarcadores(num_marc:uint)
5
6
7
8
9
10
11
12
13
{
for (var i:uint = 0; i < num_marc; i++)
{
var marcador:Marcador = new Marcador(stageRef, i);
stageRef.addChild(marcador);
marcadores.push(marcador);
}
}
Y ahora, recuerdas que en GolEvent tenamos un atributo lado que indicaba
dnde se produjo el gol? Pues ha llegado el momento de utilizarlo. Podemos
borrar el contenido de la funcin golAnotado en Escenario y cambiarlo por este
otro:
1
2
3
4
5
6
7
8
/**
* Tratamiento tras que se produza un evento.
* @param e El evento producido.
*/
public function golAnotado(e:GolEvent)
{
marcadores[e.lado].sumaPuntuacion(1);
}
- marcadores[e.lado]: Tenemos dos marcadores dentro del Vector. Uno en la
posicin 0 y otro en la posicin 1. Cmo decidimos dnde sumar puntuacin?
Con el atributo antes mencionado.
Y ya tenemos los marcadores funcionando.

You might also like