|
Android example source code file (Demo_Ball.java)
The Demo_Ball.java Android example source code
/*
* Copyright (C) 2009 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.
*/
package net.clc.bt;
import java.util.Arrays;
import java.util.List;
/**
* Model of a "ball" object used by the demo app.
*/
public class Demo_Ball {
public enum BOUNCE_TYPE {
TOPLEFT, TOP, TOPRIGHT, LEFT, RIGHT, BOTTOMLEFT, BOTTOM, BOTTOMRIGHT
}
private final float radius = 20;
private final float pxPerM = 2; // Let 2 pixels represent 1 meter
private final float reboundEnergyFactor = 0.6f; // Amount of energy returned
// when rebounding
private float xPos = 160;
private float yPos = 240;
private float xMax = 320;
private float yMax = 410;
private float xAcceleration = 0;
private float yAcceleration = 0;
private float xVelocity = 0;
private float yVelocity = 0;
private float reboundXPos = 0;
private float reboundYPos = 0;
private float reboundXVelocity = 0;
private float reboundYVelocity = 0;
private long lastUpdate;
private boolean onScreen;
public Demo_Ball(boolean visible) {
onScreen = visible;
lastUpdate = System.currentTimeMillis();
}
public Demo_Ball(boolean visible, int screenSizeX, int screenSizeY) {
onScreen = visible;
lastUpdate = System.currentTimeMillis();
xMax = screenSizeX;
yMax = screenSizeY;
}
public float getRadius() {
return radius;
}
public float getXVelocity() {
return xVelocity;
}
public float getX() {
if (!onScreen) {
return -1;
}
return xPos;
}
public float getY() {
if (!onScreen) {
return -1;
}
return yPos;
}
public void putOnScreen(float x, float y, float ax, float ay, float vx, float vy,
int startingSide) {
xPos = x;
yPos = y;
xVelocity = vx;
yVelocity = vy;
xAcceleration = ax;
yAcceleration = ay;
lastUpdate = System.currentTimeMillis();
if (startingSide == Demo_Multiscreen.RIGHT) {
xPos = xMax - radius - 2;
} else if (startingSide == Demo_Multiscreen.LEFT) {
xPos = radius + 2;
} else if (startingSide == Demo_Multiscreen.UP) {
yPos = radius + 2;
} else if (startingSide == Demo_Multiscreen.DOWN) {
yPos = yMax - radius - 2;
} else if (startingSide == AirHockey.FLIPTOP) {
yPos = radius + 2;
xPos = xMax - x;
if (xPos < 0){
xPos = 0;
}
yVelocity = -vy;
yAcceleration = -ay;
}
onScreen = true;
}
public void setAcceleration(float ax, float ay) {
if (!onScreen) {
return;
}
xAcceleration = ax;
yAcceleration = ay;
}
public boolean isOnScreen(){
return onScreen;
}
public int update() {
if (!onScreen) {
return 0;
}
long currentTime = System.currentTimeMillis();
long elapsed = currentTime - lastUpdate;
lastUpdate = currentTime;
xVelocity += ((elapsed * xAcceleration) / 1000) * pxPerM;
yVelocity += ((elapsed * yAcceleration) / 1000) * pxPerM;
xPos += ((xVelocity * elapsed) / 1000) * pxPerM;
yPos += ((yVelocity * elapsed) / 1000) * pxPerM;
// Handle rebounding
if (yPos - radius < 0) {
reboundXPos = xPos;
reboundYPos = radius;
reboundXVelocity = xVelocity;
reboundYVelocity = -yVelocity * reboundEnergyFactor;
onScreen = false;
return Demo_Multiscreen.UP;
} else if (yPos + radius > yMax) {
reboundXPos = xPos;
reboundYPos = yMax - radius;
reboundXVelocity = xVelocity;
reboundYVelocity = -yVelocity * reboundEnergyFactor;
onScreen = false;
return Demo_Multiscreen.DOWN;
}
if (xPos - radius < 0) {
reboundXPos = radius;
reboundYPos = yPos;
reboundXVelocity = -xVelocity * reboundEnergyFactor;
reboundYVelocity = yVelocity;
onScreen = false;
return Demo_Multiscreen.LEFT;
} else if (xPos + radius > xMax) {
reboundXPos = xMax - radius;
reboundYPos = yPos;
reboundXVelocity = -xVelocity * reboundEnergyFactor;
reboundYVelocity = yVelocity;
onScreen = false;
return Demo_Multiscreen.RIGHT;
}
return Demo_Multiscreen.CENTER;
}
public void doRebound() {
xPos = reboundXPos;
yPos = reboundYPos;
xVelocity = reboundXVelocity;
yVelocity = reboundYVelocity;
onScreen = true;
}
public String getState() {
String state = "";
state = xPos + "|" + yPos + "|" + xAcceleration + "|" + yAcceleration + "|" + xVelocity
+ "|" + yVelocity;
return state;
}
public void restoreState(String state) {
List<String> stateInfo = Arrays.asList(state.split("\\|"));
putOnScreen(Float.parseFloat(stateInfo.get(0)), Float.parseFloat(stateInfo.get(1)), Float
.parseFloat(stateInfo.get(2)), Float.parseFloat(stateInfo.get(3)), Float
.parseFloat(stateInfo.get(4)), Float.parseFloat(stateInfo.get(5)), Integer
.parseInt(stateInfo.get(6)));
}
public void doBounce(BOUNCE_TYPE bounceType, float vX, float vY){
switch (bounceType){
case TOPLEFT:
if (xVelocity > 0){
xVelocity = -xVelocity * reboundEnergyFactor;
}
if (yVelocity > 0){
yVelocity = -yVelocity * reboundEnergyFactor;
}
break;
case TOP:
if (yVelocity > 0){
yVelocity = -yVelocity * reboundEnergyFactor;
}
break;
case TOPRIGHT:
if (xVelocity < 0){
xVelocity = -xVelocity * reboundEnergyFactor;
}
if (yVelocity > 0){
yVelocity = -yVelocity * reboundEnergyFactor;
}
break;
case LEFT:
if (xVelocity > 0){
xVelocity = -xVelocity * reboundEnergyFactor;
}
break;
case RIGHT:
if (xVelocity < 0){
xVelocity = -xVelocity * reboundEnergyFactor;
}
break;
case BOTTOMLEFT:
if (xVelocity > 0){
xVelocity = -xVelocity * reboundEnergyFactor;
}
if (yVelocity < 0){
yVelocity = -yVelocity * reboundEnergyFactor;
}
break;
case BOTTOM:
if (yVelocity < 0){
yVelocity = -yVelocity * reboundEnergyFactor;
}
break;
case BOTTOMRIGHT:
if (xVelocity < 0){
xVelocity = -xVelocity * reboundEnergyFactor;
}
if (yVelocity < 0){
yVelocity = -yVelocity * reboundEnergyFactor;
}
break;
}
xVelocity = xVelocity + (vX * 500);
yVelocity = yVelocity + (vY * 150);
}
}
Other Android examples (source code examples)Here is a short list of links related to this Android Demo_Ball.java source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.