Commit d2574f9a authored by Mathys's avatar Mathys
Browse files

merge infini

parents f5c67c1d 3bcf5496
{
"WindowTitle": "test",
"WindowSizeX": 800,
"WindowSizeY": 800,
"ParticleImage": "assets/particle.png",
"Debug": true,
"InitNumParticles": 0,
"RandomSpawn": false,
"SpawnX": 400,
"SpawnY": 400,
"SpawnRate": 0,
"SpeedLimit": [0,0,0,0],
"Colors": [1,1,1,1,1,1],
"Gravity": false,
"GravityCenter": false,
"NumCycle": 0,
"LifeOpt": [""]
}
\ No newline at end of file
......@@ -10,9 +10,18 @@
"scaleY":1,
"SpawnX": 400,
"SpawnY": 400,
"SpawnRate": 0,
"SpeedLimit": [0,20,0,0],
"Spawnimg" : false,
"SpawnRate": 0.00025,
"SpeedLimit": [0,0,0,0],
"Colors": [0,1,0,1,0,1],
"Gravity": false,
"GravityCenter": false,
"NumCycle": 300,
"Pictures": "",
"Colors": [1,1,1,1,1,1]
"LifeOpt": ["grow","fade","Death"],
"Scaleimg": false,
"Spawnimg" : false,
"GravityPoint": false,
"Clock" : false,
"Horlogescale" : 2
}
......@@ -4,16 +4,42 @@ Léo TRANCHET , Mathys M , Lana Heyrendt
### Utilisation :
`git clone https://gitlab.univ-nantes.fr/E215151K/sae_particule.git`
```
git clone https://gitlab.univ-nantes.fr/E215151K/sae_particule.git
cd sae_particule
go build
./project-particles [ARGUMENT]
```
Lancer le fichier **Particule.sh**
`./Particles.sh`
Vous pouvez utiliser les sufixes suivants :
### Liste des Arguments
+ Default ( Génére des particules blanches )
arguments with "!" are not implemented yet
+ Spirale ( Génére une spirale de particules )
+ `Default` Génére des particules blanches statiques
+ Gravite ( Génére des particules en activant la fonction "Gravité" )
+ ! `Spirale` Génére des particules qui prennent la forme d'une spirale
+ ! `Gravite` Applique une gravité sur les particules
+ `LifeCycle` Donne au particule une durée de vie
+ ! `Image` Les particules spawn aléatoirement et se déplace pour former un image
### Detail de config.json :
+ `WindowTitle` Le nom de la fenếtre
+ `WindowSizeX` Taille "verticale" de la fenếtre
+ `WindowSizeY` Taille "verticale" de la fenếtre
+ `ParticleImage` Indique l'image utiliser pour les particules
+ `Debug` Affiche les FPS
+ `InitNumParticles` Le nombre de particules initiales
+ `RandomSpawn` Rend la postition d'apparition des particules aléatoires
+ `SpawnX,SpawnY` La postion de spawn des particules
+ `SpeedLimit` Tableau de vitesse des particules (4 float) dans l'ordre : Vitesse minimum en X , Vitesse maximum en X , Vitesse minimum en Y ,Vitesse maximum en Y
+ `Colors` Couleurs des particules (spectre RGB) dans l'ordre min,max
+ `Gravity` Donne de la gravité au particules
+ `GravityCenter` Crée un centre de gravité
+ `NumCycle` donne un nombre de cycle a vivre pour les particules (mettre 0 pour désactiver)
+ `LifeOpt` Tableau de chaine de charactère pour des options relative au cycle de vie ("grow" les particules grandissent au fur et a mesure ; "fade" les particules devienne transparente ; "Death" les particules disparaise a la fin de leurs cycle de vie)
......@@ -4,11 +4,22 @@
"WindowSizeY": 600,
"ParticleImage": "assets/particle.png",
"Debug": true,
"InitNumParticles": 10,
"InitNumParticles": 100000,
"RandomSpawn": true,
"SpawnX": 400,
"SpawnY": 400,
"scaleX":1,
"scaleY":1,
"SpawnRate": 0,
"SpeedLimit": [0,0,0,0],
"Colors": [1,1,1,1,1,1]
}
"SpeedLimit": [-1,1,-1,1],
"Colors": [0,1,0,1,0,1],
"Gravity": false,
"Pictures": "",
"GravityCenter": false,
"Scaleimg": false,
"Spawnimg" : false,
"GravityPoint": false,
"Clock" : false,
"Horlogescale" : 2
}
\ No newline at end of file
......@@ -25,6 +25,8 @@ type Config struct {
Gravity,GravityCenter,GravityPoint bool //Active plusieurs type de gravités, GravityPoint attire les pixels d'une image vers leur position d'origine sur celle ci
Clock bool //fait apparaitre une les aiguilles d'une horloge analogique s'actualisant, peut etre combine avec Pictures pour rajouter un fond
Horlogescale int //determine la taille des aiguilles, une valeur de 1 pour 250pixels est recommandé
NumCycle int
LifeOpt []string
}
var General Config
......@@ -15,12 +15,16 @@ import (
func (g *game) Draw(screen *ebiten.Image) {
for _, p := range g.system.Content {
options := ebiten.DrawImageOptions{}
options.GeoM.Rotate(p.Rotation)
options.GeoM.Scale(p.ScaleX, p.ScaleY)
options.GeoM.Translate(p.PositionX, p.PositionY)
options.ColorM.Scale(p.ColorRed, p.ColorGreen, p.ColorBlue, p.Opacity)
screen.DrawImage(assets.ParticleImage, &options)
if p.Overflow{
continue
}else{
options := ebiten.DrawImageOptions{}
options.GeoM.Rotate(p.Rotation)
options.GeoM.Scale(p.ScaleX, p.ScaleY)
options.GeoM.Translate(p.PositionX, p.PositionY)
options.ColorM.Scale(p.ColorRed, p.ColorGreen, p.ColorBlue, p.Opacity)
screen.DrawImage(assets.ParticleImage, &options)
}
}
if config.General.Debug {
......
......@@ -63,6 +63,14 @@ func commands() {
ExecPart("./Extension/Clock/clock.json")
},
},
{
Name: "Life",
Aliases: []string{"l"},
Usage: "Give particule a \"Life Cycle\"",
Action: func(c *cli.Context) {
ExecPart("./Extension/life.json")
},
},
}
}
......
package particles
import (
"project-particles/config"
"math/rand"
"project-particles/config"
"time"
"project-particles/Extension/Pictures"
"strconv"
......@@ -14,26 +14,29 @@ import (
// Dans sa version actuelle, cette fonction affiche une particule blanche au
// centre de l'écran.
func GenPart() (Particle) { // Crée une particule avec Px,Py comme position
func GenPart() Particle { // Crée une particule avec Px,Py comme position
rand.Seed(time.Now().UnixNano())
var PosX,PosY int = config.General.SpawnX, config.General.SpawnY
var PosX, PosY int = config.General.SpawnX, config.General.SpawnY
// Si le fichier de config le demande, la position des particules devient aléatoire
if config.General.RandomSpawn {
PosX,PosY = rand.Intn(config.General.WindowSizeX) , rand.Intn(config.General.WindowSizeY)
PosX, PosY = rand.Intn(config.General.WindowSizeX), rand.Intn(config.General.WindowSizeY)
}
return Particle{
PositionX: float64(PosX),
PositionY: float64(PosY),
ScaleX: config.General.ScaleX, ScaleY: config.General.ScaleY,
ColorRed: config.General.Colors[0] + rand.Float64() * ( config.General.Colors[1] - config.General.Colors[0] ),
ColorGreen: config.General.Colors[2] + rand.Float64() * ( config.General.Colors[3] - config.General.Colors[2] ),
ColorBlue: config.General.Colors[4] + rand.Float64() * ( config.General.Colors[5] - config.General.Colors[4] ),
Opacity: 1,
SpeedX: config.General.SpeedLimit[0] + rand.Float64()* (config.General.SpeedLimit[1]-config.General.SpeedLimit[0]),
SpeedY: config.General.SpeedLimit[2] + rand.Float64()* (config.General.SpeedLimit[3]-config.General.SpeedLimit[2]),
CibleX: float64(PosX),
CibleY: float64(PosY),
ColorRed: config.General.Colors[0] + rand.Float64()*(config.General.Colors[1]-config.General.Colors[0]),
ColorGreen: config.General.Colors[2] + rand.Float64()*(config.General.Colors[3]-config.General.Colors[2]),
ColorBlue: config.General.Colors[4] + rand.Float64()*(config.General.Colors[5]-config.General.Colors[4]),
Opacity: 1,
SpeedX: config.General.SpeedLimit[0] + rand.Float64()*(config.General.SpeedLimit[1]-config.General.SpeedLimit[0]),
SpeedY: config.General.SpeedLimit[2] + rand.Float64()*(config.General.SpeedLimit[3]-config.General.SpeedLimit[2]),
Overflow: false,
Life: config.General.NumCycle,
}
}
......@@ -46,7 +49,7 @@ func gettime()[]float64 {
}
// fonction NewSystem
func NewSystem() System {
// Initialise les variables et la seed de math/rand
// Initialise les variables et la seed de math/rand
var TabParticule []Particle
var NombreDeParticules int = config.General.InitNumParticles
......
......@@ -5,43 +5,75 @@ import (
"project-particles/config"
)
func Test_System_Vide(t *testing.T) {
config.Get("../Extension/TestConfig.json")
config.General.InitNumParticles = 0
Sys := NewSystem()
if Sys.Content != nil{
t.Fail()
}
}
func Test_System_Nombre(t *testing.T) {
config.Get("../Extension/TestConfig.json")
config.General.InitNumParticles = 10
Systemtest := NewSystem()
if len(Systemtest.Content) != 10 {
t.Fail()
}
}
func TestVide(t *testing.T) {
config.Get("../config.json")
config.General.InitNumParticles = 0
Systemtest := NewSystem()
if Systemtest.Content != nil{
func Test_GenPart_Position_Non_Aleatoire(t *testing.T) {
config.Get("../Extension/TestConfig.json")
config.General.SpawnX = 400
config.General.SpawnY = 400
config.General.RandomSpawn = false
var p Particle = GenPart()
if p.PositionX != 400 || p.PositionY != 400 {
t.Fail()
}
}
func TestNombre(t *testing.T) {
config.Get("../config.json")
Systemtest := NewSystem()
if len(Systemtest.Content) != config.General.InitNumParticles{
// May Cause false positive since it mesure probability of a random event
func Test_System_Position_Aleatoire(t *testing.T) {
config.Get("../Extension/TestConfig.json")
config.General.RandomSpawn = true
config.General.InitNumParticles = 10
Sys := NewSystem()
var prob int = config.General.InitNumParticles
for i:=0; i < len(Sys.Content); i++ {
if Sys.Content[i].PositionX == 400 || Sys.Content[i].PositionY == 400 {
prob += -1
}
}
if prob < 3 {
t.Fail()
}
}
func TestNonAleatoire(t *testing.T){
config.Get("../config.json")
config.General.RandomSpawn = false
for i:= 0; i< len(NewSystem().Content); i++{
if NewSystem().Content[i].PositionX != float64(config.General.SpawnX) || NewSystem().Content[i].PositionY != float64(config.General.SpawnY){
t.Fail()
}
func Test_GenPart_Speed(t *testing.T) {
config.Get("../Extension/TestConfig.json")
config.General.SpeedLimit = []float64 {1,1,1,1}
part := GenPart()
if part.SpeedX != 1 || part.SpeedY != 1 {
t.Fail()
}
}
func TestAléatoire(t *testing.T){
config.Get("../config.json")
config.General.RandomSpawn = true
for i:=0 ; i <len(NewSystem().Content);i++{
if NewSystem().Content[i].PositionX > float64(config.General.WindowSizeX) || NewSystem().Content[i].PositionX < 0 || NewSystem().Content[i].PositionY > float64(config.General.WindowSizeY) || NewSystem().Content[i].PositionY <0{
t.Fail()
}
func Test_GenPart_colors(t *testing.T) {
config.Get("../Extension/TestConfig.json")
config.General.Colors = []float64 {1,1,1,1,1,1}
part := GenPart()
if part.ColorRed != 1 || part.ColorGreen != 1 || part.ColorBlue != 1 {
t.Fail()
}
}
func Test_GenPart_Life(t *testing.T) {
config.Get("../Extension/TestConfig.json")
config.General.NumCycle = 1
part := GenPart()
if part.Life != 1 {
t.Fail()
}
}
\ No newline at end of file
......@@ -4,7 +4,7 @@ package particles
// Pour le moment il ne contient qu'un tableau de particules, mais cela peut
// évoluer durant votre projet.
type System struct {
Content []Particle
Content []Particle
SpawBuffer float64
}
......@@ -24,4 +24,6 @@ type Particle struct {
GravityCenter bool
GravityImg bool
CibleX, CibleY float64
Overflow bool
Life int
}
......@@ -11,19 +11,38 @@ import (
// projet.
// C'est à vous de développer cette fonction.
func Nettoyage(tab []*Particle) ([]*Particle){
maxi := float64(config.General.WindowSizeX)
mini := float64(config.General.WindowSizeY)
func Nettoyage(tab []Particle) ([]Particle){
for i:=0; i< len(tab); i++{
if tab[i].PositionX > maxi|| tab[i].PositionX < 0 || tab[i].PositionY > mini || tab[i].PositionY < -10{
tab = append(tab[:i], tab[i+1:]...)
i = i -1
if int(tab[i].PositionX) > config.General.WindowSizeX || int(tab[i].PositionX) < 0 || int(tab[i].PositionY) > config.General.WindowSizeY || int(tab[i].PositionY) < -10{
tab[i].Overflow = true
}
}
return tab
}
func UpdateCycle(Part Particle) (Particle) {
Part.Life = Part.Life -1
for i:=0; i < len(config.General.LifeOpt); i++ {
if config.General.LifeOpt[i] == "Death" && Part.Life == 0 {
Part.Overflow = true
}
if config.General.LifeOpt[i] == "white" {
Part.ColorRed += (1-Part.ColorRed)*(1-(float64(Part.Life) / float64(config.General.NumCycle)))
Part.ColorBlue += (1-Part.ColorBlue)*(1-(float64(Part.Life) / float64(config.General.NumCycle)))
Part.ColorGreen += (1-Part.ColorGreen)*(1-(float64(Part.Life) / float64(config.General.NumCycle)))
}
if config.General.LifeOpt[i] == "fade" {
Part.Opacity = (float64(Part.Life)/float64(config.General.NumCycle))
}
if config.General.LifeOpt[i] == "grow" && Part.Life != 0 {
Part.PositionX += -0.0125
Part.ScaleX += 0.025
Part.PositionY += -0.0125
Part.ScaleY += 0.025
}
}
return Part
}
func gravite(p Particle) (Particle){
if p.SpeedY > 0{
......@@ -154,27 +173,22 @@ func spirale(p Particle) (Particle){
return p
}
func (s *System) Update() {
var tabPointeursParticle []*Particle
for i:=0; i<len(s.Content); i++{
tabPointeursParticle = append(tabPointeursParticle, &s.Content[i])
}
tabPointeursParticle = Nettoyage(tabPointeursParticle)
s.Content = []Particle{}
for i:=0; i<len(tabPointeursParticle); i++{
s.Content = append(s.Content, *tabPointeursParticle[i])
}
s.Content = Nettoyage(s.Content)
for i:=0; i < len(s.Content); i++ {
s.Content[i].PositionX += s.Content[i].SpeedX
s.Content[i].PositionY += s.Content[i].SpeedY
if config.General.Gravity{
s.Content[i] = gravite(s.Content[i])
}
if config.General.GravityCenter{
s.Content[i] = spirale(s.Content[i])
if s.Content[i].Overflow == false {
s.Content[i].PositionX += s.Content[i].SpeedX
s.Content[i].PositionY += s.Content[i].SpeedY
if config.General.Gravity{
s.Content[i] = gravite(s.Content[i])
}
if config.General.GravityCenter{
s.Content[i] = spirale(s.Content[i])
}
if config.General.NumCycle > 0 {
s.Content[i] = UpdateCycle(s.Content[i])
}
}
if config.General.GravityPoint{
s.Content[i] = gravitepoint(s.Content[i])
......@@ -184,11 +198,13 @@ func (s *System) Update() {
if config.General.Clock{
s.Content = ClockUpdate(s.Content)
}
NbSpaw := config.General.SpawnRate + s.SpawBuffer
for i:=0; i < int(NbSpaw); i++ {
NbSpawn := config.General.SpawnRate + s.SpawBuffer
for i:=0; i < int(NbSpawn); i++ {
s.Content = append(s.Content,GenPart())
}
s.SpawBuffer = NbSpaw - float64(int(NbSpaw))
s.SpawBuffer = NbSpawn - float64(int(NbSpawn))
}
\ No newline at end of file
package particles
import (
"testing"
"project-particles/config"
"testing"
"math/rand"
"time"
"project-particles/config"
)
func TestVitesseNull(t *testing.T){
config.Get("../config.json")
config.Get("../Extension/TestConfig.json")
config.General.SpawnRate = 0
tab := []float64{0,0,0,0}
config.General.SpeedLimit = tab
config.General.SpeedLimit = []float64{0,0,0,0}
var SystemTest System = NewSystem()
for i:=0; i<len(SystemTest.Content)-1;i++{
PosX1 := SystemTest.Content[i].PositionX
......@@ -20,12 +20,10 @@ func TestVitesseNull(t *testing.T){
t.Fail()
}
}
}
func TestVitesse(t *testing.T){
config.Get("../config.json")
config.Get("../Extension/TestConfig.json")
config.General.SpawnRate = 0
var SystemTest System = NewSystem()
for i:=0; i<len(SystemTest.Content)-1;i++{
......@@ -36,6 +34,29 @@ func TestVitesse(t *testing.T){
t.Fail()
}
}
}
func Test_Netoyage(t *testing.T) {
config.Get("../Extension/TestConfig.json")
config.General.WindowSizeX = 400
config.General.WindowSizeY = 400
config.General.SpawnX = 200
config.General.SpawnY = 200
config.General.SpeedLimit = []float64 {1,1,0,0}
p := GenPart()
Ptab := []Particle {p}
config.General.SpawnX = 397
p = GenPart()
Ptab = append(Ptab,p)
rand.Seed(time.Now().UnixNano())
for i:=0; i < 15; i++ {
if rand.Intn(1) == 1 {
config.General.SpawnX = 397
p = GenPart()
} else {
config.General.SpawnX = 200
p = GenPart()
}
Ptab = append(Ptab,p)
}
}
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment