master
kn5886348135 3 years ago
parent 2b10bac007
commit 4f4583c036

@ -57,12 +57,12 @@ public class Audio {
public void play() {
try {
byte[] b = new byte[1024 * 5];
byte[] b = new byte[1024*5];
int len = 0;
sourceDataLine.open(audioFormat, 1024 * 5);
sourceDataLine.open(audioFormat, 1024*5);
sourceDataLine.start();
System.out.println(audioInputStream.markSupported());
// audioInputStream.mark(12358946);
//System.out.println(audioInputStream.markSupported());
audioInputStream.mark(12358946);
while ((len = audioInputStream.read(b)) > 0) {
sourceDataLine.write(b, 0, len);
}

@ -152,4 +152,12 @@ public class Bullet {
public void die() {
this.living = false;
}
public boolean isLiving() {
return living;
}
public void setLiving(boolean living) {
this.living = living;
}
}

@ -1,6 +1,6 @@
package com.example.tankbattle;
import java.awt.*;
import java.awt.Graphics;
public class Explode {
public static int WIDTH = ResourceMgr.explodes[0].getWidth();
@ -13,14 +13,17 @@ public class Explode {
public Explode(int x, int y) {
this.x = x;
this.y = y;
new Thread(()->new Audio("audio/explode.wav").play()).start();
}
public void paint(Graphics g) {
g.drawImage(ResourceMgr.explodes[step++], x, y, null);
if (step >= ResourceMgr.explodes.length)
if (step >= ResourceMgr.explodes.length) {
TankFrame.INSTANCE.explodes.remove(this);
}
}
}

@ -26,7 +26,6 @@ public class Main {
}
}).start();
Client client = Client.INSTANCE;
client.connect();
Client.INSTANCE.connect();
}
}

