private void removeObjects() { Body body = w.getWorld().getBodyList(); while (body != null) { Body current = body; body = body.m_next; if (current.m_userData != null) { w.getWorld().destroyBody(current); } } }
/** When the activity is created this method is called and will set everything up. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get an instance of the SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); // Get an instance of the PowerManager mPowerManager = (PowerManager) getSystemService(POWER_SERVICE); // Get an instance of the WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); mDisplay = mWindowManager.getDefaultDisplay(); // Create a bright wake lock mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, getClass().getName()); getWindow() .setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); this.requestWindowFeature(Window.FEATURE_NO_TITLE); DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); // set up the physics world pWorld = new PhysicsWorld(this, dm.widthPixels, dm.heightPixels); this.setContentView(this.pWorld); pWorld.setOnTouchListener(this); // get a clientID and then generate paint based upon it registerOnServer(); pWorld.setPaint(); // Add some initial balls for (int i = 0; i < 2; i++) { pWorld.addToCreateList(); } // Start Regular Update mHandler = new Handler(); mHandler.post(update); mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_UI); networkThread(); }
/** * Register the client on the server to obtain a client id which is then used to determine the * colour of the client's world/balls */ public void registerOnServer() { try { httppost.setURI(new URI(url + "/register?w=" + pWorld.World_W + "&h=" + pWorld.World_H)); HttpResponse response = httpclient.execute(httppost); BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); String input = reader.readLine(); if (!input.equals(null)) { clientID = Integer.parseInt(input); pWorld.clientID = this.clientID; } else Log.e(TAG, "invalid reponse from server"); Log.d(TAG, "******clientID: " + clientID); } catch (UnsupportedEncodingException e) { Log.e(TAG, e.getMessage()); // e.printStackTrace(); } catch (URISyntaxException e) { Log.e(TAG, e.getMessage()); } catch (ClientProtocolException e) { Log.e(TAG, e.getMessage()); } catch (IOException e) { Log.e(TAG, e.getMessage()); } }
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.item_clear: removeObjects(); return true; case R.id.item_rotate: rotateScreen(); return true; case R.id.item_gravity_normal: { SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); sensorManager.unregisterListener(listener); w.getWorld().setGravity(new Vec2(0.0f, -10.0f)); saveGravity(GRAVITY_NORMAL); return true; } case R.id.item_gravity_moon: { SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); sensorManager.unregisterListener(listener); w.getWorld().setGravity(new Vec2(0.0f, -1.67f)); saveGravity(GRAVITY_MOON); return true; } case R.id.item_gravity_zero: { SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); sensorManager.unregisterListener(listener); w.getWorld().setGravity(new Vec2(0.0f, 0.0f)); saveGravity(GRAVITY_ZERO); return true; } case R.id.item_gravity_accelerometer: SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); if (sensor != null) { sensorManager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL); } saveGravity(GRAVITY_ACCELEROMETER); return true; default: return super.onOptionsItemSelected(item); } }
/** When a person touches the screen, a ball will be created at that same location */ @Override public boolean onTouch(View v, MotionEvent e) { float x = e.getX(); float y = e.getY(); switch (e.getActionMasked()) { case MotionEvent.ACTION_DOWN: pWorld.addBall(x, pWorld.World_H - y, 0, 0, pWorld.clientID); break; } return true; }
public void onSensorChanged(SensorEvent event) { float x, y; if (rotation == Surface.ROTATION_0) { x = -event.values[SensorManager.DATA_X]; y = -event.values[SensorManager.DATA_Y]; } else if (rotation == Surface.ROTATION_90) { x = event.values[SensorManager.DATA_Y]; y = -event.values[SensorManager.DATA_X]; } else if (rotation == Surface.ROTATION_180) { x = event.values[SensorManager.DATA_X]; y = event.values[SensorManager.DATA_Y]; } else { x = -event.values[SensorManager.DATA_Y]; y = event.values[SensorManager.DATA_X]; } // Log.v("gravity", "x,y: " + x + " " + y); w.getWorld().setGravity(new Vec2(x, y)); }
@Override public void init(PhysicsWorld pw) { super.init(pw); int y = pw.World_H; int x = pw.World_W; pw.setball(160 * x / 320, 180 * y / 480); pw.addrope(20 * x / 320, 10 * y / 480); pw.addrope(-20 * x / 320, 10 * y / 480); // pw.addbubble(40, 250); // pw.addrope(10*x,(-25)*y); pw.addstar(160 * x / 320, 60 * y / 480); pw.addstar(160 * x / 320, 280 * y / 480); pw.addstar(160 * x / 320, 360 * y / 480); pw.addbubble(160 * x / 320, 280 * y / 480); pw.adddoor(160 * x / 320, 440 * y / 480); }
/** * When the accelerometer notices a change this method gets triggered and will get the new * acceleration and then apply it to the physics world */ @Override public void onSensorChanged(SensorEvent event) { float mSensorX = 0, mSensorY = 0; if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER) return; switch (mDisplay.getRotation()) { case Surface.ROTATION_0: mSensorX = event.values[0]; mSensorY = event.values[1]; break; case Surface.ROTATION_90: mSensorX = -event.values[1]; mSensorY = event.values[0]; break; case Surface.ROTATION_180: mSensorX = -event.values[0]; mSensorY = -event.values[1]; break; case Surface.ROTATION_270: mSensorX = event.values[1]; mSensorY = -event.values[0]; break; } /* * If the gravity change is greater than the threshold * then we will update the gravity in the physics world */ Vec2 gravity_new = new Vec2(-mSensorX, -mSensorY); if (Math.abs(gravity_new.x - gravity.x) > gravity_threshold.x || Math.abs(gravity_new.y - gravity.y) > gravity_threshold.y) { gravity = gravity_new; pWorld.updateGravity(gravity); } } // end onSensorChange
public void run() { pWorld.update(); mHandler.postDelayed(update, (long) (10 / pWorld.timeStep)); }