une fourmiliere (enfin le debut)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Clair que Werber ça casse pas des barres niveau phrasé mais la trilogie des Fourmis (et les thanatonautes), je les ai trouvé vraiment captivants. Même si il ne fait que reprendre des infos ici et là. :)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Message par Cool Dji »

Bon c'est po trop grave, je lis beaucoup et ça enrichira ma culture perso.
Bon, c'est toujours du temps en moins passé sur PureBasic, mais ma douce aime beaucoup quand je lis à coté d'elle le soir au lit au lieu d'être sur l'ordi !!! Faut parfois faire des concessions !!! Ah Yeah !
Only PureBasic makes it possible
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Cool Dji a écrit :Bon c'est po trop grave, je lis beaucoup et ça enrichira ma culture perso.
Bon, c'est toujours du temps en moins passé sur PureBasic, mais ma douce aime beaucoup quand je lis à coté d'elle le soir au lit au lieu d'être sur l'ordi !!! Faut parfois faire des concessions !!! Ah Yeah !
tiens ça me rappelle quelqu'un.. heuu mais c'est moi :P
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Ce qui est cocasse c'est qu'un bouquin de Raymond de Rienzi en 1932 "Les formiciens" était la préfiguration parfaite de la thématique de la trilogie des fourmis ;)
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

kerkael: finalement non. tant qu'elle dépose les pheromones, c pas toutes les autres qui chg de couleur en croisant...
tu dis: "Ce n'est que l'accumulation de phéromones qui indique aux fourmis qu'une piste est très fréquentée, donc pleine de promesse". Par la suite j'en tiendrai compte. merci
au final l"eclaireur" comme tu dis ira ramener la bouffe aussi..

Dobro: si j'en suis là (mm si je suis pas tres loin), c bq grace à toi...
je vais "jouer" avec ce prg dés que j'aurrai un moment
au 1er coup d'oeil, je ne connais pas "EcranX = GetSystemMetrics_(#SM_CXSCREEN)"

Cool Dji: merci, mais attend pas trop vite ma "nouvelle version", g une autre vie aussi, puis demande a dobro comment je comprend vite quand on m'explique longtemps

Ar-S: non hélas , j'ai pas ouvert de boukin sur les fourmis, mais reçu des brides d'info et j'ai pensé qu'elles émettaient des phéro de tt nature (danger, bouffe...) et que pour cette derniere elles s'estomper apres qu'il n'y aurrait plus rien à rapporter.

En tout cas , à tous ceux qui portent un interet, je vais bosser dur la semaine prochaine, car en prog. g jamais renoncer et mon but était de créer une seconde colonie à base d'affrontement et c pour ça que g mis la barre haute (50 fourmis) pour observer si il y a ralentissement...
la je vois que je vais pouvoir diviser en deux le clan. ou au moin faire 30/30

quand au moin, les fourmis detecteront tous les phéromones, j'éclaircirais ma routine au maximum...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

chikun a écrit : au 1er coup d'oeil, je ne connais pas "EcranX = GetSystemMetrics_(#SM_CXSCREEN)"
c'est une Api qui recupere la largeur (l'autre est pour la hauteur)en pixel de la résolution de ton ordinateur !! :)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Pour la détection de la piste des phéromones, tu peux "tricher" en créant un tableau de la taille de l'écran, contenant la ou les valeurs représentatives des phéromones (plusieurs pistes superposées seraient ainsi possibles, l'évaporation et les directions aussi). Ce serait plus rapide que de tester l'écran.
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

voilà, comme promis pour ceux qui me soutienne, je recommence presque tout à commencer par une petite translation sur le prg de dobro concernant 1 seule sprite et bq d'ordre et de clarté.
Ici juste le déplacement des fourmis dans une boite...


djes :
Pour la détection de la piste des phéromones, tu peux "tricher" en créant un tableau de la taille de l'écran, contenant la ou les valeurs représentatives des phéromones
j'y ai pensé, mais es ce que ça ne me fait pas comparer à chaque déplacement tout le contenu du tbx à la position de chaque fourmi ?
la question c comment un sprite rencontre kkchose sur l'ecran sans utiliser spritepixelcolllision étant donné qu'il y a trop de points (pheromones) a moins que que je crée un sprite oblique et un autre droit (trait jaune representant les phero) et que j'utilise l'instruction de collission...mais je crois que pour reduire, je vais, tous les 16 pas creer une phéromone sprite....

