package com.view;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import com.game.Enemy;
import com.game.Path;
import com.game.Tower;
import com.gamedata.Const;
import com.gamedata.EnemyData;
import com.menu.GameMenu;
import com.tower.R;
public class GameView extends View {
// 地图方格大小
public static final int BLOCKWIDTH = 64;
Context mContext;
Paint mPaint;
Lock lock;
private boolean running;
private boolean pause = false;
private boolean isDrawMap = false;
private boolean isDrawTower = false;
private boolean isDrawBomb = false;
Bitmap backGround;
Bitmap[] tower = new Bitmap[4];
Bitmap bomb;
Bitmap vertigo; // 眩晕图片
Bitmap speedSlow; // 减速图片
Bitmap blood; // 流血图片
float eventX; // 触摸事件的坐标
float eventY;
float towerX; // 用来记录临时炮塔的坐标
float towerY;
float bombX; // 爆炸效果的坐标
float bombY;
private int enemyX; // 敌人起始坐标
private int enemyY;
public int rows = 12; // 地图行和列
public int cols = 7;
private int curRow; // 当前行和列
private int curCol;
private int runAwayNum; // 逃跑数量
int killNum; // 杀死数量
private int momey; // 金钱
private int selectedTower; // 用于记录当前选择的炮塔
private int itemSelected; // 用于记录炮塔选择菜单的选择项
private int offsetX; // 地图偏移,用于调整地图方格
private int offsetY;
private int levelNum; // 游戏关数
private int enemyLevel; // 第几波敌人
private int curEnemyCount; // 当前敌人数量
private int enemyNum = 1; // 记录敌人编号,没一个敌人分配一个编号
private float enemyMoveSpeed; // 敌人移动速度
private int HP; // 敌人血量
String enemyName = null; // 敌人名称
private int map[][] = new int[rows][cols]; // 地图数组
ArrayList<Enemy> enemys = new ArrayList<Enemy>(); // 敌人列表
private ArrayList<Tower> towers = new ArrayList<Tower>(); // 炮塔列表
GameMenu mGameMenu; // 炮塔选择菜单
GameMenu towerMenu;// 炮塔升级菜单
Const mConst; // 该类用于存放一些游戏用到的常量
private boolean dragging; // 菜单拖拽
// 以下是长按事件元素
private int mLastMotionX, mLastMotionY;
// 是否移动了
private boolean isMoved;
// 是否释放了
private boolean isReleased;
// 计数器,防止多次点击导致最后一次形成longpress的时间变短
private int mCounter;
// 长按的runnable
private Runnable mLongPressRunnable;
// 移动的阈值
private static final int TOUCH_SLOP = 20;
public GameView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
mContext = context;
lock = new ReentrantLock();
mPaint = new Paint();
mPaint.setColor(Color.WHITE);
mPaint.setTextSize(24);
levelNum = 1;
mGameMenu = new GameMenu(0, 0, 64, 20 + 64 * 4);
towerMenu = new GameMenu(100, 300, 240, 100);
towerMenu.addItem("攻击强度", 10, 10);
towerMenu.addItem("攻击范围", 20 + towerMenu.getLastItemWidth(), 10);
towerMenu.addItem("攻击速度", 10, 60);
towerMenu.addItem("取消菜单", 20 + towerMenu.getLastItemWidth(), 60);
towerMenu.setVisibility(false);
mConst = new Const();
loadImage();
running = true;
loadDataByLevel(levelNum);
Log.i("GameView", "GameView");
new EnemyThread().start();
new TowerThread().start();
mLongPressRunnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
mCounter--;
// 计数器大于0,说明当前执行的Runnable不是最后一次down产生的。
if (mCounter > 0 || isReleased || isMoved)
return;
// 自定义长按事件处理函数
LongClick();
}
};
}
public void LongClick() {
// 显示菜单
towerMenu.setVisibility(true);
// 根据当前选中的炮塔设置菜单的位置
for (int i = 0; i < towers.size(); i++) {
if (curRow == towers.get(i).getRow()
&& curCol == towers.get(i).getCol()) {
// 设置菜单的坐标即菜单的位置
towerMenu.setMenuLocation(towers.get(i).getX()
- towers.get(i).getAttackR() + 20, towers.get(i).getY()
- towerMenu.getHeight() / 2);
break;
}
}
}
private void initMap(int level) {
map = new Const().loadMap(level);
}
public void resetGame() {
loadDataByLevel(levelNum);
mGameMenu.restoreMenuLocation();
towers.removeAll(towers);
enemys.removeAll(enemys);
}
public void nextGame() {
levelNum++;
if (levelNum > 4) {
levelNum = 1;
}
// loadDataByLevel(levelNum);
// towers.removeAll(towers);
// enemys.removeAll(enemys);
resetGame();
}
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
Log.i("onSizeChanged", "onSizeChanged");
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(backGround, 0, 0, null);
lock.lock();
drawTower(canvas);
drawEnemy(canvas);
lock.unlock();
drawMessage(canvas);
if (isDrawMap) {
drawMap(canvas, offsetX, offsetY);
}
if (isDrawTower) {
Paint paint = new Paint();
paint.setAlpha(100);
canvas.drawBitmap(tower[itemSelected], towerX, towerY, paint);
}
if (isDrawBomb) {
canvas.drawBitmap(bomb, bombX, bombY, null);
isDrawBomb = false;
}
if (mGameMenu != null) {
mGameMenu.drawGameMenu(canvas);
}
if (towerMenu != null) {
towerMenu.drawGameMenu(canvas);
}
invalidate();
}
private void drawEnemy(Canvas canvas) {
for (int i = 0; i < enemys.size(); i++) {
enemys.get(i).drawmSpriteBitmap(canvas);
if (enemys.get(i).getMoveSpeed() == 0) {
canvas.drawBitmap(vertigo, enemys.get(i).getX() + 5, enemys
.get(i).getY() - vertigo.getHeight(), null);
} else if (enemys.get(i).isSpeedSlow()) {
canvas.drawBitmap(speedSlow, enemys.get(i).getX() + 2, enemys
.get(i).getY() - speedSlow.getHeight(), null);
}
if (enemys.get(i).isBlood()) {
canvas.drawBitmap(blood, enemys.get(i).getX() + 5, enemys
.get(i).getY() - blood.getHeight(), null);
}
}
}
protected void drawMessage(Canvas canvas) {
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setAlpha(50);
canvas.drawText("第" + (enemyLevel + 1) + "波敌人", 0, 625, mPaint);
if (enemyName != null) {
canvas.drawText(enemyName, 0, 650, mPaint);
}
canvas.drawText("生命值:" + HP, 0, 675, mPaint);
canvas.drawText("移动速度:" + enemyMoveSpeed, 0, 700, mPaint);
canvas.drawText("逃脱:" + runAwayNum, 0, 725, mPaint);
canvas.drawText("金钱:" + momey, 0, 750, mPaint);
// canvas.drawText("X:" + eventX, 0, 725, mPaint);
// canvas.drawText("Y:" + eventY, 0, 750, mPaint);
for (int i = 0; i < towers.size(); i++) {
// 绘制炮塔
if (towers.get(i).isDrawAttackR()) {
// 点击炮塔的时候绘制炮塔的攻击范围
canvas.drawCircle(towers.get(i).getCircleX(), towers.get(i)
.getCircleY(), towers.get(i).getAttackR(), paint);
int damage = towers.get(i).getDamage();
int attackTime = towers.get(i).getAttackTimes();
float attackR = towers.get(i).getAttackR();
canvas.drawText("攻击强度:" + damage, 320, 675, mPaint);
canvas.drawText("攻击速度:" + attackTime, 320, 700, mPaint);
canvas.drawText("攻击范围:" + attackR, 320, 725, mPaint);
}
}
}
private void drawMap(Canvas canvas, int startX, int StartY) {
Paint paint = new Paint();
paint.setColor(Color.WHITE);
for (int i = 0; i <= cols; i++) {
canvas.drawLine(startX +
没有合适的资源?快使用搜索试试~ 我知道了~
Android应用源码之塔防游戏.zip项目安卓应用源码下载
共63个文件
png:39个
java:13个
jpg:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 143 浏览量
2022-03-08
19:55:39
上传
评论
收藏 1.28MB ZIP 举报
温馨提示
Android应用源码之塔防游戏.zip项目安卓应用源码下载Android应用源码之塔防游戏.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
资源推荐
资源详情
资源评论
收起资源包目录
Android应用源码之塔防游戏.zip (63个子文件)
Android应用源码之塔防游戏
Android应用源码之塔防游戏
TowerDemo
res
drawable-ldpi
enemy19.png 28KB
enemy5.png 7KB
enemy13.png 12KB
enemy21.png 4KB
enemy23.png 21KB
enemy17.png 22KB
enemy11.png 6KB
enemy8.png 14KB
enemy1.png 13KB
enemy16.png 9KB
enemy14.png 15KB
enemy15.png 13KB
enemy9.png 13KB
enemy4.png 5KB
enemy7.png 13KB
enemy20.png 11KB
enemy22.png 8KB
enemy6.png 9KB
enemy3.png 7KB
enemy.png 9KB
enemy10.png 6KB
enemy2.png 10KB
enemy12.png 5KB
enemy18.png 22KB
drawable-hdpi
map3.jpg 317KB
game_bullet3.png 5KB
rocket2.png 933B
game_bullet.png 237B
blood.png 11KB
map1.jpg 111KB
game_bullet2.png 5KB
tower3.png 29KB
bullet1.png 322B
bullet2.png 907B
xuanyun.png 7KB
bomb.png 13KB
map4.jpg 347KB
tower9.png 4KB
map2.jpg 77KB
tower4.png 7KB
tower1.png 27KB
tower2.png 25KB
jiansu.png 15KB
values
strings.xml 178B
layout
main.xml 388B
gen
com
tower
R.java 3KB
proguard.cfg 1KB
src
com
towerdemo
TowerDemoActivity.java 2KB
gamedata
EnemyData.java 643B
Const.java 6KB
menu
GameMenu.java 9KB
game
Sprite.java 4KB
BulletSprite.java 2KB
Tower.java 6KB
Enemy.java 9KB
Path.java 2KB
HpBar.java 802B
view
GameView.java 28KB
anim
Animation.java 2KB
.project 812B
.classpath 356B
project.properties 361B
AndroidManifest.xml 774B
共 63 条
- 1
资源评论
- 拉姆哥的小屋2022-05-30用户下载后在一定时间内未进行评价,系统默认好评。
yxkfw
- 粉丝: 76
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功