Compare commits
5 Commits
master
...
dp_gamemod
Author | SHA1 | Date |
---|---|---|
|
788791c52f | 3 years ago |
|
76f7f49812 | 3 years ago |
|
c3b59f519e | 3 years ago |
|
2860e1a336 | 3 years ago |
|
acb756e651 | 3 years ago |
@ -0,0 +1,98 @@
|
||||
package com.example.tankbattle;
|
||||
|
||||
import com.example.tankbattle.cor.ColliderChain;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class GameModel {
|
||||
|
||||
Tank myTank;
|
||||
|
||||
static List<Bullet> bullets = new ArrayList<>();
|
||||
static List<Tank> tanks = new ArrayList<>();
|
||||
static List<Explode> explodes = new ArrayList<>();
|
||||
static ColliderChain chain = new ColliderChain();
|
||||
|
||||
static List<GameObject> objects = new ArrayList<>();
|
||||
|
||||
private static final GameModel INSTANCE = new GameModel();
|
||||
|
||||
public static GameModel getInstance(){
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
public GameModel() {
|
||||
}
|
||||
|
||||
private void init(){
|
||||
myTank = new Tank(200, 400, Dir.DOWN, Group.GOOD);
|
||||
|
||||
int initTankCount = Integer.valueOf(PropertyMgr.get("initTankCount"));
|
||||
|
||||
// 初始化敌方坦克
|
||||
for (int i = 0; i < initTankCount; i++) {
|
||||
add(new Tank(50 + i * 80, 200, Dir.DOWN, Group.BAD));
|
||||
}
|
||||
|
||||
add(myTank);
|
||||
|
||||
add(new Wall(150, 150, 200, 50));
|
||||
add(new Wall(550, 150, 200, 50));
|
||||
add(new Wall(300, 500, 200, 50));
|
||||
add(new Wall(500, 300, 50, 200));
|
||||
}
|
||||
|
||||
static {
|
||||
getInstance().init();
|
||||
}
|
||||
|
||||
public void add(GameObject go) {
|
||||
objects.add(go);
|
||||
}
|
||||
|
||||
public void remove(GameObject go) {
|
||||
objects.remove(go);
|
||||
}
|
||||
|
||||
public void paint(Graphics g) {
|
||||
Color c = g.getColor();
|
||||
g.setColor(Color.WHITE);
|
||||
g.drawString("子弹的数量:" + bullets.size(), 10, 60);
|
||||
g.drawString("敌方坦克的数量:" + tanks.size(), 10, 80);
|
||||
g.drawString("爆炸的数量:" + explodes.size(), 10, 100);
|
||||
g.setColor(c);
|
||||
|
||||
myTank.paint(g);
|
||||
for (int i = 0; i < objects.size(); i++) {
|
||||
objects.get(i).paint(g);
|
||||
}
|
||||
|
||||
// 互相碰撞逻辑
|
||||
for (int i = 0; i < objects.size(); i++) {
|
||||
for (int j = 0; j < objects.size(); j++) {
|
||||
GameObject o1 = objects.get(i);
|
||||
GameObject o2 = objects.get(j);
|
||||
// collider.collide(o1, o2);
|
||||
// collider2.collide(o1, o2);
|
||||
chain.collide(o1, o2);
|
||||
}
|
||||
}
|
||||
|
||||
// for (int i = 0; i < bullets.size(); i++) {
|
||||
// for (int j = 0; j < tanks.size(); j++)
|
||||
// bullets.get(i).collideWith(tanks.get(j));
|
||||
// }
|
||||
|
||||
// for (Iterator<Bullet> it = bullets.iterator(); it.hasNext()) {
|
||||
// Bullet b = it.next();
|
||||
// if (!b.live) it.remove();
|
||||
// }
|
||||
}
|
||||
|
||||
public Tank getMainTank() {
|
||||
return myTank;
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package com.example.tankbattle;
|
||||
|
||||
import java.awt.Graphics;
|
||||
|
||||
public abstract class GameObject {
|
||||
public int x;
|
||||
public int y;
|
||||
|
||||
public abstract void paint(Graphics g);
|
||||
public abstract int getWidth();
|
||||
public abstract int getHeight();
|
||||
}
|
@ -1,31 +1,14 @@
|
||||
package com.example.tankbattle;
|
||||
|
||||
import com.example.tankbattle.net.Client;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) throws InterruptedException {
|
||||
TankFrame tf = TankFrame.INSTANCE;
|
||||
tf.setVisible(true);
|
||||
|
||||
// int initTankCount = Integer.valueOf(PropertyMgr.get("initTankCount"));
|
||||
//
|
||||
// // 初始化敌方坦克
|
||||
// for (int i = 0; i < initTankCount; i++) {
|
||||
// tf.tanks.add(new Tank(50 + i * 80, 200, Dir.DOWN, Group.BAD, tf));
|
||||
// }
|
||||
TankFrame tf = new TankFrame();
|
||||
|
||||
new Thread(()->new Audio("audio/war1.wav").loop()).start();
|
||||
new Thread(() -> {
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
Thread.sleep(25);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
tf.repaint();
|
||||
}
|
||||
}).start();
|
||||
|
||||
Client.INSTANCE.connect();
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,62 @@
|
||||
package com.example.tankbattle;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Rectangle;
|
||||
|
||||
public class Wall extends GameObject{
|
||||
|
||||
int w, h;
|
||||
|
||||
public Rectangle rect;
|
||||
|
||||
public int getW() {
|
||||
return w;
|
||||
}
|
||||
|
||||
public void setW(int w) {
|
||||
this.w = w;
|
||||
}
|
||||
|
||||
public int getH() {
|
||||
return h;
|
||||
}
|
||||
|
||||
public void setH(int h) {
|
||||
this.h = h;
|
||||
}
|
||||
|
||||
public Rectangle getRect() {
|
||||
return rect;
|
||||
}
|
||||
|
||||
public void setRect(Rectangle rect) {
|
||||
this.rect = rect;
|
||||
}
|
||||
|
||||
public Wall(int x, int y, int w, int h) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.w = w;
|
||||
this.h = h;
|
||||
this.rect = new Rectangle(x, y, w, h);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paint(Graphics g) {
|
||||
Color c = g.getColor();
|
||||
g.setColor(Color.GRAY);
|
||||
g.fillRect(x, y, w, h);
|
||||
g.setColor(c);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWidth() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getHeight() {
|
||||
return 0;
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.example.tankbattle.cor;
|
||||
|
||||
import com.example.tankbattle.Bullet;
|
||||
import com.example.tankbattle.GameObject;
|
||||
import com.example.tankbattle.Tank;
|
||||
|
||||
public class BulletTankCollider implements Collider {
|
||||
|
||||
|
||||
@Override
|
||||
public boolean collide(GameObject o1, GameObject o2) {
|
||||
if (o1 instanceof Bullet && o2 instanceof Tank) {
|
||||
Bullet bullet = (Bullet) o1;
|
||||
Tank t = (Tank) o2;
|
||||
if (bullet.collideWith(t)){
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
} else if (o1 instanceof Tank && o2 instanceof Bullet) {
|
||||
return collide(o2, o1);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.example.tankbattle.cor;
|
||||
|
||||
import com.example.tankbattle.Bullet;
|
||||
import com.example.tankbattle.GameObject;
|
||||
import com.example.tankbattle.Wall;
|
||||
|
||||
public class BulletWallCollider implements Collider {
|
||||
|
||||
@Override
|
||||
public boolean collide(GameObject o1, GameObject o2) {
|
||||
if (o1 instanceof Bullet && o2 instanceof Wall) {
|
||||
Bullet bullet = (Bullet) o1;
|
||||
Wall wall = (Wall) o2;
|
||||
if (bullet.getRect().intersects(wall.getRect())) {
|
||||
System.out.println("bullet die");
|
||||
bullet.die();
|
||||
} else if (o1 instanceof Wall && o2 instanceof Bullet) {
|
||||
return collide(o2, o1);
|
||||
}
|
||||
} else {
|
||||
System.out.println(o1.getClass().getName() + " " + o2.getClass().getName());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package com.example.tankbattle.cor;
|
||||
|
||||
import com.example.tankbattle.GameObject;
|
||||
|
||||
public interface Collider {
|
||||
boolean collide(GameObject o1, GameObject o2);
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package com.example.tankbattle.cor;
|
||||
|
||||
import com.example.tankbattle.GameObject;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
public class ColliderChain implements Collider {
|
||||
|
||||
private List<Collider> colliders = new LinkedList<>();
|
||||
|
||||
public ColliderChain() {
|
||||
add(new BulletTankCollider());
|
||||
add(new TankTankCollider());
|
||||
add(new BulletWallCollider());
|
||||
add(new TankWallCollider());
|
||||
}
|
||||
|
||||
public void add(Collider c) {
|
||||
colliders.add(c);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean collide(GameObject o1, GameObject o2) {
|
||||
for (int i = 0; i < colliders.size(); i++) {
|
||||
if (!colliders.get(i).collide(o1, o2)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package com.example.tankbattle.cor;
|
||||
|
||||
import com.example.tankbattle.GameObject;
|
||||
import com.example.tankbattle.Tank;
|
||||
|
||||
public class TankTankCollider implements Collider {
|
||||
|
||||
|
||||
@Override
|
||||
public boolean collide(GameObject o1, GameObject o2) {
|
||||
if (o1 instanceof Tank && o2 instanceof Tank) {
|
||||
Tank t1 = (Tank) o1;
|
||||
Tank t2 = (Tank) o2;
|
||||
if ( t1.getRect().intersects(t2.getRect())){
|
||||
// t1.stop();
|
||||
// t2.stop();
|
||||
t1.back();
|
||||
t2.back();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package com.example.tankbattle.cor;
|
||||
|
||||
import com.example.tankbattle.GameObject;
|
||||
import com.example.tankbattle.Tank;
|
||||
import com.example.tankbattle.Wall;
|
||||
|
||||
public class TankWallCollider implements Collider {
|
||||
|
||||
|
||||
@Override
|
||||
public boolean collide(GameObject o1, GameObject o2) {
|
||||
if (o1 instanceof Tank && o2 instanceof Wall) {
|
||||
Tank tank = (Tank) o1;
|
||||
Wall wall = (Wall) o2;
|
||||
if (tank.getRect().intersects(wall.getRect())) {
|
||||
tank.back();
|
||||
} else if (o1 instanceof Wall && o2 instanceof Tank) {
|
||||
return collide(o2, o1);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
package com.example.tankbattle.decorator;
|
||||
|
||||
import com.example.tankbattle.GameObject;
|
||||
|
||||
import java.awt.Graphics;
|
||||
|
||||
public class GODecorator extends GameObject {
|
||||
GameObject gameObject;
|
||||
|
||||
public GODecorator(GameObject gameObject) {
|
||||
this.gameObject = gameObject;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paint(Graphics g) {
|
||||
this.x = gameObject.x;
|
||||
this.y = gameObject.y;
|
||||
paint(g);
|
||||
gameObject.paint(g);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWidth() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getHeight() {
|
||||
return 0;
|
||||
}
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package com.example.tankbattle.decorator;
|
||||
|
||||
import com.example.tankbattle.GameObject;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics;
|
||||
|
||||
public class RectDecorator extends GameObject {
|
||||
GameObject gameObject;
|
||||
|
||||
public RectDecorator(GameObject gameObject) {
|
||||
this.gameObject = gameObject;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paint(Graphics g) {
|
||||
this.x = gameObject.x;
|
||||
this.y = gameObject.y;
|
||||
|
||||
gameObject.paint(g);
|
||||
|
||||
Color c = g.getColor();
|
||||
g.setColor(Color.YELLOW);
|
||||
g.drawRect(x, y, gameObject.getWidth(), gameObject.getHeight());
|
||||
g.setColor(c);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getWidth() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getHeight() {
|
||||
return 0;
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package com.example.tankbattle.strategy;
|
||||
package com.example.tankbattle.demo;
|
||||
|
||||
|
||||
public class Cat implements CustomComparable<Cat> {
|
@ -1,4 +1,4 @@
|
||||
package com.example.tankbattle.strategy;
|
||||
package com.example.tankbattle.demo;
|
||||
|
||||
public interface CustomComparable<T> {
|
||||
int compareTo(T o);
|
@ -1,4 +1,4 @@
|
||||
package com.example.tankbattle.strategy;
|
||||
package com.example.tankbattle.demo;
|
||||
|
||||
public interface CustomComparator<T> {
|
||||
int compare(T o1, T o2);
|
@ -1,4 +1,4 @@
|
||||
package com.example.tankbattle.strategy;
|
||||
package com.example.tankbattle.demo;
|
||||
|
||||
public class Dog implements CustomComparable<Dog> {
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.example.tankbattle.strategy;
|
||||
package com.example.tankbattle.demo;
|
||||
|
||||
public class DogComparator implements CustomComparator<Dog> {
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.example.tankbattle.strategy;
|
||||
package com.example.tankbattle.demo;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.example.tankbattle.strategy;
|
||||
package com.example.tankbattle.demo;
|
||||
|
||||
public class Sorter<T> {
|
||||
|
@ -1,96 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import com.example.tankbattle.Bullet;
|
||||
import com.example.tankbattle.Dir;
|
||||
import com.example.tankbattle.Group;
|
||||
import com.example.tankbattle.TankFrame;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.UUID;
|
||||
|
||||
public class BulletNewMessage extends Message {
|
||||
UUID playerID;
|
||||
UUID id;
|
||||
int x, y;
|
||||
Dir dir;
|
||||
Group group;
|
||||
|
||||
public BulletNewMessage() {
|
||||
}
|
||||
|
||||
public BulletNewMessage(Bullet bullet) {
|
||||
this.playerID = bullet.getPlayerId();
|
||||
this.id = bullet.getId();
|
||||
this.x = bullet.getX();
|
||||
this.y = bullet.getY();
|
||||
this.dir = bullet.getDir();
|
||||
this.group = bullet.getGroup();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle() {
|
||||
if (this.playerID.equals(TankFrame.INSTANCE.getMainTank().getId())) {
|
||||
return;
|
||||
}
|
||||
Bullet bullet = new Bullet(this.playerID, x, y, dir, group, TankFrame.INSTANCE);
|
||||
bullet.setId(this.id);
|
||||
TankFrame.INSTANCE.addBullet(bullet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] toBytes() {
|
||||
byte[] bytes = null;
|
||||
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
DataOutputStream dos = new DataOutputStream(baos)) {
|
||||
dos.writeLong(this.playerID.getMostSignificantBits());
|
||||
dos.writeLong(this.playerID.getLeastSignificantBits());
|
||||
dos.writeLong(id.getMostSignificantBits());
|
||||
dos.writeLong(id.getLeastSignificantBits());
|
||||
dos.writeInt(x);
|
||||
dos.writeInt(y);
|
||||
dos.writeInt(dir.ordinal());
|
||||
dos.writeInt(group.ordinal());
|
||||
dos.flush();
|
||||
bytes = baos.toByteArray();
|
||||
} catch (Exception exception) {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parse(byte[] bytes) {
|
||||
try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes))) {
|
||||
this.playerID = new UUID(dis.readLong(), dis.readLong());
|
||||
this.id = new UUID(dis.readLong(), dis.readLong());
|
||||
|
||||
this.x = dis.readInt();
|
||||
this.y = dis.readInt();
|
||||
this.dir = Dir.values()[dis.readInt()];
|
||||
this.group = Group.values()[dis.readInt()];
|
||||
} catch (IOException exception) {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageType getMessageType() {
|
||||
return MessageType.BulletNew;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "BulletNewMessage{" +
|
||||
"playerID=" + playerID +
|
||||
", id=" + id +
|
||||
", x=" + x +
|
||||
", y=" + y +
|
||||
", dir=" + dir +
|
||||
", group=" + group +
|
||||
'}';
|
||||
}
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import io.netty.bootstrap.Bootstrap;
|
||||
import io.netty.channel.Channel;
|
||||
import io.netty.channel.ChannelFuture;
|
||||
import io.netty.channel.ChannelFutureListener;
|
||||
import io.netty.channel.EventLoopGroup;
|
||||
import io.netty.channel.nio.NioEventLoopGroup;
|
||||
import io.netty.channel.socket.nio.NioSocketChannel;
|
||||
|
||||
public class Client {
|
||||
public static final Client INSTANCE = new Client();
|
||||
|
||||
private Client() {
|
||||
}
|
||||
|
||||
private Channel channel;
|
||||
public void connect() {
|
||||
EventLoopGroup group = new NioEventLoopGroup(1);
|
||||
Bootstrap bootstrap = new Bootstrap();
|
||||
|
||||
try {
|
||||
ChannelFuture channelFuture = bootstrap.group(group).channel(NioSocketChannel.class).handler(new ClientChannelInitializer())
|
||||
.connect("localhost", 8888);
|
||||
channelFuture.addListener(new ChannelFutureListener() {
|
||||
@Override
|
||||
public void operationComplete(ChannelFuture future) throws Exception {
|
||||
if (!future.isSuccess()) {
|
||||
System.out.println("not connected");
|
||||
} else {
|
||||
System.out.println("connected");
|
||||
channel = future.channel();
|
||||
}
|
||||
}
|
||||
});
|
||||
channelFuture.sync();
|
||||
channelFuture.channel().closeFuture().sync();
|
||||
System.out.println("connection closed");
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
group.shutdownGracefully();
|
||||
}
|
||||
}
|
||||
|
||||
public void send(Message message) {
|
||||
System.out.println("send " + message.toString());
|
||||
channel.writeAndFlush(message);
|
||||
}
|
||||
|
||||
public void closeConnect(){
|
||||
}
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import io.netty.channel.ChannelInitializer;
|
||||
import io.netty.channel.socket.SocketChannel;
|
||||
|
||||
public class ClientChannelInitializer extends ChannelInitializer<SocketChannel> {
|
||||
|
||||
@Override
|
||||
protected void initChannel(SocketChannel socketChannel) throws Exception {
|
||||
socketChannel.pipeline()
|
||||
.addLast(new MessageEncoder())
|
||||
.addLast(new MessageDecoder())
|
||||
.addLast(new ClientHandler());
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import com.example.tankbattle.TankFrame;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.SimpleChannelInboundHandler;
|
||||
|
||||
public class ClientHandler extends SimpleChannelInboundHandler<Message> {
|
||||
@Override
|
||||
public void channelRead0(ChannelHandlerContext ctx, Message msg) throws Exception {
|
||||
System.out.println(msg);
|
||||
msg.handle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void channelActive(ChannelHandlerContext ctx) throws Exception {
|
||||
ctx.writeAndFlush(new TankJoinMessage(TankFrame.INSTANCE.getMainTank()));
|
||||
}
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
public abstract class Message {
|
||||
public abstract void handle();
|
||||
public abstract byte[] toBytes();
|
||||
public abstract void parse(byte[] bytes);
|
||||
public abstract MessageType getMessageType();
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.handler.codec.ByteToMessageDecoder;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class MessageDecoder extends ByteToMessageDecoder {
|
||||
@Override
|
||||
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
|
||||
if (in.readableBytes() < 8) {
|
||||
return;
|
||||
}
|
||||
in.markReaderIndex();
|
||||
MessageType messageType = MessageType.values()[in.readInt()];
|
||||
int length = in.readInt();
|
||||
if (in.readableBytes() < length) {
|
||||
in.resetReaderIndex();
|
||||
return;
|
||||
}
|
||||
|
||||
byte[] bytes = new byte[length];
|
||||
in.readBytes(bytes);
|
||||
|
||||
Message message = (Message) Class.forName("com.example.tankbattle.net." + messageType.toString() + "Message").getDeclaredConstructor().newInstance();
|
||||
message.parse(bytes);
|
||||
out.add(message);
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.handler.codec.MessageToByteEncoder;
|
||||
|
||||
public class MessageEncoder extends MessageToByteEncoder<Message> {
|
||||
|
||||
@Override
|
||||
protected void encode(ChannelHandlerContext ctx, Message msg, ByteBuf out) throws Exception {
|
||||
out.writeInt(msg.getMessageType().ordinal());
|
||||
byte[] data = msg.toBytes();
|
||||
out.writeInt(data.length);
|
||||
out.writeBytes(data);
|
||||
}
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
public enum MessageType {
|
||||
TankJoin, TankDirChanged, TankStop, TankStartMoving, BulletNew, TankDie,
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import io.netty.bootstrap.ServerBootstrap;
|
||||
import io.netty.channel.ChannelFuture;
|
||||
import io.netty.channel.ChannelInitializer;
|
||||
import io.netty.channel.ChannelPipeline;
|
||||
import io.netty.channel.EventLoopGroup;
|
||||
import io.netty.channel.group.ChannelGroup;
|
||||
import io.netty.channel.group.DefaultChannelGroup;
|
||||
import io.netty.channel.nio.NioEventLoopGroup;
|
||||
import io.netty.channel.socket.SocketChannel;
|
||||
import io.netty.channel.socket.nio.NioServerSocketChannel;
|
||||
import io.netty.util.concurrent.GlobalEventExecutor;
|
||||
|
||||
public class Server {
|
||||
public static ChannelGroup clients = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
|
||||
|
||||
public void serverStart() {
|
||||
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
|
||||
EventLoopGroup workerGroup = new NioEventLoopGroup(2);
|
||||
try {
|
||||
ServerBootstrap bootstrap = new ServerBootstrap();
|
||||
ChannelFuture channelFuture = bootstrap.group(bossGroup, workerGroup)
|
||||
.channel(NioServerSocketChannel.class)
|
||||
.childHandler(new ChannelInitializer<SocketChannel>() {
|
||||
@Override
|
||||
protected void initChannel(SocketChannel ch) throws Exception {
|
||||
ChannelPipeline channelPipeline = ch.pipeline();
|
||||
channelPipeline.addLast(new MessageEncoder())
|
||||
.addLast(new MessageDecoder())
|
||||
.addLast(new ServerChildHandler());
|
||||
}
|
||||
}).bind(8888).sync();
|
||||
|
||||
ServerFrame.INSTANCE.updateServerMessage("server started!");
|
||||
channelFuture.channel().closeFuture().sync();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
workerGroup.shutdownGracefully();
|
||||
bossGroup.shutdownGracefully();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Button;
|
||||
import java.awt.Font;
|
||||
import java.awt.Frame;
|
||||
import java.awt.GridLayout;
|
||||
import java.awt.Panel;
|
||||
import java.awt.TextArea;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
|
||||
public class ServerFrame extends Frame {
|
||||
public static final ServerFrame INSTANCE = new ServerFrame();
|
||||
Button btnStart = new Button("start");
|
||||
TextArea textLeft = new TextArea();
|
||||
TextArea textRight = new TextArea();
|
||||
Server server = new Server();
|
||||
|
||||
public ServerFrame() {
|
||||
this.setSize(1600, 600);
|
||||
this.setLocation(300, 30);
|
||||
this.add(btnStart, BorderLayout.NORTH);
|
||||
Panel panel = new Panel(new GridLayout(1, 2));
|
||||
panel.add(textLeft);
|
||||
panel.add(textRight);
|
||||
this.add(panel);
|
||||
textLeft.setFont(new Font("verderna", Font.PLAIN, 25));
|
||||
|
||||
this.addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public void windowClosing(WindowEvent e) {
|
||||
System.exit(0);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
ServerFrame.INSTANCE.setVisible(true);
|
||||
ServerFrame.INSTANCE.server.serverStart();
|
||||
}
|
||||
|
||||
public void updateServerMessage(String message) {
|
||||
this.textLeft.setText(textLeft.getText() + message + System.lineSeparator());
|
||||
}
|
||||
|
||||
public void updateClientMessage(String message) {
|
||||
this.textRight.setText(textRight.getText() + message + System.lineSeparator());
|
||||
|
||||
}
|
||||
}
|
@ -1,96 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import com.example.tankbattle.Bullet;
|
||||
import com.example.tankbattle.Tank;
|
||||
import com.example.tankbattle.TankFrame;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.UUID;
|
||||
|
||||
public class TankDieMessage extends Message{
|
||||
|
||||
UUID bulletId;
|
||||
UUID id;
|
||||
|
||||
public TankDieMessage() {
|
||||
}
|
||||
|
||||
public TankDieMessage(UUID playerId, UUID id) {
|
||||
this.bulletId = playerId;
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public UUID getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(UUID id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle() {
|
||||
System.out.println("we got a tank die: " + id);
|
||||
System.out.println("and my tank is: " + TankFrame.INSTANCE.getMainTank().getId());
|
||||
Tank tank = TankFrame.INSTANCE.findTankByUUID(id);
|
||||
System.out.println("i found a tank with this id: " + tank);
|
||||
|
||||
Bullet bullet = TankFrame.INSTANCE.findBulletByUUID(bulletId);
|
||||
if (bullet != null) {
|
||||
bullet.die();
|
||||
}
|
||||
if (this.id.equals(TankFrame.INSTANCE.getMainTank().getId())) {
|
||||
TankFrame.INSTANCE.getMainTank().die();
|
||||
} else {
|
||||
Tank tanka = TankFrame.INSTANCE.findTankByUUID(id);
|
||||
if (tanka != null) {
|
||||
tanka.die();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] toBytes() {
|
||||
byte[] bytes = null;
|
||||
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
DataOutputStream dos = new DataOutputStream(baos)) {
|
||||
dos.writeLong(bulletId.getMostSignificantBits());
|
||||
dos.writeLong(bulletId.getLeastSignificantBits());
|
||||
dos.writeLong(id.getMostSignificantBits());
|
||||
dos.writeLong(id.getLeastSignificantBits());
|
||||
dos.flush();
|
||||
bytes = baos.toByteArray();
|
||||
|
||||
} catch (Exception exception) {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parse(byte[] bytes) {
|
||||
try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes))) {
|
||||
this.bulletId = new UUID(dis.readLong(), dis.readLong());
|
||||
this.id = new UUID(dis.readLong(), dis.readLong());
|
||||
} catch (IOException exception) {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageType getMessageType() {
|
||||
return MessageType.TankDie;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TankDieMessage{" +
|
||||
"bulletId=" + bulletId +
|
||||
", id=" + id +
|
||||
'}';
|
||||
}
|
||||
}
|
@ -1,132 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import com.example.tankbattle.Dir;
|
||||
import com.example.tankbattle.Tank;
|
||||
import com.example.tankbattle.TankFrame;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.UUID;
|
||||
|
||||
public class TankDirChangedMessage extends Message{
|
||||
|
||||
UUID id;
|
||||
|
||||
Dir dir;
|
||||
|
||||
int x, y;
|
||||
|
||||
public TankDirChangedMessage() {
|
||||
}
|
||||
|
||||
public TankDirChangedMessage(UUID id, int x, int y , Dir dir) {
|
||||
super();
|
||||
this.id = id;
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.dir = dir;
|
||||
}
|
||||
|
||||
public TankDirChangedMessage(Tank tank) {
|
||||
this.id = tank.getId();
|
||||
this.dir = tank.getDir();
|
||||
this.x = tank.getX();
|
||||
this.y = tank.getY();
|
||||
}
|
||||
|
||||
public UUID getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(UUID id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public int getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public void setX(int x) {
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
public int getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
public void setY(int y) {
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public Dir getDir() {
|
||||
return dir;
|
||||
}
|
||||
|
||||
public void setDir(Dir dir) {
|
||||
this.dir = dir;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle() {
|
||||
if (this.id.equals(TankFrame.INSTANCE.getMainTank().getId())) {
|
||||
return;
|
||||
}
|
||||
Tank tank = TankFrame.INSTANCE.findTankByUUID(this.id);
|
||||
if (tank != null) {
|
||||
tank.setMoving(true);
|
||||
tank.setX(this.x);
|
||||
tank.setY(this.y);
|
||||
tank.setDir(this.dir);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] toBytes() {
|
||||
byte[] bytes = null;
|
||||
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
DataOutputStream dos = new DataOutputStream(baos)) {
|
||||
dos.writeLong(id.getMostSignificantBits());
|
||||
dos.writeLong(id.getLeastSignificantBits());
|
||||
dos.writeInt(x);
|
||||
dos.writeInt(y);
|
||||
dos.writeInt(dir.ordinal());
|
||||
dos.flush();
|
||||
bytes = baos.toByteArray();
|
||||
|
||||
} catch (Exception exception) {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parse(byte[] bytes) {
|
||||
try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes))) {
|
||||
this.id = new UUID(dis.readLong(), dis.readLong());
|
||||
|
||||
this.x = dis.readInt();
|
||||
this.y = dis.readInt();
|
||||
this.dir = Dir.values()[dis.readInt()];
|
||||
} catch (IOException exception) {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageType getMessageType() {
|
||||
return MessageType.TankDirChanged;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TankDirChangedMessage{" +
|
||||
"id=" + id +
|
||||
", dir=" + dir +
|
||||
", x=" + x +
|
||||
", y=" + y +
|
||||
'}';
|
||||
}
|
||||
}
|
@ -1,109 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import com.example.tankbattle.Dir;
|
||||
import com.example.tankbattle.Group;
|
||||
import com.example.tankbattle.Tank;
|
||||
import com.example.tankbattle.TankFrame;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.UUID;
|
||||
|
||||
public class TankJoinMessage extends Message{
|
||||
public int x;
|
||||
public int y;
|
||||
public Dir dir;
|
||||
public boolean moving;
|
||||
public Group group;
|
||||
public UUID id;
|
||||
|
||||
public TankJoinMessage() {
|
||||
}
|
||||
|
||||
public TankJoinMessage(int x, int y, Dir dir, boolean moving, Group group, UUID id) {
|
||||
super();
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.dir = dir;
|
||||
this.moving = moving;
|
||||
this.group = group;
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public TankJoinMessage(Tank tank) {
|
||||
this.x = tank.getX();
|
||||
this.y = tank.getY();
|
||||
this.dir = tank.getDir();
|
||||
this.group = tank.getGroup();
|
||||
this.moving = tank.isMoving();
|
||||
this.id = tank.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parse(byte[] bytes) {
|
||||
try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes))) {
|
||||
|
||||
this.x = dis.readInt();
|
||||
this.y = dis.readInt();
|
||||
this.dir = Dir.values()[dis.readInt()];
|
||||
this.moving = dis.readBoolean();
|
||||
this.group = Group.values()[dis.readInt()];
|
||||
this.id = new UUID(dis.readLong(), dis.readLong());
|
||||
} catch (IOException exception) {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] toBytes() {
|
||||
|
||||
byte[] bytes = null;
|
||||
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
DataOutputStream dos = new DataOutputStream(baos)) {
|
||||
dos.writeInt(x);
|
||||
dos.writeInt(y);
|
||||
dos.writeInt(dir.ordinal());
|
||||
dos.writeBoolean(moving);
|
||||
dos.writeInt(group.ordinal());
|
||||
dos.writeLong(id.getMostSignificantBits());
|
||||
dos.writeLong(id.getLeastSignificantBits());
|
||||
dos.flush();
|
||||
bytes = baos.toByteArray();
|
||||
|
||||
} catch (Exception exception) {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle() {
|
||||
if (this.id.equals(TankFrame.INSTANCE.getMainTank().getId()) ||
|
||||
TankFrame.INSTANCE.findTankByUUID(this.id) != null) {
|
||||
return;
|
||||
}
|
||||
Tank tank = new Tank(this);
|
||||
TankFrame.INSTANCE.addTank(tank);
|
||||
Client.INSTANCE.send(new TankJoinMessage(TankFrame.INSTANCE.getMainTank()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageType getMessageType() {
|
||||
return MessageType.TankJoin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TankJoinMessage{" +
|
||||
"x=" + x +
|
||||
", y=" + y +
|
||||
", dir=" + dir +
|
||||
", moving=" + moving +
|
||||
", group=" + group +
|
||||
", id=" + id +
|
||||
'}';
|
||||
}
|
||||
}
|
@ -1,131 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import com.example.tankbattle.Dir;
|
||||
import com.example.tankbattle.Tank;
|
||||
import com.example.tankbattle.TankFrame;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.UUID;
|
||||
|
||||
public class TankStartMovingMessage extends Message{
|
||||
|
||||
UUID id;
|
||||
|
||||
int x, y;
|
||||
|
||||
Dir dir;
|
||||
|
||||
public TankStartMovingMessage() {
|
||||
}
|
||||
|
||||
public TankStartMovingMessage(UUID id, int x, int y, Dir dir) {
|
||||
this.id = id;
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.dir = dir;
|
||||
}
|
||||
|
||||
public TankStartMovingMessage(Tank tank) {
|
||||
this.id = tank.getId();
|
||||
this.x = tank.getX();
|
||||
this.y = tank.getY();
|
||||
this.dir = tank.getDir();
|
||||
}
|
||||
|
||||
public UUID getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(UUID id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public int getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public void setX(int x) {
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
public int getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
public void setY(int y) {
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public Dir getDir() {
|
||||
return dir;
|
||||
}
|
||||
|
||||
public void setDir(Dir dir) {
|
||||
this.dir = dir;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle() {
|
||||
if (this.id.equals(TankFrame.INSTANCE.getMainTank().getId())) {
|
||||
return;
|
||||
}
|
||||
Tank tank = TankFrame.INSTANCE.findTankByUUID(this.id);
|
||||
if (tank != null) {
|
||||
tank.setMoving(true);
|
||||
tank.setX(this.x);
|
||||
tank.setY(this.y);
|
||||
tank.setDir(this.dir);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] toBytes() {
|
||||
byte[] bytes = null;
|
||||
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
DataOutputStream dos = new DataOutputStream(baos)) {
|
||||
dos.writeLong(id.getMostSignificantBits());
|
||||
dos.writeLong(id.getLeastSignificantBits());
|
||||
dos.writeInt(x);
|
||||
dos.writeInt(y);
|
||||
dos.writeInt(dir.ordinal());
|
||||
dos.flush();
|
||||
bytes = baos.toByteArray();
|
||||
|
||||
} catch (Exception exception) {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parse(byte[] bytes) {
|
||||
try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes))) {
|
||||
this.id = new UUID(dis.readLong(), dis.readLong());
|
||||
|
||||
this.x = dis.readInt();
|
||||
this.y = dis.readInt();
|
||||
this.dir = Dir.values()[dis.readInt()];
|
||||
} catch (IOException exception) {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageType getMessageType() {
|
||||
return MessageType.TankStartMoving;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TankStartMovingMessage{" +
|
||||
"id=" + id +
|
||||
", x=" + x +
|
||||
", y=" + y +
|
||||
", dir=" + dir +
|
||||
'}';
|
||||
}
|
||||
}
|
@ -1,115 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import com.example.tankbattle.Tank;
|
||||
import com.example.tankbattle.TankFrame;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.UUID;
|
||||
|
||||
public class TankStopMessage extends Message{
|
||||
|
||||
UUID id;
|
||||
|
||||
private int x;
|
||||
|
||||
private int y;
|
||||
|
||||
public TankStopMessage() {}
|
||||
|
||||
public TankStopMessage(UUID id, int x, int y) {
|
||||
this.id = id;
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public TankStopMessage(Tank tank) {
|
||||
this.id = tank.getId();
|
||||
this.x = tank.getX();
|
||||
this.y = tank.getY();
|
||||
}
|
||||
|
||||
public UUID getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(UUID id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public int getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public void setX(int x) {
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
public int getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
public void setY(int y) {
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle() {
|
||||
if (this.id.equals(TankFrame.INSTANCE.getMainTank().getId())) {
|
||||
return;
|
||||
}
|
||||
Tank tank = TankFrame.INSTANCE.findTankByUUID(this.id);
|
||||
if (tank != null) {
|
||||
tank.setMoving(false);
|
||||
tank.setX(this.x);
|
||||
tank.setY(this.y);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] toBytes() {
|
||||
byte[] bytes = null;
|
||||
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
DataOutputStream dos = new DataOutputStream(baos)) {
|
||||
dos.writeLong(id.getMostSignificantBits());
|
||||
dos.writeLong(id.getLeastSignificantBits());
|
||||
dos.writeInt(x);
|
||||
dos.writeInt(y);
|
||||
dos.flush();
|
||||
bytes = baos.toByteArray();
|
||||
|
||||
} catch (Exception exception) {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parse(byte[] bytes) {
|
||||
try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes))) {
|
||||
this.id = new UUID(dis.readLong(), dis.readLong());
|
||||
|
||||
this.x = dis.readInt();
|
||||
this.y = dis.readInt();
|
||||
} catch (IOException exception) {
|
||||
exception.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageType getMessageType() {
|
||||
return MessageType.TankStop;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TankStopMessage{" +
|
||||
"id=" + id +
|
||||
", x=" + x +
|
||||
", y=" + y +
|
||||
'}';
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package com.example.tankbattle.strategy;
|
||||
|
||||
import com.example.tankbattle.Audio;
|
||||
import com.example.tankbattle.Bullet;
|
||||
import com.example.tankbattle.GameModel;
|
||||
import com.example.tankbattle.GameObject;
|
||||
import com.example.tankbattle.Group;
|
||||
import com.example.tankbattle.Tank;
|
||||
import com.example.tankbattle.decorator.RectDecorator;
|
||||
|
||||
public class DefaultFireStrategy implements FireStrategy{
|
||||
|
||||
@Override
|
||||
public void fire(Tank t) {
|
||||
int bX = t.x + Tank.WIDTH / 2 - Bullet.WIDTH / 2;
|
||||
int bY = t.y + Tank.HEIGHT / 2 - Bullet.HEIGHT / 2;
|
||||
GameModel.getInstance().add(new RectDecorator(new Bullet(bX, bY, t.dir, t.group)));
|
||||
|
||||
if(t.group == Group.GOOD) new Thread(()->new Audio("audio/tank_fire.wav").play()).start();
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package com.example.tankbattle.strategy;
|
||||
|
||||
import com.example.tankbattle.Tank;
|
||||
|
||||
public interface FireStrategy {
|
||||
void fire(Tank tank);
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package com.example.tankbattle.strategy;
|
||||
|
||||
import com.example.tankbattle.Audio;
|
||||
import com.example.tankbattle.Bullet;
|
||||
import com.example.tankbattle.Dir;
|
||||
import com.example.tankbattle.Group;
|
||||
import com.example.tankbattle.Tank;
|
||||
|
||||
public class FourDirFireStrategy implements FireStrategy{
|
||||
|
||||
@Override
|
||||
public void fire(Tank t) {
|
||||
int bX = t.x + Tank.WIDTH / 2 - Bullet.WIDTH / 2;
|
||||
int bY = t.y + Tank.HEIGHT / 2 - Bullet.HEIGHT / 2;
|
||||
Dir[] dirs = Dir.values();
|
||||
for(Dir dir : dirs) {
|
||||
new Bullet(bX, bY, dir, t.group);
|
||||
}
|
||||
if(t.group == Group.GOOD) new Thread(()->new Audio("audio/tank_fire.wav").play()).start();
|
||||
}
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
package com.example.tankbattle;
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.RenderingHints;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.IOException;
|
||||
|
||||
class ImageRotateTest {
|
||||
|
||||
@Test
|
||||
void test() {
|
||||
try {
|
||||
BufferedImage tankL = ImageIO.read(ResourceMgr.class.getClassLoader().getResourceAsStream("images/tankL.gif"));
|
||||
tankL = rotateImage(tankL, 90);
|
||||
Assertions.assertNotNull(tankL);
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public BufferedImage rotateImage(final BufferedImage bufferedimage,
|
||||
final int degree) {
|
||||
int w = bufferedimage.getWidth();
|
||||
int h = bufferedimage.getHeight();
|
||||
int type = bufferedimage.getColorModel().getTransparency();
|
||||
BufferedImage img;
|
||||
Graphics2D graphics2d;
|
||||
(graphics2d = (img = new BufferedImage(w, h, type))
|
||||
.createGraphics()).setRenderingHint(
|
||||
RenderingHints.KEY_INTERPOLATION,
|
||||
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
|
||||
graphics2d.rotate(Math.toRadians(degree), w / 2, h / 2);
|
||||
graphics2d.drawImage(bufferedimage, 0, 0, null);
|
||||
graphics2d.dispose();
|
||||
return img;
|
||||
}
|
||||
}
|
@ -1,69 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import com.example.tankbattle.Dir;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.channel.embedded.EmbeddedChannel;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
class TankDirChangedMessageCoderTest {
|
||||
|
||||
@Test
|
||||
void encode() {
|
||||
EmbeddedChannel embeddedChannel = new EmbeddedChannel();
|
||||
UUID id = UUID.randomUUID();
|
||||
TankStartMovingMessage message = new TankStartMovingMessage(id, 5, 10, Dir.LEFT);
|
||||
embeddedChannel.pipeline()
|
||||
.addLast(new MessageEncoder());
|
||||
|
||||
embeddedChannel.writeOutbound(message);
|
||||
|
||||
ByteBuf buf = (ByteBuf) embeddedChannel.readOutbound();
|
||||
MessageType messageType = MessageType.values()[buf.readInt()];
|
||||
assertEquals(MessageType.TankStartMoving, messageType);
|
||||
|
||||
int length = buf.readInt();
|
||||
assertEquals(28, length);
|
||||
|
||||
UUID uuid = new UUID(buf.readLong(), buf.readLong());
|
||||
int x = buf.readInt();
|
||||
int y = buf.readInt();
|
||||
int dirOrdinal = buf.readInt();
|
||||
Dir dir = Dir.values()[dirOrdinal];
|
||||
|
||||
assertEquals(5, x);
|
||||
assertEquals(10, y);
|
||||
assertEquals(Dir.LEFT, dir);
|
||||
assertEquals(id, uuid);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testDecoder() {
|
||||
EmbeddedChannel ch = new EmbeddedChannel();
|
||||
|
||||
|
||||
UUID id = UUID.randomUUID();
|
||||
TankStartMovingMessage message = new TankStartMovingMessage(id, 5, 10, Dir.LEFT);
|
||||
ch.pipeline()
|
||||
.addLast(new MessageDecoder());
|
||||
|
||||
ByteBuf buf = Unpooled.buffer();
|
||||
buf.writeInt(MessageType.TankStartMoving.ordinal());
|
||||
byte[] bytes = message.toBytes();
|
||||
buf.writeInt(bytes.length);
|
||||
buf.writeBytes(bytes);
|
||||
|
||||
ch.writeInbound(buf.duplicate());
|
||||
|
||||
TankStartMovingMessage msg = (TankStartMovingMessage) ch.readInbound();
|
||||
|
||||
assertEquals(5, msg.getX());
|
||||
assertEquals(10, msg.getY());
|
||||
assertEquals(Dir.LEFT, msg.getDir());
|
||||
assertEquals(id, msg.getId());
|
||||
}
|
||||
}
|
@ -1,83 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import com.example.tankbattle.Dir;
|
||||
import com.example.tankbattle.Group;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.channel.embedded.EmbeddedChannel;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class TankJoinMessageCoderTest {
|
||||
|
||||
@Test
|
||||
void testEncoder() {
|
||||
EmbeddedChannel ch = new EmbeddedChannel();
|
||||
|
||||
|
||||
UUID id = UUID.randomUUID();
|
||||
TankJoinMessage msg = new TankJoinMessage(5, 10, Dir.DOWN, true, Group.BAD, id);
|
||||
ch.pipeline()
|
||||
.addLast(new MessageEncoder());
|
||||
|
||||
ch.writeOutbound(msg);
|
||||
|
||||
ByteBuf buf = (ByteBuf)ch.readOutbound();
|
||||
MessageType messageType = MessageType.values()[buf.readInt()];
|
||||
assertEquals(MessageType.TankJoin, messageType);
|
||||
|
||||
int length = buf.readInt();
|
||||
assertEquals(33, length);
|
||||
|
||||
int x = buf.readInt();
|
||||
int y = buf.readInt();
|
||||
int dirOrdinal = buf.readInt();
|
||||
Dir dir = Dir.values()[dirOrdinal];
|
||||
boolean moving = buf.readBoolean();
|
||||
int groupOrdinal = buf.readInt();
|
||||
Group g = Group.values()[groupOrdinal];
|
||||
UUID uuid = new UUID(buf.readLong(), buf.readLong());
|
||||
|
||||
assertEquals(5, x);
|
||||
assertEquals(10, y);
|
||||
assertEquals(Dir.DOWN, dir);
|
||||
assertEquals(true, moving);
|
||||
assertEquals(Group.BAD, g);
|
||||
assertEquals(id, uuid);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testDecoder() {
|
||||
EmbeddedChannel ch = new EmbeddedChannel();
|
||||
|
||||
|
||||
UUID id = UUID.randomUUID();
|
||||
TankJoinMessage message = new TankJoinMessage(5, 10, Dir.DOWN, true, Group.BAD, id);
|
||||
ch.pipeline()
|
||||
.addLast(new MessageDecoder());
|
||||
|
||||
ByteBuf buf = Unpooled.buffer();
|
||||
buf.writeInt(MessageType.TankJoin.ordinal());
|
||||
byte[] bytes = message.toBytes();
|
||||
buf.writeInt(bytes.length);
|
||||
buf.writeBytes(bytes);
|
||||
|
||||
ch.writeInbound(buf.duplicate());
|
||||
|
||||
TankJoinMessage msg = (TankJoinMessage) ch.readInbound();
|
||||
|
||||
|
||||
|
||||
assertEquals(5, msg.x);
|
||||
assertEquals(10, msg.y);
|
||||
assertEquals(Dir.DOWN, msg.dir);
|
||||
assertEquals(true, msg.moving);
|
||||
assertEquals(Group.BAD, msg.group);
|
||||
assertEquals(id, msg.id);
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,71 +0,0 @@
|
||||
package com.example.tankbattle.net;
|
||||
|
||||
import com.example.tankbattle.Dir;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.channel.embedded.EmbeddedChannel;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class TankStartMovingMessageTest {
|
||||
|
||||
@Test
|
||||
void testEncoder() {
|
||||
EmbeddedChannel ch = new EmbeddedChannel();
|
||||
|
||||
|
||||
UUID id = UUID.randomUUID();
|
||||
Message message = new TankDirChangedMessage(id, 5, 10, Dir.LEFT);
|
||||
ch.pipeline()
|
||||
.addLast(new MessageEncoder());
|
||||
|
||||
ch.writeOutbound(message);
|
||||
|
||||
ByteBuf buf = (ByteBuf)ch.readOutbound();
|
||||
MessageType messageType = MessageType.values()[buf.readInt()];
|
||||
assertEquals(MessageType.TankDirChanged, messageType);
|
||||
|
||||
int length = buf.readInt();
|
||||
assertEquals(28, length);
|
||||
|
||||
UUID uuid = new UUID(buf.readLong(), buf.readLong());
|
||||
int x = buf.readInt();
|
||||
int y = buf.readInt();
|
||||
int dirOrdinal = buf.readInt();
|
||||
Dir dir = Dir.values()[dirOrdinal];
|
||||
|
||||
assertEquals(5, x);
|
||||
assertEquals(10, y);
|
||||
assertEquals(Dir.LEFT, dir);
|
||||
assertEquals(id, uuid);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testDecoder() {
|
||||
EmbeddedChannel ch = new EmbeddedChannel();
|
||||
|
||||
|
||||
UUID id = UUID.randomUUID();
|
||||
TankDirChangedMessage message = new TankDirChangedMessage(id, 5, 10, Dir.LEFT);
|
||||
ch.pipeline()
|
||||
.addLast(new MessageDecoder());
|
||||
|
||||
ByteBuf buf = Unpooled.buffer();
|
||||
buf.writeInt(MessageType.TankDirChanged.ordinal());
|
||||
byte[] bytes = message.toBytes();
|
||||
buf.writeInt(bytes.length);
|
||||
buf.writeBytes(bytes);
|
||||
|
||||
ch.writeInbound(buf.duplicate());
|
||||
|
||||
TankDirChangedMessage msgR = (TankDirChangedMessage)ch.readInbound();
|
||||
|
||||
assertEquals(5, msgR.getX());
|
||||
assertEquals(10, msgR.getY());
|
||||
assertEquals(Dir.LEFT, msgR.getDir());
|
||||
assertEquals(id, msgR.getId());
|
||||
}
|
||||
}
|
Loading…
Reference in new issue