java用socket实现双人弹球游戏

package com.example.railway.game;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.font.FontRenderContext;
import java.awt.font.TextAttribute;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.IndexColorModel;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
import javax.swing.JPanel;

public class Racket {

    public int x, y;

    public int width, height;

    public boolean upper = true;

    Color outerC = Color.red;
    Color innerC = Color.pink;

    public void drawRacket(Graphics2D g2) {
        int w = width;
        int h = height;
        int w2 = w / 2;
        int h2 = h / 2;

        g2.setPaint(new GradientPaint(x, y, outerC, x + w * .35f, y + h * .35f, innerC));
        g2.fillRect(x, y, w2, h2);
        g2.setPaint(new GradientPaint(x + w, y, outerC, x + w * .65f, y + h * .35f, innerC));
        g2.fillRect(x + w2, y, w2, h2);
        g2.setPaint(new GradientPaint(x, y + h, outerC, x + w * .35f, y + h * .65f, innerC));
        g2.fillRect(x, y + h2, w2, h2);
        g2.setPaint(new GradientPaint(x + w, y + h, outerC, x + w * .65f, y + h * .65f, innerC));
        g2.fillRect(x + w2, y + h2, w2, h2);

        g2.setColor(Color.black);
        TextLayout tl = new TextLayout(
                "Racket", g2.getFont(), g2.getFontRenderContext());
        tl.draw(g2, (int) (x + w / 2 - tl.getBounds().getWidth() / 2),
                (int) (y + h / 2 + tl.getBounds().getHeight() / 2));
    }
}

class Ball {

    public int bsize;
    public float x, y;
    public float Vx = 0.1f;
    public float Vy = 0.05f;
    public int nImgs = 5;
    public BufferedImage imgs;
    public boolean out = false;

    private final float inelasticity = 1f;
    private final float Ax = 0.0f;
    private final float Ay = 0.0002f;
    private final float Ar = 0.9f;
    private final int UP = 0;
    private final int DOWN = 1;
    private int indexDirection = UP;
    private boolean collision_x, collision_y;
    private float jitter;
    private Color color;
    private boolean isSelected;


    public Ball(Color color, int bsize) {
        this.color = color;
        makeImages(bsize);
    }

    public void makeImages(int bsize) {
        this.bsize = bsize * 2;
        int R = bsize;
        byte[] data = new byte[R * 2 * R * 2];
        int maxr = 0;
        for (int Y = 2 * R; --Y >= 0; ) {
            int x0 = (int) (Math.sqrt(R * R - (Y - R) * (Y - R)) + 0.5);
            int p = Y * (R * 2) + R - x0;
            for (int X = -x0; X < x0; X++) {
                int x = X + 15;
                int y = Y - R + 15;
                int r = (int) (Math.sqrt(x * x + y * y) + 0.5);
                if (r > maxr) {
                    maxr = r;
                }
                data[p++] = r <= 0 ? 1 : (byte) r;
            }
        }
        int bg = 255;
        byte red[] = new byte[256];
        red[0] = (byte) bg;
        byte green[] = new byte[256];
        green[0] = (byte) bg;
        byte blue[] = new byte[256];
        blue[0] = (byte) bg;
        float b = 0.5f;
        for (int i = maxr; i >= 1; --i) {
            float d = (float) i / maxr;
            red[i] = (byte) blend(blend(color.getRed(), 255, d), bg, b);
            green[i] = (byte) blend(blend(color.getGreen(), 255, d), bg, b);
            blue[i] = (byte) blend(blend(color.getBlue(), 255, d), bg, b);
        }
        IndexColorModel icm = new IndexColorModel(8, maxr + 1, red, green,
                blue, 0);
        DataBufferByte dbb = new DataBufferByte(data, data.length);
        int bandOffsets[] = {0};
        WritableRaster wr = Raster.createInterleavedRaster(dbb, R * 2, R * 2,
                R * 2, 1, bandOffsets, null);
        imgs = new BufferedImage(icm, wr, icm.isAlphaPremultiplied(), null);
    }


    private final int blend(int fg, int bg, float fgfactor) {
        return (int) (bg + (fg - bg) * fgfactor);
    }

    public void step(long deltaT, int w, int h, Racket r) {
        collision_x = false;
        collision_y = false;

        jitter = (float) Math.random() * .01f - .005f;

        x += Vx * deltaT + (Ax / 2.0) * deltaT * deltaT;
        y += Vy * deltaT + (Ay / 2.0) * deltaT * deltaT;
        if (x <= 0.0f) {
            x = 0.0f;
            Vx = -Vx * inelasticity + jitter;
            collision_x = true;
        }
        if (x + bsize >= w) {
            x = w - bsize;
            Vx = -Vx * inelasticity + jitter;
            collision_x = true;
        }

        if (y <= 0) {
            y = 0;
            Vy = -Vy * inelasticity + jitter;
            collision_y = true;
        }

        if (x >= 600.0) {
            System.out.println("out!");
            this.out = true;
        }

        if (r.upper) {
            if (y + bsize >= h - r.height) {
                if ((x >= (r.x - bsize)) && (x <= (r.x + r.width))) {
                    y = h - r.height - bsize;
                    Vx *= inelasticity;
                    Vy = -Vy * inelasticity + jitter;
                    collision_y = true;
                } else {
                    System.out.println("out!");
                    this.out = true;
                }
            }
        } else {
            if (y + bsize >= h) {
                y = h - bsize;
                Vx *= inelasticity;
                Vy = -Vy * inelasticity + jitter;
                collision_y = true;
            }
        }
        Vy = Vy + Ay * deltaT;
        Vx = Vx + Ax * deltaT;
    }

    public void step1(long deltaT, int w, int h, Racket r) {
        collision_x = false;
        collision_y = false;

        jitter = (float) Math.random() * .01f - .005f;

        x += Vx * deltaT + (Ax / 2.0) * deltaT * deltaT;
        y += Vy * deltaT + (Ay / 2.0) * deltaT * deltaT;
        if (x <= 600.0f) {
            x = 600.0f;
            Vx = -Vx * inelasticity + jitter;
            collision_x = true;
        }
        if (x + bsize >= w) {
            x = w - bsize;
            Vx = -Vx * inelasticity + jitter;
            collision_x = true;
        }

        if (y <= 0) {
            y = 0;
            Vy = -Vy * inelasticity + jitter;
            collision_y = true;
        }
        // r.width=200,r.x=600,x=-40,bsize=40,
        if (r.upper) {
            if (y + bsize >= h - r.height) {
                if ((x >= (r.x - bsize)) && (x <= (r.x + r.width))) {
                    y = h - r.height - bsize;
                    Vx *= inelasticity;
                    Vy = -Vy * inelasticity + jitter;
                    collision_y = true;
                } else {
                    System.out.println("out!");
                    this.out = true;
                }
            }
        } else {
            if (y + bsize >= h) {
                y = h - bsize;
                Vx *= inelasticity;
                Vy = -Vy * inelasticity + jitter;
                collision_y = true;
            }
        }
        Vy = Vy + Ay * deltaT;
        Vx = Vx + Ax * deltaT;
    }

    public void step(long deltaT, int w, int h) {
        collision_x = false;
        collision_y = false;

        jitter = 0;// (float) Math.random() * .01f - .005f;

        x += Vx * deltaT + (Ax / 2.0) * deltaT * deltaT;
        y += Vy * deltaT + (Ay / 2.0) * deltaT * deltaT;
        if (x <= 0.0f) {
            x = 0.0f;
            Vx = -Vx * inelasticity + jitter;
            collision_x = true;
        }
        if (x + bsize >= w) {
            x = w - bsize;
            Vx = -Vx * inelasticity + jitter;
            collision_x = true;
        }
        if (y <= 0) {
            y = 0;
            Vy = -Vy * inelasticity + jitter;
            collision_y = true;
        }
        if (y + bsize >= h) {
            y = h - bsize;
            Vx *= inelasticity;
            Vy = -Vy * inelasticity + jitter;
            collision_y = true;
        }
        Vy = Vy + Ay * deltaT;
        Vx = Vx + Ax * deltaT;


    }
}

