Skip to content

Commit

Permalink
Mejoras UX
Browse files Browse the repository at this point in the history
  • Loading branch information
fdodino committed May 25, 2024
1 parent a8699d7 commit 4b368be
Show file tree
Hide file tree
Showing 9 changed files with 267 additions and 65 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
[![Build Status](https://github.com/wollok/sokobanGame/actions/workflows/ci.yml/badge.svg)](https://github.com/wollok/sokobanGame/actions/workflows/ci.yml)


Ejemplo del juego Sokoban hecho con Wollok-Game
Ejemplo del juego Sokoban hecho con Wollok-Game. El personaje principal puede moverse hacia arriba, abajo, derecha o izquierda. Si tiene una caja puede moverla si avanzando la caja tiene un lugar libre (no tiene un lugar libre si hay otra caja o la pared).

![demo](./video/demo.gif)

35 changes: 14 additions & 21 deletions caja.wlk
Original file line number Diff line number Diff line change
@@ -1,35 +1,28 @@
import wollok.game.*
import sokoban.*

class Caja {
var property position
const property llegadas

method movete(direccion) {
self.validarLugarLibre(direccion)
self.validarLugarLibre(direccion)
position = direccion.siguiente(position)
}

method validarLugarLibre(direccion) {
const posAlLado = direccion.siguiente(position)
var lugarLibre = game.getObjectsIn(posAlLado)
.all{ obj => obj.puedePisarte(self) }

if (!lugarLibre)
throw new Exception(message = "Algo traba la caja.")
const posAlLado = direccion.siguiente(position)
const lugarLibre = game.getObjectsIn(posAlLado).all(
{ obj => obj.puedePisarte(self) }
)
if (!lugarLibre) {
throw new DomainException(message = "Algo traba la caja.", source = sokoban)
}
}

method puedePisarte(_) = false

method image() {
if (self.estaBienPosicionada())
return "caja_ok.png"

return "caja.png"
}

method estaBienPosicionada() {
return llegadas
.map{ llegada => llegada.position() }
.contains(self.position()) //TODO: Redefinir el (==) en Position!
}
}
method image() = if (self.estaBienPosicionada()) "caja_ok.png" else "caja.png"

method estaBienPosicionada() = llegadas.any({ llegada => llegada.position() == position })
}
5 changes: 3 additions & 2 deletions llegada.wlk
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@

class Llegada {
const property position

method movete(direccion) { /* No pasa naranja */ }

// No pasa naranja cuando se quiere mover
method movete(direccion) { }
method puedePisarte(_) = true
method image() = "almacenaje.png"

Expand Down
178 changes: 178 additions & 0 deletions log/wollok.log

Large diffs are not rendered by default.

105 changes: 67 additions & 38 deletions niveles.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -5,49 +5,78 @@ import llegada.*
import wollok.game.*

object nivel1 {

method cargar() {

// PAREDES
// PAREDES
const ancho = game.width() - 1
const largo = game.height() - 1

var posParedes = []
(0 .. ancho).forEach{ n => posParedes.add(new Position(x=n, y=0)) } // bordeAbajo
(0 .. ancho).forEach{ n => posParedes.add(new Position(x=n, y=largo)) } // bordeArriba
(0 .. largo).forEach{ n => posParedes.add(new Position(x=0, y=n)) } // bordeIzq
(0 .. largo).forEach{ n => posParedes.add(new Position(x=ancho, y=n)) } // bordeDer

posParedes.addAll([new Position(x=3,y=5), new Position(x=4,y=5), new Position(x=5,y=5)])
posParedes.addAll([new Position(x=1,y=2), new Position(x=2,y=2),new Position(x=6,y=2), new Position(x=7,y=2)])
posParedes.addAll([new Position(x=1,y=1), new Position(x=2,y=1),new Position(x=6,y=1), new Position(x=7,y=1)])

posParedes.forEach { p => self.dibujar(new Pared(position = p)) }
const posicionesParedes = []
(0 .. ancho).forEach(
{ n => posicionesParedes.add(new Position(x = n, y = 0)) }
) // bordeAbajo

// LLEGADAS
var llegadas = [new Position(x=4, y=4), new Position(x=4, y=3),new Position(x=4, y=2), new Position(x=4, y=1)]
.map{ p => self.dibujar(new Llegada(position = p)) }

// CAJAS
var cajas = [new Position(x=2, y=4), new Position(x=6, y=4), new Position(x=4, y=2), new Position(x=5, y=2)]
.map{ p => self.dibujar(new Caja(position = p, llegadas = llegadas)) }

// SOKOBAN

game.addVisual(sokoban)

// TECLADO
keyboard.up().onPressDo{ sokoban.irArriba() }
keyboard.down().onPressDo{ sokoban.irAbajo() }
keyboard.left().onPressDo{ sokoban.irIzquierda() }
keyboard.right().onPressDo{ sokoban.irDerecha() }
(0 .. ancho).forEach(
{ n => posicionesParedes.add(new Position(x = n, y = largo)) }
) // bordeArriba

(0 .. largo).forEach(
{ n => posicionesParedes.add(new Position(x = 0, y = n)) }
) // bordeIzq

(0 .. largo).forEach(
{ n => posicionesParedes.add(new Position(x = ancho, y = n)) }
) // bordeDer


posicionesParedes.addAll(
[
new Position(x = 3, y = 5),
new Position(x = 4, y = 5),
new Position(x = 5, y = 5)
]
)
posicionesParedes.addAll(
[
new Position(x = 1, y = 2),
new Position(x = 2, y = 2),
new Position(x = 6, y = 2),
new Position(x = 7, y = 2)
]
)
posicionesParedes.addAll(
[
new Position(x = 1, y = 1),
new Position(x = 2, y = 1),
new Position(x = 6, y = 1),
new Position(x = 7, y = 1)
]
)
posicionesParedes.forEach({ posicionParedes => self.dibujar(new Pared(position = posicionParedes)) })

keyboard.r().onPressDo{ self.restart() }
keyboard.any().onPressDo{ self.comprobarSiGano(cajas) }
// LLEGADAS
const llegadas = [
new Position(x = 4, y = 4),
new Position(x = 4, y = 3),
new Position(x = 4, y = 2),
new Position(x = 4, y = 1)
].map({ posicion => self.dibujar(new Llegada(position = posicion)) }) // CAJAS
const cajas = [
new Position(x = 2, y = 4),
new Position(x = 6, y = 4),
new Position(x = 4, y = 2),
new Position(x = 5, y = 2)
].map({ posicion => self.dibujar(new Caja(position = posicion, llegadas = llegadas)) })
// SOKOBAN

game.addVisual(sokoban) // TECLADO

// COLISIÓNES
game.whenCollideDo(sokoban, { e => sokoban.empuja(e) })
keyboard.up().onPressDo({ sokoban.irArriba() })
keyboard.down().onPressDo({ sokoban.irAbajo() })
keyboard.left().onPressDo({ sokoban.irIzquierda() })
keyboard.right().onPressDo({ sokoban.irDerecha() })
keyboard.r().onPressDo({ self.restart() })
// COLISIONES.onPressDo({ self.comprobarSiGano(cajas) })
game.whenCollideDo(sokoban, { elemento => sokoban.empuja(elemento) })
}

method restart() {
Expand All @@ -61,8 +90,8 @@ object nivel1 {
}

method comprobarSiGano(cajas) {
if (cajas.all{ c => c.estaBienPosicionada() }) {
game.say(sokoban, "GANASTE!")
}
if (cajas.all({ caja => caja.estaBienPosicionada() }))
game.say(sokoban, "GANASTE!")
game.onTick(5000, "gameEnd", { game.stop() })
}
}
2 changes: 1 addition & 1 deletion pared.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ class Pared {
var property position

method movete(direccion) {
throw new Exception(message = "No puedes mover las paredes.")
throw new DomainException(message = "No puedes mover las paredes.")
}

method puedePisarte(_) = false
Expand Down
3 changes: 1 addition & 2 deletions pgmGame.wpgm
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@ program SokobanGame {
game.title("Sokoban")
game.height(7)
game.width(9)
game.ground("suelo.png")
game.boardGround("suelo.png")


nivel1.cargar()

game.start()
Expand Down
1 change: 1 addition & 0 deletions sokoban.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ object sokoban {
}

method image() = "jugador.png"

// method position() = position
// method position(_position) {
// position = _position
Expand Down
Binary file added video/demo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 4b368be

Please sign in to comment.