Nantes Université

Skip to content
Extraits de code Groupes Projets
Valider 606b0d09 rédigé par E206554Q's avatar E206554Q
Parcourir les fichiers

fix - factorisation de ouf guedin

parent 27aa1218
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -8,6 +8,7 @@ import javafx.scene.input.KeyCode ...@@ -8,6 +8,7 @@ import javafx.scene.input.KeyCode
import javafx.scene.paint.Color import javafx.scene.paint.Color
import builder.* import builder.*
import enums.EBehavior import enums.EBehavior
import enums.EDirection
const val mapWidth : Int = 14 const val mapWidth : Int = 14
const val mapHeight : Int = 10 const val mapHeight : Int = 10
...@@ -48,29 +49,33 @@ class GameApp : GameApplication() { ...@@ -48,29 +49,33 @@ class GameApp : GameApplication() {
} }
override fun initInput() { override fun initInput() {
onKeyDown(KeyCode.RIGHT) { onKeyDown(KeyCode.UP) {
var movableObjects = currentLevel.map.cases.filter { obj -> obj != null && obj.behavior == EBehavior.MOVE } var movableObjects = currentLevel.map.cases.filter { obj -> obj != null && obj.behavior == EBehavior.MOVE }
for (obj in movableObjects) { for (obj in movableObjects) {
currentLevel.map.moveRight(obj!!) currentLevel.map.move(obj!!, EDirection.UP)
} }
currentLevel.map.checkForBehaviorChange()
} }
onKeyDown(KeyCode.LEFT) { onKeyDown(KeyCode.DOWN) {
var movableObjects = currentLevel.map.cases.filter { obj -> obj != null && obj.behavior == EBehavior.MOVE} var movableObjects = currentLevel.map.cases.filter { obj -> obj != null && obj.behavior == EBehavior.MOVE }
for (obj in movableObjects) { for (obj in movableObjects) {
currentLevel.map.moveLeft(obj!!) currentLevel.map.move(obj!!, EDirection.DOWN)
} }
currentLevel.map.checkForBehaviorChange()
} }
onKeyDown(KeyCode.UP) { onKeyDown(KeyCode.LEFT) {
var movableObjects = currentLevel.map.cases.filter { obj -> obj != null && obj.behavior == EBehavior.MOVE } var movableObjects = currentLevel.map.cases.filter { obj -> obj != null && obj.behavior == EBehavior.MOVE}
for (obj in movableObjects) { for (obj in movableObjects) {
currentLevel.map.moveUp(obj!!) currentLevel.map.move(obj!!, EDirection.LEFT)
} }
currentLevel.map.checkForBehaviorChange()
} }
onKeyDown(KeyCode.DOWN) { onKeyDown(KeyCode.RIGHT) {
var movableObjects = currentLevel.map.cases.filter { obj -> obj != null && obj.behavior == EBehavior.MOVE } var movableObjects = currentLevel.map.cases.filter { obj -> obj != null && obj.behavior == EBehavior.MOVE }
for (obj in movableObjects) { for (obj in movableObjects) {
currentLevel.map.moveDown(obj!!) currentLevel.map.move(obj!!, EDirection.RIGHT)
} }
currentLevel.map.checkForBehaviorChange()
} }
onKeyDown(KeyCode.R) { onKeyDown(KeyCode.R) {
reset() reset()
......
import enums.EBehavior import enums.EBehavior
import enums.EBlock import enums.EBlock
import enums.EDirection
import enums.ESprite import enums.ESprite
import observer.ConcretSubject
import observer.Sprite
class Map() { class Map(
var width = 0 var width: Int = 0,
var height = 0 var height: Int = 0,
var scaleFactor = 0.0 var scaleFactor: Double = 0.0, // Redimension des sprites
lateinit var defaultCases : Array<GameObject?> // Emplacement par défaut utilisé pour le reset var defaultCases: Array<GameObject?> = Array(width * height) { null }, // Emplacement initial des cases utilisé par le reset
lateinit var cases : Array<GameObject?> var cases: Array<GameObject?> = Array(width * height) { null },
var blockIs: ArrayList<GameObject> = ArrayList(), // Liste des blocks IS pour vérifier les mises à jour de comportement
var blockIs: ArrayList<GameObject> = ArrayList() // IS Blocks var subjects: HashMap<ESprite, ConcretSubject> = HashMap() // Sujets des observers
) {
var subjects: HashMap<ESprite, ConcretSubject> = HashMap() // Subjects for observers (one for each type of sprite) init {
// Initialisation des observers pour chaque type de sprites
constructor(width: Int, height: Int, scaleFactor: Double) : this() {
this.width = width
this.height = height
this.scaleFactor = scaleFactor
defaultCases = Array(width*height){null}
cases = Array(width*height){null}
for (spriteType in ESprite.values()) { for (spriteType in ESprite.values()) {
subjects.set(spriteType, ConcretSubject()) subjects[spriteType] = ConcretSubject()
} }
} }
...@@ -35,160 +31,76 @@ class Map() { ...@@ -35,160 +31,76 @@ class Map() {
// Emplacement sur la map // Emplacement sur la map
if (x<=width && y<=height) { if (x<=width && y<=height) {
cases[y*width + x] = obj
defaultCases[y*width + x] = obj defaultCases[y*width + x] = obj
cases[y*width + x] = obj
} }
} }
fun moveLeft(obj: GameObject) : Boolean { fun move(obj: GameObject, direction: EDirection) : Boolean {
var i = cases.indexOf(obj) var i = cases.indexOf(obj)
if (i%width == 0) { // Si l'obj se situe sur la première colonne
return false
}
else if (cases[i-1] != null) { // Si la case de gauche est occupée
when (cases[i-1]!!.behavior) {
EBehavior.MOVE, EBehavior.PUSH -> {
if (!moveLeft(cases[i-1]!!)) { // On pousse la case de gauche
return false // Sinon
}
}
EBehavior.STOP -> {
return false
}
EBehavior.DEFEAT -> {
if(cases[i]!!.behavior == EBehavior.MOVE) {
reset()
}
return false
}
EBehavior.WIN -> {
if(cases[i]!!.behavior == EBehavior.MOVE) {
nextLevel()
}
return false
}
}
}
// Déplacement
cases[i-1] = obj
cases[i] = null
if (obj.behavior == EBehavior.MOVE) checkForBehaviorChange()
// Affichage
obj.gameEntity.translateX(-48.0*scaleFactor)
return true
}
fun moveRight(obj: GameObject) : Boolean { // Code dépendant de la direction
var i = cases.indexOf(obj) var adjacentCaseIndex: Int
if (i%width == width-1) { // Si l'obj se situe sur la dernière colonne
return false when (direction) {
} EDirection.UP -> {
else if (cases[i+1] != null) { // Si la case de droite est occupée if (i < width) return false // Si l'objet est sur la première ligne
when (cases[i+1]!!.behavior) { adjacentCaseIndex = i-width
EBehavior.MOVE, EBehavior.PUSH -> { }
if (!moveRight(cases[i + 1]!!)) { // On pousse la case de droite EDirection.DOWN -> {
return false // Sinon if (i >= width*(height-1)) return false // Si l'objet est sur la dernière ligne
} adjacentCaseIndex = i+width
} }
EBehavior.STOP -> { EDirection.LEFT -> {
return false if (i%width == 0) return false // Si l'objet est sur la première colonne
} adjacentCaseIndex = i-1
EBehavior.DEFEAT -> { }
if(cases[i]!!.behavior == EBehavior.MOVE) { EDirection.RIGHT -> {
reset() if (i%width == width-1) return false // Si l'objet est sur la dernière colonne
} adjacentCaseIndex = i+1
return false
}
EBehavior.WIN -> {
if(cases[i]!!.behavior == EBehavior.MOVE) {
nextLevel()
}
return false
}
} }
} }
// Déplacement
cases[i+1] = obj
cases[i] = null
if (obj.behavior == EBehavior.MOVE) checkForBehaviorChange()
// Affichage
obj.gameEntity.translateX(48.0*scaleFactor)
return true
}
fun moveUp(obj: GameObject) : Boolean { // Code commun
var i = cases.indexOf(obj) if (cases[adjacentCaseIndex] != null) { // Si la case de destination est occupée
if (i < width) { // Si l'obj se situe sur la première ligne var adjacentCase : GameObject = cases[adjacentCaseIndex]!!
return false when (adjacentCase.behavior) {
}
else if (cases[i-width] != null) { // Si la case du dessus est occupée
when (cases[i-width]!!.behavior) {
EBehavior.MOVE, EBehavior.PUSH -> { EBehavior.MOVE, EBehavior.PUSH -> {
if (!moveUp(cases[i - width]!!)) { // On pousse la case du dessus if (!move(adjacentCase, direction)) { // On pousse la case adjacente
return false // Sinon return false // Si ce n'est pas possible pas de déplacement
} }
} }
EBehavior.STOP -> {
return false
}
EBehavior.DEFEAT -> { EBehavior.DEFEAT -> {
if(cases[i]!!.behavior == EBehavior.MOVE) { if(obj!!.behavior == EBehavior.MOVE) reset()
reset()
}
return false return false
} }
EBehavior.WIN -> { EBehavior.WIN -> {
if(cases[i]!!.behavior == EBehavior.MOVE) { if(obj!!.behavior == EBehavior.MOVE) nextLevel()
nextLevel()
}
return false return false
} }
EBehavior.STOP -> return false
} }
} }
// Déplacement // Déplacement
cases[i-width] = obj cases[adjacentCaseIndex] = obj
cases[i] = null cases[i] = null
if (obj.behavior == EBehavior.MOVE) checkForBehaviorChange()
// Affichage
obj.gameEntity.translateY(-48.0*scaleFactor)
return true
}
fun moveDown(obj: GameObject) : Boolean { // Affichage
var i = cases.indexOf(obj) when (direction) {
if (i >= width*(height-1)) { // Si l'obj se situe sur la dernière ligne EDirection.UP -> {
return false obj.gameEntity.translateY(-48.0*scaleFactor)
} }
else if (cases[i+width] != null) { // Si la case du dessous est occupée EDirection.DOWN -> {
when (cases[i+width]!!.behavior) { obj.gameEntity.translateY(48.0*scaleFactor)
EBehavior.MOVE, EBehavior.PUSH -> { }
if (!moveDown(cases[i + width]!!)) { // On pousse la case du dessous EDirection.LEFT -> {
return false // Sinon obj.gameEntity.translateX(-48.0*scaleFactor)
} }
} EDirection.RIGHT -> {
EBehavior.STOP -> { obj.gameEntity.translateX(48.0*scaleFactor)
return false
}
EBehavior.DEFEAT -> {
if(cases[i]!!.behavior == EBehavior.MOVE) {
reset()
}
return false
}
EBehavior.WIN -> {
if(cases[i]!!.behavior == EBehavior.MOVE) {
nextLevel()
}
return false
}
} }
} }
// Déplacement
cases[i+width] = obj
cases[i] = null
if (obj.behavior == EBehavior.MOVE) checkForBehaviorChange()
// Affichage
obj.gameEntity.translateY(48.0*scaleFactor)
return true return true
} }
......
...@@ -3,7 +3,7 @@ package builder ...@@ -3,7 +3,7 @@ package builder
import enums.* import enums.*
import Level import Level
import Map import Map
import Sprite import observer.Sprite
import Block import Block
import mapHeight import mapHeight
import mapWidth import mapWidth
......
...@@ -3,7 +3,7 @@ package builder ...@@ -3,7 +3,7 @@ package builder
import enums.* import enums.*
import Level import Level
import Map import Map
import Sprite import observer.Sprite
import mapHeight import mapHeight
import mapWidth import mapWidth
import scaleFactor import scaleFactor
......
package enums
enum class EDirection {
UP, DOWN, LEFT, RIGHT
}
\ No newline at end of file
package observer
import enums.EBehavior import enums.EBehavior
class ConcretSubject(): ISubject { class ConcretSubject(): ISubject {
......
package observer
import enums.EBehavior import enums.EBehavior
interface IObserver { interface IObserver {
......
package observer
interface ISubject { interface ISubject {
fun addObserver(observer: IObserver) {} fun addObserver(observer: IObserver) {}
fun removeObserver(observer: IObserver) {} fun removeObserver(observer: IObserver) {}
......
package observer
import GameObject
import enums.EBehavior import enums.EBehavior
import enums.ESprite import enums.ESprite
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter