Fixing bugs in the LLand.

less garish hue on the bugdroid
       :
  +----:-----------+
  | |  : |    Θ.......... improved pop styles
  | |  : @    |    |
  | O  A      |....... occasionally there was no gap to fly
  |      0    O    |   through, creating an unintentional
  | @    |    |    |   commentary on the futility of it all
  +----------------+
     :      :
     :      : animation could continue
     :        after activity pause, sapping
     :        precious cycles
     :
   failure is now more visceral

Bug: 17931806
Change-Id: Iea9bd88e340beb3a0ca310db071ec9f6ec719a33
This commit is contained in:
Daniel Sandler
2014-11-24 18:54:40 -05:00
committed by Dan Sandler
parent 3f6755f587
commit 195c438883
8 changed files with 120 additions and 47 deletions

View File

@@ -0,0 +1,29 @@
<!--
Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="100.0dp"
android:height="100.0dp"
android:viewportWidth="100.0"
android:viewportHeight="100.0">
<path
android:pathData="M0,50 a50,50 0 1 1 100,0
a50,50 0 1 1 -100,0"
android:fillColor="#FFFF1744"/>
<path
android:pathData="M16,36 A24,24 0 1 1 64,36
M64,36 A24,24 0 1 1 16,36"
android:fillColor="#20FFFFFF"/>
</vector>

View File

@@ -20,14 +20,14 @@ Copyright (C) 2014 The Android Open Source Project
android:viewportHeight="100.0">
<path
android:pathData="M50.000000,50.000000m-47.599998,0.000000a47.599998,47.599998 0.000000,1.000000 1.000000,95.199997 0.000000a47.599998,47.599998 0.000000,1.000000 1.000000,-95.199997 0.000000"
android:fillColor="#D81B60"/>
android:fillColor="#9C27B0"/>
<path
android:pathData="M50.000000,2.429000c-26.337999,0.000000 -47.688999,21.351000 -47.688999,47.688999c0.000000,13.168000 5.337000,25.091000 13.968000,33.722000l67.444000,-67.443001C75.092003,7.766000 63.168999,2.429000 50.000000,2.429000z"
android:fillColor="#F06292"/>
android:fillColor="#BA68C8"/>
<path
android:pathData="M0.000000,41.573002l100.000000,0.000000l0.000000,17.090000l-100.000000,0.000000z"
android:fillColor="#D81B60"/>
android:fillColor="#9C27B0"/>
<path
android:pathData="M0.000000,58.662998l0.000000,-17.089996 100.000000,0.000000z"
android:fillColor="#F06292"/>
android:fillColor="#BA68C8"/>
</vector>

View File

@@ -20,26 +20,26 @@ Copyright (C) 2014 The Android Open Source Project
android:viewportHeight="100.0">
<path
android:pathData="M14.645000,14.645000C5.597000,23.693001 0.000000,36.193001 0.000000,50.000000l50.000000,0.000000L14.645000,14.645000z"
android:fillColor="#7BAAF7"/>
android:fillColor="#2979FF"/>
<path
android:pathData="M100.000000,50.000000c0.000000,-13.807000 -5.597000,-26.306999 -14.645000,-35.355000L50.000000,50.000000L100.000000,50.000000z"
android:fillColor="#D81B60"/>
android:fillColor="#FF1744"/>
<path
android:pathData="M85.355003,14.645000C76.306999,5.597000 63.806999,0.000000 50.000000,0.000000l0.000000,50.000000L85.355003,14.645000z"
android:fillColor="#F06292"/>
android:fillColor="#0F9D58"/>
<path
android:pathData="M50.000000,0.000000C36.193001,0.000000 23.693001,5.597000 14.645000,14.645000L50.000000,50.000000L50.000000,0.000000z"
android:fillColor="#FFF176"/>
android:fillColor="#FFBC00"/>
<path
android:pathData="M50.000000,50.000000l35.355000,35.355000C94.403000,76.307999 100.000000,63.807999 100.000000,50.000000L50.000000,50.000000z"
android:fillColor="#7BAAF7"/>
android:fillColor="#2979FF"/>
<path
android:pathData="M50.000000,100.000000c13.807000,0.000000 26.306999,-5.596000 35.355000,-14.645000L50.000000,50.000000L50.000000,100.000000z"
android:fillColor="#FFF176"/>
android:fillColor="#FFBC00"/>
<path
android:pathData="M14.645000,85.355003C23.693001,94.403999 36.193001,100.000000 50.000000,100.000000L50.000000,50.000000L14.645000,85.355003z"
android:fillColor="#F06292"/>
android:fillColor="#0F9D58"/>
<path
android:pathData="M0.000000,50.000000c0.000000,13.808000 5.597000,26.308001 14.645000,35.355000L50.000000,50.000000L0.000000,50.000000z"
android:fillColor="#D81B60"/>
android:fillColor="#FF1744"/>
</vector>

