GamingActivity can now load with various levels by supplying the right intent
This commit is contained in:
parent
cb046a2e01
commit
8f65131b7a
7 changed files with 132 additions and 39 deletions
|
@ -3,6 +3,7 @@ package com.rubenvandeven.emotionhero;
|
|||
import android.Manifest;
|
||||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.media.AudioAttributes;
|
||||
import android.media.AudioManager;
|
||||
|
@ -27,10 +28,8 @@ import com.affectiva.android.affdex.sdk.detector.Detector;
|
|||
import com.affectiva.android.affdex.sdk.detector.Face;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
|
@ -40,6 +39,8 @@ import java.util.List;
|
|||
*/
|
||||
public class GamingActivity extends AppCompatActivity implements Detector.ImageListener, CameraDetector.CameraEventListener, Detector.FaceListener {
|
||||
|
||||
public final static String INTENT_EXTRA_SCENARIO = "com.rubenvandeven.emotionhero.LEVEL";
|
||||
|
||||
final static String LOG_TAG = "EmotionHero";
|
||||
final static String HIGHSCORE_FILENAME = "highscores.json";
|
||||
|
||||
|
@ -60,6 +61,7 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL
|
|||
boolean has_camera_permission = false;
|
||||
|
||||
Button restartButton;
|
||||
Button nextLvlButton;
|
||||
|
||||
public SoundPool sound;
|
||||
public HashMap<Integer, Integer> soundIds = new HashMap<>();
|
||||
|
@ -75,6 +77,10 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL
|
|||
|
||||
setContentView(R.layout.activity_gaming);
|
||||
|
||||
Intent intent = getIntent();
|
||||
// first level is the default to load, if none is given to intent
|
||||
int scenarioLvlId = intent.getIntExtra(INTENT_EXTRA_SCENARIO, Scenario.SCENARIOS.get(0));
|
||||
|
||||
mContentView = (TextView) findViewById(R.id.fullscreen_content);
|
||||
RelativeLayout videoLayout = (RelativeLayout) findViewById(R.id.video_layout);
|
||||
|
||||
|
@ -86,6 +92,16 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL
|
|||
startActivity(getIntent());
|
||||
}
|
||||
});
|
||||
nextLvlButton = (Button) findViewById(R.id.nextLvlButton);
|
||||
nextLvlButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
finish();
|
||||
Intent intent = getIntent(); // trouble create new intent because of 'this'
|
||||
intent.putExtra(INTENT_EXTRA_SCENARIO, currentScenario.getNextLevelId());
|
||||
startActivity(intent);
|
||||
}
|
||||
});
|
||||
|
||||
// Set up the user interaction to manually show or hide the system UI.
|
||||
mContentView.setOnClickListener(new View.OnClickListener() {
|
||||
|
@ -130,7 +146,8 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL
|
|||
videoLayout.addView(cameraPreview,0);
|
||||
|
||||
|
||||
currentScenario = new ScenarioAnger(this);
|
||||
// currentScenario = new ScenarioAnger(this);
|
||||
currentScenario = new Scenario(scenarioLvlId, this);
|
||||
|
||||
scenarioView = new ScenarioView(this, currentScenario);
|
||||
RelativeLayout.LayoutParams scenarioViewParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
|
||||
|
@ -359,6 +376,10 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL
|
|||
setText("LEVEL ENDED");
|
||||
stopDetector();
|
||||
restartButton.setVisibility(View.VISIBLE);
|
||||
if(!currentScenario.isFinalLevel()) {
|
||||
nextLvlButton.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
Highscores scores = getHighscores();
|
||||
Highscore score = currentScenario.getHighscore();
|
||||
|
||||
|
@ -378,5 +399,18 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL
|
|||
|
||||
scores.add(score);
|
||||
saveHighscores(scores);
|
||||
|
||||
String highscoreText = "TOPSCORES\n";
|
||||
|
||||
Highscores topscores = scores.getTopN(3); // TODO: only highscores for current lEVEL!!!!!!!
|
||||
int i = 0;
|
||||
for(Highscore topscore: topscores) {
|
||||
i++;
|
||||
highscoreText += String.format("%1$d. %2$.2f\n", i, topscore.score); //make line by line elements
|
||||
}
|
||||
|
||||
TextView highscoreView = (TextView) findViewById(R.id.highscores);
|
||||
highscoreView.setText(highscoreText);
|
||||
highscoreView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -56,6 +56,9 @@ public class Highscores extends ArrayList<Highscore>{
|
|||
}
|
||||
});
|
||||
|
||||
if(n > this.size())
|
||||
n = this.size();
|
||||
|
||||
Highscores scores = new Highscores();
|
||||
for (int i = 0; i < n; i++) {
|
||||
scores.add(this.get(i));
|
||||
|
@ -65,6 +68,7 @@ public class Highscores extends ArrayList<Highscore>{
|
|||
|
||||
/**
|
||||
* Get the n highest scores
|
||||
* @todo only for current level!!
|
||||
*/
|
||||
public Highscores getLast(Integer n) {
|
||||
Collections.sort(this, new Comparator<Highscore>() {
|
||||
|
@ -80,6 +84,9 @@ public class Highscores extends ArrayList<Highscore>{
|
|||
return this;
|
||||
}
|
||||
|
||||
if(n > this.size())
|
||||
n = this.size();
|
||||
|
||||
Highscores scores = new Highscores();
|
||||
for (int i = 0; i < n; i++) {
|
||||
scores.add(this.get(i));
|
||||
|
|
|
@ -17,10 +17,24 @@ import java.util.TimerTask;
|
|||
* Created by ruben on 16/08/16.
|
||||
*/
|
||||
|
||||
abstract public class Scenario {
|
||||
public class Scenario {
|
||||
|
||||
public int id;
|
||||
|
||||
public Bitmap currentFrameBitmap;
|
||||
|
||||
public static final int LVL_NONE = 0;
|
||||
public static final int LVL_ANGER = 1;
|
||||
public static final int LVL_JOY = 2;
|
||||
public static final int LVL_SURPRISE = 3;
|
||||
|
||||
// the levels in the right order.
|
||||
public static final ArrayList<Integer> SCENARIOS = new ArrayList<Integer>() {{
|
||||
add(LVL_ANGER);
|
||||
add(LVL_JOY);
|
||||
add(LVL_SURPRISE);
|
||||
}};
|
||||
|
||||
static int DESIRED_FPS = 25;
|
||||
|
||||
float duration = 0;
|
||||
|
@ -53,8 +67,6 @@ abstract public class Scenario {
|
|||
|
||||
ArrayList<Target> targets = new ArrayList<>();
|
||||
|
||||
abstract void createScenario();
|
||||
|
||||
class Target {
|
||||
public Emotion emotion;
|
||||
public float value;
|
||||
|
@ -77,9 +89,21 @@ abstract public class Scenario {
|
|||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public Scenario(GamingActivity activity)
|
||||
public Scenario(int lvl_id, GamingActivity activity)
|
||||
{
|
||||
createScenario();
|
||||
// go to first scenario if unexisting is given
|
||||
if(!SCENARIOS.contains(lvl_id)) {
|
||||
lvl_id = SCENARIOS.get(0);
|
||||
}
|
||||
|
||||
this.id = lvl_id;
|
||||
_activity = activity;
|
||||
createTargets();
|
||||
init();
|
||||
}
|
||||
|
||||
public void init() {
|
||||
|
||||
timer = new Timer("ScenarioTimer");
|
||||
TimerTask tickTask;
|
||||
tickTask = new TimerTask() {
|
||||
|
@ -92,7 +116,7 @@ abstract public class Scenario {
|
|||
}
|
||||
};
|
||||
timer.schedule(tickTask, 0, 1000/DESIRED_FPS);
|
||||
_activity = activity;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -273,6 +297,43 @@ abstract public class Scenario {
|
|||
return targets.size() * 100;
|
||||
}
|
||||
|
||||
// TODO: create a 'tick' that checks all current values with requirements and increases the timer etc
|
||||
// TODO: ... if scenario is running. This internal times makes it easier to pause etc.
|
||||
public void createTargets() {
|
||||
switch(id) {
|
||||
case LVL_ANGER:
|
||||
setTarget(Emotion.ANGER, 10, 1);
|
||||
setTarget(Emotion.ANGER, 20, 2);
|
||||
setTarget(Emotion.ANGER, 40, 3);
|
||||
setTarget(Emotion.ANGER, 70, 4);
|
||||
setTarget(Emotion.ANGER, 100, 5);
|
||||
setTarget(Emotion.JOY, 100, 8);
|
||||
setTarget(Emotion.ANGER, 100, 10);
|
||||
setTarget(Emotion.JOY, 100, 15);
|
||||
setTarget(Emotion.ANGER, 100, 20);
|
||||
break;
|
||||
case LVL_JOY:
|
||||
break;
|
||||
case LVL_SURPRISE:
|
||||
setTarget(Emotion.SURPRISE, 20, 1);
|
||||
setTarget(Emotion.SURPRISE, 50, 2);
|
||||
setTarget(Emotion.SURPRISE, 80, 3);
|
||||
setTarget(Emotion.SURPRISE, 100, 4);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public int getNextLevelId() {
|
||||
int nextIdx = SCENARIOS.indexOf(id) + 1;
|
||||
if(SCENARIOS.size() <= nextIdx) {
|
||||
return SCENARIOS.get(0);
|
||||
}
|
||||
return SCENARIOS.get(nextIdx);
|
||||
}
|
||||
|
||||
public boolean isFinalLevel() {
|
||||
if(SCENARIOS.get(SCENARIOS.size()-1) == id)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,28 +0,0 @@
|
|||
package com.rubenvandeven.emotionhero;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
/**
|
||||
* Created by ruben on 17/08/16.
|
||||
*/
|
||||
|
||||
public class ScenarioAnger extends Scenario {
|
||||
|
||||
public ScenarioAnger(GamingActivity activity) {
|
||||
super(activity);
|
||||
}
|
||||
|
||||
void createScenario()
|
||||
{
|
||||
Log.d(GamingActivity.LOG_TAG, "CREATE SCENARIO: anger");
|
||||
setTarget(Emotion.ANGER, 10, 1);
|
||||
setTarget(Emotion.ANGER, 20, 2);
|
||||
setTarget(Emotion.ANGER, 40, 3);
|
||||
setTarget(Emotion.ANGER, 70, 4);
|
||||
setTarget(Emotion.ANGER, 100, 5);
|
||||
setTarget(Emotion.JOY, 100, 8);
|
||||
setTarget(Emotion.ANGER, 100, 10);
|
||||
setTarget(Emotion.JOY, 100, 15);
|
||||
setTarget(Emotion.ANGER, 100, 20);
|
||||
}
|
||||
}
|
|
@ -35,10 +35,20 @@
|
|||
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/ending_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:id="@+id/highscores"
|
||||
android:textColor="@color/highscore"
|
||||
android:textSize="30sp"
|
||||
android:visibility="gone"
|
||||
/>
|
||||
|
||||
<Button
|
||||
android:text="@string/restart"
|
||||
android:layout_width="wrap_content"
|
||||
|
@ -46,6 +56,13 @@
|
|||
android:id="@+id/restartButton"
|
||||
android:layout_gravity="center_vertical|center_horizontal"
|
||||
android:visibility="gone" />
|
||||
<Button
|
||||
android:text="@string/nextLvl"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/nextLvlButton"
|
||||
android:layout_gravity="center_vertical|right"
|
||||
android:visibility="gone" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
<color name="colorScenarioLine">#FF0000</color>
|
||||
|
||||
<color name="black_overlay">#66000000</color>
|
||||
<color name="highscore">#ffff00</color>
|
||||
|
||||
<!--TODO: implement in Emotion.java-->
|
||||
<color name="emotion_anger">#ff0000</color>
|
||||
|
|
|
@ -5,4 +5,5 @@
|
|||
<string name="dummy_content">initialising…</string>
|
||||
<string name="camera_required">The camera permission is required. Please start again</string>
|
||||
<string name="restart">Restart</string>
|
||||
<string name="nextLvl">Next Level!</string>
|
||||
</resources>
|
||||
|
|
Loading…
Reference in a new issue