cercle vide

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

cercle vide

Message par chikun »

:? on fait comment un cercle vide :roll:

c bien la pure mais fo s'accrocher :(

et va s'y Jeannot :lol:

ps: pas en sprite si possible
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message par Gillou »

Regarde la commande 'drawingmode'

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 100, 100, "", #PB_Window_SystemMenu) And CreateGadgetList(WindowID(0))
    
    If CreateImage(0, 100, 100)
        StartDrawing(ImageOutput(0))
            DrawingMode(#PB_2DDrawing_Outlined)
            Circle(50, 50, 20, $00FF00)
        StopDrawing()
        
        ImageGadget(0, 0, 0, 100, 100, ImageID(0))
    EndIf
    
    Repeat
        e = WaitWindowEvent()
    Until e = #PB_Event_CloseWindow
    
    If IsImage(0) : FreeImage(0) : EndIf
EndIf
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

merci Gillou
waouuu le jolie cercle vert :D
tres sympa de me guider

mais...mon dieu que d'instruction à apprendre encore :roll:
accroche toi jeannot :lol:
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message par Gillou »

Pas de pb, c'est un forum d'entraide, n'hésites pas ;)
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

ok alors j'en profite, c pas un probleme pour avoir le meme resultat en ecran "openscreen" ?
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message par Gillou »

Même principe

Code : Tout sélectionner

If InitSprite() = 0
    MessageRequester("Erreur", "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !", 0)
    End
EndIf

If OpenWindow(0, 0, 0, 220, 160, "Un écran dans une fenêtre...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(0))
        ButtonGadget(0, 170, 135, 45, 20, "Quitter")
    EndIf
    If OpenWindowedScreen(WindowID(0), 0, 0, 160, 160, 0, 0, 0)
        CreateSprite(0, 20, 20)
        If StartDrawing(SpriteOutput(0))
                DrawingMode(#PB_2DDrawing_Outlined)
                Circle(10, 10, 10, $ff00ff)
            StopDrawing()
        EndIf
    Else
        MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
        End
    EndIf
EndIf

direction = 2
Repeat

    Repeat
        Event = WindowEvent()
        
        Select Event
            Case #PB_Event_Gadget
                If EventGadget() = 0
                    End
                EndIf
                
            Case #PB_Event_CloseWindow
                End
        EndSelect
    Until Event = 0
    
    FlipBuffers()
    ClearScreen(RGB(0, 0, 0))
    DisplaySprite(0, x, x)
    x + direction
    If x > 140 : direction = -2 : EndIf
    If x < 0   : direction =  2 : EndIf
    Delay(1)
ForEver
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

c tres sympa de vouloir m'aider Gillou, mais regarde cette routine tu comprendras sur quel écran j'ai commençé

dans le cadre d'une etude en vue de réaliser une sorte de flipper
j'ai commençé par etudier un rebond correct sur les bords d'ecran.. (faite le test , ça me semble correct)

j'ai ensuite mis une barre inclinée pour effectuer des test de rebond en utilisant spritepixelcollision.... mais ce test ralenti le prg , alors je voudrais remplaçer ma balle bleue par un cercle vide et demander en son centre s'il rencontre la barre inclinée avec: Plot

mais je sais pas le faire :roll: avis aux patients

je pense avoir rendu clair le prg avec dans la boucle for next un ptit com recapitulatif

Code : Tout sélectionner

InitSprite() 
InitKeyboard() 
InitMouse() 

OpenScreen(1024, 768, 32, "squelette ecran") 
; 992,736 

Structure objet 
    xb.w 
    yb.w  
    an.w
EndStructure 
#balle=1
#target=2

Dim objet.objet(2) 

CreateSprite ( #balle,32,32) 
StartDrawing ( SpriteOutput (#balle)) 
  Circle (16,16,16, RGB (0,0,255)) 
StopDrawing () 

CreateSprite ( #target,100,50) 
StartDrawing ( SpriteOutput (#target)) 
  LineXY(0,50,100,0,RGB(128,250,32))
StopDrawing () 
objet(#target)\xb=400 : objet(#target)\yb=300 : objet(#target)\an=360

ang=180 : st=1 : diam=600

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
 
Repeat 
StartDrawing(ScreenOutput()) 
DrawText(0,0,"Chikun",RGB(125,90,30),RGB(0,0,0)) 
DrawText(370,0,"clic droit > sortir ___/___ clic gauche > shooter",RGB(0,200,100), RGB(0,0,0)) 
DrawText(369,16,"(A) ang à gauche ___/___ (Z) ang à droite",RGB(0,200,100), RGB(0,0,0)) 
StopDrawing() 
 
ExamineMouse() 
mx=MouseX() : my=MouseY()
If mx>992 : mx=992 : EndIf
If my>736 : my=736 : EndIf

objet(#balle)\xb=mx : objet(#balle)\yb=my

StartDrawing(ScreenOutput()) 
Line(mx+16,my+16,px,py,RGB(255,0,0)) 

StopDrawing() 


DisplayTransparentSprite(#balle,objet(#balle)\xb,objet(#balle)\yb) 
DisplayTransparentSprite(#target,objet(#target)\xb,objet(#target)\yb) 


FlipBuffers()
 

ExamineKeyboard() 
      If KeyboardPushed(#PB_Key_Q) : ang=ang-st : EndIf ;"A"
       
      If KeyboardPushed(#PB_Key_W) : ang=ang+st : EndIf ;"Z"
      
px=diam*Cos(ang*#PI/180) 
py=diam*Sin(ang*#PI/180) 
ClearScreen(RGB(0, 0,0))


      If MouseButton(1)
       
          
           
            For i=1 To 400


            objet(#balle)\xb=objet(#balle)\xb+16*Cos(ang*#PI/180) 
            objet(#balle)\yb=objet(#balle)\yb+16*Sin(ang*#PI/180) 

            DisplayTransparentSprite(#balle,objet(#balle)\xb,objet(#balle)\yb) 
            DisplayTransparentSprite(#target,objet(#target)\xb,objet(#target)\yb) 
                    
            StartDrawing(ScreenOutput()) 
            Line(mx+16,my+16,px,py,RGB(255,0,0)) 
            DrawText(0,0,"Chikun",RGB(125,90,30),RGB(0,0,0)) 
            StopDrawing()      
                      
            FlipBuffers() 
            
               If objet(#balle)\yb<0 : objet(#balle)\yb=0 : ang=-ang : EndIf
               If objet(#balle)\yb>736 : objet(#balle)\yb=736 : ang=-ang : EndIf
               If objet(#balle)\xb<0 : objet(#balle)\xb=0 : ang=270+(270-ang):EndIf
               If objet(#balle)\xb>992 : objet(#balle)\xb=992 : ang=270+(270-ang): EndIf
                ; au lieu de :
               If SpritePixelCollision(#balle,objet(#balle)\xb,objet(#balle)\yb,#target,objet(#target)\xb,objet(#target)\yb) : Delay(3000) : EndIf
                ; je voudrais avoir un cercle vide (au lieu de ma balle bleue) et demander si le centre (par Plot) rencontre un obstacle (une couleur)
            
            
            ClearScreen(RGB(0, 0,0))
            Next i 
            
      EndIf
 



Until MouseButton(2) 
End 
Anonyme

Message par Anonyme »

pour un cercle transparent :

Code : Tout sélectionner

CreateSprite ( #balle,32,32)
StartDrawing ( SpriteOutput (#balle))
  DrawingMode(#PB_2DDrawing_Outlined)
  Circle (16,16,16, RGB (0,0,255))
StopDrawing ()
Pour une collision avec un cercle , pas besoin de sprite pixel machin , tu connais le rayon de la sphère.
Donc , Si BalleX-Rayon < 0 alors ta balle sors de l'écran par la gauche
Regarde du coté des vecteurs , normale d'une droite , collision segment sphère ( dispo sur le forum ) avant d'essayer de codé toi même des "routines" de collisions. Il te faut quelques connaissance mathématique avant de te lancer la dedans. quand j'ai commençer la prog , j'étais une quiche en math , maintenant , après moult heures de compréhension , ca roule tout seul !
je vais voir pour te faire un snippet.
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

heu merci mais !? je ne cherche pas a tester les sorties d'ecran mais la rencontre avec un objet sur l'ecran (ici la barre inclinée) ..

c pas avec pixelcoltruc que je test si ma balle sort de l'écran ..as tu pris le temps de "lire" ma routine" ...
ou alors c moi qui ne comprend pas ce que tu veux me dire , je retourne te lire..
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

ok! je retire plus haut :?

... avant d'afficher ma balle bleue, je demande à sa futur position s'il y a une couleur.... donc la barre inclinée :lol:
Anonyme

Message par Anonyme »

j'ai pris la sortie d'écran comme exemple , car elle est simple à comprendre.
Si tu veut faire un rebond avec une droite , je te met au défi d'utiliser SpritePixelCol...() , il de faut connaitre les points qui compose ta droite ( 2 vecteur ) , calculer la normale , le vecteur direction , Calculer le nouveau vecteur de direction , une routine qui te dit si le segment est en collision avec une sphere ( bresham + Test distance/rayon ?) + un test en ammont AABB ( aligned bounding box )
Tu vas me dire , que de vocabulaire , je ne cherche pas "à me la péter" , de toute façon , la science , c'est comme le nutella , moins ont en à, plus l'étale...
Tout se que je viens de te citer , est le strict minimum pour des collisions , je ne parle pas de physique pure , comme la gravité , le vent , la friction... faut voir huitbit pour ça...

Voila voila , a toi de faire un minimum de recherche avec le vocabulaire cité plus haut.

@++
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: cercle vide

Message par beauregard »

chikun a écrit ::? on fait comment un cercle vide :roll:

c bien la pure mais fo s'accrocher :(

et va s'y Jeannot :lol:

ps: pas en sprite si possible
je ne vais pas t'aider dans ton objectif du moment, mais voilà ce que je pense( qu'il faut prendre comme une aparté hein):
1) un jeu de flipper n'est pas facile à faire( un beau défis bien difficile même). Tu as mis la barre trop haut quoi( perso je ne m'en sens pas capable).
2) les sprites2D( ram) sont rapide, les sprites3D( video ram) le sont encore plus( avec en prime zoom, rotation, transparence)... et tu n'es pas obligé d'apprendre les commandes par coeur, tu fais un copier/coller et pis voilà( çà finira par rentrer tout seul avec le temps). Par contre pour les variables, là, faut une bonne mémoire...
A+ :)
Avatar de l’utilisateur
Ouaf-Ouaf
Messages : 212
Inscription : dim. 11/juil./2004 9:07

Message par Ouaf-Ouaf »

2) les sprites2D( ram) sont rapide, les sprites3D( video ram) le sont encore plus( avec en prime zoom, rotation, transparence )...
Ce n'est pas juste les transformations qui sont plus rapides ? Grâce à l'ut de la carte graphique quoi.
Par ce que j'etais resté là dessus :

Intro de Sprite3D dans l'aide :
Une carte graphique récente est recommandée pour bénéficier de la pleine puissance de ces fonctions (avec accélération des fonctions 3D). Les sprites 3D sont proposés pour réaliser facilement des effets hors du commun, mais il ne faut pas oublier qu'ils sont moins rapides que les sprites classiques et plus restrictifs en termes de taille par exemple.

Quand au sprites classiques, ces infos de createSprite(), ça veux pas dire que le sprite est chargé sur la RAM uniquement sur demande, ou si la mem video ne le permet plus ?
0 : Mode par défaut (le sprite est chargé dans la mémoire video, si possible)
#PB_Sprite_Memory : Le sprite est créé dans la mémoire principale du PC (plus lent sauf en mode SpecialFX())
#PB_Sprite_Alpha : Le sprite est au format 8 bits (256 couleurs) en niveau de gris utilisé par DisplayAlphaSprite(), DisplayShadowSprite() ou DisplaySolidSprite()
#PB_Sprite_Texture: Le sprite est créé avec le support 3D (texture) nécessaire à la fonction CreateSprite3D() de la bibliothèque Sprite3D.
En ce qui concerne le point 1, je suis relativement d'accord mais..
La complexitée me semble plus due à l'astreinte du temps (pour les êtres materiels perrisables j'entends).
Après ce n'est jamais qu'une combinaison de problematiques qui peuvent être étudiées séparément, posément.. Qui de plus repondent à un système existant, déjà decortiqués par maintes hommes brillants du bulbe logique (faut dire qu'ils astiquent hein [pardon]), système existant donc, qui n'est autre que notre univers, là, palpable, sous nos pieds.. heu.. et au dessus de notre tête.

Tout est affaire, respectivement et recursivement, d'observation [des codes de Huibytes :lol:] , de methode, et de temps. :D

Je ne deconseillerais ça à personne =]
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Ouaf-Ouaf a écrit :Quand au sprites classiques, ces infos de createSprite(), ça veux pas dire que le sprite est chargé sur la RAM uniquement sur demande, ou si la mem video ne le permet plus ?
0 : Mode par défaut (le sprite est chargé dans la mémoire video, si possible)
#PB_Sprite_Memory : Le sprite est créé dans la mémoire principale du PC (plus lent sauf en mode SpecialFX())
#PB_Sprite_Alpha : Le sprite est au format 8 bits (256 couleurs) en niveau de gris utilisé par DisplayAlphaSprite(), DisplayShadowSprite() ou DisplaySolidSprite()
#PB_Sprite_Texture: Le sprite est créé avec le support 3D (texture) nécessaire à la fonction CreateSprite3D() de la bibliothèque Sprite3D.
En ce qui concerne le point 1, je suis relativement d'accord mais..
La complexitée me semble plus due à l'astreinte du temps (pour les êtres materiels perrisables j'entends).
Après ce n'est jamais qu'une combinaison de problematiques qui peuvent être étudiées séparément, posément.. Qui de plus repondent à un système existant, déjà decortiqués par maintes hommes brillants du bulbe logique (faut dire qu'ils astiquent hein [pardon]), système existant donc, qui n'est autre que notre univers, là, palpable, sous nos pieds.. heu.. et au dessus de notre tête.

Tout est affaire, respectivement et recursivement, d'observation [des codes de Huibytes :lol:] , de methode, et de temps. :D

Je ne deconseillerais ça à personne =]
Ah, j'ai encore fait une bourde !
Tu as surement raison, mais comment voir, avec nos yeux fatigués, si un sprite2D est plus rapide qu'un sprite3D ? Si je devais commencer aujourd'hui un grand jeu, je le ferai uniquement avec des sprites3D, toujours rapport au zoom, rotation, transparence réalisé le doigt dans le nez, et c'est dans ce sens que l'on gagne du temps...
Hier et aujourd'hui, j'ai transformé des sprites2D en sprites3D, car ils étaient la cause de ralentissement: j'affiche de large étendu d'eau transparente( en sprites3D), les images affichées avant doivent également être en sprites3D... et maintenant le jeu est fluide en toute circonstance( ce qui fait toujours plaisir :D ).

Donc PB n'est pas en cause comme je pouvais le penser au début, il faut juste utiliser les sprites3D et pis c'est tout.

Pour en revenir au sujet, un pong ou un space invader permet de mieux démarrer( bibliothèque liste chainées et sprite).
Avatar de l’utilisateur
Ouaf-Ouaf
Messages : 212
Inscription : dim. 11/juil./2004 9:07

Message par Ouaf-Ouaf »

Ah, j'ai encore fait une bourde !
Pas de blem hein, rassuré de voir que tu n'as pas pris ça comme une petite attaque mesquine lol. ^^
Tu as surement raison, mais comment voir, avec nos yeux fatigués, si un sprite2D est plus rapide qu'un sprite3D ? Si je devais commencer aujourd'hui un grand jeu, je le ferai uniquement avec des sprites3D, toujours rapport au zoom, rotation, transparence réalisé le doigt dans le nez, et c'est dans ce sens que l'on gagne du temps...
Oukiii ! J'avais pas compris ça.

Du reste, je pense que même si le flippers est plus complexe, ça reste un empilement de problèmes, qui pris un à un, ne sont pas plus diaboliques qu'un pong ou autres. ? Nop ?
Répondre