To the Moon – Skyler Liu – Rudi

Conception and Design

Inspired by the project Anti-Drawing Machine, I intend to a game which challenges players’ sense of control. In my game, the player needs to control a spaceship by Arduino 101 (gyroscope) to reach the moving moon as fast as possible and avoid the moving black holes. My game has three levels, at each higher level, there would be more black holes with higher speed. In this way, playing my game should an interactive method which differs from people’s general cognition because it requires the player to shift spatial orientation into plane orientation in their mind for controlling, and the destinations and obstacles all change constantly. Through this project, I want to understand people’s reaction when they first encounter with such an unusual interactive project and how such interaction would be like. 

At first, I planned to make a snake game which uses a joystick as the controller and uses Processing to make the game interface. In the game, the direction control would be all the opposite to the general way. This was how I considered at the very beginning making my players lose the sense of control while playing it. However, Professor Rudi told me that joystick was still a common game controller and when people once understood the operation was just all the opposite, the game would not be challenging anymore. He suggested me to consider some controllers which involve people’s physical movements. Therefore, at last, I chose Arduino 101 as my game controller. The process of how I decided to use Arduino 101 was also interesting. When I first thought about the physical controllers, I considered gyroscope plus Arduino Uno. Gyroscope is a sensor which can measure and maintain orientation in the spatial dimension and using it to be my game controller should be innovative and challenging because it requires the player to shift spatial orientation into plane orientation in their mind and explore how to operate better by themselves; in this way, it can challenge players’ sense of control while playing my games. Later, when I took “Arduino + gyroscope” as keyword doing research, I found there was Arduino 101 includes the function of gyroscope itself and directly using Arduino 101 would certainly decrease the complexity of my code and the hardware. This was how I decided to choose Arduino 101 at last.

Moreover, I used a spaceship toy to cover Arduino 101 being my controller because it was soft and much more acceptable for players to hold than a naked Arduino board, and the appearance of this toy also implies which content is controlled by players in my game.

Fabrication and Production

The first important step for me was to figure out how to collect data from Arduino 101. After research, I found samples from Arduino’s official website introducing Arduino 101 CurieIMU orientation visualiser: https://www.arduino.cc/en/Tutorial/Genuino101CurieIMUOrientationVisualiser. These samples helped me a lot in coding my game.

Moreover, my final version was quite different from the user testing version (the audios are at the bottom of this section). During the user testing session, I got several useful feedback: 1) The aspect of all the contents was too basic; players might not recognize which one they were controlling and where they needed to reach; 2) Because all the contents were influenced by the controller, some players got confused about in what ways they should control the central content; 3) the naked Arduino 101 didn’t look like the controller (in the user testing session, I directly used the Arduino board as my game controller).

Also, before the user testing session, I still thought about making a snake game, but I found it was really difficult to program a snake with the body that could rotate 360 degrees controlled by Arduino 101, which means a content of rectangle shape was not suitable to be controlled by a gyroscope because it was hard to decide how to shift the orientation of the snake’s head. This was also why my project still looked like a demo in the user testing. During the session, both Professor Rudi and Tristen suggested that maybe I didn’t have to stick on the idea of making a snake game. Their words really talked some sense into me.

Therefore, based on the feedback I got from user testing, I made a lot of improvements in the final version: 1) I finally decided to make the game into a spaceship pass game, in which the player needs to control a spaceship reaching the moon as fast as possible and avoid the black holes; 2) Added UI for leading the players; 3) Optimized the shape of all contents; 4) Added three levels, giving players time to get used to the operation and making them have a progressively lost sense of control; 5) Modified the functions which Arduino controlled – from somehow controlling all the rotation on the screen to only controlling the ship, and other contents were modified to autorotation; 6) Added ship aspect for Arduino 101, giving players a direct inspiration of how to operate and making the controller could be held more comfortably. In this way, I remained the elements which were central to challenge players’ sense of control and optimized my game for better user experience. 

