2012-01-27 4 views
0

Je veux déplacer un objet graphique vers le curseur lorsque l'utilisateur clique sur un bouton de la souris, mais j'ai aucune idée ...Déplacer un objet graphique vers le curseur

J'ai la position du curseur et l'objet graphique, mais aucune idée sur la façon dont je changerais son X et Y pour faire "lisse" mouvement de l'emplacement de départ au nouveau point (où l'utilisateur a cliqué) ...

Répondre

0

Approche générale:

avoir un modèle soutenant vos graphiques, et stocker les coordonnées de chaque élément dans le modèle sur le modèle.

  1. Ajouter un MouseListener et mettre en œuvre mousedown
  2. Dans votre auditeur saisir X, Y de l'événement de la souris.
  3. Décidez à quelle vitesse vous souhaitez déplacer l'objet (vitesse constante? Temps constant pour atteindre le curseur? Acclérage? Décélération?)
  4. Écrivez une équation qui décrit le mouvement vers le curseur, de préférence en termes de distance restante à être couvert. Pour une approche de décélération très rapide qui pourrait être distanceRemaining/5. (par exemple). D'autres mouvements nécessitent un peu de géométrie/algèbre, mais c'est votre travail :)
  5. Créez un objet qui encapsule la logique ci-dessus et a un drapeau pour déterminer quand l'animation est terminée.
  6. Utilisez un thread "animation" (ou le cadre de synchronisation comme mentionné ci-dessus, je ne l'ai pas utilisé) pour effectuer 24 ou plus mises à jour par seconde aux coordonnées X et Y du modèle en fonction de la distance restante dans le Direction X et Y et repeindre l'appel(). Le thread doit le faire jusqu'à ce que l'indicateur d'animation complète soit vrai, puis arrête d'appeler repaint(). Java appellera alors la fonction de peinture pour vous à un débit qu'elle sait pouvoir gérer (si vous appelez trop vite, elle fusionnera les appels supplémentaires pour vous et vous empêchera de verrouiller le programme avec un arriéré d'appels de peinture) . Votre fonction de peinture doit simplement dessiner le modèle en fonction de son état actuel chaque fois que java choisit de l'appeler.

Il est important de mettre à jour x et y dans le même thread, pas de threads indépendants. Cela semble être une bonne idée, mais cela échoue parce que le planificateur de threads traîne parfois un thread et vous pouvez obtenir 2 ou 3 mises à jour sur une dimension sans mise à jour correspondante dans l'autre, ce qui va déplacer l'objet dans une ligne pas lisse. Dans la plupart des cas, vous devriez faire toutes vos mises à jour sur le modèle (pour ce mouvement et tout autre mouvement) dans le même fil. Notez que votre x & y dans votre modèle doit probablement être flottante ou double car vous ne voulez pas perdre des fractions d'un pixel, surtout si le mouvement est destiné à être lent. L'expression de l'équation en termes de distance restante évite de devoir calculer l'angle de la trajectoire et d'utiliser les fonctions sinus/cosinus pour effectuer la mise à jour. Cependant, dans certains cas, vous pouvez trouver plus facile de calculer cet angle et utiliser plutôt sinus/cosinus, si vous voulez qu'un mouvement complexe qui n'est pas facilement transformé soit exprimé en termes de distance restante. Faites ce qui rend votre code clair, optimisez plus tard si nécessaire.

24 mises à jour par seconde est le taux de trame standard pour les caméras vidéo et ce nombre est un minimum qui concerne flicker fusion de l'œil humain, si vous mettez à jour plus lentement que les gens verront le mouvement comme saccadé.Pour une fluidité maximale, vous voudrez plus de 60 fois par seconde, mais cela n'est probablement nécessaire que pour les jeux vidéo et crée un coût de performance beaucoup plus élevé. Choisissez le taux de mise à jour minimum que vous trouvez visuellement satisfaisant. C'est aussi une bonne idée d'avoir un drapeau sur le thread de mise à jour qui l'allume et l'éteint quand il y a quelque chose à mettre à jour afin qu'il ne demande pas de repeindre sans raison quand il n'y a rien à animer. Assurez-vous que l'indicateur est marqué avec le mot clé volatile car il sera mis à jour par d'autres threads. Si vous avez plusieurs animations en même temps, vous pouvez activer et désactiver le thread en fonction de la présence d'objets d'animation dans une liste (en les supprimant lorsqu'ils sont complets)

Questions connexes