Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - Kernel panik

Pages: [1]
1
Graphique / Re: Besoin d'aide pour un calcul de trajectoire...
« le: Juillet 24, 2017, 04:48:48 pm »
En faite on ne fait pas une recherche d'intersection entre un rectangle et une droite mais entre deux segments.
Pour l'étendre à un rectangle, tu peux le faire sur les quatre fois (une fois pour chaque côté du rectangle) ou uniquement sur les diagonale pour gagner du temps de calcul. Ce qui peut être intéressant si tu as beaucoup de rectangles à tester
Cependant, en faisant le calcul sur les diagonales tu perds un peu en précision. La détection ne se fera pas dans certains cas particuliers où le rayon entre dans le rectangle mais s’arrête avant d'atteindre une diagonale. Ce qui n'est pas un problème dans le cas où le rayon à une portée « illimitée ».
De plus le point d'intersection retourné se trouve à l'intérieur du rectangle et non sur l'un des bords. Cela peut être gênant suivant l'ordre d'affichage.
A toi de voir ce que tu souhaites privilégier en fonction de tes besoins.

Pour ce qui est du calcul de l'intersection en lui même c'est juste un peu de maths ^_^
Il faut commencer par calculer les paramètres des équations des droites dont les segments font partie.
Donc j'ai un segment [A0 A1] qui fait partie de la droite d'équation y = Aa * x + Ab, et le segment [B0 B1] qui fait partie de la droite d'équation y = Ba * x + Bb. Tu peux adapter cette partie là si tu utilises des coordonnées polaires pour définir ton rayon à la place de deux points.
   float Aa = (_A1.y - _A0.y) / (_A1.x - _A0.x);
   float Ab = _A0.y - (Aa * _A0.x);

   float Ba = (_B1.y - _B0.y) / (_B1.x - _B0.x);
   float Bb = _B0.y - (Ba * _B0.x);

Ensuite on teste si la pente des droites ne sont pas les mêmes, si c'est le cas les droites sont parallèles il n'y aura donc pas d'intersection.
   if (Aa == Ba)
      return false;

Pour trouver l'intersection, il reste juste à résoudre un système de 2 équations 2 inconnues :
y = Aa * x + Ab
y = Ba * x + Bb
La solution étant :
   float x = (Bb - Ab) / (Aa - Ba);

Il reste alors à vérifier que le x trouvé pour le point d'intersection se trouve bien sur le segment et pas sur une le reste des droites. Dans le cas où tu aurais un rayon avec une portée illimitée il ne faudra faire ce test que pour le segment correspondant au rectangle.
   if (x < _A0.x || x > _A1.x)
      return false;

   if (x < _B0.x || x > _B1.x)
      return false;

Si c'est le cas tu peux alors calculer ton y et affecter le résultat au pointeur passé en paramètre
   _intersects->x = x;
   _intersects->y = Aa * x + Ab;


Voila, j'espère que ça répond à tes questions ^_^

2
Graphique / Re: Besoin d'aide pour un calcul de trajectoire...
« le: Juillet 23, 2017, 04:53:46 pm »
Bonjour ^_^

Il existe plusieurs façon de le faire. A mon avis le plus simple est de calculer le point d’intersection entre le rayon et les deux diagonales du carré.

Pour ce faire, tu peux utiliser une fonction qui calcul le point d'intersection entre deux segments A et B définit par leurs points A0, A1 et B0, B1 et retourne true s'il y a intersection ainsi que le point d'intersection dans le paramètre _intersects (pour limiter le tracé du rayon jusqu'à ce point)

bool Intersects (sf::Vector2f _A0, sf::Vector2f _A1, sf::Vector2f _B0, sf::Vector2f _B1, sf::Vector2f* _intersects)    
{
   float Aa = (_A1.y - _A0.y) / (_A1.x - _A0.x);
   float Ab = _A0.y - (Aa * _A0.x);

   float Ba = (_B1.y - _B0.y) / (_B1.x - _B0.x);
   float Bb = _B0.y - (Ba * _B0.x);

   if (Aa == Ba)
      return false;

   float x = (Bb - Ab) / (Aa - Ba);
   if (x < _A0.x || x > _A1.x)
      return false;

   if (x < _B0.x || x > _B1.x)
      return false;

   _intersects->x = x;
   _intersects->y = Aa * x + Ab;

   return true;
}
 

Ensuite, tu n'as plus qu'à faire une fonction qui l’appelle pour chaque diagonale.

bool Intersects(sf::Vector2f _A0, sf::Vector2f _A1, sf::FloatRect _rect, sf::Vector2f* _intersects)    
{
   if (Intersects(_A0, _A1, sf::Vector2f(_rect.left, _rect.top), sf::Vector2f(_rect.left + _rect.width, _rect.top + _rect.height), _intersects))
      return true;

   return Intersects(_A0, _A1, sf::Vector2f(_rect.left, _rect.top + _rect.height), sf::Vector2f(_rect.left + _rect.width, _rect.top), _intersects);
}
 

Tu peux sûrement optimiser ce code pour utiliser directement les variables que tu utilises mais ça te donne une idée.

3
Général / Re : Configuration de touche
« le: Août 12, 2015, 05:24:50 pm »
Bonjour,

Pour un jeu simple où le nombre de fonction clavier reste limité, passer par une map comme tu le pensais est suffisant. Même si le code de sauvegarde et de chargement des paramètres risque de ne pas être des plus élégant ^_^

Personnellement, j'ai réglé ce problème en implémentant un pattern de commande. Il permet d'avoir un fonctionnement générique et permet d'ajouter des commandes très facilement et indépendant du paramétrage. De plus, il peut être couplé à une gestion de script pour élargir son utilité.
Mais bon, pour un pong, ça semble disproportionné x_-'

4
Actuellement tu changes l'opacité de 0 à 255 dans la même frame, si tu veux que ça change dans le temps, il faut que tu l'augmentes au fil des frames avec simplement

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
        if (stepColor < 255)
                stepColor += 5 ;

        cible.setFillColor(sf::Color(255,0,0,stepColor));
}

bien entendu en déclarant ton stepColor (qui deviendrait plutôt un opacity) en global et non dans la fonction de mise à jour, quelle ne soit pas réinitialisée à chaque passage ^_^

Après pour bien faire, il faudrait que tu utilises une gestion de temps pour calculer un incrément en fonction du framerate, sinon le changement d'opacité ne se fera pas toujours dans le même délais.

5
DotNet / Re : Besoin d'aide pour configurer un projet Visual Studio
« le: Juin 25, 2015, 07:25:56 am »
Bonjour,

Pour permettre aux modules externes de trouver les dlls non managées tu dois passer par une API Windows.

...
class Program
{
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool SetDllDirectory (string lpPathName    );

        static  void Main (string[] _arguments  )
        {
                SetDllDirectory(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Librairies"));
                ...
 

Les chemins d'accès des références, quant à eux permettent de spécifier des dossiers pour les dlls managées uniquement.

Pages: [1]
anything