Изображение движется к цели - PullRequest
0 голосов
/ 22 апреля 2020
Изображения

A и C находятся далеко. В это время изображение B создается из значений координат A. Для каждой итерации необходимо переместить x, y, чтобы получить значение координаты изображения C.

Например, A (100,100) , C (300 300) Начиная с B (100 100), Каждый раз, когда это повторяется, x, y необходимо перемещать, чтобы достичь B (300 300).

Это метод ввода текущего движущегося источника.

 Public void Attack () {
    int x1 = a.getX ();
    int y1 = a.getY ();

    int x2 = c.getX ();
    int y2 = c.getY ();
    if(b.getX ()==c.getX&&b.getY () == c.getY())'
    {
        system.out.println ("ok");'
    }else {
        b.setbounds (help1,help2,100,50)
    }
 }

Здесь я хочу знать код для ввода help1 help2.

формула Пифагора

между изображениями A и C Я хочу знать, как заставить изображение B двигаться по виртуальной прямой линии.

Как игра в оборону башни. Изображение - башня. Изображение - пуля. C - это враг.

Я хочу, чтобы пули, выпущенные из башни, переместились в места врага.

Я кореец. Я использовал переводчик

1 Ответ

0 голосов
/ 23 апреля 2020

Следующий код представляет собой mre использования уравнения прямой линии y = mx + c для рисования движущегося объекта вдоль такой линии. Чтобы проверить код, скопируйте весь код в MoveAlongStraightLine.java и запустите или запустите его онлайн :

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class MoveAlongStraightLine extends JFrame {

    public MoveAlongStraightLine(){
        setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        ShootinBoard shootingBoard = new ShootinBoard();
        JButton fire = new JButton("Fire");
        fire.addActionListener(e->shootingBoard.fire());
        add(shootingBoard);
        add(fire, BorderLayout.SOUTH);
        pack();
        setVisible(true);
    }

    public static void main(String[]args){
        SwingUtilities.invokeLater(()->new MoveAlongStraightLine());
    }
}

class ShootinBoard extends JPanel{

    //use constants for better readability
    private static final double W = 600, H = 400;
    private static final int DOT_SIZE = 10, SPEED = 2;
    private final int dX = 1; //x increment

    private final Timer timer;
    private final Point2D.Double shooter, target;
    private Point2D.Double bullet;

    public ShootinBoard() {
        setPreferredSize(new Dimension((int)W, (int)H));
        shooter = new Point2D.Double(50,350);
        bullet = shooter; //place bullet at start point
        target = new Point2D.Double(550,50);
        timer = new Timer(SPEED, e->moveBullet());
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setStroke(new BasicStroke(3));
        //draw source
        g2.setColor(Color.blue);
        g2.draw(new Ellipse2D.Double(shooter.getX(), shooter.getY(),DOT_SIZE , DOT_SIZE));
        //draw bullet
        g2.setColor(Color.black);
        g2.draw(new Ellipse2D.Double(bullet.getX(), bullet.getY(),DOT_SIZE , DOT_SIZE));
        //draw target
        g2.setColor(Color.red);
        g2.draw(new Ellipse2D.Double(target.getX(), target.getY(),DOT_SIZE , DOT_SIZE));
    }

    void fire(){
        timer.stop();
        bullet = shooter; //place bullet at start point
        timer.start();
    }

    void moveBullet() {

        if(target.x == bullet.x && target.y == bullet.y) {
            timer.stop();
        }
        //y = mx + c  for more details see https://www.usingmaths.com/senior_secondary/java/straightline.php
        double m = (target.y - bullet.y)/ (target.x - bullet.x);//slope
        double c = (target.x * bullet.y - bullet.x * target.y)/(target.x - bullet.x);

        double newBulletX = bullet.x+dX; //increment x
        double newBulletY = m * newBulletX + c; //calculate new y
        bullet =  new Point2D.Double(newBulletX,newBulletY);

        repaint();
    }
}

enter image description here

...