public class GameView extends SurfaceView {
int groundY = 0;
SurfaceHolder holder;
GameLoop loop;
Bitmap backGround;
Player player;
int bgColor = Color.BLACK;
HeadUpDisplay hud;
Sounds sounds;
GameView nextLevel = null;
Sprite exit = null;
List<Sprite> sprites = new CopyOnWriteArrayList<Sprite>();
List<Sprite> bgSprites = new CopyOnWriteArrayList<Sprite>();
GameView view;
Activity context;
public int x = 0, y = 0, bgx = 0, bgy = 0, bgSpriteX = 0, bgSpriteY = 0;
DisplayMetrics metrics;
int normalUnit = 192, smallUnit = 96;
public GameView(Context context) {
super(context);
this.context = (Activity) context;
hud = new HeadUpDisplay(this);
metrics = new DisplayMetrics();
this.context.getWindowManager().getDefaultDisplay().getMetrics(metrics);
normalUnit = (int) (128 * metrics.density);
smallUnit = (int) (64 * metrics.density);
view = this;
holder = this.getHolder();
addCallback();
}
public void changeActivity(Class c) {
loop.running = false;
context.finish();
Intent i = new Intent(getContext(), c);
getContext().startActivity(i);
}
public void addCallback() {
holder.addCallback(new Callback()
{
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
int arg3) {
}
public void surfaceCreated(SurfaceHolder holder) {
sounds = new Sounds(getContext());
player = new Player(view);
hud.makeInterface();
createLevel();
loop = new GameLoop(view);
loop.start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
);
}
public int playSound(int sound, int... settings) {
int id = -1;
int loopMode = 0;
int volume = 1;
if (settings.length > 0) {
loopMode = settings[0];
if (settings.length > 1) {
volume = settings[1];
}
}
if (sound != -1) {
id = sounds.sp.play(sound, volume, volume, 0, loopMode, 1);
return id;
}
return -1;
}
public void saveGame() {
try {
FileOutputStream fos = context.openFileOutput("savegame",
Context.MODE_PRIVATE);
ObjectOutputStream os;
try {
os = new ObjectOutputStream(fos);
PrintWriter w = new PrintWriter(os);
w.write(player.hp + "\n");
os.writeObject(player.ammo);
w.write("\n");
os.close();
w.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
FileInputStream fis = context.openFileInput("savegame");
int i;
try {
while ((i = fis.read()) != -1) {
Log.d("reading", String.valueOf(i));
}
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public void moveLevel(int x, int y) {
this.x += x;
this.y += y;
if (backGround != null) {
if (bgx <= -backGround.getWidth()) {
bgx = 0;
}
if (bgx >= backGround.getWidth()) {
bgx = 0;
}
if (bgy <= -backGround.getHeight()) {
bgy = 0;
}
if (bgy >= backGround.getHeight()) {
bgy = 0;
}
}
if (this.y < -300) {
view.post(new Runnable() {
public void run() {
}
});
}
for (Sprite s : sprites) {
s.x += x / ((float) (s.distance) / 10);
s.y += y / ((float) (s.distance) / 10);
s.updateBounds();
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP)
{
hud.onRelease();
}
else {
hud.pointerX = (int) event.getX() - x;
hud.pointerY = (int) (event.getY() - y) - groundY;
if (event.getAction() == MotionEvent.ACTION_DOWN) {
for (int i = 0; i < hud.hud.size(); i++) {
HudElement e = hud.hud.get(i);
for (int h = 0; h < hud.hud.get(i).bounds.length; h++) {
Rect r = hud.hud.get(i).bounds[h];
if (r != null
&& intersects((int) event.getX(),
(int) event.getY(), e.bounds[h])) {
e.onTouchEvent(event, h);
break;
}
}
}
}
}
return true;
}
public boolean intersects(int x, int y, Rect r) {
if (x >= r.left && x <= r.right && y >= r.top && y <= r.bottom) {
return true;
}
return false;
}
public void createLevel() {
}
public void updateGame() {
player.update();
for (Sprite s : sprites) {
if (s instanceof LevelExit) {
if (player.bounds.intersect(s.bounds)) {
}
}
if ((s instanceof Bullet) || s.x + s.width >= 0
&& s.x <= this.getWidth() && s.y + s.height >= 0
&& s.y <= getHeight()) {
s.update();
}
}
}
public void onDraw(Canvas canvas) {
if (canvas != null) {
canvas.drawColor(bgColor);
if (backGround != null) {
Rect src = new Rect(0, 0, backGround.getWidth(),
backGround.getHeight());
for (int i = -backGround.getWidth(); i < getWidth()
+ backGround.getWidth(); i += backGround.getWidth()) {
for (int h = -backGround.getHeight(); h < getHeight()
+ backGround.getHeight(); h += backGround
.getHeight()) {
Rect dest = new Rect(i + bgx, h + bgy, i + bgx
+ backGround.getWidth(), h + bgy
+ backGround.getHeight());
canvas.drawBitmap(backGround, src, dest, null);
}
}
}
int layerCount = 0;
for (Sprite s : sprites) {
if (s instanceof LevelExit) {
canvas.drawRect(s.bounds, new Paint());
}
if (s.layer > layerCount) {
layerCount = s.layer;
}
}
if (player.layer > layerCount) {
layerCount = player.layer;
}
for (int i = 0; i <= layerCount; i++) {
if (player.layer == i) {
player.drawWeapon(canvas);
player.drawBitmap(canvas, player.bmp);
}
for (Sprite s : sprites) {
if (s.layer == i) {
if (s.currentGun != null) {
s.drawWeapon(canvas);
}
if (s.bmp != null && s.x + (s.width * s.bmpScale) >= 0
&& s.x <= this.getWidth()) {
s.drawBitmap(canvas, s.bmp);
}
}
}
}
hud.onDraw(canvas);
}
}
}