View File

@@ -20,7 +20,7 @@ Copyright (C) 2014 The Android Open Source Project
android:viewportHeight="100.0">
<path
android:pathData="M50.000000,50.000000C86.898003,27.834999 79.244003,11.688000 76.177002,7.399000c-7.240000,-4.459000 -15.703000,-7.112000 -24.770000,-7.363000C56.247002,2.253000 70.815002,12.456000 50.000000,50.000000z"
android:fillColor="#82B1FF"/>
android:fillColor="#FFFFFA"/>
<path
android:pathData="M50.000000,50.000000c20.815001,-37.543999 6.247000,-47.747002 1.407000,-49.964001C50.938000,0.022000 50.472000,0.000000 50.000000,0.000000c-8.627000,0.000000 -16.743999,2.186000 -23.827000,6.032000C31.392000,5.514000 49.251999,6.903000 50.000000,50.000000z"
android:fillColor="#76FF03"/>
@@ -32,7 +32,7 @@ Copyright (C) 2014 The Android Open Source Project
android:fillColor="#303F9F"/>
<path
android:pathData="M50.000000,50.000000C27.834000,13.103000 11.687000,20.757000 7.398000,23.823999C2.940000,31.063000 0.287000,39.527000 0.035000,48.592999C2.253000,43.752998 12.456000,29.184999 50.000000,50.000000z"
android:fillColor="#FAFAFA"/>
android:fillColor="#FFFFFA"/>
<path
android:pathData="M50.000000,50.000000C49.251999,6.903000 31.392000,5.514000 26.173000,6.032000c-7.709000,4.187000 -14.188000,10.344000 -18.774000,17.792000C11.687000,20.757000 27.834000,13.103000 50.000000,50.000000z"
android:fillColor="#303F9F"/>
@@ -44,13 +44,13 @@ Copyright (C) 2014 The Android Open Source Project
android:fillColor="#303F9F"/>
<path
android:pathData="M50.000000,50.000000c22.166000,36.897999 38.313000,29.243999 42.602001,26.177999c4.458000,-7.240000 7.111000,-15.703000 7.363000,-24.770000C97.747002,56.248001 87.543999,70.816002 50.000000,50.000000z"
android:fillColor="#FAFAFA"/>
android:fillColor="#FFFFFA"/>
<path
android:pathData="M50.000000,50.000000c-20.815001,37.544998 -6.247000,47.748001 -1.407000,49.965000C49.062000,99.978996 49.528000,100.000000 50.000000,100.000000c8.627000,0.000000 16.743999,-2.185000 23.827000,-6.031000C68.608002,94.486000 50.748001,93.098000 50.000000,50.000000z"
android:fillColor="#76FF03"/>
<path
android:pathData="M50.000000,50.000000C13.103000,72.166000 20.757000,88.313004 23.823000,92.601997c7.240000,4.459000 15.703000,7.112000 24.770000,7.363000C43.752998,97.748001 29.184999,87.544998 50.000000,50.000000z"
android:fillColor="#82B1FF"/>
android:fillColor="#FFFFFA"/>
<path
android:pathData="M50.000000,50.000000C6.902000,50.749001 5.514000,68.609001 6.032000,73.828003c4.186000,7.708000 10.344000,14.188000 17.791000,18.773001C20.757000,88.313004 13.103000,72.166000 50.000000,50.000000z"
android:fillColor="#303F9F"/>