class move implements Runnable {

    ballp p;

    public move(ballp p) {
        super();
        this.p = p;
    }


    public void run() {
        // TODO Auto-generated method stub

        while (true) {

            p.deltaT = 5;
            p.b.step(p.deltaT, p.getWidth(), p.getHeight(), p.r);
            p.b1.step1(p.deltaT, p.getWidth(), p.getHeight(), p.r1);
            if (p.b.out && p.b1.out) {
                p.repaint();
                break;
            }
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            p.repaint();

        }
    }
}

class ballp extends JPanel {
    Ball b;
    Ball b1;
    public long now, deltaT, lasttime;
    private boolean active;
    Racket r;
    Racket r1;

    ballp() {
        b = new Ball(Color.red, 10);
        b1 = new Ball(Color.red, 10);
        b.Vx = (float) Math.random() / 4.0f - 0.125f;
        b.Vy = -(float) Math.random() / 4.0f - 0.2f;
        b1.Vx = (float) Math.random() / 4.0f - 0.125f;
        b1.Vy = -(float) Math.random() / 4.0f - 0.2f;
        b.makeImages(b.bsize);
        b1.makeImages(b1.bsize);
        this.setBackground(Color.white);
        setDoubleBuffered(true);
        r = new Racket();
        r.width = 200;
        r.height = 20;
        r.x = 0;
        r1 = new Racket();
        r1.width = 200;
        r1.height = 20;
        r1.x = 600;

    }

    @Override
    public void paintComponent(Graphics arg0) {
        // TODO Auto-generated method stub

        super.paintComponent(arg0);
        Graphics2D g2 = (Graphics2D) arg0;
        g2.setPaint(new GradientPaint(0, 0, Color.white,
                0, this.getHeight() * 2 / 3, Color.green));
        g2.fillRect(0, 0, this.getWidth(), this.getHeight());

        g2.drawImage(b.imgs, (int) b.x, (int) b.y, this);
        g2.drawImage(b1.imgs, (int) b1.x, (int) b1.y, this);
        g2.setColor(Color.red);
        r.y = this.getHeight() - r.height;
        r1.y = this.getHeight() - r1.height;

        r.drawRacket(g2);
        r1.drawRacket(g2);

//        if (b.out) {
//            g2.clearRect(0, 0, this.getWidth(), this.getHeight());
//            int w = this.getWidth();
//            int h = this.getHeight();
//            FontRenderContext frc = g2.getFontRenderContext();
//            Font f = new Font("Arial", Font.PLAIN, w / 8);
//            Font f1 = new Font("Arial", Font.ITALIC, w / 8);
//            String s = "out!";
//            AttributedString as = new AttributedString(s);
//            as.addAttribute(TextAttribute.FONT, f, 0, s.length());
//            AttributedCharacterIterator aci = as.getIterator();
//            TextLayout tl = new TextLayout(aci, frc);
//            float sw = (float) tl.getBounds().getWidth();
//            float sh = (float) tl.getBounds().getHeight();
//            Shape sha = tl.getOutline(AffineTransform.getTranslateInstance(w / 2 - sw / 2, h * 0.2 + sh / 2));
//            g2.setColor(Color.green);
//            g2.setStroke(new BasicStroke(2.5f));
//            g2.draw(sha);
//            g2.setColor(Color.pink);
//            g2.fill(sha);
//        }

    }

}

class ballp1 extends JPanel {
    Ball b;
    public long now, deltaT, lasttime;
    private boolean active;
    Racket r;

    ballp1() {
        b = new Ball(Color.red, 10);
        b.Vx = (float) Math.random() / 4.0f - 0.125f;
        b.Vy = -(float) Math.random() / 4.0f - 0.2f;
        b.makeImages(b.bsize);
        this.setBackground(Color.white);
        setDoubleBuffered(true);
        r = new Racket();
        r.width = 200;
        r.height = 20;
        r.x = 0;

    }

