revert b3eabeff83
continuous-integration/drone/push Build is failing Details

revert Boucle de jeu
ajoutsStub
Thomas CHAZOT 2 years ago
parent b3eabeff83
commit 6dcb6d334d

@ -0,0 +1,16 @@
package uca.iutinfo.studentbros.model
interface CollisionManager {
fun detectCollision(element: Element, level: Level): Boolean
fun distanceToCollision(element: Element, level: Level): Pair<Float, Float>
fun collisionAction(element: Element, elementHitted: Element, collisionSide: Side)
fun getCollisionSide(element: Element, elementHitted: Element): Side
fun Element.intersects(element: Element): Boolean = left <= element.right && right >= element.left && top >= element.bottom && bottom <= element.top
fun Element.intersectsWithVelocity(element: Element): Boolean = left + velX < element.right && right + velX > element.left && top + velY > element.bottom && bottom + velY < element.top
fun getCollisionDistances(element: Element, elementHitted: Element, pair: Pair<Float, Float>): Pair<Float, Float>
}

@ -0,0 +1,42 @@
package uca.iutinfo.studentbros.model
class CollisionMouvementManager : MouvementManager {
val collisionManager: CollisionManager = ConcreteCollisionManager()
override fun moveAllElements(level: Level) {
level.elements.filterNot { it is Player || !it.isVisible }.forEach {
val pair = collisionManager.distanceToCollision(it, level)
moveElement(it, level, pair.first, pair.second)
}
}
override fun moveElement(element: Element, level: Level, x: Float, y: Float) {
element.top += y
element.bottom += y
element.right += x
element.left += x
}
override fun moveElementAccordingToPlayer(level: Level, player: Player, screenCenter: Float) {
val pair = collisionManager.distanceToCollision(player, level)
if (player.right<screenCenter){
var x = pair.first
if (player.right + x > screenCenter){
x = screenCenter - player.right
level.elements.filterNot { it is Player || !it.isVisible }.forEach{ moveElement(it, level, -x, 0F)}
}
else if (player.left + pair.first < 0){
x = -player.left
}
moveElement(player, level, x, pair.second)
}
else if (pair.first>0){
moveElement(player, level, 0F, pair.second)
level.elements.filterNot { it is Player || !it.isVisible }.forEach{ moveElement(it, level, -pair.first, 0F)}
}
else{
moveElement(player, level, pair.first, pair.second)
}
}
}

