1

画面の両側に 2 つのパドルがあり、プレイヤーはボールを打たなければならないピンポンに似たゲームを作成しています。問題は、画像との衝突検出をどのように行うかです。長方形を使った簡単な方法があることは知っています。これが私のコードです。私のウィンドウクラス

import javax.swing.JFrame;
import java.awt.Rectangle;
public class window{
    public static void main(String args[])
    {
        JFrame f = new JFrame();
        second s = new second();
        f.add(s);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(806,628);
        f.setResizable(false);
        f.setTitle("Pong!");
    }
}

そして、このクラスで私は本当に助けが必要です! これは私の 2 番目のクラスです。

import javax.swing.*;
import java.awt.Rectangle;
import java.util.Random;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.*;
import javax.swing.JFrame;
public class second extends JPanel implements ActionListener, KeyListener
{
    Timer t = new Timer(5, this);
    double x1 = 20, y1 = 250, velx1 = 0, vely1 = 0;
    double x = 750, y = 250, velx = 0, vely = 0;
    double xb = 384, yb  = 290, velbx = 3.0, velby = 3.0;
    boolean collision = false;
    public second()
    {
        t.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    }
    public void paintComponent(Graphics g)
    {
        Graphics2D g2 = (Graphics2D)g;
        g2.fill(new Rectangle2D.Double(x,y,40,40));
        super.paintComponent(g);
        ImageIcon i = new ImageIcon("C:\\Users\\gsjha\\workspace\\JFrame Pong\\bin\\pong1.png");
        ImageIcon a = new ImageIcon("C:\\Users\\gsjha\\workspace\\JFrame Pong\\bin\\pong-bg.png");
        ImageIcon b = new ImageIcon("C:\\Users\\gsjha\\workspace\\JFrame Pong\\bin\\pong1.png");
        ImageIcon c = new ImageIcon("C:\\Users\\gsjha\\workspace\\JFrame Pong\\bin/Ball.png");
        a.paintIcon(this, g, 0, 0);
        i.paintIcon(this, g, (int)x1 , (int)y1);
        b.paintIcon(this, g, (int) x, (int) y); 
        c.paintIcon(this, g, (int)xb, (int)yb);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        repaint();
        if (y1<=0 || y1 >= 600 || y1 >= 500)
        {
            vely1 = -vely1;
        }
        x1 +=velx1;
        y1 += vely1;
        repaint();
        if (y<=0 || y >= 600 || y > 500)
        {
            vely = -vely;
        }
        repaint();
        x += velx;
        y += vely;
        repaint();
        if (xb<0 || xb > 800)
        {
            velbx = -velbx;
        }
        if (yb<0 || yb > 600)
        {
            velby = -velby;
        }
        xb += velbx;
        yb += velby;
        repaint();
    }
    public void up()
    {
        vely1 = -3.0;
        velx1 = 0;

    }
    public void up1()
    {
        vely = -3.0;
        velx = 0;
    }
    public void down()
    {
        vely1 = 3.0;
        velx1 = 0;
    }
    public void down1()
    {
        vely = 3.0;
        velx = 0;
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if(code == KeyEvent.VK_W)
        {
                up();
        }
        if(code == KeyEvent.VK_S)
        {
            down();
        }
        if (code == KeyEvent.VK_UP)
        {
            up1();
        }
        if(code == KeyEvent.VK_DOWN)
        {
            down1();
        }
    }
    @Override
    public void keyReleased(KeyEvent ee) {
        int code1 = ee.getKeyCode();
        if(code1 == KeyEvent.VK_W)
        {
            vely1 = 0;
        }
        if (code1 == KeyEvent.VK_S)
        {
            vely1 = 0;
        }
        if(code1 == KeyEvent.VK_UP)
        {
            vely = 0;
        }
        if(code1 == KeyEvent.VK_DOWN)
        {
            vely = 0;
        }
    }
    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }
}

ご覧のとおり、ピンポンとパドルの間の衝突検出を除いて、ピンポン ゲームのほとんどが終了しました。ゲームの最も重要な部分。ありがとう、アーダーシュ・ジャー

4

1 に答える 1

0

それを行う方法はたくさんあります。多くの精度が必要ない場合は、バウンディング ボックスを使用し、それらのサイズと位置を使用して、衝突があるかどうかを調べることができます。詳細については、http : //gpsnippets.blogspot.com.es/2008/10/bounding-box-collision-detection.htmlを参照してください。

于 2013-08-26T23:27:27.763 に答える