Ya estás familiarizado con la escritura de métodos simples para el juego Spacewar! Escribiremos algunos más y aprenderemos a clasificarlos.
Queremos añadir el método initialize a nuestra clase
SpaceWar. Por supuesto, necesitamos utilizar el System
Browser: ...menú World → Open... →
Browser...
Como recordatorio, haz lo siguiente (si es necesario mira la Figura 2.1):
Categoría de clases a la izquierda,
desplázate hacia abajo hasta la categoría Spacewar! y
selecciónala.
Clases, selecciona la clase SpaceWar.
instance para exponer
los métodos del lado de la instancia de la clase SpaceWar. Es
el comportamiento por defecto del browser de todos modos, por lo
que puedes saltarte este paso siempre que no hayas pulsado el botón
class.
Categoría de Métodos, selecciona la
categoría -- all --. Se mostrará en el panel inferior una
plantilla de código para el método:
messageSelectorAndArgumentNames "comment stating purpose of message" | temporary variable names | statements
La plantilla contiene cuatro líneas: el nombre del métdo, un comentario, una declaración de variable local y statements. Puedes seleccionar todo y borrarlo o editar línea a línea de la plantilla según necesites.
En nuestro caso, seleccionaremos todo y lo reemplazaremos con el
código fuente de SpaceWar>>initialize:
SpaceWar>>initialize "We want to capture keyboard and mouse events, start the game loop(step) and initialize the actors." super initialize. color := self defaultColor. self setProperty: #'handlesKeyboard' toValue: true. self setProperty: #'handlesMouseOver:' toValue: true. self startSteppingStepTime: self stepTime. self initializeActors
Ejemplo 5.7: Inicializar SpaceWar
Accept (s)...
El método recién creado se mostrará en el panel Métodos. También
puedes clasificarlo automáticamente: con el ratón, ve al panel
Categorías de métodos...haz clic con el botón derecho →
categorize all uncategorized (c)... (clasificar todo lo no clasificado).
En la clase
SpaceWar, añade el métodoteleport:tal y como se define en Ejemplo 5.3 y, a continuación, clasifícalo en la categoría de métodosevents.
Ejercicio 5.3: Clasificar un método
En un capítulo anterior, ofrecimos una pequeña muestra del código de detección de colisiones entre las naves espaciales y la estrella central. Se basa en un iterador, un bloque de código y un flujo de control.
Sin embargo, existen otros escenarios, como colisiones entre naves, entre torpedos y el Sol, y entre torpedos y naves.
¿Cómo escribirás el método para detectar la colisión entre las dos naves y tomar las acciones correspondiente? (Adáptalo de Ejemplo 4.23).
Ejercicio 5.5: Colisión de naves
La detección entre las dos naves y la gran cantidad posible de torpedos necesitó dos enumeradores con bloques de código anidados:
SpaceWar>>collisionsShipsTorpedoes
ships do: [:aShip |
torpedoes do: [:aTorpedo |
(aShip morphPosition dist: aTorpedo morphPosition) < 15 ifTrue: [
aShip flashWith: Color red.
aTorpedo flashWith: Color orange.
self destroyTorpedo: aTorpedo.
self teleport: aShip]
]
]
Ejemplo 5.10: Colisión entre las naves y los torpedos
El último escenario de colisión entre torpedo y sol lo dejamos como un ejercicio para ti.
Escribe el método para detectar las colisiones entre los torpedos y la estrella central y realizar la acción correspondiente. (Adáptalo desde Ejemplo 4.23 y Ejemplo 5.10.)
Ejercicio 5.6: Colisiones entre los torpedos y el Sol