les pheromones sont préparées dans la structure au début (ancien prg) se sont des sprites aussi, kan une fourmi a trouvé la bouffe elle "pompe" les coordonnées pour se deplacer et ramener la bouffe (bien surs , c a venir). en fait kan tu vois une fourmis poser les pheromones, elle transfere ses coord. dans la structure...(dsl je m'exprime tres mal)

bon, je vais me coucher

Code : Tout sélectionner

; @ Chikun version 0.001

Structure sprite
    xe.l
    ye.l
    direction.b
    sensx.b
    sensy.b
EndStructure

Enumeration
    #sprite_fond
    #sprite
EndEnumeration

nbr_sprite=50
Dim sprite.sprite(nbr_sprite)

; Test
EcranX = GetSystemMetrics_(#SM_CXSCREEN)
EcranY = GetSystemMetrics_(#SM_CYSCREEN)
InitSprite(): InitKeyboard()


OpenScreen (EcranX,EcranY,32,"Test")

; *********** ce sprite sert a effacer le fond ! ****************************
CreateSprite(#sprite_fond,EcranX,EcranY)
StartDrawing(SpriteOutput(#sprite_fond))
    Box(0,0,EcranX,EcranY,RGB(0,0,0))
StopDrawing()
; ***************************************************************************

; *********** dessine le  sprite *****************

CreateSprite(#sprite, 16, 16) ; c'est la meme image qui est employé
    ; dessine le sprite
StartDrawing(SpriteOutput(#sprite))
    Circle(8,8,8, RGB(65,32,14))
StopDrawing()

; je les place au départ (plus tard dans la fourmilière)
For i=1 To nbr_sprite
sprite(i)\xe=300 : sprite(i)\ye=200
Next i

Repeat
    
    
    ;{ determine la direction
    
    For i=1 To nbr_sprite
        
        temp=Random(50) 
        If temp=25 
            sprite(i)\direction=Random(7)+1; choix de la direction 
        EndIf 
        
        ; nord:
        If sprite(i)\direction=1 
            sprite(i)\sensx=0 
            sprite(i)\sensy=-1 
        EndIf  
        ; nord/est:
        If sprite(i)\direction=2 
            sprite(i)\sensx=1 
            sprite(i)\sensy=-1  
        EndIf  
        ; est:
        If sprite(i)\direction=3 
            sprite(i)\sensx=1 
            sprite(i)\sensy=0 
        EndIf  
        ; sud/est:
        If sprite(i)\direction=4  
            sprite(i)\sensx=1 
            sprite(i)\sensy=1  
        EndIf  
        ; sud:
        If sprite(i)\direction=5 
            sprite(i)\sensx=0 
            sprite(i)\sensy=1  
        EndIf  
        ; sud/ouest:
        If sprite(i)\direction=6  
            sprite(i)\sensx=-1 
            sprite(i)\sensy=1  
        EndIf  
        ; ouest:
        If sprite(i)\direction=7 
            sprite(i)\sensx=-1 
            sprite(i)\sensy=0 
        EndIf  
        ; nord/ouest:
        If sprite(i)\direction=8 
            sprite(i)\sensx=-1 
            sprite(i)\sensy=-1 
        EndIf  
        
        ; sortie d'écran (maintenir dans "une boite")
        If sprite(i)\xe<0 
            sprite(i)\xe=0
        EndIf 
        If sprite(i)\xe>EcranX-20;1024 
            sprite(i)\xe=EcranX-20 ;1024
        EndIf 
        If sprite(i)\ye<0 
            sprite(i)\ye=0
        EndIf 
        If sprite(i)\ye>EcranY-18 ;768 
            sprite(i)\ye=EcranY-18 ;768
        EndIf 
        
    ;} 
   
       
    ; une fois que le sens est aquis: déplacement
    sprite(i)\xe=sprite(i)\xe+sprite(i)\sensx 
    sprite(i)\ye=sprite(i)\ye+sprite(i)\sensy
    
    DisplayTransparentSprite(#sprite,sprite(i)\xe,sprite(i)\ye)   ; toujour la meme image qui est affiché
        
    
    ExamineKeyboard()
    If  KeyboardPushed(#PB_Key_Escape)
        End
    EndIf
    
    Next i 
    FlipBuffers()
    DisplaySprite(#sprite_fond,0,0)
   
ForEver

chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

Dobro :lol: merci
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Pourquoi tu comparerais tout le contenu du tableau, plutôt qu'uniquement les données à l'endroit où se trouve la fourmi, voire quelques cases autour? Quant à "poser" un sprite tous les 16 pixels, tu peux faire un tableau plus petit que l'écran et accéder aux coordonnées en divisant les x et les y.

Par exemple:

Code : Tout sélectionner

pheromones(sprite(i)\x / 16, sprite(i)\y / 16) = #True
Un tableau sera toujours plus rapide que d'accéder à l'écran, sauf si tu veux faire des formes complexes.
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

djes

8O [quote]

Code : Tout sélectionner

pheromones(sprite(i)\x / 16, sprite(i)\y / 16) = #True


dsl je comprend pas ...c un tbx appelé "pheromones" et on enregistre une seule valeur "#true" à partir de coordonnées x,y !?

sachant x et y quelle valeur prend #true ?
tu veux bien développer un peu stp...
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

j'ai un petit peu nettoyé le code pour t'aider

un petit Select pour les directions

et j'ai sortie la gestion du clavier de la boucle For Next

Bon courage

Code : Tout sélectionner

; @ Chikun version 0.001

Structure sprite
  xe.l
  ye.l
  direction.b
  sensx.b
  sensy.b
EndStructure

Enumeration
  #sprite_fond
  #sprite
EndEnumeration

nbr_sprite = 50
Dim sprite.sprite(nbr_sprite)

; Test
EcranX = GetSystemMetrics_(#SM_CXSCREEN)
EcranY = GetSystemMetrics_(#SM_CYSCREEN)
InitSprite() : InitKeyboard()


OpenScreen (EcranX, EcranY, 32, "Test")

; *********** ce sprite sert a effacer le fond ! ****************************
CreateSprite(#sprite_fond, EcranX, EcranY)
StartDrawing(SpriteOutput(#sprite_fond))
  Box(0, 0, EcranX, EcranY, RGB(0, 0, 0))
StopDrawing()
; ***************************************************************************

; *********** dessine le  sprite *****************

CreateSprite(#sprite, 16, 16) ; c'est la meme image qui est employé
; dessine le sprite
StartDrawing(SpriteOutput(#sprite))
  Circle(8, 8, 8, RGB(65, 32, 14))
StopDrawing()

; je les place au départ (plus tard dans la fourmilière)
For i = 1 To nbr_sprite
  sprite(i)\xe = 300 : sprite(i)\ye = 200
Next

Repeat
  
  ;{ determine la direction
  
  For i = 1 To nbr_sprite
    
    If Random(50) = 0
      sprite(i)\direction = Random(7) + 1
      Select sprite(i)\direction
        Case 1
          ; nord:
          sprite(i)\sensx = 0
          sprite(i)\sensy = -1
        Case 2
          ; nord/est:
          sprite(i)\sensx = 1
          sprite(i)\sensy = -1
        Case 3
          ; est:
          sprite(i)\sensx = 1
          sprite(i)\sensy = 0
        Case 4
          ; sud/est:
          sprite(i)\sensx = 1
          sprite(i)\sensy = 1
        Case 5
          ; sud:
          sprite(i)\sensx = 0
          sprite(i)\sensy = 1
        Case 6
          ; sud/ouest:
          sprite(i)\sensx = -1
          sprite(i)\sensy = 1
        Case 7
          ; ouest:
          sprite(i)\sensx = -1
          sprite(i)\sensy = 0
        Case 8
          ; nord/ouest:
          sprite(i)\sensx = -1
          sprite(i)\sensy = -1
      EndSelect
    EndIf

    
    
    ; sortie d'écran (maintenir dans "une boite")
    If sprite(i)\xe < 0
      sprite(i)\xe = 0
    EndIf
    If sprite(i)\xe > EcranX - 20 ; 1024
      sprite(i)\xe = EcranX - 20 ; 1024
    EndIf
    If sprite(i)\ye < 0
      sprite(i)\ye = 0
    EndIf
    If sprite(i)\ye > EcranY - 18 ; 768
      sprite(i)\ye = EcranY - 18 ; 768
    EndIf
    
    ;}
    
    
    ; une fois que le sens est aquis: déplacement
    sprite(i)\xe = sprite(i)\xe + sprite(i)\sensx
    sprite(i)\ye = sprite(i)\ye + sprite(i)\sensy
    
    DisplayTransparentSprite(#sprite, sprite(i)\xe, sprite(i)\ye) ; toujour la meme image qui est affiché
    
    
    
    
  Next
  
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Escape)
    End
  EndIf
  FlipBuffers()
  DisplaySprite(#sprite_fond, 0, 0)
  
ForEver
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Hum! Ok, je vois.

pheromones() serait un tableau que tu créerais en début de programme. Par exemple, pour créer un tableau contenant des entiers, pour pouvoir poser une phéromones tous les 16 pixels :

Code : Tout sélectionner

dim pheromones.l(EcranX / 16, EcranY / 16)
#True est une constante. Admettons qu'au début de ton programme (ou à chaque boucle), tu effaces ton tableau, chaque case contiendra 0 (=#False). Pour poser une phéromone, tu assignes #True (ou n'importe quelle autre valeur) à la case de ton tableau correspondant à la position de la fourmi. Mais pour avoir la position dans le tableau, je divise les coordonnées par 16.

C'est un exemple bien sûr! Tu peux avoir un tableau de la même taille que l'écran! Mais avoir moins de cases améliorera le résultat de la collision, tu risqueras moins de passer "à travers" la trajectoire d'une autre fourmi.
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

Le Soldat Inconnu: :) merci pour m'avoir apris "select"
et j'ai sortie la gestion du clavier de la boucle For Next
:) bien vue!

djes :
hum! ok je vois
:wink: hum! ok je vois....
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

chikun a écrit :Le Soldat Inconnu: :) merci pour m'avoir apris "select"
et j'ai sortie la gestion du clavier de la boucle For Next
:) bien vue!

djes :
hum! ok je vois
:wink: hum! ok je vois....
Excuse, c'est un pote qui faisait souvent ça, j'ai repris son expression! :P
Sinon, j'avais marqué:
Hum! Ok, je vois.
Ce qui n'est pas DU TOUT la même chose. :lol:
Répondre