View File

@@ -20,7 +20,7 @@ Copyright (C) 2014 The Android Open Source Project
android:viewportHeight="100.0">
<path
android:pathData="M50.000000,50.000000m-50.000000,0.000000a50.000000,50.000000 0.000000,1.000000 1.000000,100.000000 0.000000a50.000000,50.000000 0.000000,1.000000 1.000000,-100.000000 0.000000"
android:fillColor="#FFF176"/>
android:fillColor="#F8F8FF"/>
<path
android:pathData="M58.658001,89.648003c-19.330000,0.000000 -35.000000,-15.670000 -35.000000,-35.000000c0.000000,-13.531000 10.969000,-24.500000 24.500000,-24.500000c9.472000,0.000000 17.150000,7.679000 17.150000,17.150000c0.000000,6.631000 -5.375000,12.006000 -12.006000,12.006000c-3.798000,0.000000 -7.004000,-2.522000 -8.045000,-5.982000c1.021000,1.136000 2.497000,1.854000 4.145000,1.854000c2.644000,0.000000 4.853000,-1.841000 5.428000,-4.310000c0.175000,-0.558000 0.271000,-1.150000 0.271000,-1.766000c0.000000,-4.642000 -3.763000,-8.404000 -8.403000,-8.404000c-6.631000,0.000000 -12.006000,5.375000 -12.006000,12.006000c0.000000,9.472000 7.679000,17.149000 17.150000,17.149000c13.531000,0.000000 24.500000,-10.969000 24.500000,-24.500000c0.000000,-19.330000 -15.670000,-35.000000 -35.000000,-35.000000c-12.963000,0.000000 -24.773001,4.935000 -33.657001,13.025000C2.824000,31.087000 0.000000,40.212002 0.000000,50.000000c0.000000,27.615000 22.386000,50.000000 50.000000,50.000000c17.825001,0.000000 33.462002,-9.335000 42.313999,-23.375999C83.431000,84.714996 71.621002,89.648003 58.658001,89.648003z"
android:fillColor="#7BAAF7"/>

View File

@@ -26,7 +26,7 @@
<dimen name="obstacle_width">90dp</dimen>
<dimen name="obstacle_stem_width">12dp</dimen>
<dimen name="obstacle_gap">170dp</dimen>
<dimen name="obstacle_height_min">40dp</dimen>
<dimen name="obstacle_height_min">48dp</dimen>
<dimen name="building_width_min">20dp</dimen>
<dimen name="building_width_max">250dp</dimen>
<dimen name="building_height_min">20dp</dimen>

View File

