D.D.Tap - interaktiva spel plattform med bearbetning, Arduino och Twitter
D.D.Tap är ett spel som kan spelas med hjälp av sensorer kopplade till Arduino och gränssnitt till spelet producerade med bearbetning. Det är en enkel dance dance revolution som spel som ackumuleras punkt när spelaren aktiverar sensorerna eller tryck på tangentbordet för när slumpmässiga pilarna når den röda genomskinlig bar. Banan byggdes på Arduino är enkel eftersom jag hade begränsad sensorer. Jag använde fotoceller i en pull-up konfiguration som sensorer. Jag laddade upp appleten för @http://www.openprocessing.org/visuals/?visualID=29670 men för Twitter funktionen ska fungera, måste du ange din egen konsumenten nyckel och så vidare tas från kontot OAuth på http://dev.twitter.com/apps . Lastning på openprocessing.org är ganska lång på grund av den stora filen så att hoppa över den, tryck bara på "Source Code".
Också, jag använde låten yeahx3 av Chris Brown som det har catchy beat för slumpmässiga pilarna ~
Resultatet är OK men jag skulle ändå vilja åtgärda problemet med ackumulera mer än en bonus för varje pil. Problemet var inte så betydande när spelade med tangentbordet men när dess läsa data från com-porten, datahastigheten var så snabbt att det utlöser bonusar mer än en gång för varje pil. Jag skulle bli glad om någon vill hjälpa till med koderna som behandling. Jag trodde att skapa en array för att kontrollera bonusar men som inte fungerade ganska bra. Så, jag på något sätt hälften löst det problemet med hjälp av försening i Arduino koden. Detta introducerade naturligtvis andra problem såsom; om båda sidor av pilen når samtidigt, kunde bara en pil bonus begäras. Videon visar exemplet interaktion och att om det fanns en ny highscore, poängen skulle bokföras som en tweet till din sida. Jag är villig att acceptera någon uppgradering förslag.
Här är koden! Utan twitter nyckel naturligtvis...
grupp av pilar
pekaren [] tips;
Boolean återställa = sant;
int num;
offentliga statisk float yPos, yPos2;
Twitter initiering
Tweet twitter;
Seriell kommunikation
import processing.serial.*;
Seriell port;
Sträng portname = "COM1";
int baudvärde = 9600;
int läsa = 0;
PImage bild, blueButton, röda;
initiera spela för mp3
import ddf.minim.*;
Minim minim;
AudioPlayer Ja;
initiera variabler
PFont teckensnitt;
int mål;
int nivå = 1;
int poäng = 0;
int registreras.
int mål uppnås.
booleska win = false;
Boolean förlora = false;
PrintWriter utgång;
String [] fil;
[] Strängvärden;
int [] värde;
void setup() {
storlek (600, 600);
initiera port
Port = ny följetong (här, portname, baudvärde);
println(port);
Ladda bilden
bild = loadImage("view.jpg");
blueButton = loadImage("bluebutton.png");
redButton = loadImage("redbutton.png");
musik
Minim = nya Minim(this);
Ja = minim.loadFile("yes.mp3");
Yes.Play();
Font
Font = loadFont("BerlinSansFB-Bold-48.vlw");
textFont(font);
värden = loadStrings("Values.txt"); Ladda värden
värde = nya int[values.length];
för (int jag = 0; jag < values.length; i ++) {
println(Values);
värde [i] = Integer.valueOf(values[i]).intValue(); konvertera sträng till heltal
}
Fil = loadStrings("Highscore.txt"); Ladda tidigare rekordet
för (int jag = 0; jag < file.length; i ++) {
spelade in = Integer.valueOf(file[i]).intValue(); konvertera sträng till heltal
}
frameRate(value[0]);
}
void draw() {
yPos = 0; återställa pil läge
yPos2 = 0;
View(); Rita bakgrund
nivå 1
om (nivå == 1) {
om (reset) {
make();
Target = värde [1].
}
om ((millis() > = value[4]) & & (score > = target)) {
Level = 2;
återställa = sant;
redraw();
}
annars om (millis() > = value[4]) {
förlora = sant;
}
}
nivå 2
annars om (nivå == 2) {
om (reset) {
make();
Target = värde [2].
}
om ((millis() > = value[5]) & & (score > = target)) {
Level = 3.
återställa = sant;
redraw();
}
annars om (millis() > = value[5]) {
förlora = sant;
}
}
nivå 3
annars om (nivå == 3) {
om (reset) {
make();
Target = värde [3].
}
om ((millis() > = value[6]) & & (score > = target)) {
vinna = sant;
}
annars om (millis() > = value[6]) {
förlora = sant;
}
}
instruktioner
textSize(40);
text ("kontroller", 410, 50);
textSize(20);
text (""a"att slå vänster \n'l" att slå rätt ", 410, 100);
Sträng beat = ("målet poäng:" + mål);
text (beat, 405, 200);
text ("Ellapsed tid:", 410, 250);
text (millis () / 1000, 410, 280);
Sträng beatH = ("Tidigare Highscore:\n" + inspelade);
text(beatH,410,320);
nivå och poäng
Fill(0);
poäng = poäng + mål uppnås.
textSize(40);
text ("Score", 420, 450);
text (poäng, 420, 480);
Sträng lev = "nivå" + nivå.
text (lev, 420, 410);
prestation = 0; återställa prestation
Visa pilen
för (int jag = 0; jag < num; i ++) {
pekare [i] .arr (); //make på pilen
pointers[i].Motion();
}
Styr produktionen och åtgärder när spelare kommer alla ronder
om (win) {
fyllning (255, 73, 73, 190);
textSize(80);
text ("du vinner!!! \nPress ESC", 80, 300);
Spara ("Tap poäng" + poäng + ".jpg"); kan användas om du vill spara display på vinnande
jämföra lagrade highscore och spara högsta poäng
om (score > = inspelad) {
Fill(0);
text ("\tNEW\nHIGHSCORE!!!", 20, 100);
output = createWriter("Highscore.txt");
output.println(score);
output.flush();
output.Close();
Skicka resultatet till twitter
Twitter = nya tweet(score);
twitter.sendHighscore();
}
noLoop(); stoppa display
}
annars om (förlora) {
fyllning (255, 73, 73, 190);
textSize(80);
text ("du FÖRLORAR! \nTRY igen: P ", 50, 350);
noLoop();
}
Läs seriell port
samtidigt (port.available () > 0) {
portRead();
}
}
void stop() //stop musik
{
alltid nära Minim ljud klasser när du är klar med dem
Yes.Close();
alltid stoppa Minim innan spännande
Minim.stop();
Super.stop();
}
void view() {//background design
Smooth();
noStroke();
Background(0); använda vit bakgrund
Image(Picture,0,0);
fyllning (151, 16, 201, 90), //purple bar
Quad (15, 450, 385, 450, 385, 490, 15, 490);
fyllning (2,56,242,30); //side barer
Quad (400, 10, 590, 10, 590, 590, 400, 590);
Fill(242,2,79,30);
Quad (405, 15, 585, 15, 585, 585, 405, 585);
bild (blueButton, 0,450);
bild (röda, 200,450);
Fill(30);
}
void make() {//create pilar
NUM = värde [7]. antalet pilar
återställa = false;
pekare = nya pointer [num];
göra pilar
för (int jag = 0; jag < num; i ++) {
pekare [i] = nya pointer (nivå); //make en ny pil
}
bakgrund (0), //show uppdatera
Delay(2000);
}
void portRead() {//acts nästan som ett avbrott när tangenter trycks ned
Fill(255);
läsning = port.read();
om (läser == "A") {
ellips (100, 550, 80, 80);
för (int jag = 0; jag < pointers.length; i ++) {
om ((yPos > = 450)) {
prestation = 100;
}
}
}
annars om (läser == 'B') {
ellips (300, 550, 80, 80);
för (int jag = 0; jag < pointers.length; i ++) {
om ((yPos2 > = 450)) {
prestation = 100;
}
}
}
Fill(30);
}
void keyPressed() {//acts nära ett avbrott när tangenter trycks ned
om (nyckel == "a") {
ellips (100, 550, 80, 80);
om ((yPos > = 450)) {
Delay(5);
prestation = 100;
}
}
annars om (nyckel == "l") {
ellips (300, 550, 80, 80);
om ((yPos2 > = 450)) {
Delay(5);
prestation = 100;
}
}
}
klass pekaren
{
flyttal vänster, höger;
PVector pos, pos2;
PVector vel;
pekaren (int v) {
POS = nya PVector (100, int (random (-12000, 0)));
POS2 = nya PVector (300, int (random (-12000, 0)));
Vel = nya PVector (0, (v * 2) + 3); bara flytta i y-riktningen
}
void arr() {
Fill(255);
strokeWeight(9);
stroke (54,83,234, 160); //vary färger
vänster pil
om (pos.y < = 490) {
om (pos.y > = yPos) {
yPos = pos.y;
}
beginShape();
vertex (pos.x-20, pos.y);
vertex (pos.x, pos.y-20);
vertex (pos.x, pos.y-10);
vertex (pos.x+10, pos.y-10);
vertex (pos.x+10, pos.y+10);
vertex (pos.x, pos.y+10);
vertex (pos.x, pos.y+20);
endShape(CLOSE);
}
stroke (13,242,2, 160); //vary färger
höger pil
om (pos2.y < = 490) {
om (pos2.y > = yPos2) {
yPos2 = pos2.y;
}
beginShape();
vertex (pos2.x+20, pos2.y);
vertex (pos2.x, pos2.y+20);
vertex (pos2.x, pos2.y+10);
vertex (pos2.x-10, pos2.y+10);
vertex (pos2.x-10 pos2.y-10);
vertex (pos2.x, pos2.y-10);
vertex (pos2.x, pos2.y-20);
endShape(CLOSE);
}
}
void motion() {//move pilar
POS.Add (vel); //add velocity vektorn till din position
POS2.Add(Vel);
}
}
klass tweet {
import twitter4j.conf.*;
import twitter4j.internal.async.*;
import twitter4j.internal.org.json.*;
import twitter4j.internal.logging.*;
import twitter4j.json.*;
import twitter4j.internal.util.*;
import twitter4j.management.*;
import twitter4j.auth.*;
import twitter4j.api.*;
import twitter4j.util.*;
import twitter4j.internal.http.*;
import twitter4j.*;
import twitter4j.internal.json.*;
Sträng msg = "Tap Tap spel ny Highscore!:";
Booleskt värde skickas;
int highscore;
TwitterFactory tf;
Tweet (int hscore) {
highscore = hscore;
String ConsumerKey = "***";
String ConsumerSecret = "***";
String oauth_token = "***";
String oauth_token_secret = "***";
skickade = false;
ConfigurationBuilder cb = nya ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey(ConsumerKey)
.setOAuthConsumerSecret(ConsumerSecret)
.setOAuthAccessToken(oauth_token)
.setOAuthAccessTokenSecret(oauth_token_secret);
TF = nya TwitterFactory(cb.build());
}
void sendHighscore() {
Twitter twitter = tf.getInstance();
försök {
Status st = twitter.updateStatus (msg + highscore + "till" + getDateTime());
println ("framgångsrikt uppdaterade: [" + st.getText() + "].");
skickade = sant;
}
fånga (TwitterException e) {
println(e.getStatusCode());
}
}
Sträng getDateTime() {
DateFormat dateFormat = nya SimpleDateFormat ("åååå-MM-dd hh");
Datum-datum = nya Date();
återvända dateFormat.format(date);
}
}
_____________________________________________________________________
Arduino kod
int ledPin = 13.
int värde1, värde2;
void setup() {
Serial.BEGIN(9600);
pinMode(A0,INPUT);
pinMode(A1,INPUT);
pinMode(ledPin,OUTPUT);
}
void loop() {
värde1 = analogRead(A0);
value2 = analogRead(A1);
värde1 = constrain(value1,0,1023);
value2 = constrain(value2,0,1023);
värde1 = map(value1,0,1023,0,1);
value2 = map(value2,0,1023,0,1);
om (värde1 < = 10) {
Serial.Print ("värde1 =");
Serial.println(value1);
Serial.println("A");
}
om (värde2 < = 10) {
Serial.Print ("Value2 =");
Serial.println(value2);
Serial.println("B");
}
Delay(200);
}
Du måste skapa två txt filer som heter "värde" och highscore "och om du läser koder, bör du veta hur många fält det är. Lycka till!