@ -4,12 +4,14 @@ import com.example.tankbattle.net.BulletNewMessage;
import com.example.tankbattle.net.Client;
import com.example.tankbattle.net.TankJoinMessage;
import java.awt.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Random;
import java.util.UUID;
public class Tank {
private static final int SPEED = 1;
private static final int SPEED = 2;
public static int WIDTH = ResourceMgr.GoodTankD.getWidth();
public static int HEIGHT = ResourceMgr.GoodTankD.getHeight();
@ -73,6 +75,9 @@ public class Tank {
Bullet bullet = new Bullet(this.id, bX, bY, this.dir, this.group, this.tf);
tf.bullets.add(bullet);
Client.INSTANCE.send(new BulletNewMessage(bullet));
if (this.group == Group.GOOD) {
new Thread(() -> new Audio("audio/tank_fire.wav").play()).start();
}
}
public Dir getDir() {
@ -119,30 +124,33 @@ public class Tank {
break;
}
rect.x = this.x;
rect.y = this.y;
if (this.group == Group.BAD && random.nextInt(100) > 95) this.fire();
if (this.group == Group.BAD && random.nextInt(100) > 95) {
this.fire();
}
if (this.group == Group.BAD && random.nextInt(100) > 95) {
randomDir();
}
boundsCheck();
rect.x = this.x;
rect.y = this.y;
}
private void boundsCheck() {
if (this.x < 0) {
if (this.x < 2) {
this.x = 2;
}
if (this.y < 28) {
this.y = 28;
}
if (this.x > TankFrame.GAME_WIDTH - Tank.WIDTH) {
this.x = TankFrame.GAME_WIDTH - Tank.WIDTH;
if (this.x > TankFrame.GAME_WIDTH - Tank.WIDTH - 2) {
this.x = TankFrame.GAME_WIDTH - Tank.WIDTH - 2;
}
if (this.y > TankFrame.GAME_HEIGHT - Tank.HEIGHT) {
this.y = TankFrame.GAME_HEIGHT - Tank.HEIGHT;
if (this.y > TankFrame.GAME_HEIGHT - Tank.HEIGHT - 2) {
this.y = TankFrame.GAME_HEIGHT - Tank.HEIGHT - 2;
}
}
@ -151,10 +159,12 @@ public class Tank {
}
public void paint(Graphics g) {
if (!living) tf.tanks.remove(this);
// if (!living) {
// tf.tanks.remove(this);
// }
Color color = g.getColor();
g.setColor(Color.YELLOW);
g.drawString(id.toString(), this.x, this.y - 10);
g.drawString(id.toString(), this.x, this.y - 20);
g.drawString("live=" + living, x, y - 10);
g.setColor(color);

@ -100,7 +100,7 @@ public class TankFrame extends Frame {
bullets.get(i).paint(g);
}
tanks.values().forEach((e) -> e.paint(g));
tanks.values().stream().forEach((e) -> e.paint(g));
for (int i = 0; i < explodes.size(); i++) {
explodes.get(i).paint(g);
@ -131,21 +131,24 @@ public class TankFrame extends Frame {
switch (key) {
case KeyEvent.VK_LEFT:
bL = true;
setMainTankDir();
break;
case KeyEvent.VK_UP:
bU = true;
setMainTankDir();
break;
case KeyEvent.VK_RIGHT:
bR = true;
setMainTankDir();
break;
case KeyEvent.VK_DOWN:
bD = true;
setMainTankDir();
break;
default:
break;
}
setMainTankDir();
new Thread(()->new Audio("audio/tank_move.wav").play()).start();
}
@Override
@ -154,15 +157,19 @@ public class TankFrame extends Frame {
switch (key) {
case KeyEvent.VK_LEFT:
bL = false;
setMainTankDir();
break;
case KeyEvent.VK_UP:
bU = false;
setMainTankDir();
break;
case KeyEvent.VK_RIGHT:
bR = false;
setMainTankDir();
break;
case KeyEvent.VK_DOWN:
bD = false;
setMainTankDir();
break;
case KeyEvent.VK_CONTROL:
myTank.fire();
@ -170,8 +177,6 @@ public class TankFrame extends Frame {
default:
break;
}
setMainTankDir();
}
private void setMainTankDir() {
@ -182,12 +187,21 @@ public class TankFrame extends Frame {
myTank.setMoving(false);
Client.INSTANCE.send(new TankStopMessage(getMainTank()));
} else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
if (bL) {
myTank.setDir(Dir.LEFT);
}
if (bU) {
myTank.setDir(Dir.UP);
}
if (bR) {
myTank.setDir(Dir.RIGHT);
}
if (bD) {
myTank.setDir(Dir.DOWN);
}
if (!myTank.isMoving()) {
Client.INSTANCE.send(new TankStartMovingMessage(getMainTank()));
}
myTank.setMoving(true);
if (dir != myTank.getDir()) {

@ -33,7 +33,7 @@ public class BulletNewMessage extends Message {
@Override
public void handle() {
if (this.id.equals(TankFrame.INSTANCE.getMainTank().getId())) {
if (this.playerID.equals(TankFrame.INSTANCE.getMainTank().getId())) {
return;
}
Bullet bullet = new Bullet(this.playerID, x, y, dir, group, TankFrame.INSTANCE);

@ -26,7 +26,7 @@ public class Client {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
if (!future.isSuccess()) {
System.out.println("not conected");
System.out.println("not connected");
} else {
System.out.println("connected");
channel = future.channel();

@ -11,5 +11,6 @@ public class MessageEncoder extends MessageToByteEncoder<Message> {
out.writeInt(msg.getMessageType().ordinal());
byte[] data = msg.toBytes();
out.writeInt(data.length);
out.writeBytes(data);}
out.writeBytes(data);
}
}

@ -2,7 +2,6 @@ package com.example.tankbattle.net;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.ReferenceCountUtil;
public class ServerChildHandler extends ChannelInboundHandlerAdapter {
@ -15,6 +14,29 @@ public class ServerChildHandler extends ChannelInboundHandlerAdapter {
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ServerFrame.INSTANCE.updateClientMessage(msg.toString());
Server.clients.writeAndFlush(msg);
/*ByteBuf buf = null;
try {
buf = (ByteBuf)msg;
byte[] bytes = new byte[buf.readableBytes()];
buf.getBytes(buf.readerIndex(), bytes);
String s = new String(bytes);
if(s.equals("_bye_")) {
System.out.println("<22>ͻ<EFBFBD><CDBB><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>˳<EFBFBD>");
Server.clients.remove(ctx.channel());
ctx.close();
} else {
Server.clients.writeAndFlush(msg);
}*/
//System.out.println(buf);
//System.out.println(buf.refCnt());
/*} finally {
//if(buf != null && buf) ReferenceCountUtil.release(buf);
//System.out.println(buf.refCnt());
}*/
}
@Override

@ -12,7 +12,7 @@ import java.awt.event.WindowEvent;
public class ServerFrame extends Frame {
public static final ServerFrame INSTANCE = new ServerFrame();
Button btnStart = new Button("Start");
Button btnStart = new Button("start");
TextArea textLeft = new TextArea();
TextArea textRight = new TextArea();
Server server = new Server();

@ -19,8 +19,8 @@ public class TankDieMessage extends Message{
public TankDieMessage() {
}
public TankDieMessage(UUID bulletId, UUID id) {
this.bulletId = bulletId;
public TankDieMessage(UUID playerId, UUID id) {
this.bulletId = playerId;
this.id = id;
}

@ -22,7 +22,8 @@ public class TankDirChangedMessage extends Message{
public TankDirChangedMessage() {
}
public TankDirChangedMessage(UUID id, int x, int y, Dir dir) {
public TankDirChangedMessage(UUID id, int x, int y , Dir dir) {
super();
this.id = id;
this.x = x;
this.y = y;
@ -75,7 +76,7 @@ public class TankDirChangedMessage extends Message{
}
Tank tank = TankFrame.INSTANCE.findTankByUUID(this.id);
if (tank != null) {
tank.setMoving(false);
tank.setMoving(true);
tank.setX(this.x);
tank.setY(this.y);
tank.setDir(this.dir);
@ -108,7 +109,7 @@ public class TankDirChangedMessage extends Message{
this.x = dis.readInt();
this.y = dis.readInt();
this.dir = Dir.values()[dis.read()];
this.dir = Dir.values()[dis.readInt()];
} catch (IOException exception) {
exception.printStackTrace();
}

@ -33,9 +33,7 @@ public class TankJoinMessage extends Message{
this.id = id;
}
public TankJoinMessage(Tank tank) {
super();
this.x = tank.getX();
this.y = tank.getY();
this.dir = tank.getDir();
@ -46,8 +44,8 @@ public class TankJoinMessage extends Message{
@Override
public void parse(byte[] bytes) {
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes));
try {
try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bytes))) {
this.x = dis.readInt();
this.y = dis.readInt();
this.dir = Dir.values()[dis.readInt()];
@ -56,17 +54,12 @@ public class TankJoinMessage extends Message{
this.id = new UUID(dis.readLong(), dis.readLong());
} catch (IOException exception) {
exception.printStackTrace();
} finally {
try {
dis.close();
}catch (IOException ex){
ex.printStackTrace();
}
}
}
@Override
public byte[] toBytes(){
public byte[] toBytes() {
byte[] bytes = null;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos)) {
@ -82,13 +75,12 @@ public class TankJoinMessage extends Message{
} catch (Exception exception) {
exception.printStackTrace();
} finally {
}
return bytes;
}
@Override
public void handle(){
public void handle() {
if (this.id.equals(TankFrame.INSTANCE.getMainTank().getId()) ||
TankFrame.INSTANCE.findTankByUUID(this.id) != null) {
return;

@ -15,7 +15,7 @@ public class TankStartMovingMessage extends Message{
UUID id;
int x,y;
int x, y;
Dir dir;

@ -14,10 +14,11 @@ public class TankStopMessage extends Message{
UUID id;
int x,y;
private int x;
public TankStopMessage() {
}
private int y;
public TankStopMessage() {}
public TankStopMessage(UUID id, int x, int y) {
this.id = id;

@ -0,0 +1,42 @@
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;
}
}

@ -16,10 +16,9 @@ public class ImageTest {
public void test(){
System.out.println(ImageTest.class.getClassLoader());
try {
BufferedImage image = ImageIO.read(new File("C:/work/javaprojects/Tank_60/src/images/bulletD.gif"));
BufferedImage image = ImageIO.read(new File("/images/bulletD.gif"));
assertNotNull(image);
BufferedImage image2 = ImageIO.read(ImageTest.class.getClassLoader().getResourceAsStream("src/images" +
"/bulletD.gif"));
BufferedImage image2 = ImageIO.read(ImageTest.class.getClassLoader().getResourceAsStream("src/images/bulletD.gif"));
assertNotNull(image2);
} catch (IOException exception) {
exception.printStackTrace();

@ -16,52 +16,54 @@ class TankDirChangedMessageCoderTest {
void encode() {
EmbeddedChannel embeddedChannel = new EmbeddedChannel();
UUID id = UUID.randomUUID();
TankStartMovingMessage message = new TankStartMovingMessage(id, 5, 10, Dir.LEFT);
embeddedChannel.pipeline()
.addLast(new MessageEncoder());
TankDirChangedMessage message = new TankDirChangedMessage(id, 5, 10, Dir.DOWN);
embeddedChannel.pipeline().addLast(new MessageEncoder());
embeddedChannel.writeOutbound(message);
ByteBuf buf = embeddedChannel.readOutbound();
ByteBuf buf = (ByteBuf) embeddedChannel.readOutbound();
MessageType messageType = MessageType.values()[buf.readInt()];
assertEquals(MessageType.TankJoin, messageType);
assertEquals(MessageType.TankStartMoving, messageType);
int length = buf.readInt();
assertEquals(33, length);
assertEquals(28, length);
UUID uuid = new UUID(buf.readLong(), buf.readLong());
int x = buf.readInt();
int y = buf.readInt();
Dir dir = Dir.values()[buf.readInt()];
UUID uuid = new UUID(buf.readLong(), buf.readLong());
int dirOrdinal = buf.readInt();
Dir dir = Dir.values()[dirOrdinal];
assertEquals(5, x);
assertEquals(10, y);
assertEquals(Dir.DOWN, dir);
assertEquals(Dir.LEFT, dir);
assertEquals(id, uuid);
}
@Test
void decode() {
EmbeddedChannel embeddedChannel = new EmbeddedChannel();
void testDecoder() {
EmbeddedChannel ch = new EmbeddedChannel();
UUID id = UUID.randomUUID();
TankDirChangedMessage message = new TankDirChangedMessage(id, 5, 10, Dir.DOWN);
embeddedChannel.pipeline().addLast(new MessageDecoder());
TankStartMovingMessage message = new TankStartMovingMessage(id, 5, 10, Dir.LEFT);
ch.pipeline()
.addLast(new MessageDecoder());
ByteBuf buf = Unpooled.buffer();
buf.writeInt(MessageType.TankJoin.ordinal());
byte[] data = message.toBytes();
buf.writeInt(data.length);
buf.writeBytes(data);
buf.writeInt(MessageType.TankStartMoving.ordinal());
byte[] bytes = message.toBytes();
buf.writeInt(bytes.length);
buf.writeBytes(bytes);
embeddedChannel.writeInbound(buf.duplicate());
ch.writeInbound(buf.duplicate());
TankDirChangedMessage msg = embeddedChannel.readInbound();
TankStartMovingMessage msg = (TankStartMovingMessage) ch.readInbound();
assertEquals(5, msg.x);
assertEquals(10, msg.y);
assertEquals(Dir.DOWN, msg.dir);
assertEquals(id, msg.id);
assertEquals(5, msg.getX());
assertEquals(10, msg.getY());
assertEquals(Dir.LEFT, msg.getDir());
assertEquals(id, msg.getId());
}
}

@ -14,15 +14,18 @@ import static org.junit.jupiter.api.Assertions.*;
class TankJoinMessageCoderTest {
@Test
void encode() {
EmbeddedChannel embeddedChannel = new EmbeddedChannel();
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());
TankJoinMessage message = new TankJoinMessage(5, 10, Dir.DOWN, true, Group.BAD, id);
embeddedChannel.pipeline().addLast(new MessageEncoder());
embeddedChannel.writeOutbound(message);
ch.writeOutbound(msg);
ByteBuf buf = embeddedChannel.readOutbound();
ByteBuf buf = (ByteBuf)ch.readOutbound();
MessageType messageType = MessageType.values()[buf.readInt()];
assertEquals(MessageType.TankJoin, messageType);
@ -31,38 +34,42 @@ class TankJoinMessageCoderTest {
int x = buf.readInt();
int y = buf.readInt();
Dir dir = Dir.values()[buf.readInt()];
int dirOrdinal = buf.readInt();
Dir dir = Dir.values()[dirOrdinal];
boolean moving = buf.readBoolean();
Group group = Group.values()[buf.readInt()];
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, group);
assertEquals(Group.BAD, g);
assertEquals(id, uuid);
}
@Test
void decode() {
EmbeddedChannel embeddedChannel = new EmbeddedChannel();
void testDecoder() {
EmbeddedChannel ch = new EmbeddedChannel();
UUID id = UUID.randomUUID();
TankJoinMessage message = new TankJoinMessage(5, 10, Dir.DOWN, true, Group.BAD, id);
embeddedChannel.pipeline().addLast(new MessageDecoder());
ch.pipeline()
.addLast(new MessageDecoder());
ByteBuf buf = Unpooled.buffer();
buf.writeInt(MessageType.TankJoin.ordinal());
byte[] data = message.toBytes();
buf.writeInt(data.length);
buf.writeBytes(data);
byte[] bytes = message.toBytes();
buf.writeInt(bytes.length);
buf.writeBytes(bytes);
ch.writeInbound(buf.duplicate());
TankJoinMessage msg = (TankJoinMessage) ch.readInbound();
embeddedChannel.writeInbound(buf.duplicate());
TankJoinMessage msg = embeddedChannel.readInbound();
assertEquals(5, msg.x);
assertEquals(10, msg.y);
@ -71,4 +78,6 @@ class TankJoinMessageCoderTest {
assertEquals(Group.BAD, msg.group);
assertEquals(id, msg.id);
}
}

@ -13,17 +13,20 @@ import static org.junit.jupiter.api.Assertions.*;
class TankStartMovingMessageTest {
@Test
void encode() {
EmbeddedChannel embeddedChannel = new EmbeddedChannel();
void testEncoder() {
EmbeddedChannel ch = new EmbeddedChannel();
UUID id = UUID.randomUUID();
Message message = new TankDirChangedMessage(id, 5, 10, Dir.LEFT);
ch.pipeline()
.addLast(new MessageEncoder());
TankStartMovingMessage message = new TankStartMovingMessage(id, 5, 10, Dir.LEFT);
embeddedChannel.pipeline().addLast(new MessageEncoder());
embeddedChannel.writeOutbound(message);
ch.writeOutbound(message);
ByteBuf buf = embeddedChannel.readOutbound();
ByteBuf buf = (ByteBuf)ch.readOutbound();
MessageType messageType = MessageType.values()[buf.readInt()];
assertEquals(MessageType.TankStartMoving, messageType);
assertEquals(MessageType.TankDirChanged, messageType);
int length = buf.readInt();
assertEquals(28, length);
@ -31,38 +34,38 @@ class TankStartMovingMessageTest {
UUID uuid = new UUID(buf.readLong(), buf.readLong());
int x = buf.readInt();
int y = buf.readInt();
Dir dir = Dir.values()[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 decode() {
EmbeddedChannel embeddedChannel = new EmbeddedChannel();
void testDecoder() {
EmbeddedChannel ch = new EmbeddedChannel();
UUID id = UUID.randomUUID();
TankStartMovingMessage message = new TankStartMovingMessage(id, 5, 10, Dir.LEFT);
embeddedChannel.pipeline().addLast(new MessageDecoder());
TankDirChangedMessage message = new TankDirChangedMessage(id, 5, 10, Dir.LEFT);
ch.pipeline()
.addLast(new MessageDecoder());
ByteBuf buf = Unpooled.buffer();
buf.writeInt(MessageType.TankStartMoving.ordinal());
byte[] data = message.toBytes();
buf.writeInt(data.length);
buf.writeBytes(data);
buf.writeInt(MessageType.TankDirChanged.ordinal());
byte[] bytes = message.toBytes();
buf.writeInt(bytes.length);
buf.writeBytes(bytes);
embeddedChannel.writeInbound(buf.duplicate());
ch.writeInbound(buf.duplicate());
TankStartMovingMessage msg = (TankStartMovingMessage)embeddedChannel.readInbound();
TankDirChangedMessage msgR = (TankDirChangedMessage)ch.readInbound();
assertEquals(5, msg.x);
assertEquals(10, msg.y);
assertEquals(Dir.LEFT, msg.dir);
assertEquals(id, msg.id);
assertEquals(5, msgR.getX());
assertEquals(10, msgR.getY());
assertEquals(Dir.LEFT, msgR.getDir());
assertEquals(id, msgR.getId());
}
}
Loading…
Cancel
Save