Nantes Université

Skip to content
Extraits de code Groupes Projets
Valider 9c25402a rédigé par Jibril CHETTAOUI's avatar Jibril CHETTAOUI :squid:
Parcourir les fichiers

Merge branch 'release2' into 'main'

Mise à jour de la documentation

See merge request E230960T/s-101-chettaoui-jibril-viaud-jeanne!22
parents ab343a70 5673cbec
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -17,8 +17,7 @@ Réalisation du projet d'implémentation quadtree par CHETTAOUI Jibril et VIAUD
- 0 : La caméra est statique
- 1 : La caméra suit le joueur
- 2 : La caméra suit le joueur, mais se bloque aux extrémités du terrain
- 3 :
- 4 : La caméra
- 3 : La caméra suit le joueur, mais de manière plus précise
- `FloorKind`: Défini la méthode d'affichage du sol
- 0 : Affiche une grille infinie
- 1 : Affiche un terrain à partir d'un fichier (stocké dans un tableau)
......
......@@ -48,14 +48,14 @@ var ParticleImage *ebiten.Image
//go:embed squareParticle.png
var squareParticleBytes []byte
// SquareParticle est l'image utilisable par Ebiten qui représente une particule
// SquareParticle est l'image utilisable par Ebiten qui représente une particule carrée
var SquareParticle *ebiten.Image
//go:embed lumiere.png
var lumiereParticleBytes []byte
// Lumiere est l'image utilisable par Ebiten qui représente une particule de lumiere
var Lumiere *ebiten.Image
// LightParticle est l'image utilisable par Ebiten qui représente une particule de lumiere
var LightParticle *ebiten.Image
// Load est la fonction en charge de transformer, à l'exécution du programme,
// les images du jeu en structures de données compatibles avec Ebitengine.
......@@ -95,5 +95,5 @@ func Load() {
if err != nil {
log.Fatal(err)
}
Lumiere = ebiten.NewImageFromImage(decoded)
LightParticle = ebiten.NewImageFromImage(decoded)
}
......@@ -64,6 +64,8 @@ func (c *Camera) updateStuckAtBorder(characterPosX, characterPosY int) {
}
}
// updateCinematographic est la mise-à-jour d'une caméra dite 'cinématographique'.
// Elle permet au joueur une certaine liberté de mouvement avant de modifier sa propre position.
func (c *Camera) updateCinematographic(charX, charY int) {
if math.Abs(float64(charX-c.X)) > distanceBeforeCameraMovement {
if charX > c.X {
......@@ -82,6 +84,8 @@ func (c *Camera) updateCinematographic(charX, charY int) {
}
}
// GetShift renvoie le décalage en pixel de la caméra par rapport au coin supérieur gauche d'une case.
// (Utilisé en CamMode 4 uniquement actuellement)
func (c Camera) GetShift() (int, int) {
return c.X % configuration.Global.TileSize, c.Y % configuration.Global.TileSize
}
......@@ -72,9 +72,11 @@ func (c Character) drawPixel(screen *ebiten.Image, camX, camY int) {
image.Rect(shiftX, shiftY, shiftX+configuration.Global.TileSize, shiftY+configuration.Global.TileSize),
).(*ebiten.Image), op)
op2 := &ebiten.DrawImageOptions{}
op2.GeoM.Translate(float64(c.X-topLeftX), float64(c.Y-topLeftY))
screen.DrawImage(assets.ParticleImage, op2)
if configuration.Global.CameraMode == camera.Cinematographic {
op2 := &ebiten.DrawImageOptions{}
op2.GeoM.Translate(float64(c.X-topLeftX), float64(c.Y-topLeftY))
screen.DrawImage(assets.ParticleImage, op2)
}
}
func (c Character) GetShift() (xShift, yShift int) {
......
......@@ -19,6 +19,7 @@ func (c *Character) Update(blocking [4]bool) {
}
// updateRegular est la mise-à-jour classique du personnage
func (c *Character) updateRegular(blocking [4]bool) {
if !c.Moving {
if c.Teleporting {
......@@ -69,9 +70,9 @@ func (c *Character) updateRegular(blocking [4]bool) {
}
}
// todo: reduce speed by using c.moving and maybe a counter
// updateCinematographic est la mise-à-jour du personnage en CamMode 4
func (c *Character) updateCinematographic(blocking [4]bool) {
// todo: reduce speed by using c.moving and maybe a counter
//if !c.moving {
// if ebiten.IsKeyPressed(ebiten.KeyRight) {
// c.orientation = orientedRight
......@@ -138,6 +139,7 @@ func (c *Character) updateCinematographic(blocking [4]bool) {
}
}
// StopMovement annule tout mouvement en cours du joueur. Elle est notamment appelée lors des téléportations.
func (c *Character) StopMovement() {
c.xInc = 0
c.yInc = 0
......
......@@ -64,7 +64,6 @@ type Configuration struct {
SpawnPlace int
ParticlesOnWalking bool
ParticlesOnTeleport int
SnowParticles bool
ScreenWidth, ScreenHeight int `json:"-"`
ScreenCenterTileX, ScreenCenterTileY int `json:"-"`
......
......@@ -7,8 +7,6 @@ import (
"math"
)
// todo: documentation
// Blocking retourne, étant donné la position du personnage,
// un tableau de booléen indiquant si les cases au-dessus (0),
// à droite (1), au-dessous (2) et à gauche (3) du personnage
......
......@@ -170,7 +170,7 @@ func randomPattern(width, height int) (pattern [][]int) {
return pattern
}
// savePattern est une fonction permettant de sauvegarder un pattern
// savePattern est une fonction permettant de sauvegarder un terrain
func savePattern(pattern [][]int, name string) {
var fileContent string
......
......@@ -135,6 +135,8 @@ func (f *Floor) updateQuadtreeFloor(camXPos, camYPos int) {
f.quadtreeContent.GetContent(topLeftX, topLeftY, f.content)
}
// le sol est récupéré depuis un quadtree qui a été lu dans un fichier
// et qui est mis à jour au fur et à mesure des déplacements du joueur
func (f *Floor) updateContinuousQuadtree(camXPos, camYPos int) {
var topLeftX, topLeftY, bottomRightX, bottomRightY int
switch configuration.Global.CameraMode {
......
......@@ -112,6 +112,11 @@ func (g Game) drawDebug(screen *ebiten.Image) {
ebitenutil.DebugPrintAt(screen, fmt.Sprint("aIndex: ", g.floor.AnimationIndex), xMaxPos+2*configuration.Global.TileSize+configuration.Global.TileSize/2, 8*ySpace)
}
if configuration.Global.CameraMode == camera.Cinematographic {
ebitenutil.DebugPrintAt(screen, fmt.Sprint("(", g.camera.X/16, ",", g.camera.Y/16, ")"), xMaxPos+2*configuration.Global.TileSize+configuration.Global.TileSize/2, 2*ySpace)
ebitenutil.DebugPrintAt(screen, fmt.Sprint("(", g.character.X/16, ",", g.character.Y/16, ")"), xMaxPos+2*configuration.Global.TileSize+configuration.Global.TileSize/2, 5*ySpace)
}
// 2nd column
ebitenutil.DebugPrintAt(screen, "Téléporteurs:", xMaxPos+6*configuration.Global.TileSize, 0)
tpString := ""
......@@ -125,13 +130,9 @@ func (g Game) drawDebug(screen *ebiten.Image) {
}
ebitenutil.DebugPrintAt(screen, tpString, xMaxPos+6*configuration.Global.TileSize+configuration.Global.TileSize/2, 0)
if configuration.Global.CameraMode == camera.Cinematographic {
ebitenutil.DebugPrintAt(screen, fmt.Sprint("(", g.camera.X/16, ",", g.camera.Y/16, ")"), xMaxPos+2*configuration.Global.TileSize+configuration.Global.TileSize/2, 2*ySpace)
ebitenutil.DebugPrintAt(screen, fmt.Sprint("(", g.character.X/16, ",", g.character.Y/16, ")"), xMaxPos+2*configuration.Global.TileSize+configuration.Global.TileSize/2, 5*ySpace)
}
}
// drawFps permet l'affichage du nombre de fps
func (g Game) drawFps(screen *ebiten.Image) {
ebitenutil.DebugPrintAt(screen, fmt.Sprint("FPS: ", math.Round(ebiten.ActualFPS())), 0, 0)
}
package game
// Init initialise les données d'un jeu. Il faut bien
// faire attention à l'ordre des initialisation car elles
// faire attention à l'ordre des initialisations, car elles
// pourraient dépendre les unes des autres.
func (g *Game) Init() {
g.character.Init()
......
......@@ -8,7 +8,7 @@ import (
"math/rand"
)
// SnowPart est une particule inutilisée. Ce fichier est un modèle pour créer de nouvelles particules.
// SnowPart est une particule simulant de la neige.
//
// SnowPart implémente l'interface Particule
//
......
......@@ -9,7 +9,7 @@ import (
"math/rand"
)
// SparkPart est une particule simulant des étincelles lors de la téléportation du personnage
// SparkPart est une particule simulant des étincelles lors de la téléportation du personnage.
//
// SparkPart implémente l'interface Particule
//
......@@ -120,7 +120,7 @@ func (s *SparkSystem) Draw(screen *ebiten.Image, camX, camY int) {
options := ebiten.DrawImageOptions{}
options.GeoM.Scale(p.scaleX, p.scaleY)
options.GeoM.Translate(xPos, yPos)
screen.DrawImage(assets.Lumiere, &options)
screen.DrawImage(assets.LightParticle, &options)
}
}
}
......
......@@ -9,30 +9,31 @@ import (
"image"
)
// TeleportPart est une particule apparaissant lorsque le joueur se téléporte
// TeleportPart implémente l'interface Particule
type TeleportPart struct {
// TeleportSlidePart est une particule apparaissant lorsque le joueur se téléporte (si ParticlesOnTeleport vaut 1)
//
// TeleportSlidePart implémente l'interface Particule
type TeleportSlidePart struct {
x, y float64
colorRed, colorGreen, colorBlue, colorAlpha float32
lifetime, startLifetime int
}
func (p *TeleportPart) GetPosition() (x, y float64) { return p.x, p.y }
func (p *TeleportPart) GetColor() (r, g, b, a float32) {
func (p *TeleportSlidePart) GetPosition() (x, y float64) { return p.x, p.y }
func (p *TeleportSlidePart) GetColor() (r, g, b, a float32) {
return p.colorRed, p.colorGreen, p.colorBlue, p.colorAlpha
}
func (p *TeleportPart) GetLifetime() (l int) { return p.lifetime }
func (p *TeleportPart) SetPosition(x, y float64) { p.x, p.y = x, y }
func (p *TeleportPart) SetColor(r, g, b, a float32) {
func (p *TeleportSlidePart) GetLifetime() (l int) { return p.lifetime }
func (p *TeleportSlidePart) SetPosition(x, y float64) { p.x, p.y = x, y }
func (p *TeleportSlidePart) SetColor(r, g, b, a float32) {
p.colorRed, p.colorGreen, p.colorBlue, p.colorAlpha = r, g, b, a
}
func (p *TeleportPart) SetLifetime(l int) { p.lifetime, p.startLifetime = l, l }
func (p *TeleportSlidePart) SetLifetime(l int) { p.lifetime, p.startLifetime = l, l }
// TeleportSlideSystem défini le système responsable des particules de poussière lors des déplacements du joueur
// TeleportSlideSystem implémente l'interface ParticuleSystem et possède les attributs suivants :
// - content : la liste des particules
type TeleportSlideSystem struct {
content []*TeleportPart
content []*TeleportSlidePart
// temp
moving bool
......@@ -49,7 +50,7 @@ func (s *TeleportSlideSystem) Init(c *character.Character) {
lineAmount := screenHeight/teleportPartSize + 1
partAmount := columnAmount * lineAmount
s.content = make([]*TeleportPart, partAmount)
s.content = make([]*TeleportSlidePart, partAmount)
s.moving = false
s.duration = 40
s.timeSpent = 0
......@@ -77,13 +78,13 @@ func (s *TeleportSlideSystem) Init(c *character.Character) {
repair2 := 1 - repair
var color = [3]float32{
degrad(colorPart[c.Src[0]][0], colorPart[c.Src[1]][0], repair, repair2),
degrad(colorPart[c.Src[0]][1], colorPart[c.Src[1]][1], repair, repair2),
degrad(colorPart[c.Src[0]][2], colorPart[c.Src[1]][2], repair, repair2),
gradient(colorPart[c.Src[0]][0], colorPart[c.Src[1]][0], repair, repair2),
gradient(colorPart[c.Src[0]][1], colorPart[c.Src[1]][1], repair, repair2),
gradient(colorPart[c.Src[0]][2], colorPart[c.Src[1]][2], repair, repair2),
}
var r, g, b = color[0], color[1], color[2]
p := &TeleportPart{
p := &TeleportSlidePart{
x: x,
y: float64(teleportPartSize * j),
......@@ -98,8 +99,8 @@ func (s *TeleportSlideSystem) Init(c *character.Character) {
}
// degrad renvoi la valeur nécessaire à faire le dégradé de l'écran de particule
func degrad(colorHaut, colorBas, repHaut, repBas float32) (resu float32) {
// gradient renvoie la valeur nécessaire à faire le dégradé de l'écran de particule
func gradient(colorHaut, colorBas, repHaut, repBas float32) (resu float32) {
return colorHaut*repHaut + colorBas*repBas
}
......
......@@ -7,6 +7,7 @@ import (
"strings"
)
// Save permet de sauvegarder le contenu d'un Quadtree dans un fichier
func (q Quadtree) Save(filename string) {
content := nodeToStringToSave(q.root)
file, err := os.Create("../floor-files/" + filename)
......@@ -25,6 +26,7 @@ func (q Quadtree) Save(filename string) {
}
}
// nodeToStringToSave permet de convertir le contenu d'une node en une chaîne de caractères
func nodeToStringToSave(n *node) (res string) {
if n == nil {
return ""
......@@ -61,6 +63,8 @@ func nodeToStringToSave(n *node) (res string) {
return res
}
// stringQuarterFusion fusionne 4 chaînes de caractères en une seule.
// Chaque chaîne représente un coin d'un rectangle.
func stringQuarterFusion(s1, s2, s3, s4 string, height int) (res string) {
t1 := strings.Split(s1, "\n")
t2 := strings.Split(s2, "\n")
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter