Skip to content

Commit

Permalink
Visual inicial arreglado | Fotoboton cambiado | TEORICO.md realizado
Browse files Browse the repository at this point in the history
  • Loading branch information
AscarlatoUTN committed Oct 16, 2024
1 parent a399a8a commit e0ceb97
Show file tree
Hide file tree
Showing 9 changed files with 61 additions and 40 deletions.
Binary file added Diagrama.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
29 changes: 29 additions & 0 deletions EXPLICACION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Conceptos de Programación Orientada a Objetos

## Clases y Objetos

En el diseño del juego, las *clases* se utilizan tanto para representar tanto a los personajes como a los elementos interactivos. Por ejemplo, tenemos una clase base `Personaje`, que actúa como plantilla general para los personajes del juego, y clases específicas como `FireBoy` y `WaterGirl` que heredan de `Personaje`. De manera similar, la clase `Diamante` representa a los distintos tipos de diamantes en el juego, con subclases específicas como `DiamanteRojo` y `DiamanteAzul`, que definen características particulares.

El uso de *clases* permite organizar el código en estructuras que reflejan los elementos del juego, haciendo que cada objeto (instancia de una clase) tenga sus propias propiedades y comportamientos, como la posición en el mapa o la manera que reacciona a colisiones.

Además, gracias a las *clases*, es sencillo crear múltiples instancias de objetos iguales en diferentes lugares del juego. Por ejemplo, en un nivel podemos necesitar varios diamantes dispersos o varios botones de plataforma que el jugador debe activar. Utilizando la misma clase para todos estos elementos, podemos generarlos de manera uniforme y gestionar sus comportamientos de forma centralizada y evitando repetición de lógica.

## Herencia

La *herencia* es utilizada para crear relaciones jerárquicas entre las clases. En nuestro juego, `FireBoy` y `WaterGirl` heredan de la clase base Personaje, compartiendo atributos y métodos comunes, como `moveUp()` y `jump()`. Sin embargo, cada uno puede sobrescribir o extender estos comportamientos para adaptarse a situaciones específicas; por ejemplo, `FireBoy` podría pasar ileso a través de obstáculos de fuego, mientras que `WaterGirl` lo haría con obstáculos de agua. Esto sucede porque las subclases sobrescriben el método `tipo()`. Asimismo, las teclas empleadas para mover los personajes son diferentes, por ende debemos especificar dicho comportamiento en cada subclase particular.

Esta estructura facilita la reutilización de código, ya que los comportamientos comunes se definen en la clase base, y las subclases solo necesitan implementar las diferencias específicas. Esto hace que el sistema sea fácilmente extensible, permitiendo agregar nuevos personajes o tipos de diamantes sin necesidad de cambios drásticos en el código base.

## Polimorfismo

En el código y el contexto del juego, el *polimorfismo* se utiliza para manejar de manera uniforme objetos que comparten una estructura básica, pero responden de forma diferente a ciertos eventos del juego. Un claro ejemplo es la gestión de colisiones: en lugar de diferenciar entre diamantes, plataformas u otros personajes, se utiliza una interfaz común llamada `colision()`. Cada objeto colisionable implementa este método de manera específica, adaptándose a su comportamiento particular. Por ejemplo, mientras que `Caja` se desplaza a la par que el personaje con el que colisionó, un `Diamante` es recolectado por personajes de su mismo tipo.

Además, utilizamos referencias comunes para varios objetos, como `esAtravesable`, `esColisionable` y el método `tipo()`. Estas características compartidas permiten tratar distintos elementos del juego de manera consistente.

El *polimorfismo* también se aplica a los objetos del juego, como los diamantes. Al utilizar una clase base llamada `Diamante` y subclases específicas como `DiamanteRojo` y `DiamanteAzul`, se pueden manejar los diamantes de manera genérica en el código. Sin embargo, las diferencias en su comportamiento, como su imagen o tipo, se implementan en cada subclase. Esto facilita la incorporación de nuevos tipos de diamantes sin necesidad de modificar el código central del juego. Ocurre lo mismo con `Personaje`, `Fireboy` y `Watergirl`.