Additionally, there was one step really challenging for me when I made my final version. It was how to get the position of each moving black holes. It took me a long time to do the mathematical calculations, but the effect of my final version shows the efforts were worth taking at last. 😀

User Testing Version:

Final Version:

Interface of Final Version (HD):

https://drive.google.com/file/d/12OoS2flY02lL1CC-OrdVj2i7mY8QpGQC/view?usp=sharing

Conclusions:

During the user testing and IMA show, I found most people would like to play my game and had the desire to pass all three levels despite a lot of failures. The lack of sense of control might frustrate my players in the beginning, but most of them got more passion for conquering this game afterward. It could somehow make the relation between users and the interactive device closer, increasing users’ participation in the project by touching their emotions, even though starting with frustration.

I learned that the sense of control is not necessary for users to interact with a device or game, only if the project gives them a clear sense of what role they should play in it as a minimum standard. They may try to win their sense of control back afterward or just allow the project to lead them, but either way, generally wouldn’t decrease the interaction between users and the project. This could be a direction worth trying for other interactive projects and all the game designs. 

For future improvements, I think I can add a record system, giving players a way to have goals which they want to transcend. Also, adding background music is also a good idea. The BGM can be produced by players’ operation, for example, the players may trigger different tones if they tilt the game in different directions. Buzzer + Arduino or Processing Sound Library can achieve such functions. In this way, the game could be more exciting for players to play and could have more room for them to explore.

The final project was the first time that I enjoyed the fruit of designing a game independently. I learned plenty of valuable experiences in game designing. More importantly, I realized that the happiest moment for me in the whole process was when I saw my players liked to play my game. This would always be one of my goals in my future interactive project designs. 

Recitation 9: Final Project Process – By Skyler Liu

Step 1:

“You are the SUPERHERO” – Kaycee

Kaycee’s project plans to design a game in which three players would control three superheroes to fight one player who controls Thanos.  Every superhero would be set to a certain position on the screen and can use a button to shoot bullets; Thanos could move up and down trying to avoid the damage. I think the idea is interesting because Avengers is really a popular IP recently since Avengers IV is on and the game would have a large fan base. However, we all think the playing method could be better. The game designed in the current proposal is too simple to have fun with – the operation and win condition are too common and lack creativity. We think the game can be added to the level system for more challenges and it would be better to consider involving more operations for superhero players instead of only pressing the button to shoot bullets.

“Darkness Rhapsody” – Mimi

Mimi’s project intends to make a game in which the player needs to listen to the music and other sound effects’ guide to find a way out of the maze in the dark. And the game also adds horror elements, which means if you don’t recognize the monster’s direction and reach their nest, the monster would suddenly scream and come out to the full screen. I really love the idea because I am a big fan of horror games! And for me, the gaming style based on auditory sense is very innovative and interesting. However, I consider that if they can make another version which is less horrible for players to choose because some people cannot play horror games, yet such a gaming style is still worth experiencing.  

“Navigating in Space” – Ellie

Ellie’s project also intends to make a game. It would be a first-perspective game in which the player needs to drive a spaceship towards a destination by joystick and avoid obstacles on the voyage. I think this idea is cool because almost everyone dreamed to travel in the space when we were kids. I am curious about how Ellie would design the user interface which can let players immerse in the space. And another groupmate and I both think maybe joystick can be replaced by another kind of controller which is more innovative. 

Step 2:

In my proposal, I describe what I intend to make is a snake game in which all the direction control are the opposite and have a level to which requires players to use gyroscope to control the snake. The feedback from my group members include that add some aesthetics; add levels which change the speed of snake to make the game more challenging. They think the most successful part in my proposal was the purpose I stated of my game, which is to explore people’s reaction when they lose the sense of control in an interactive project. I also think it is an important part because I don’t want to design a game only for joy. It took me a long time to consider how I could make a meaningful game and what it should be like. Based on the feedback, I think I will definitely add aesthetics for my game and add more levels, however, I don’t consider about add levels by changing the speed of the snake, because it is already hard to be controlled, but I am considering adding movable obstacles to better challenge my players.

