Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • v-lafeychine/prog-2
1 result
Show changes
Commits on Source (5)
Showing
with 120 additions and 250 deletions
......@@ -10,4 +10,4 @@ indent.main = 4
indent.callSite = 4
project.git = true
project.excludeFilters = ["bindings"]
project.excludeFilters = ["sfml"]
package Main
import SFML.Config.*
import SFML.SFMLGraphics.*
import SFML.SFMLSystem.*
import SFML.SFMLWindow.*
import scalanative.unsafe.*
import scalanative.unsigned.*
import SFML.Graphics.{Color, RenderWindow}
import SFML.Window.{VideoMode, Window}
val FRAMERATE = 30
@main def main() =
val videoMode = stackalloc[sfVideoMode]()
videoMode._1 = 1024.toUInt
videoMode._2 = 768.toUInt
videoMode._3 = 32.toUInt
val sfBlack = stackalloc[sfColor]()
sfBlack._1 = 0.toUByte
sfBlack._2 = 0.toUByte
sfBlack._3 = 0.toUByte
sfBlack._4 = 0.toUByte
var window = sfRenderWindow_create(videoMode, c"Projet", sfDefaultStyle.value, null)
val videoMode = VideoMode(1024, 768, 32)
val window = RenderWindow(videoMode, "Projet", Window.WindowStyle.DefaultStyle)
sfRenderWindow_setFramerateLimit(window, FRAMERATE.toUInt)
sfRenderWindow_setVerticalSyncEnabled(window, sfTrue)
window.setFramerateLimit(FRAMERATE)
window.setVerticalSyncEnabled(true)
val game = Game(window, Scene.Battle.BattleScene)
while sfRenderWindow_isOpen(window) == sfTrue do
sfRenderWindow_clear(window, sfBlack)
while window.isOpen() do
window.clear(Color(0, 0, 0, 0))
game.fetchEvents()
game.currentScene.components.foreach(_.update(game))
game.currentScene.components.foreach(_.draw(window))
sfRenderWindow_display(window)
window.display()
package Main
import scalanative.unsafe.*
import Pokemon.*
import Scene.*
import SFML.Config.*
import SFML.SFMLGraphics.*
import SFML.SFMLSystem.*
import SFML.SFMLWindow.*
import SFML.Graphics.RenderWindow
import SFML.Window.{Event, Mouse}
class Game(window: Ptr[sfRenderWindow], private var _currentScene: Scene):
import scalanative.unsafe.*
class Game(window: RenderWindow, private var _currentScene: Scene):
var isTrainerTurn = true
val trainer = Trainer("", List(PokemonFactory("Bulbasaur"), PokemonFactory("Squirtle")), 0)
......@@ -34,7 +32,7 @@ class Game(window: Ptr[sfRenderWindow], private var _currentScene: Scene):
if !trainer.primaryPokemon.get.isAlive then
if trainerPokemonIndex == trainer.numberPokemon then
sfRenderWindow_close(window)
window.close()
println("Tous tes Pokémons sont hors combat. Fin de partie.")
scala.sys.exit()
trainer.changePrimaryPokemon(trainerPokemonIndex)
......@@ -42,7 +40,7 @@ class Game(window: Ptr[sfRenderWindow], private var _currentScene: Scene):
if !trainerEnemy.primaryPokemon.get.isAlive then
if trainerPokemonEnemyIndex == trainerEnemy.numberPokemon then
sfRenderWindow_close(window)
window.close()
println("Tous les Pokémons adverses sont hors combat. Fin de partie.")
scala.sys.exit()
trainerEnemy.changePrimaryPokemon(trainerPokemonEnemyIndex)
......@@ -54,12 +52,10 @@ class Game(window: Ptr[sfRenderWindow], private var _currentScene: Scene):
_currentScene.load(this)
queryScene = None
val event = stackalloc[sfEvent]()
mouseButtonClicked = false
while sfRenderWindow_pollEvent(window, event) == sfTrue do
sfEventType.fromOrdinal(event._1) match
case sfEventType.sfEvtClosed => sfRenderWindow_close(window)
case sfEventType.sfEvtMouseMoved => mouse = (event._2, event._3)
case sfEventType.sfEvtMouseButtonPressed => if event._2 == 0 then mouseButtonClicked = true
case _ => ()
for event <- window.pollEvent() do
event match
case Event.Closed() => window.close()
case Event.MouseMoved(x, y) => mouse = (x, y)
case Event.MouseButtonPressed(Mouse.Button.Left, _, _) => mouseButtonClicked = true
case _ => ()
package SFML.Window
import scalanative.unsigned.UnsignedRichInt
import SFML.Config.*
object Window:
type sfContextSettings
enum sfWindowStyle(val value: sfUint32):
case sfNone extends sfWindowStyle(0.toUInt)
case sfTitlebar extends sfWindowStyle((1 << 0).toUInt)
case sfResize extends sfWindowStyle((1 << 1).toUInt)
case sfClose extends sfWindowStyle((1 << 2).toUInt)
case sfFullscreen extends sfWindowStyle((1 << 3).toUInt)
case sfDefaultStyle extends sfWindowStyle((sfTitlebar.value | sfResize.value | sfClose.value).toUInt)
package Component
import SFML.Config.*
import SFML.SFMLGraphics.*
import SFML.SFMLSystem.*
import scalanative.unsafe.*
import SFML.Graphics.IntRect
import Component.*
......@@ -19,13 +15,9 @@ trait Button(size_x: Int, size_y: Int) extends DrawableTexture:
def update(game: Main.Game): Unit =
val oldHovering = isHovering
val rect = stackalloc[sfIntRect]()
rect._1 = (pos._1).toInt
rect._2 = (pos._2).toInt
rect._3 = (size_x * scale).toInt
rect._4 = (size_y * scale).toInt
val rect = IntRect(pos._1.toInt, pos._2.toInt, size_x * scale, size_y * scale)
isHovering = (sfIntRect_contains(rect, game.mouse._1, game.mouse._2) == sfTrue)
isHovering = rect.contains(game.mouse._1, game.mouse._2)
if !oldHovering && isHovering then onMouseOver(game)
if oldHovering && !isHovering then onMouseExit(game)
......
package Component
import SFML.Config.*
import SFML.SFMLGraphics.*
import scalanative.unsafe.*
import scalanative.unsigned.*
import SFML.Graphics.RenderWindow
trait Drawable():
var color: sfUint8 = 255.toUByte
var color = 255.toByte
var pos = (0.0f, 0.0f)
var scale = 1
def draw(window: Ptr[sfRenderWindow]): Unit
def draw(window: RenderWindow): Unit
def init(): Unit
def update(game: Main.Game): Unit
package Component
import SFML.Config.*
import SFML.SFMLGraphics.*
import SFML.SFMLSystem.*
import SFML.Graphics.{Color, Font, RenderWindow, Text}
import SFML.System.Vector2f
import scalanative.unsafe.*
import scalanative.unsigned.*
trait DrawableText(font: Ptr[sfFont]) extends Drawable:
trait DrawableText(font: Font) extends Drawable:
var msg = ""
def draw(window: Ptr[sfRenderWindow]) =
val _text = sfText_create()
val _color = stackalloc[sfColor]()
_color._1 = color
_color._2 = color
_color._3 = color
_color._4 = 255.toUByte
val _pos = stackalloc[sfVector2f]()
_pos._1 = pos._1
_pos._2 = pos._2
def draw(window: RenderWindow) =
val text = Text()
sfText_setFont(_text, font)
Zone { implicit z => sfText_setString(_text, toCString(msg)) }
sfText_setColor(_text, _color)
sfText_setPosition(_text, _pos)
sfRenderWindow_drawText(window, _text, null)
sfText_destroy(_text)
text.setFont(font)
text.setString(msg)
text.setColor(Color(color, color, color, 255.toByte))
text.setPosition(Vector2f(pos._1, pos._2))
window.draw(text)
// text.destroy()
package Component
import SFML.Config.*
import SFML.SFMLGraphics.*
import SFML.SFMLSystem.*
import SFML.Graphics.{Color, IntRect, RenderWindow, Sprite, Texture}
import SFML.System.Vector2f
import scalanative.unsafe.*
import scalanative.unsigned.*
trait DrawableTexture(texture: Ptr[sfTexture]) extends Drawable:
trait DrawableTexture(texture: Texture) extends Drawable:
var rect: Option[(Int, Int)] = None
def draw(window: Ptr[sfRenderWindow]) =
val sprite = sfSprite_create()
val _color = stackalloc[sfColor]()
_color._1 = color
_color._2 = color
_color._3 = color
_color._4 = 255.toUByte
val _pos = stackalloc[sfVector2f]()
_pos._1 = pos._1
_pos._2 = pos._2
val _scale = stackalloc[sfVector2f]()
_scale._1 = scale
_scale._2 = scale
sfSprite_setTexture(sprite, texture, sfTrue)
def draw(window: RenderWindow) =
val sprite = Sprite(texture)
rect match
case None => ()
case Some(rect) =>
val _rect = stackalloc[sfIntRect]()
_rect._1 = 0
_rect._2 = 0
_rect._3 = rect._1
_rect._4 = rect._2
sfSprite_setTextureRect(sprite, _rect)
case None => ()
case Some(rect) => sprite.setTextureRect(IntRect(0, 0, rect._1, rect._2))
sfSprite_setPosition(sprite, _pos)
sfSprite_setScale(sprite, _scale)
sfSprite_setColor(sprite, _color)
sfRenderWindow_drawSprite(window, sprite, null)
sfSprite_destroy(sprite)
sprite.setPosition(Vector2f(pos._1, pos._2))
sprite.setScale(Vector2f(scale, scale))
sprite.setColor(Color(color, color, color, 255.toByte))
window.draw(sprite)
package Scene
import Component.*
import SFML.SFMLGraphics.*
import SFML.SFMLSystem.*
import SFML.Graphics.Texture
import scalanative.unsafe.*
class Sprite(texture: Ptr[sfTexture]) extends DrawableTexture(texture):
class Sprite(texture: Texture) extends DrawableTexture(texture):
def init() = ()
def update(game: Main.Game) = ()
package Scene
import Component.*
import SFML.SFMLGraphics.*
import SFML.SFMLSystem.*
import SFML.Graphics.Font
import scalanative.unsafe.*
class Text(font: Ptr[sfFont]) extends DrawableText(font):
class Text(font: Font) extends DrawableText(font):
def init() = ()
def update(game: Main.Game) = ()
package Scene.Battle
import scalanative.unsafe.*
import scalanative.unsigned.*
import Component.*
import Scene.*
import SFML.Config.*
import SFML.SFMLGraphics.*
import SFML.SFMLSystem.*
import SFML.SFMLWindow.*
import SFML.Graphics.{Font, IntRect, Texture}
object BattleScene extends Scene:
private def healthPercentage(life: Int, maxLife: Int): Int = (48 * (life.toFloat / maxLife.toFloat)).toInt
......@@ -17,93 +12,71 @@ object BattleScene extends Scene:
val pokemonTrainer = game.trainer.primaryPokemon.get
val pokemonTrainerEnemy = game.trainerEnemy.primaryPokemon.get
val rect = stackalloc[sfIntRect]()
rect._1 = 0
rect._2 = 0
rect._3 = 256
rect._4 = 144
val background = Sprite(sfTexture_createFromFile(c"src/main/resources/battle/background.png", rect))
val background = Sprite(Texture("src/main/resources/battle/background.png"))
background.scale = 4
val tiles = Sprite(sfTexture_createFromFile(c"src/main/resources/battle/tiles.png", rect))
val tiles = Sprite(Texture("src/main/resources/battle/tiles.png"))
tiles.scale = 4
rect._3 = 120
rect._4 = 41
val bar = Sprite(sfTexture_createFromFile(c"src/main/resources/battle/bar.png", rect))
val bar = Sprite(Texture("src/main/resources/battle/bar.png"))
bar.scale = 4
bar.pos = (544, 390)
rect._3 = 120
rect._4 = 30
val barEnemy = Sprite(sfTexture_createFromFile(c"src/main/resources/battle/bar_enemy.png", rect))
val barEnemy = Sprite(Texture("src/main/resources/battle/bar_enemy.png"))
barEnemy.scale = 4
barEnemy.pos = (0, 90)
rect._3 = 48
rect._4 = 7
val healthBar = Sprite(sfTexture_createFromFile(c"src/main/resources/battle/health_bar_green.png", rect))
val healthBar = Sprite(Texture("src/main/resources/battle/health_bar_green.png"))
healthBar.scale = 4
healthBar.pos = (792, 466)
healthBar.rect = Some(healthPercentage(pokemonTrainer.life, pokemonTrainer.maxLife), 7)
val healthBarEnemy = Sprite(sfTexture_createFromFile(c"src/main/resources/battle/health_bar_green.png", rect))
val healthBarEnemy = Sprite(Texture("src/main/resources/battle/health_bar_green.png"))
healthBarEnemy.scale = 4
healthBarEnemy.pos = (200, 166)
healthBarEnemy.rect = Some(healthPercentage(pokemonTrainerEnemy.life, pokemonTrainerEnemy.maxLife), 7)
rect._3 = 256
rect._4 = 48
val textbox = Sprite(sfTexture_createFromFile(c"src/main/resources/textbox.png", rect))
val textbox = Sprite(Texture("src/main/resources/textbox.png"))
textbox.scale = 4
textbox.pos = (0, 576)
rect._3 = 64
rect._4 = 64
val pokemonPath = f"src/main/resources/pokemons/back/${pokemonTrainer.id}%03d.png"
val pokemon = Zone { implicit z => Sprite(sfTexture_createFromFile(toCString(pokemonPath), rect)) }
val pokemon = Sprite(Texture(f"src/main/resources/pokemons/back/${pokemonTrainer.id}%03d.png"))
pokemon.scale = 4
pokemon.pos = (130, 320)
rect._3 = 64
rect._4 = 64
val pokemonEnemyPath = f"src/main/resources/pokemons/front/${pokemonTrainerEnemy.id}%03d.png"
val pokemonEnemy = Zone { implicit z => Sprite(sfTexture_createFromFile(toCString(pokemonEnemyPath), rect)) }
val pokemonEnemy = Sprite(Texture(f"src/main/resources/pokemons/front/${pokemonTrainerEnemy.id}%03d.png"))
pokemonEnemy.scale = 4
pokemonEnemy.pos = (645, 150)
rect._3 = 78
rect._4 = 46
val fightBox = FightBox(sfTexture_createFromFile(c"src/main/resources/battle/fight_box.png", rect))
val fightBox = FightBox(Texture("src/main/resources/battle/fight_box.png"))
fightBox.scale = 3
fightBox.pos = (690, 603)
val font = sfFont_createFromFile(c"src/main/resources/font.ttf")
val font = Font("src/main/resources/font.ttf")
val name = Text(font)
name.msg = pokemonTrainer.name
name.color = 0.toUByte
name.color = 0.toByte
name.pos = (624, 415)
val nameEnemy = Text(font)
nameEnemy.msg = pokemonTrainerEnemy.name
nameEnemy.color = 0.toUByte
nameEnemy.color = 0.toByte
nameEnemy.pos = (35, 115)
val health = Text(font)
health.msg = s"${pokemonTrainer.life}"
health.color = 0.toUByte
health.color = 0.toByte
health.pos = (800, 495)
val maxHealth = Text(font)
maxHealth.msg = s"${pokemonTrainer.maxLife}"
maxHealth.color = 0.toUByte
maxHealth.color = 0.toByte
maxHealth.pos = (920, 495)
val fight = Text(font)
fight.msg = "Fight"
fight.color = 255.toUByte
fight.color = 255.toByte
fight.pos = (745, 660)
this.addComponent(background)
......
package Scene.Battle
import SFML.SFMLGraphics.*
import SFML.SFMLSystem.*
import SFML.Graphics.Texture
import Component.*
import scalanative.unsafe.*
import scalanative.unsigned.*
class FightBox(texture: Ptr[sfTexture]) extends Button(78, 46) with DrawableTexture(texture):
def onMouseOver(game: Main.Game) = this.color = 200.toUByte
class FightBox(texture: Texture) extends Button(78, 46) with DrawableTexture(texture):
def onMouseOver(game: Main.Game) = this.color = 200.toByte
def onMouseClick(game: Main.Game) = game.queryScene = Some(Scene.Battle.CapacitySelector.CapacitySelectorScene)
def onMouseExit(game: Main.Game) = this.color = 255.toUByte
def onMouseExit(game: Main.Game) = this.color = 255.toByte
package Scene.Battle.CapacitySelector
import SFML.SFMLGraphics.*
import SFML.SFMLSystem.*
import SFML.Graphics.Texture
import Component.*
import scalanative.unsafe.*
import scalanative.unsigned.*
class CancelBox(texture: Ptr[sfTexture]) extends Button(238, 46) with DrawableTexture(texture):
def onMouseOver(game: Main.Game) = this.color = 200.toUByte
class CancelBox(texture: Texture) extends Button(238, 46) with DrawableTexture(texture):
def onMouseOver(game: Main.Game) = this.color = 200.toByte
def onMouseClick(game: Main.Game) = game.queryScene = Some(Scene.Battle.BattleScene)
def onMouseExit(game: Main.Game) = this.color = 255.toUByte
def onMouseExit(game: Main.Game) = this.color = 255.toByte
package Scene.Battle.CapacitySelector
import SFML.SFMLGraphics.*
import SFML.SFMLSystem.*
import SFML.Graphics.Texture
import Component.*
import Pokemon.*
import scalanative.unsafe.*
import scalanative.unsigned.*
class CapacityBox(texture: Ptr[sfTexture], capacity: Capacity) extends Button(124, 55) with DrawableTexture(texture):
def onMouseOver(game: Main.Game) = this.color = 200.toUByte
class CapacityBox(texture: Texture, capacity: Capacity) extends Button(124, 55) with DrawableTexture(texture):
def onMouseOver(game: Main.Game) = this.color = 200.toByte
def onMouseClick(game: Main.Game) =
game.trainer.primaryPokemon.get.useCapacity(capacity, game.trainerEnemy.primaryPokemon.get)
game.queryScene = Some(Scene.Battle.BattleScene)
game.isTrainerTurn = false
def onMouseExit(game: Main.Game) = this.color = 255.toUByte
def onMouseExit(game: Main.Game) = this.color = 255.toByte
package Scene.Battle.CapacitySelector
import scalanative.unsafe.*
import scalanative.unsigned.*
import Component.*
import Pokemon.*
import Scene.*
import SFML.Config.*
import SFML.SFMLGraphics.*
import SFML.SFMLSystem.*
import SFML.SFMLWindow.*
import SFML.Graphics.{Font, IntRect, Texture}
object CapacitySelectorScene extends Scene:
def load(game: Main.Game) =
val pokemonTrainer = game.trainer.primaryPokemon.get
val rect = stackalloc[sfIntRect]()
rect._1 = 0
rect._2 = 0
rect._3 = 256
rect._4 = 144
val background = Sprite(sfTexture_createFromFile(c"src/main/resources/battle/background_capacities.png", rect))
val background = Sprite(Texture("src/main/resources/battle/background_capacities.png"))
background.scale = 4
this.addComponent(background)
rect._3 = 124
rect._4 = 55
val capacity_texture = sfTexture_createFromFile(c"src/main/resources/battle/capacity.png", rect)
val font = sfFont_createFromFile(c"src/main/resources/font.ttf")
val capacity_texture = Texture("src/main/resources/battle/capacity.png")
val font = Font("src/main/resources/font.ttf")
if pokemonTrainer.capacity.length >= 1 then
val capacity_1 = CapacityBox(capacity_texture, pokemonTrainer.capacity(0))
......@@ -38,7 +25,7 @@ object CapacitySelectorScene extends Scene:
val capacity_text_1 = Text(font)
capacity_text_1.msg = pokemonTrainer.capacity(0).name
capacity_text_1.color = 0.toUByte
capacity_text_1.color = 0.toByte
capacity_text_1.pos = (68, 84)
this.addComponent(capacity_text_1)
......@@ -50,7 +37,7 @@ object CapacitySelectorScene extends Scene:
val capacity_text_2 = Text(font)
capacity_text_2.msg = pokemonTrainer.capacity(1).name
capacity_text_2.color = 0.toUByte
capacity_text_2.color = 0.toByte
capacity_text_2.pos = (580, 84)
this.addComponent(capacity_text_2)
......@@ -62,7 +49,7 @@ object CapacitySelectorScene extends Scene:
val capacity_text_3 = Text(font)
capacity_text_3.msg = pokemonTrainer.capacity(2).name
capacity_text_3.color = 0.toUByte
capacity_text_3.color = 0.toByte
capacity_text_3.pos = (68, 328)
this.addComponent(capacity_text_3)
......@@ -74,13 +61,11 @@ object CapacitySelectorScene extends Scene:
val capacity_text_4 = Text(font)
capacity_text_4.msg = pokemonTrainer.capacity(3).name
capacity_text_4.color = 0.toUByte
capacity_text_4.color = 0.toByte
capacity_text_4.pos = (580, 328)
this.addComponent(capacity_text_4)
rect._3 = 238
rect._4 = 46
val cancel = CancelBox(sfTexture_createFromFile(c"src/main/resources/battle/cancel_box.png", rect))
val cancel = CancelBox(Texture("src/main/resources/battle/cancel_box.png"))
cancel.scale = 4
cancel.pos = (36, 580)
......
package SFML
package Graphics:
export Wrapper.Graphics.{Color, FloatRect, Font, IntRect, RenderStates, RenderWindow, Sprite, Text, Texture}
package Window:
export Wrapper.Window.{Event, Keyboard, Joystick, Mouse, VideoMode, Window}
package System:
export Wrapper.System.{Vector2f}
package SFML.Graphics
package SFML.Bindings
package Graphics
import scalanative.unsafe.*
import SFML.Config.*
@link("csfml-graphics")
@extern object Color:
type sfColor = CStruct4[sfUint8, sfUint8, sfUint8, sfUint8]
type sfColor = CStruct4[Type.sfUint8, Type.sfUint8, Type.sfUint8, Type.sfUint8]
package SFML.Graphics
package SFML.Bindings.Graphics
import scalanative.unsafe.*
......
package SFML.Graphics
package SFML.Bindings
package Graphics
import scalanative.unsafe.*
import SFML.Config.*
@link("csfml-graphics")
@extern object Rect:
type sfIntRect = CStruct4[CInt, CInt, CInt, CInt]
type sfFloatRect = CStruct4[CFloat, CFloat, CFloat, CFloat]
def sfIntRect_contains(rect: Ptr[sfIntRect], x: CInt, y: CInt): sfBool = extern
def sfFloatRect_contains(rect: Ptr[sfFloatRect], x: CFloat, y: CFloat): sfBool = extern
def sfIntRect_contains(rect: Ptr[sfIntRect], x: CInt, y: CInt): Type.sfBool = extern
def sfFloatRect_contains(rect: Ptr[sfFloatRect], x: CFloat, y: CFloat): Type.sfBool = extern
package SFML.Graphics
package SFML.Bindings
package Graphics
object RenderStates:
type sfRenderStates