A partir de esto, apreciamos que el polimorfismo otorga flexibilidad y facilita la reutilización de código, además de tornarlo más extensible y fácil de mantener.

# Diagrama de Clases

![alt text](Diagrama.png)
9 changes: 1 addition & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,6 @@ UTN - Facultad Regional Buenos Aires - Materia Paradigmas de Programación
- Alejo Scarlato
- Elín Winter

## Capturas

![pepita](assets/golondrina.png)

## Reglas de Juego / Instrucciones

Los jugadores deben completar los niveles del mapa guiando a los dos personajes, FireBoy y WaterGirl, hacia sus respectivas puertas. Para avanzar, deben recolectar la mayor cantidad de diamantes posible y evitar obstáculos mortales que correspondan a cada personaje, como agua para FireBoy y fuego para WaterGirl.
Expand All @@ -30,7 +26,4 @@ Los jugadores deben completar los niveles del mapa guiando a los dos personajes,

- ```w``` para saltar 5 unidades.
- ```a``` para dirigirse 1 unidad a la derecha.
- ```d``` para dirigirse 1 unidad a la izquierda.



- ```d``` para dirigirse 1 unidad a la izquierda.
Binary file added assets/E_buttonn.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed assets/E_cubee.png
Binary file not shown.
4 changes: 2 additions & 2 deletions characters.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,11 @@ class Character {
method collect () {puntos += 100}

method die (){
//game.sound("S_muerte.mp3").play()
game.sound("S_muerte.mp3").play()
game.addVisual(muerte)
game.sound("S_game_over.mp3").play()
game.schedule(3000,{game.removeVisual(muerte)})
nivelActual.cleanVisuals()
nivelActual.cleanVisuals() ///
game.schedule(4000, {nivelActual.start()}) // Reiniciamos el nivel
// RESTART LEVEL1
}
Expand Down
39 changes: 21 additions & 18 deletions config.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,20 @@ import elements.*
object settings {

// ---------------------- Referencias
const niveles = [level1, level2]
const niveles = [level1]
var nivelActual = 0 // Índice del nivel actual
const fondoNuevo = new BackgroundCover()

// ---------------------- Métodos

method init (background, height, width, cellSize){
game.title("FireBoyWaterGirlGame")
game.boardGround(background)
method init(title, boardground, height, width, cellSize){
game.title(title)
game.boardGround(boardground)
game.height(height)
game.width(width)
game.cellSize(cellSize) // 1404x1044 // 39x29 = 36px
game.start()
}

method pasarSgteNivel(){

const proxNivel = nivelActual + 1
Expand Down Expand Up @@ -51,11 +50,13 @@ object settings {
class Level {

// ---------------- JUEGO PRINCIPAL
method image()
method position() = game.origin()


method start() {
//game.clear()

//game.addVisual(self)
self.setupElements() // Bloques, palancas, plataformas, etc.
self.setupDiamonds()
self.setupCharacters()
Expand Down Expand Up @@ -90,7 +91,8 @@ class Level {
object level1 inherits Level {

// --------------------- Referencias -------------------------

override method image() = "F_nivel_1.png"

// Personajes

const fireboy = new Fireboy(position = new MutablePosition (x=13, y=1), oldPosition = new MutablePosition (x=13, y=1), nivelActual = self, zonasProhibidas = zonasProhibidasFuego, invalidPositions = positions) //Depende del nivel
Expand All @@ -113,12 +115,11 @@ object level1 inherits Level {

// Plataforma Amarilla y Elementos Asociados

const extensionPlatAmarilla1 = new ExtensionPlataformaMovible(posX = 2, posY = 9)
const extensionPlatAmarilla2 = new ExtensionPlataformaMovible(posX = 3, posY = 9)
const extensionPlatAmarilla1 = new ExtensionPlataformaMovible(position = new MutablePosition(x=2, y=9))
const extensionPlatAmarilla2 = new ExtensionPlataformaMovible(position = new MutablePosition(x=3, y=9))

const plataformaAmarilla = new PlataformaMovible(
posX = 1,
posY = 9,
position = new MutablePosition(x=1, y=9),
maxAltura = 13,
minAltura = 9,
platAsocs = [extensionPlatAmarilla1, extensionPlatAmarilla2]
Expand All @@ -136,12 +137,11 @@ object level1 inherits Level {

// Plataforma Bordo y Elementos Asociados

const extensionPlatBordo1 = new ExtensionPlataformaMovible(posX = 35, posY = 13)
const extensionPlatBordo2 = new ExtensionPlataformaMovible(posX = 36, posY = 13)
const extensionPlatBordo1 = new ExtensionPlataformaMovible(position = new MutablePosition(x=35, y=13))
const extensionPlatBordo2 = new ExtensionPlataformaMovible(position = new MutablePosition(x=36, y=13))

const plataformaBordo = new PlataformaMovible(
posX = 34,
posY = 13,
position = new MutablePosition(x=34, y=13),
maxAltura = 16,
minAltura =13,
platAsocs = [extensionPlatBordo1, extensionPlatBordo2]
Expand Down Expand Up @@ -176,6 +176,7 @@ object level1 inherits Level {
}

method setupMechanicsInit(){
game.addVisual(self)
self.setupMechanics(fireboy)
self.setupMechanics(watergirl)
}
Expand Down Expand Up @@ -339,6 +340,8 @@ object level1 inherits Level {
// Pisos

positions.clear()

// game.removeVisual(self)
}

// Métodos Propios
Expand All @@ -351,9 +354,9 @@ object level1 inherits Level {
}
}

object level2 inherits Level {} // DEJENLO, NO LO SAQUEN
object level3 inherits Level {} // DEJENLO, NO LO SAQUEN
object level4 inherits Level {} // DEJENLO, NO LO SAQUEN
//object level2 inherits Level {} // DEJENLO, NO LO SAQUEN
//object level3 inherits Level {} // DEJENLO, NO LO SAQUEN
//object level4 inherits Level {} // DEJENLO, NO LO SAQUEN

object puntajes{
method position() = game.center()
Expand Down
12 changes: 4 additions & 8 deletions elements.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ class Boton {
plataformaAsoc.moveUp()
game.schedule(200, {self.colision(personaje)})
}
}
}
}

method personajeMovido(personaje) {
Expand All @@ -178,7 +178,7 @@ class Boton {
}
}

method image() = "E_cubee.png"
method image() = "E_buttonn.png"

method hastaMaxAltura() = plataformaAsoc.position().y() != plataformaAsoc.maxAltura()
method hastaMinAltura() = plataformaAsoc.position().y() != plataformaAsoc.minAltura()
Expand All @@ -188,11 +188,9 @@ class Boton {

class PlataformaMovible {

const posX
const posY
const maxAltura
const minAltura
const position = new MutablePosition(x=posX, y=posY)
const position
const unidadMovimiento = 1
const platAsocs

Expand Down Expand Up @@ -225,9 +223,7 @@ class PlataformaMovible {

class ExtensionPlataformaMovible {

const posX
const posY
const position = new MutablePosition(x=posX, y=posY)
const position

method esAtravesable() = false
method esColisionable() = true
Expand Down
8 changes: 4 additions & 4 deletions main.wpgm
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@ import config.*

program FireBoyWaterGirlGame {


const fondo = game.sound("S_fondo.mp3")
fondo.shouldLoop(true)
game.schedule(500, { fondo.play() fondo.volume(0.3)} )
// Inicial
settings.init("F_nivel_1.png", 29, 39, 36)
settings.init("FireBoyAndWaterGirl", "F_lobby.png", 29, 39, 36)

// Sonidos
level1.setupMechanicsInit()
keyboard.enter().onPressDo({level1.setupMechanicsInit()})
// Mecanica del Juego
level1.start()

keyboard.enter().onPressDo({level1.start()})


}

0 comments on commit e0ceb97

Please sign in to comment.