@@ -29,11 +29,15 @@ import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.os.Vibrator;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.util.Slog;
import android.view.View;
import android.view.ViewOutlineProvider;
import android.view.animation.DecelerateInterpolator;
@@ -51,9 +55,9 @@ public class LLand extends FrameLayout {
public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
public static final boolean DEBUG_DRAW = false; // DEBUG
public static final void L(String s, Object ... objects) {
public static void L(String s, Object ... objects) {
if (DEBUG) {
Log.d(TAG, String.format(s, objects));
Slog.d(TAG, objects.length == 0 ? s : String.format(s, objects));
}
}
@@ -61,17 +65,18 @@ public class LLand extends FrameLayout {
public static final boolean HAVE_STARS = true;
public static final float DEBUG_SPEED_MULTIPLIER = 1f; // 0.1f;
public static final boolean DEBUG_IDDQD = false;
public static final boolean DEBUG_IDDQD = Log.isLoggable(TAG + ".iddqd", Log.DEBUG);
final static int[] POPS = {
// resid // spinny!
R.drawable.pop_belt, 0,
R.drawable.pop_droid, 0,
R.drawable.pop_pizza, 1,
R.drawable.pop_stripes, 0,
R.drawable.pop_swirl, 1,
R.drawable.pop_vortex, 1,
R.drawable.pop_vortex2, 1,
// resid // spinny! // alpha
R.drawable.pop_belt, 0, 255,
R.drawable.pop_droid, 0, 255,
R.drawable.pop_pizza, 1, 255,
R.drawable.pop_stripes, 0, 255,
R.drawable.pop_swirl, 1, 255,
R.drawable.pop_vortex, 1, 255,
R.drawable.pop_vortex2, 1, 255,
R.drawable.pop_ball, 0, 190,
};
private static class Params {
@@ -117,10 +122,20 @@ public class LLand extends FrameLayout {
PLAYER_Z = res.getDimensionPixelSize(R.dimen.player_z);
PLAYER_Z_BOOST = res.getDimensionPixelSize(R.dimen.player_z_boost);
HUD_Z = res.getDimensionPixelSize(R.dimen.hud_z);
// Sanity checking
if (OBSTACLE_MIN <= OBSTACLE_WIDTH / 2) {
Slog.e(TAG, "error: obstacles might be too short, adjusting");
OBSTACLE_MIN = OBSTACLE_WIDTH / 2 + 1;
}
}
}
private TimeAnimator mAnim;
private Vibrator mVibrator;
private AudioManager mAudioManager;
private final AudioAttributes mAudioAttrs = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_GAME).build();
private TextView mScoreField;
private View mSplash;
@@ -158,6 +173,8 @@ public class LLand extends FrameLayout {
public LLand(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
setFocusable(true);
PARAMS = new Params(getResources());
mTimeOfDay = irand(0, SKIES.length);
@@ -198,7 +215,15 @@ public class LLand extends FrameLayout {
final float hsv[] = {0, 0, 0};
private void reset() {
private void thump() {
if (mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {
// No interruptions. Not even game haptics.
return;
}
mVibrator.vibrate(80, mAudioAttrs);
}
public void reset() {
L("reset");
final Drawable sky = new GradientDrawable(
GradientDrawable.Orientation.BOTTOM_TOP,
@@ -313,14 +338,16 @@ public class LLand extends FrameLayout {
private void setScore(int score) {
mScore = score;
if (mScoreField != null) mScoreField.setText(String.valueOf(score));
if (mScoreField != null) {
mScoreField.setText(DEBUG_IDDQD ? "??" : String.valueOf(score));
}
}
private void addScore(int incr) {
setScore(mScore + incr);
}
private void start(boolean startPlaying) {
public void start(boolean startPlaying) {
L("start(startPlaying=%s)", startPlaying?"true":"false");
if (startPlaying) {
mPlaying = true;
@@ -352,7 +379,7 @@ public class LLand extends FrameLayout {
}
}
private void stop() {
public void stop() {
if (mAnimating) {
mAnim.cancel();
mAnim = null;
@@ -417,8 +444,10 @@ public class LLand extends FrameLayout {
if (mPlaying && mDroid.below(mHeight)) {
if (DEBUG_IDDQD) {
poke();
unpoke();
} else {
L("player hit the floor");
thump();
stop();
}
}
@@ -429,6 +458,7 @@ public class LLand extends FrameLayout {
final Obstacle ob = mObstaclesInPlay.get(j);
if (mPlaying && ob.intersects(mDroid) && !DEBUG_IDDQD) {
L("player hit an obstacle");
thump();
stop();
} else if (ob.cleared(mDroid)) {
if (ob instanceof Stem) passedBarrier = true;
@@ -459,8 +489,9 @@ public class LLand extends FrameLayout {
// 3. Time for more obstacles!
if (mPlaying && (t - mLastPipeTime) > PARAMS.OBSTACLE_PERIOD) {
mLastPipeTime = t;
final int obstacley = (int) (Math.random()
* (mHeight - 2*PARAMS.OBSTACLE_MIN - PARAMS.OBSTACLE_GAP)) + PARAMS.OBSTACLE_MIN;
final int obstacley =
(int)(frand() * (mHeight - 2*PARAMS.OBSTACLE_MIN - PARAMS.OBSTACLE_GAP)) +
PARAMS.OBSTACLE_MIN;
final int inset = (PARAMS.OBSTACLE_WIDTH - PARAMS.OBSTACLE_STEM_WIDTH) / 2;
final int yinset = PARAMS.OBSTACLE_WIDTH/2;
@@ -539,7 +570,7 @@ public class LLand extends FrameLayout {
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (DEBUG) L("touch: %s", ev);
L("touch: %s", ev);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
poke();
@@ -553,7 +584,7 @@ public class LLand extends FrameLayout {
@Override
public boolean onTrackballEvent(MotionEvent ev) {
if (DEBUG) L("trackball: %s", ev);
L("trackball: %s", ev);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
poke();
@@ -567,7 +598,7 @@ public class LLand extends FrameLayout {
@Override
public boolean onKeyDown(int keyCode, KeyEvent ev) {
if (DEBUG) L("keyDown: %d", keyCode);
L("keyDown: %d", keyCode);
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_DPAD_UP:
@@ -582,7 +613,7 @@ public class LLand extends FrameLayout {
@Override
public boolean onKeyUp(int keyCode, KeyEvent ev) {
if (DEBUG) L("keyDown: %d", keyCode);
L("keyDown: %d", keyCode);
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_DPAD_UP:
@@ -597,7 +628,7 @@ public class LLand extends FrameLayout {
@Override
public boolean onGenericMotionEvent (MotionEvent ev) {
if (DEBUG) L("generic: %s", ev);
L("generic: %s", ev);
return false;
}
@@ -684,6 +715,10 @@ public class LLand extends FrameLayout {
private boolean mBoosting;
private final int[] sColors = new int[] {
0xFF78C557,
};
private final float[] sHull = new float[] {
0.3f, 0f, // left antenna
0.7f, 0f, // right antenna
@@ -692,7 +727,7 @@ public class LLand extends FrameLayout {
0.6f, 1f, // right foot
0.4f, 1f, // left foot BLUE!
0.08f, 0.75f, // sinistram
0.08f, 0.33f, // cold shoulder
0.08f, 0.33f, // cold shoulder
};
public final float[] corners = new float[sHull.length];
@@ -701,7 +736,7 @@ public class LLand extends FrameLayout {
setBackgroundResource(R.drawable.android);
getBackground().setTintMode(PorterDuff.Mode.SRC_ATOP);
getBackground().setTint(0xFF00FF00);
getBackground().setTint(sColors[0]);
setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
@@ -822,8 +857,9 @@ public class LLand extends FrameLayout {
int cx, cy, r;
public Pop(Context context, float h) {
super(context, h);
int idx = 2*irand(0, POPS.length/2);
int idx = 3*irand(0, POPS.length/3);
setBackgroundResource(POPS[idx]);
setAlpha((float)(POPS[idx+2])/255);
setScaleX(frand() < 0.5f ? -1 : 1);
mRotate = POPS[idx+1] == 0 ? 0 : (frand() < 0.5f ? -1 : 1);
setOutlineProvider(new ViewOutlineProvider() {

View File

@@ -24,13 +24,21 @@ import android.widget.TextView;
import com.android.systemui.R;
public class LLandActivity extends Activity {
LLand mLand;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lland);
LLand world = (LLand) findViewById(R.id.world);
world.setScoreField((TextView) findViewById(R.id.score));
world.setSplash(findViewById(R.id.welcome));
Log.v(LLand.TAG, "focus: " + world.requestFocus());
mLand = (LLand) findViewById(R.id.world);
mLand.setScoreField((TextView) findViewById(R.id.score));
mLand.setSplash(findViewById(R.id.welcome));
//Log.v(LLand.TAG, "focus: " + mLand.requestFocus());
}
@Override
public void onPause() {
mLand.stop();
super.onPause();
}
}