Recitation 11: Workshops – By Skyler Liu

Process: 

I attended Tristen’s workshop for Object Oriented Programming because I planned to design a game for my final project and the knowledge of OOP might be applied a lot. Also, I was interested in OOP most among all the topics of workshops. In the recitation, I made a program in which every mouse press would trigger a ball in random color which falls down affected by gravity. 

Video: 

Code:

Recitation 10: Media Controller – By Skyler Liu

Component:

1 * Arduino Uno

1 * USB-B to A Cable

1 * 10K Potentiometer

Jumper Cables

Video:

Code:

Processing:

import processing.video.*;
Capture cam;

import processing.serial.*;

Serial myPort;

int valueFromArduino;

void setup() {
size(640, 480);
cam = new Capture(this, 640, 480 );
cam.start();
background(0);

printArray(Serial.list());

myPort = new Serial(this, Serial.list()[ 1 ], 9600);
}

void draw() {
while ( myPort.available() > 0) {
valueFromArduino = myPort.read();
}
println(valueFromArduino);
////This prints out the values from Arduino
background(0);
if (cam.available()) {
cam.read();
cam.loadPixels();
}
int circleSize = valueFromArduino+5;
int w = cam.width;
int h = cam.height;
for (int y = 0; y < h; y+=circleSize){
for (int x = 0; x < w; x+=circleSize) {
int i = x + y*w;
fill( cam.pixels[i] );
ellipse(x,y,circleSize,circleSize);
}
}
cam.updatePixels();
}

Arduino:

void setup() {
Serial.begin(9600);
}

void loop() {
int sensorValue = analogRead(A0)/ 62;
Serial.write(sensorValue);

delay(10);
}

Process & Reflection:

In the recitation, I made a media controller which applies one potentiometer to adjust the size of pixels of the live cam. I used sample code from class 22 as the basis and made modifications of setting the variation to controll the pixels of cam and soon got success. 

In relation to the reading “Computer Vision for Artists and Designers”, I think the technology used in my work is somehow different from the computer vision projects described in the reading. In my work, the value from potentiometer was the input that controlled the variation of output; the interaction happened between my computer and user’s operation of the potentiometer. My computer didn’t have to interact with the content of video or image. However, in the reading, projects as Messa di Voce receive the content of the video – people’s movements themselves as the input which triggers the corresponding output. I think such interaction is more interesting than the way in my work because it is more flexible and gives users more possibilities to explore, and this is a direction in which all the interactive projects should try forwards.

Class 22 exercise (OOP) – May 2nd – Skyler Liu

Video:

Code:

ArrayList<Ball> balls;
int ballWidth = 28;

void setup() {
size(640, 360);
noStroke();
balls = new ArrayList<Ball>();
balls.add(new Ball(width/2, 0, ballWidth));
}

void draw() {
background(255);
for (int i = balls.size()-1; i >= 0; i–) {
Ball ball = balls.get(i);
ball.move();
ball.display();
}
}

void mousePressed() {
balls.add(new Ball(mouseX, mouseY, ballWidth));
}

class Ball {

float x;
float y;
float speedX;
float speedY;
float w;
color c;

Ball(float tempX, float tempY, float tempW) {
x = tempX;
y = tempY;
w = tempW;
speedX = random(-5, 5);
speedY = random(-5, 5);
c = color(random(100, 255), random(100, 255), random(100, 255));
}

void move() {

x = x + speedX;
if ((x > width) || (x <0)) {
speedX = speedX * -1;
}

y = y + speedY;
if ((y > height) || (y < 0)) {
speedY = speedY * -1;
}
}

void display() {
fill(c);
ellipse(x,y,w,w);
}
}

Process:

In the previous recitation, I made a single bouncing ball which could change color following mouse press and I wanted to make a program which could store several balls at the same time, but my knowledge was not enough. In today’s course, I have learned the key to achieve my ideal before, so I made this program after class.