    @Override
    public void paintComponent(Graphics arg0) {
        // TODO Auto-generated method stub

        super.paintComponent(arg0);
        Graphics2D g2 = (Graphics2D) arg0;
        g2.setPaint(new GradientPaint(0, 0, Color.white,
                0, this.getHeight() * 2 / 3, Color.green));
        g2.fillRect(0, 0, this.getWidth(), this.getHeight());

        g2.drawImage(b.imgs, (int) b.x, (int) b.y, this);
        g2.setColor(Color.red);
        r.y = this.getHeight() - r.height;

        r.drawRacket(g2);

//        if (b.out) {
//            g2.clearRect(0, 0, this.getWidth(), this.getHeight());
//            int w = this.getWidth();
//            int h = this.getHeight();
//            FontRenderContext frc = g2.getFontRenderContext();
//            Font f = new Font("Arial", Font.PLAIN, w / 8);
//            Font f1 = new Font("Arial", Font.ITALIC, w / 8);
//            String s = "out!";
//            AttributedString as = new AttributedString(s);
//            as.addAttribute(TextAttribute.FONT, f, 0, s.length());
//            AttributedCharacterIterator aci = as.getIterator();
//            TextLayout tl = new TextLayout(aci, frc);
//            float sw = (float) tl.getBounds().getWidth();
//            float sh = (float) tl.getBounds().getHeight();
//            Shape sha = tl.getOutline(AffineTransform.getTranslateInstance(w / 2 - sw / 2, h * 0.2 + sh / 2));
//            g2.setColor(Color.green);
//            g2.setStroke(new BasicStroke(2.5f));
//            g2.draw(sha);
//            g2.setColor(Color.pink);
//            g2.fill(sha);
//        }

    }

}

class keyleft implements KeyListener {
    ballp p;

    public keyleft(ballp p) {
        super();
        this.p = p;
    }

    public void keyPressed(KeyEvent ke) {
        //System.out.println("test");
        // TODO Auto-generated method stub
        if (ke.getKeyCode() == KeyEvent.VK_A) {
            if (p.r.x > 0)
                p.r.x -= 10;

        }
        if (ke.getKeyCode() == KeyEvent.VK_D) {
            if (p.r.x < p.getWidth() - p.r.width - 600)
                p.r.x += 10;
        }

        if (ke.getKeyCode() == KeyEvent.VK_LEFT) {
            if (p.r1.x > 600)
                p.r1.x -= 10;

        }
        if (ke.getKeyCode() == KeyEvent.VK_RIGHT) {
            if (p.r1.x < p.getWidth() - p.r1.width)
                p.r1.x += 10;
        }
        p.repaint();
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }
}


class keyleft1 implements KeyListener {
    ballp1 p;

    public keyleft1(ballp1 p) {
        super();
        this.p = p;
    }

    public void keyPressed(KeyEvent ke) {
        //System.out.println("test");
        // TODO Auto-generated method stub
        if (ke.getKeyCode() == KeyEvent.VK_LEFT) {
            if (p.r.x > 0)
                p.r.x -= 10;

        }
        if (ke.getKeyCode() == KeyEvent.VK_RIGHT) {
            if (p.r.x < p.getWidth() - p.r.width)
                p.r.x += 10;
        }
        p.repaint();
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }
}

package com.example.railway.game;

import javax.swing.*;
import java.awt.*;

public class BallGames extends JFrame {
    public static void main(String[] arg) {
        BallGames b = new BallGames();
        b.getContentPane().setLayout(new BorderLayout());
        ballp p = new ballp();

        Thread t = new Thread(new move(p));
        t.start();
        b.addKeyListener(new keyleft(p));

        b.getContentPane().add(p, "Center");
        b.setDefaultCloseOperation(EXIT_ON_CLOSE);
        b.setSize(1200, 700);
        b.setVisible(true);
    }
}

你可能感兴趣的:(java,servlet,jvm)