@ -1,19 +1,14 @@
package uca.iutinfo.studentbros.model.gameManagers
import uca.iutinfo.studentbros.model.Element
import uca.iutinfo.studentbros.model.GameLoop
import uca.iutinfo.studentbros.model.Level
import uca.iutinfo.studentbros.model.Side
package uca.iutinfo.studentbros.model
class ConcreteCollisionManager : CollisionManager {
override fun detectCollision(element: Element, level: Level, x:Float, y: Float): Boolean {
level.elements.forEach { if (it.isVisible && element.intersectsWithVelocity(it, x, y)) return true }
override fun detectCollision(element: Element, level: Level): Boolean {
level.elements.forEach { if (it.isVisible && element.intersectsWithVelocity(it)) return true }
return false
}
override fun distanceToCollision(element: Element, level: Level, x:Float, y: Float): Pair<Float, Float> {
var distances = Pair(x, y)
override fun distanceToCollision(element: Element, level: Level): Pair<Float, Float> {
var distances = Pair(element.velX, element.velY)
var sidePair: Pair<Float, Element>?= null
var topPair: Pair<Float, Element>?= null
var leftOrRight: Side? = null
@ -21,7 +16,7 @@ class ConcreteCollisionManager : CollisionManager {
level.elements.filterNot { it==element }.forEach {
if (element.intersectsWithVelocity(it, x, y)){
if (element.intersectsWithVelocity(it)){
var pair = getCollisionDistances(element, it, distances)
var side = getCollisionSide(element, it)
if (side == Side.RIGHT || side == Side.LEFT){
@ -69,9 +64,4 @@ class ConcreteCollisionManager : CollisionManager {
return Pair(x, y)
}
override fun touchingGrass(element: Element, level: Level): Boolean {
level.elements.filterNot { it==element }.forEach { if (element.bottom == it.top) return true }
return false
}
}

@ -1,25 +0,0 @@
package uca.iutinfo.studentbros.model
import android.database.Observable
import uca.iutinfo.studentbros.model.gameManagers.CollisionMouvementManager
import uca.iutinfo.studentbros.model.gameManagers.GameManager
import kotlin.concurrent.thread
class GameLoop(val level: Level, val player: Player) : Observable<GameManager>() {
var running : Boolean = true
fun gameThread(){
thread(start=true) {
while (running){
Thread.sleep(30L)
registerAll()
if (!player.isVisible) running=false
}
}
}
private fun registerAll(){
mObservers.forEach { registerObserver(it) }
}
}

@ -0,0 +1,10 @@
package uca.iutinfo.studentbros.model
interface MouvementManager {
fun moveAllElements(level: Level)
fun moveElement(element: Element, level: Level, x: Float, y: Float)
fun moveElementAccordingToPlayer(level: Level, player: Player, screenCenter: Float)
}

@ -0,0 +1,38 @@
package uca.iutinfo.studentbros.model
class SimpleMouvementManager : MouvementManager{
override fun moveAllElements(level: Level) {
level.elements.filterNot { it is Player || !it.isVisible }.forEach { moveElement(it, level, it.velX, it.velY) }
}
override fun moveElement(element: Element, level: Level, x: Float, y: Float) {
element.top += y
element.bottom += y
element.right += x
element.left += x
}
override fun moveElementAccordingToPlayer(level: Level, player: Player, screenCenter: Float) {
if (player.right<screenCenter){
var x = player.velX
if (player.right + player.velX > screenCenter){
x = screenCenter - player.right
level.elements.filterNot { it is Player || !it.isVisible }.forEach{ moveElement(it, level, -x, 0F)}
}
else if (player.left + player.velX < 0){
x = -player.left
}
moveElement(player, level, x, player.velY)
}
else if (player.velX>0){
moveElement(player, level, 0F, player.velY)
level.elements.filterNot { it is Player || !it.isVisible }.forEach{ moveElement(it, level, -player.velX, 0F)}
}
else{
moveElement(player, level, player.velX, player.velY)
}
}
}

@ -1,21 +0,0 @@
package uca.iutinfo.studentbros.model.gameManagers
import uca.iutinfo.studentbros.model.Element
import uca.iutinfo.studentbros.model.Level
import uca.iutinfo.studentbros.model.Side
interface CollisionManager {
fun detectCollision(element: Element, level: Level, x:Float, y: Float): Boolean
fun distanceToCollision(element: Element, level: Level, x:Float, y: Float): Pair<Float, Float>
fun collisionAction(element: Element, elementHitted: Element, collisionSide: Side)
fun getCollisionSide(element: Element, elementHitted: Element): Side
fun Element.intersects(element: Element): Boolean = left <= element.right && right >= element.left && top >= element.bottom && bottom <= element.top
fun Element.intersectsWithVelocity(element: Element, x: Float, y: Float): Boolean = left + x < element.right && right + x > element.left && top + y > element.bottom && bottom + y < element.top
fun getCollisionDistances(element: Element, elementHitted: Element, pair: Pair<Float, Float>): Pair<Float, Float>
fun touchingGrass(element: Element, level: Level): Boolean
}

@ -1,63 +0,0 @@
package uca.iutinfo.studentbros.model.gameManagers
import uca.iutinfo.studentbros.model.*
import kotlin.concurrent.thread
class CollisionMouvementManager(val screenCenter: Float) : MouvementManager {
private val collisionManager: CollisionManager = ConcreteCollisionManager()
override fun moveAllElements(level: Level) {
level.elements.filterNot { it is Player || !it.isVisible }.forEach { move(it, level, it.velX, it.velY) }
}
override fun move(element: Element, level: Level, x: Float, y: Float): Boolean {
val pair = collisionManager.distanceToCollision(element, level, x, y)
element.top += pair.second
element.bottom += pair.second
element.right += pair.first
element.left += pair.first
return true;
}
override fun move(player: Player, level: Level, x: Float, y: Float): Boolean {
val pair = collisionManager.distanceToCollision(player, level, x, y)
if (player.right<screenCenter){
var x = pair.first
if (player.right + pair.first > screenCenter){
x = screenCenter - player.right
level.elements.filterNot { it is Player || !it.isVisible }.forEach{ move(it, level, -x, 0F)}
}
else if (player.left + pair.first < 0){
x = -player.left
}
player.top += pair.second
player.bottom += pair.second
player.right += pair.first
player.left += pair.first
}
else if (player.velX>0){
player.top += pair.second
player.bottom += pair.second
player.right += pair.first
player.left += pair.first
level.elements.filterNot { it is Player || !it.isVisible }.forEach{ move(it, level, -pair.first, 0F)}
}
else{
player.top += pair.second
player.bottom += pair.second
player.right += pair.first
player.left += pair.first
}
return true;
}
override fun movePlayer(player: Player, level: Level, side: Side) {
when(side){
Side.LEFT -> move(player, level, -40F, 0F)
Side.RIGHT -> move(player, level, 40F, 0F)
Side.UP -> move(player, level, 0F, 40F)
Side.DOWN -> move(player, level, 0F, -40F)
}
}
}

@ -1,27 +0,0 @@
package uca.iutinfo.studentbros.model.gameManagers
import uca.iutinfo.studentbros.model.Element
import uca.iutinfo.studentbros.model.GameLoop
import uca.iutinfo.studentbros.model.Level
import kotlin.concurrent.thread
class ConcreteGravityManager(val collisionManager: CollisionManager, ) : GravityManager {
override fun gravityFalls(level: Level) {
val t = Thread()
t.suspend()
level.elements.forEach {
if (!collisionManager.touchingGrass(it, level)){
}
}
}
override fun jumpingBoy(element: Element, level: Level, x: Float, y: Float) {
TODO("Not yet implemented")
}
override fun onChanged(t: GameLoop?) {
t?.level?.let { gravityFalls(it) }
}
}

@ -1,9 +0,0 @@
package uca.iutinfo.studentbros.model.gameManagers
import androidx.lifecycle.Observer
import uca.iutinfo.studentbros.model.GameLoop
interface GameManager : Observer<GameLoop>{
override fun onChanged(t: GameLoop?)
}

@ -1,11 +0,0 @@
package uca.iutinfo.studentbros.model.gameManagers
import uca.iutinfo.studentbros.model.Element
import uca.iutinfo.studentbros.model.Level
interface GravityManager : GameManager {
fun gravityFalls(level: Level)
fun jumpingBoy(element: Element, level: Level, x: Float, y: Float)
}

@ -1,31 +0,0 @@
package uca.iutinfo.studentbros.model.gameManagers
import uca.iutinfo.studentbros.model.Element
import uca.iutinfo.studentbros.model.Level
import uca.iutinfo.studentbros.model.Player
import uca.iutinfo.studentbros.model.Side
import uca.iutinfo.studentbros.model.mouvementManagers.ConcreteInertieManager
class InertieMouvementManager(val screenCenter: Float) : MouvementManager {
val inertieManager = ConcreteInertieManager(this)
override fun moveAllElements(level: Level) {
level.elements.forEach {
}
}
override fun move(element: Element, level: Level, x: Float, y: Float): Boolean {
TODO("Not yet implemented")
}
override fun move(player: Player, level: Level, x: Float, y: Float): Boolean {
TODO("Not yet implemented")
}
override fun movePlayer(player: Player, level: Level, side: Side) {
TODO("Not yet implemented")
}
}

@ -1,17 +0,0 @@
package uca.iutinfo.studentbros.model.gameManagers
import uca.iutinfo.studentbros.model.Element
import uca.iutinfo.studentbros.model.Level
import uca.iutinfo.studentbros.model.Player
import uca.iutinfo.studentbros.model.Side
interface MouvementManager {
fun moveAllElements(level: Level)
fun move(element: Element, level: Level, x: Float, y: Float): Boolean
fun move(player: Player, level: Level, x: Float, y: Float): Boolean
fun movePlayer(player: Player, level: Level, side: Side)
}

@ -1,60 +0,0 @@
package uca.iutinfo.studentbros.model.gameManagers
import uca.iutinfo.studentbros.model.*
class SimpleMouvementManager(val screenCenter: Float) : MouvementManager {
override fun moveAllElements(level: Level) {
level.elements.filterNot { it is Player || !it.isVisible }.forEach { move(it, level, it.velX, it.velY) }
}
override fun move(element: Element, level: Level, x: Float, y: Float): Boolean {
element.top += y
element.bottom += y
element.right += x
element.left += x
return true;
}
override fun move(player: Player, level: Level, x: Float, y: Float): Boolean {
if (player.right<screenCenter){
var x = player.velX
if (player.right + player.velX > screenCenter){
x = screenCenter - player.right
level.elements.filterNot { it is Player || !it.isVisible }.forEach{ move(it, level, -x, 0F)}
}
else if (player.left + player.velX < 0){
x = -player.left
}
player.top += y
player.bottom += y
player.right += x
player.left += x
}
else if (player.velX>0){
player.top += y
player.bottom += y
player.right += x
player.left += x
level.elements.filterNot { it is Player || !it.isVisible }.forEach{ move(it, level, -player.velX, 0F)}
}
else{
player.top += y
player.bottom += y
player.right += x
player.left += x
}
return true;
}
override fun movePlayer(player: Player, level: Level, side: Side) {
when(side){
Side.LEFT -> move(player, level, -40F, 0F)
Side.RIGHT -> move(player, level, 40F, 0F)
Side.UP -> move(player, level, 0F, 40F)
Side.DOWN -> move(player, level, 0F, -40F)
}
}
}

@ -1,33 +0,0 @@
package uca.iutinfo.studentbros.model.mouvementManagers
import kotlinx.coroutines.delay
import uca.iutinfo.studentbros.model.*
import uca.iutinfo.studentbros.model.gameManagers.MouvementManager
import kotlin.concurrent.thread
class ConcreteInertieManager(val mouvementManager: MouvementManager) : InertieManager {
val gottaMoveEmAll = mutableMapOf<Element, Float>()
override fun moveElement(player: Player, level: Level, side: Side) {
var coef = 1F
if (side==Side.LEFT) coef=-1F
if (gottaMoveEmAll.containsKey(player)) {
gottaMoveEmAll.remove(player)
}
gottaMoveEmAll.put(player, 40*coef)
}
override fun moveElement(element: Element, level: Level, side: Side) {
TODO("Not yet implemented")
}
override fun onChanged(t: GameLoop) {
val ite = gottaMoveEmAll.iterator()
ite.forEach {
if (mouvementManager.move(it.key, t.level, it.value, 0F)){
it.setValue(it.value-5F)
}
}
}
}

@ -1,21 +0,0 @@
package uca.iutinfo.studentbros.model.mouvementManagers
import uca.iutinfo.studentbros.model.Level
import uca.iutinfo.studentbros.model.Player
import uca.iutinfo.studentbros.model.Side
import uca.iutinfo.studentbros.model.gameManagers.CollisionManager
class ConcretePlayerMouvementManager(val collisionManager: CollisionManager) : PlayerMouvementManager {
val inertieManager = ConcreteInertieManager(this)
override fun movePlayer(player: Player, level: Level, side: Side) {
TODO("Not yet implemented")
}
override fun move(player: Player, level: Level, x: Float): Boolean {
player.right += x
player.left += x
return true
}
}

@ -1,13 +0,0 @@
package uca.iutinfo.studentbros.model.mouvementManagers
import androidx.lifecycle.Observer
import uca.iutinfo.studentbros.model.*
interface InertieManager : Observer<GameLoop> {
fun moveElement(player: Player, level: Level, side: Side)
fun moveElement(element: Element, level: Level, side: Side)
}

@ -1,13 +0,0 @@
package uca.iutinfo.studentbros.model.mouvementManagers
import uca.iutinfo.studentbros.model.Level
import uca.iutinfo.studentbros.model.Player
import uca.iutinfo.studentbros.model.Side
interface PlayerMouvementManager {
fun movePlayer(player: Player, level: Level, side: Side)
fun move(player: Player, level: Level, x: Float): Boolean
}

@ -1,10 +1,13 @@
package uca.iutinfo.studentbros.views
import android.app.Activity
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import android.os.Build
import android.os.Bundle
import android.view.MotionEvent
import android.view.View
import android.view.WindowManager
@ -32,6 +35,8 @@ class RectangleGameView(context: Context, level: Level) : GameView(context,level
private var rectMap = mutableMapOf<Element, RectF>()
private var button = Button(context)
init {
level.elements.add(mario)
level.elements.forEach { rectMap.put(it, RectF(it.bottom, it.left,it.top,it.right))}
@ -120,7 +125,7 @@ class RectangleGameView(context: Context, level: Level) : GameView(context,level
else{
mario.increaseDownVelocity()
}
//mouvManager.moveElementAccordingToPlayer(level,mario,height/2F)
mouvManager.moveElementAccordingToPlayer(level,mario,height/2F)
mouvManager.moveAllElements(level)
invalidate()
}

@ -2,7 +2,8 @@ package uca.iutinfo.studentbros
import org.junit.Test
import uca.iutinfo.studentbros.data.Stub
import uca.iutinfo.studentbros.model.gameManagers.CollisionMouvementManager
import uca.iutinfo.studentbros.model.CollisionMouvementManager
import uca.iutinfo.studentbros.model.ConcreteCollisionManager
class CollisionMouvementManagerTest {
@ -23,7 +24,7 @@ class CollisionMouvementManagerTest {
level.elements[0].right = 40F
level.elements[0].top = 4000F
level.elements[0].bottom = 0F
//mouvementManager.moveElementAccordingToPlayer(level, player, 100F)
mouvementManager.moveElementAccordingToPlayer(level, player, 100F)
assert(player.right==level.elements[0].left && player.bottom==10F)
}
@ -40,7 +41,7 @@ class CollisionMouvementManagerTest {
level.elements[0].right = 60F
level.elements[0].top = 4000F
level.elements[0].bottom = 0F
//mouvementManager.moveElementAccordingToPlayer(level, player, 100F)
mouvementManager.moveElementAccordingToPlayer(level, player, 100F)
assert(player.right==30F && player.left==20F && player.bottom==10F)
}
@ -57,7 +58,7 @@ class CollisionMouvementManagerTest {
level.elements[0].right = 60F
level.elements[0].top = 4000F
level.elements[0].bottom = 0F
//mouvementManager.moveElementAccordingToPlayer(level, player, 100F)
mouvementManager.moveElementAccordingToPlayer(level, player, 100F)
assert(player.right==10F && player.left==0F && player.bottom==10F)
}
@ -74,7 +75,7 @@ class CollisionMouvementManagerTest {
level.elements[0].right = 60F
level.elements[0].top = 4000F
level.elements[0].bottom = 0F
// mouvementManager.moveElementAccordingToPlayer(level, player, 100F)
mouvementManager.moveElementAccordingToPlayer(level, player, 100F)
assert(player.right==10F && player.left==0F && player.bottom==10F)
}

@ -2,7 +2,7 @@ package uca.iutinfo.studentbros
import org.junit.Test
import uca.iutinfo.studentbros.data.Stub
import uca.iutinfo.studentbros.model.gameManagers.ConcreteCollisionManager
import uca.iutinfo.studentbros.model.ConcreteCollisionManager
class ConcreteCollisionManagerTest {
private val stub = Stub()
@ -16,7 +16,7 @@ class ConcreteCollisionManagerTest {
player.right = 10F
player.velX = 20F
level.elements[0].left = 20F
//assert(collisionManager.detectCollision(player, level))
assert(collisionManager.detectCollision(player, level))
}
@Test

@ -1,26 +0,0 @@
package uca.iutinfo.studentbros
import org.junit.Test
import uca.iutinfo.studentbros.data.Stub
import uca.iutinfo.studentbros.model.Side
import uca.iutinfo.studentbros.model.gameManagers.ConcreteCollisionManager
import uca.iutinfo.studentbros.model.mouvementManagers.ConcreteInertieManager
import uca.iutinfo.studentbros.model.mouvementManagers.ConcretePlayerMouvementManager
class ConcreteInertieManagerTest {
val inertieManager = ConcreteInertieManager(ConcretePlayerMouvementManager(
ConcreteCollisionManager()
))
val player = Stub().getPlayer()
val level = Stub().getLevel()
@Test
fun testMovePlayer(){
inertieManager.moveElement(player, level, Side.RIGHT)
inertieManager.moveElement(player, level, Side.RIGHT)
}
}

@ -1,8 +1,9 @@
package uca.iutinfo.studentbros
import org.junit.Assert.assertEquals
import org.junit.Test
import uca.iutinfo.studentbros.data.Stub
import uca.iutinfo.studentbros.model.gameManagers.SimpleMouvementManager
import uca.iutinfo.studentbros.model.SimpleMouvementManager
class SimpleMouvementManagerTest {
@ -34,7 +35,7 @@ class SimpleMouvementManagerTest {
var i=0
player.increaseRightVelocity()
player.increaseUpVelocity()
//mouvementManager.moveElementAccordingToPlayer(level, player, 100F)
mouvementManager.moveElementAccordingToPlayer(level, player, 100F)
assert(player.right==p.right+player.velX && player.left==p.left+player.velX)
assert(player.top==p.top+player.velY && player.bottom==p.bottom+player.velY)
@ -55,7 +56,7 @@ class SimpleMouvementManagerTest {
var i=0
player.increaseRightVelocity()
player.increaseUpVelocity()
//mouvementManager.moveElementAccordingToPlayer(level, player, 10F)
mouvementManager.moveElementAccordingToPlayer(level, player, 10F)
assert(player.right==p.right && player.left==p.left)
level.elements.forEach {
@ -75,7 +76,7 @@ class SimpleMouvementManagerTest {
p.top=10F
var i=0
//mouvementManager.moveElementAccordingToPlayer(level, player, 20F)
mouvementManager.moveElementAccordingToPlayer(level, player, 20F)
assert(player.right==p.right+10F && player.left==p.left+10F)
level.elements.forEach {
@ -98,7 +99,7 @@ class SimpleMouvementManagerTest {
p.top=10F
var i=0
//mouvementManager.moveElementAccordingToPlayer(level, player, 50F)
mouvementManager.moveElementAccordingToPlayer(level, player, 50F)
assert(player.right==p.right-10F && player.left==0F)
level.elements.forEach {
@ -120,7 +121,7 @@ class SimpleMouvementManagerTest {
p.top=10F
var i=0
//mouvementManager.moveElementAccordingToPlayer(level, player, 50F)
mouvementManager.moveElementAccordingToPlayer(level, player, 50F)
assert(player.right==p.right && player.left==0F)
level.elements.forEach {

Loading…
Cancel
Save