Hardware components | ||||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 |
I made so cool Christmas shooting game! The player is Santa and Monster is Rudolph! Also background music of the game is goes well with Christmas! This is just my opinion. I created it for the Internet of Holiday Things because Always Playing game is so funny, so I thought playing game on Holiday is also funny!
How it does workFirst, I'll talk about Computer(java)-to-board connection relationship: I wrote some Java code that can communicate with Arduino. Mkr1000 and Java are connected directly using inner IP. If we move joystick, Mkr1000 send joystick's movement to the Java.
Uno and Leonardo are connected by Bluetooth(HC-06). If we push shooting Arcade Button. The fact that we push it is sent to Leonardo. And Leonardo receive it and press space bar using Keyboard library.
And then, Java notice that space bar was pressed and shoot! That's All!
Photo
After it, I just put everything in the box! HAHAHAHAHA (Don't forget to decorate the box!)
Before you use my Java codeI did post the all code of Java, but if you use this code, you have to change IP and save some photos (Santa figure, Rudolph picture, background, robot picture) to a (file with code) finally, you have to add some music you want.
Each file name:
- background.jpg
- Christmas.gif
- happyXmas.jpg
- JingleBell.wav
- robot.png
I think Writing Java code is more difficult than creating a game machine. But Arduino has evolved this game.
FinallyWhat A Fantastic game it is!
#include <SPI.h>
#include <WiFi101.h>
char ssid[] = "iptime"; // your network SSID (name)
int xpos;
int ypos;
int status = WL_IDLE_STATUS;
WiFiServer server(80);
WiFiClient client;
void setup() {
//Initialize serial and wait for port to open:
pinMode(A1,INPUT);
pinMode(A2,INPUT);
WiFi.lowPowerMode();
// attempt to connect to Wifi network:
while ( status != WL_CONNECTED) {
status = WiFi.begin(ssid);
// wait 10 seconds for connection:
delay(10000);
}
// start the server:
server.begin();
}
void loop() {
client = server.available();
while(client.connected()) {
xpos = analogRead(A2);
ypos = analogRead(A1);
if(xpos>900)
client.println("R");
else if(xpos<150)
client.println("L");
if(ypos<150)
client.println("F");
else if(ypos>900)
client.println("B");
}
}
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
pinMode(7,INPUT_PULLUP);
mySerial.begin(9600);
}
void loop() { // run over and over
if(digitalRead(7)==0)
mySerial.print("a");
delay(300);
}
public class NetWork {
private Socket socket;
InputStream in;
public NetWork(){
try {
socket = new Socket("mkr1000's inner Ip",mkr1000's inner port);
in = socket.getInputStream();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private char getText(){
try {
if(in.available()>0)
return (char) in.read();//read direction
} catch (IOException e) {
//ignore
}
return 'N';//no move
}
import java.io.File;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
public class MusicPlayer implements Runnable{
public Clip clip;
private File file;
public MusicPlayer(String musicFileName){
file=new File(musicFileName);
}
public MusicPlayer(File musicFile){
file=musicFile;
}
@Override
@Deprecated
public void run() {
try{
clip = AudioSystem.getClip();
clip.open(AudioSystem.getAudioInputStream(file));
clip.loop(Clip.LOOP_CONTINUOUSLY);
clip.start();
Thread.sleep(clip.getMicrosecondLength()/1000);
}
catch(Exception e){
e.printStackTrace();
}
}
public void Pause(){
clip.stop();
}
public void Stop(){
clip.stop();
clip.close();
}
public void ReStart(){
clip.start();
}
public void Start(){
new Thread(this).start();
}
public void StartAtFirst(){
try {
clip.close();
clip=AudioSystem.getClip();
clip.open(AudioSystem.getAudioInputStream(file));
Start();
} catch (Exception e) {
// TODO 자동 생성된 catch 블록
e.printStackTrace();
}
}
}
package MM;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class NetWork {
private Socket socket;
InputStream in;
public NetWork(){
try {
socket = new Socket("192.168.0.2",80);
in = socket.getInputStream();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private char getText(){
try {
if(in.available()>0)
return (char) in.read();
} catch (IOException e) {
//ignore
}
return 'N';
}
public Reaction getReaction() {
char result = getText();
switch(result){
case 'R': return Reaction.Right;
case 'B': return Reaction.Behind;
case 'F': return Reaction.Front;
case 'L': return Reaction.Left;
}
return Reaction.NM;
}
public void dispose(){
try {
socket.close();
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package shoot;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Collections;
import java.util.Iterator;
import java.util.Random;
import sounds.MusicPlayer;
import javax.swing.*;
import MM.NetWork;
public class Fight extends JPanel implements KeyListener , ActionListener,Runnable{
/**
*
*/
private static final long serialVersionUID = 1313313143231311254L;
public static boolean isChange = false;
public static int Level=1;
public static MusicPlayer music = new MusicPlayer("JingleBell.wav");
static int jumsu;
public static JFrame frame=new JFrame("MyGame");
public static int mocsom=5;
public static final int WEIGHT = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
public static final int HEIGHT=(int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
private static java.util.List<Point> bulletsPos = new java.util.ArrayList<>();
private Image playerImage = Toolkit.getDefaultToolkit().createImage("Christmas.gif");
private static Image enemyImage = Toolkit.getDefaultToolkit().createImage("happyXmas.jpg");
private Point playerCurPos =new Point(WEIGHT/2-playerImage.getWidth(this)/2,HEIGHT/2-playerImage.getHeight(this)/2);
private static java.util.List<Point> enemyPos = new java.util.ArrayList<>();
public static JLabel poinLabel=new JLabel();
public static Image backGround = Toolkit.getDefaultToolkit().createImage("background.jpg");
public static int enemyh=-1;
public static int enemyw=-1;
static NetWork net;
long current;
int ewh;
Image robot = Toolkit.getDefaultToolkit().createImage("robot.png");
public Fight(){
current = System.currentTimeMillis();
setPreferredSize(new Dimension(WEIGHT,HEIGHT));
setFocusable(true);
addKeyListener(this);
new Timer(300,this).start();
poinLabel.setText("Point :"+jumsu+", SkillLevel : "+Level);
poinLabel.setPreferredSize(new Dimension(1000,100));
poinLabel.setFont(new Font("궁서",Font.ITALIC, 30));
add(poinLabel);
bulletsPos=Collections.synchronizedList(bulletsPos);
enemyPos=Collections.synchronizedList(enemyPos);
net = new NetWork();
while(enemyh==-1)
enemyh = enemyImage.getHeight(this);
while(enemyw==-1)
enemyw = enemyImage.getWidth(this);
ewh = enemyw/2;
}
public void paintComponent(Graphics g){
Graphics2D g2d=(Graphics2D)g;
g2d.drawImage(backGround, 0, 0, getWidth(), getHeight(), this);
g2d.drawImage(playerImage, playerCurPos.x, playerCurPos.y, this);
g2d.setColor(Color.green);
synchronized (bulletsPos) {
for(Point p :bulletsPos){
synchronized (p) {
g2d.setColor(Window.getRandomColor());
g2d.fillOval(p.x+ewh,p.y-15,10,30);
}
}
}
synchronized (enemyPos) {
try{
for(Point p:enemyPos){
synchronized (p) {
g2d.drawImage(enemyImage,p.x,p.y, this);
}
}
}catch(Exception e){
}
}
g2d.setColor(Color.orange);
for(int i = 1;i<=mocsom;i++){
g2d.fillOval(10+i*50, 10, 50, 50);
}
g2d.setColor(Color.pink);
poinLabel.setText("Point :"+jumsu+", SkillLevel : "
+ ""+Level);
}
public static void main(String[]args) throws Exception{
int i = 700;
Fight f=new Fight();
new Thread(f).start();
Thread.sleep(10000);
frame.setContentPane(f);
frame.pack();
frame.addWindowListener(new Window(net));
frame.setVisible(true);
f.new brak().start();
music.Start();
Random rand = new Random();
while(true){
try{breaked();}catch(Exception e){}
Thread.sleep(i);
synchronized (enemyPos) {
enemyPos.add(new Point(rand.nextInt(WEIGHT),rand.nextInt(50)));
Iterator<Point> it = enemyPos.iterator();
while(it.hasNext()){
Point p=it.next();
synchronized (p) {
p.x+=rand.nextInt(60)-30;
p.y+=rand.nextInt(60)-10;
if(p.x<0&&p.y<0||p.y>HEIGHT)
it.remove();
}
}
}
if(jumsu>=150&&!isChange){
i=100;
isChange=true;
}
if(isChange){
Level=3;
}
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO 자동 생성된 메소드 스텁
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_SPACE){
if(current+300<System.currentTimeMillis()){
switch(Level){
default :
case 3: bulletsPos.add(new Point(playerCurPos.x-ewh+playerImage.getWidth(this),playerCurPos.y));//오른쪽
case 2: bulletsPos.add(new Point(playerCurPos.x-ewh,playerCurPos.y));//왼쪽
case 1: bulletsPos.add(new Point(playerCurPos.x-ewh+playerImage.getWidth(this)/2,playerCurPos.y));//가운데
current = System.currentTimeMillis();
}
}
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO 자동 생성된 메소드 스텁
}
@Override
public void actionPerformed(ActionEvent e) {
Iterator<Point> it=bulletsPos.iterator();
while(it.hasNext()){
Point p = it.next();
p.y-=40;
if(p.y<0)
it.remove();
}
repaint();
}
public static void breaked(){
synchronized (bulletsPos) {
synchronized (enemyPos) {
for(Point ep:enemyPos){
synchronized (ep) {
for(Point pb:bulletsPos){
synchronized (pb) {
if(Math.abs(pb.x - ep.x) <enemyw && Math.abs(pb.y - ep.y) < enemyh)
{
pb.y = -10;
ep.y=HEIGHT;
jumsu++;
break;
}
}
}//end for pb
}
}//end for ep
}
}
}
public boolean playerbreaked(){
breaked();
synchronized (enemyPos) {
for(Point ep:enemyPos){
synchronized (ep) {
if(
playerCurPos.x-ep.x<enemyw
&&
playerCurPos.y-ep.y<enemyh
&&
ep.x-playerCurPos.x<playerImage.getWidth(this)
&&
ep.y-playerCurPos.y<playerImage.getHeight(this)
)
{
ep.y = HEIGHT;
return true;
}
}
}
}
return false;
}
class brak extends Thread{
Image tmp;
public void run(){
while(true){
repaint();
try{
breaked();
if(playerbreaked()){
mocsom--;
if(mocsom<=0)
{
frame.setVisible(false);
frame.dispose();
JFrame jf=new JFrame();
jf.setLayout(new FlowLayout());
jf.setTitle("GameOver");
jf.setBounds(WEIGHT/2-150,HEIGHT/2-150 , 100, 100);
jf.setPreferredSize(new Dimension(300,300));
jf.pack();
jf.add(new JLabel("Happy Christmas!"));
JLabel jl = new JLabel(new ImageIcon("Christmas.gif"));
jf.add(jl);
jf.setVisible(true);
jf.addWindowListener(new Window(net));
music.Pause();
break;
}
Thread.yield();
tmp = playerImage;
playerImage = robot;
Thread.sleep(3000);
playerImage=tmp;
}
}
catch(Exception e){}
}
}
}
@Override
public void run() {
while(true){
switch(net.getReaction()){
case Behind:
playerCurPos.y+=3;
break;
case Front:
playerCurPos.y-=3;
break;
case Left:
playerCurPos.x-=3;
break;
case NM:
break;
case Right:
playerCurPos.x+=3;
break;
}
repaint();
}
}
}
package shoot;
import java.awt.Color;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import MM.NetWork;
import java.util.*;
public class Window extends WindowAdapter{
private static int g = 0;
private static int b = 50;
NetWork net;
public Window(NetWork net){
this.net = net;
}
@Override
public void windowClosing(WindowEvent e){
e.getWindow().dispose();
net.dispose();
System.exit(0);
}
public static Color getRandomColor(){
if(!Fight.isChange)
return new Color(255,++g%256,b);
else
return new Color(255,++g%256,++b%120);
}
}
#include<Keyboard.h>
void setup() {
Serial1.begin(9600);
Keyboard.begin();
}
void loop() { // run over and over
if (Serial1.available()) {
if(Serial1.read()=='a')
Keyboard.print(" ");
}
}
Comments