Stage1SurfaceView安异游戏第一关源代码
package com.test.view;
import java.io.InputStream; import java.util.Timer; import java.util.TimerTask;
import com.test.main.R; import com.test.activity.Stage1Activity; import com.test.activity.SuccessActivity; import com.test.my.MyAnimSkill; import com.test.my.MyAnimation; import com.test.my.MyFulluse; import com.test.my.MyIButtonfour; import com.test.my.MyImageButton;
import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; 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.graphics.Paint.Style; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.widget.Toast;
public class Stage1SurfaceView extends SurfaceView implements Callback,Runnable { private Context context; private int screenwidth; private int screenheight; private Canvas canvas; private Paint paint; private SurfaceHolder holder; private boolean isrun; private boolean isloadok; private Bitmap mapgrassbg; private Bitmap smallmap; private int gamemapwidth; private int gamemapheight; private int smallmapx; private int smallmapy; private MyIButtonfour controldirection; private MyImageButton controlattack; private MyImageButton backblood; private MyImageButton bigattack1; private MyImageButton bigattack2; private MyImageButton bigattack3; private MyAnimSkill big1anim[]; private MyAnimSkill big2anim[]; private MyAnimSkill big3anim[]; private MyAnimSkill big4anim; private Bitmap bigattackbm1; private Bitmap bigattackbm2; private Bitmap bigattackbm3; private Bitmap bigattackbm4; private boolean isuseskill; private boolean isstartskill; private int skilltype; private int skilldirection; private int skillcount; private int skillmovex; private int skillmovey; private Timer timer; private Bitmap bignone; private Bitmap gamerole; private int progressblood; private int progressmagic; private int stoptime; private int delaytime; private int goldmoney; private int medicinesum; private MyImageButton okbutton; private MyImageButton cancelbutton; private Bitmap info_show; private int infox; private int infoy; private boolean isexit; private MyAnimation []mainrole; private MyAnimation [][]enemies; private Bitmap money1; private Bitmap money2; //0:right; 1:left; 2:up; 3:down; 4:rattack; 5:lattack; 6:berattack; 7:belattack;8:rdead; 9:ldead private int rolestate; private int myimagex; private int myimagey; private int myposx; private int myposy; private int myindexx; private int myindexy; private int myscreenx; private int myscreeny; private int mapx; private int mapy; private int [][]gamemap; private int mapxcount; private int mapycount; private int MAP_LENGH=15; private int backmyposx; private int backmyposy; private int backmyscreenx; private int backmyscreeny; private int []enemystate;//0:left; 1:right; private int []enemyx; private int []enemyy; private int []enemyposx; private int []enemyposy; private int []enemydelay; private int []beattackcount; private int [][]moneyposition; private int MY_STEP=10; private boolean isdead; private boolean isclick; private boolean isattack; private boolean isbeattacked; private boolean isup; private boolean isdown; private boolean isleft; private boolean isright; private int bossbeattacksum1; private boolean []isgothere; private int touchsum; private int clickx; private int clicky; private int doorx; private int doory; private Bitmap doorpic; private int endpoint=1; private int minutes; private int seconds; public Stage1SurfaceView(Context context, int w, int h) { super(context); this.context = context; screenwidth = w; screenheight = h; paint=new Paint(); medicinesum=MyFulluse.medicinesum; progressblood=MyFulluse.progressblood; progressmagic=MyFulluse.progressmagic; new Thread(){ @Override public void run() { initMyView(); isloadok=true; } }.start(); holder = getHolder(); holder.addCallback(this); setFocusable(true); }
private void initMyView() { controldirection=new MyIButtonfour(context, R.drawable.controldirection, 10, screenheight-115); controlattack=new MyImageButton(context, R.drawable.controlattack, screenwidth-100, screenheight-100); bigattack1=new MyImageButton(context, R.drawable.bigattack1, screenwidth-170, screenheight-80);//左边 bigattack2=new MyImageButton(context, R.drawable.bigattack2, screenwidth-161, screenheight-161);//左上 bigattack3=new MyImageButton(context, R.drawable.bigattack3, screenwidth-80, screenheight-170);//上边 bigattackbm1=getBitMap(R.drawable.bigattack1); bigattackbm2=getBitMap(R.drawable.bigattack2); bigattackbm3=getBitMap(R.drawable.bigattack3); bigattackbm4=getBitMap(R.drawable.bigattack4); bignone=getBitMap(R.drawable.bignone); backblood=new MyImageButton(context, R.drawable.backblood, screenwidth-240, screenheight-80); gamerole=getBitMap(R.drawable.role); info_show=getBitMap(R.drawable.info_show); int infow=info_show.getWidth(); int infoh=info_show.getHeight(); infox=(screenwidth-infow)>>1; infoy=((screenheight-infoh)>>1)-15; okbutton=new MyImageButton(context, R.drawable.okbutton, infox+50, infoy+180); cancelbutton=new MyImageButton(context, R.drawable.cancelbutton, infox+210, infoy+180); initMaps(); initMainrole(); initEnemies(); initBigSkill(); if (timer==null) { TimerTask task=new TimerTask() { @Override public void run() { if (progressmagic<100 && !isexit) { if (stoptime<delaytime) { stoptime++; int n=100/delaytime; progressmagic+=n; }else { progressmagic=100; } } seconds++; if (seconds>=60) { seconds=0; minutes++; } } }; timer=new Timer(); timer.schedule(task, 0, 1000); } } private void initMaps() { gamemapwidth=screenwidth+240; gamemapheight=screenheight+180; doorx=gamemapwidth-35;//35=15+20 doory=(gamemapheight-80)>>1;//居中 doorpic=getBitMap(R.drawable.doorpic); mapgrassbg=getBitMap(R.drawable.mapgrassbg); mapgrassbg=resizeBitMap(mapgrassbg, gamemapwidth, gamemapheight); mapxcount=gamemapwidth/MAP_LENGH;//x轴总index mapycount=gamemapheight/MAP_LENGH;//y轴总index gamemap=new int[mapycount][mapxcount];//初始化地图,0为可行走,1为碰墙 for (int i = 0; i < 6; i++) {//前6行,6*15=90px for (int j = 0; j < mapxcount; j++) { gamemap[i][j]=1; } } for (int i = mapycount-6; i < mapycount; i++) {//后6行 for (int j = 0; j < mapxcount; j++) { gamemap[i][j]=1; } } for (int i = 0; i < 1; i++) {//前1列 for (int j = 0; j < mapycount; j++) { gamemap[j][i]=1; } } for (int i = mapxcount-1; i < mapxcount; i++) {//后1列 for (int j = 0; j < mapycount; j++) { gamemap[j][i]=1; } } //初始化小地图 int smallwidth=mapxcount*2; int smallheight=(mapycount-10)*2;//最前和最后的5行,并扩大2倍 smallmap=getBitMap(R.drawable.smallmap); smallmap=resizeBitMap(smallmap, smallwidth, smallheight); smallmapx=screenwidth-smallwidth-10; smallmapy=10; }
private void initMainrole() { myposx=120; myposy=150; myimagex=myposx-75; myimagey=myposy-95; myindexx=myposx/MAP_LENGH; myindexy=myposy/MAP_LENGH; myscreenx=myposx; myscreeny=myposy; //主角初始化 mainrole=new MyAnimation[10]; mainrole[0]=new MyAnimation(context, new int[]{ R.drawable.rolerm1,R.drawable.rolerm2,R.drawable.rolerm3, R.drawable.rolerm4,R.drawable.rolerm5,R.drawable.rolerm6, R.drawable.rolerm7,R.drawable.rolerm8 }, true); mainrole[1]=new MyAnimation(context, new int[]{ R.drawable.rolelm1,R.drawable.rolelm2,R.drawable.rolelm3, R.drawable.rolelm4,R.drawable.rolelm5,R.drawable.rolelm6, R.drawable.rolelm7,R.drawable.rolelm8 }, true); mainrole[2]=new MyAnimation(context, new int[]{ R.drawable.roleum1,R.drawable.roleum2,R.drawable.roleum3, R.drawable.roleum4,R.drawable.roleum5,R.drawable.roleum6, R.drawable.roleum7,R.drawable.roleum8 }, true); mainrole[3]=new MyAnimation(context, new int[]{ R.drawable.roledm1,R.drawable.roledm2,R.drawable.roledm3, R.drawable.roledm4,R.drawable.roledm5,R.drawable.roledm6, R.drawable.roledm7,R.drawable.roledm8 }, true); mainrole[4]=new MyAnimation(context, new int[]{ R.drawable.roleattackr1,R.drawable.roleattackr2,R.drawable.roleattackr3, R.drawable.roleattackr4,R.drawable.roleattackr5,R.drawable.roleattackr6, R.drawable.roleattackr7,R.drawable.roleattackr8,R.drawable.roleattackr9, R.drawable.roleattackr10 }, true); mainrole[5]=new MyAnimation(context, new int[]{ R.drawable.roleattackl1,R.drawable.roleattackl2,R.drawable.roleattackl3, R.drawable.roleattackl4,R.drawable.roleattackl5,R.drawable.roleattackl6, R.drawable.roleattackl7,R.drawable.roleattackl8,R.drawable.roleattackl9, R.drawable.roleattackl10 }, true); mainrole[4].setFlag(7); mainrole[5].setFlag(7); mainrole[6]=new MyAnimation(context, new int[]{ R.drawable.rolebra1,R.drawable.rolebra2,R.drawable.rolebra3, R.drawable.rolebra4,R.drawable.rolebra5 }, false); mainrole[7]=new MyAnimation(context, new int[]{ R.drawable.rolebla1,R.drawable.rolebla2,R.drawable.rolebla3, R.drawable.rolebla4,R.drawable.rolebla5 }, false); mainrole[8]=new MyAnimation(context, new int[]{ R.drawable.rolerd1,R.drawable.rolerd2,R.drawable.rolerd3, R.drawable.rolerd4,R.drawable.rolerd5,R.drawable.rolerd6, R.drawable.rolerd7,R.drawable.rolerd8,R.drawable.rolerd9 }, false); mainrole[9]=new MyAnimation(context, new int[]{ R.drawable.roleld1,R.drawable.roleld2,R.drawable.roleld3, R.drawable.roleld4,R.drawable.roleld5,R.drawable.roleld6, R.drawable.roleld7,R.drawable.roleld8,R.drawable.roleld9 }, false); } private void initEnemies() { enemystate=new int[3]; enemyx=new int[3]; enemyy=new int[3]; enemyposx=new int[3]; enemyposy=new int[3]; enemydelay=new int[3]; beattackcount=new int[3]; isgothere=new boolean[4]; moneyposition=new int[3][3]; enemyposx[0]=315; enemyposy[0]=160; enemyx[0]=enemyposx[0]-105; enemyy[0]=enemyposy[0]-110; enemyx[1]=210; enemyy[1]=150; enemyx[2]=screenwidth-205; enemyy[2]=110; enemies=new MyAnimation[3][2]; for (int i = 0; i <2; i++) { enemies[i][0]=new MyAnimation(context, new int[]{ R.drawable.eonefootl1,R.drawable.eonefootl2,R.drawable.eonefootl3, R.drawable.eonefootl4,R.drawable.eonefootl5,R.drawable.eonefootl6, R.drawable.eonefootl7 }, true); enemies[i][1]=new MyAnimation(context, new int[]{ R.drawable.eonefootr1,R.drawable.eonefootr2,R.drawable.eonefootr3, R.drawable.eonefootr4,R.drawable.eonefootr5,R.drawable.eonefootr6, R.drawable.eonefootr7 }, true); } enemies[2][0]=new MyAnimation(context, new int[]{ R.drawable.esnakel1,R.drawable.esnakel2,R.drawable.esnakel3, R.drawable.esnakel4,R.drawable.esnakel5,R.drawable.esnakel6, R.drawable.esnakel7,R.drawable.esnakel8 }, true); enemies[2][1]=new MyAnimation(context, new int[]{ R.drawable.esnaker1,R.drawable.esnaker2,R.drawable.esnaker3, R.drawable.esnaker4,R.drawable.esnaker5,R.drawable.esnaker6, R.drawable.esnaker7,R.drawable.esnaker8 }, true); money1=getBitMap(R.drawable.money1); money2=getBitMap(R.drawable.money2); } private void initBigSkill() { big1anim=new MyAnimSkill[2]; big1anim[0]=new MyAnimSkill(context, new int[]{ R.drawable.bigr1,R.drawable.bigr2, R.drawable.bigr3,R.drawable.bigr4,R.drawable.bigr5,R.drawable.bigr6, R.drawable.bigr7,R.drawable.bigr8,R.drawable.bigr9,R.drawable.bigr10}, false); big1anim[1]=new MyAnimSkill(context, new int[]{ R.drawable.bigl1,R.drawable.bigl2, R.drawable.bigl3,R.drawable.bigl4,R.drawable.bigl5,R.drawable.bigl6, R.drawable.bigl7,R.drawable.bigl8,R.drawable.bigl9,R.drawable.bigl10}, false); big2anim=new MyAnimSkill[8]; for (int i = 0; i < 8; i++) { big2anim[i]=new MyAnimSkill(context, new int[]{ R.drawable.big2_1, R.drawable.big2_2,R.drawable.big2_3 } , true); } big3anim=new MyAnimSkill[8]; Bitmap bm3=getBitMap(R.drawable.big3); Bitmap[]bmps1=new Bitmap[8]; int sum=0; int w=bm3.getWidth()/5; int h=bm3.getHeight()/2; for (int i = 0; i < 2; i++) { for (int j = 0; j < 5; j++) { if (sum<=7) { bmps1[sum]=Bitmap.createBitmap(bm3, j*w, i*h ,w ,h); sum++; } } } for (int i = 0; i < 8; i++) { big3anim[i]=new MyAnimSkill(context, bmps1, true); } Bitmap bm4=getBitMap(R.drawable.big4); Bitmap[]bmps2=new Bitmap[20]; sum=0; w=bm4.getWidth()/5; h=bm4.getHeight()/4; for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { bmps2[sum]=Bitmap.createBitmap(bm4, j*w, i*h ,w ,h); sum++; } } big4anim=new MyAnimSkill(context, bmps2, false); } private Bitmap getBitMap(int resId) { BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inPreferredConfig = Bitmap.Config.RGB_565; opt.inPurgeable = true; opt.inInputShareable = true; InputStream is = context.getResources().openRawResource(resId); return BitmapFactory.decodeStream(is, null, opt); } private Bitmap resizeBitMap(Bitmap bitmap, int w, int h) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); float scaleWidth = ((float) w / width); float scaleHeight = ((float) h / height); matrix.postScale(scaleWidth, scaleHeight); Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); return newbmp; } public void closeTimer() { if (timer!=null) { timer.cancel(); timer=null; } } private void updateDraw() { if (isloadok) { canvas.drawBitmap(mapgrassbg, mapx, mapy, paint); if (!isdead) { if (!isexit) { if (isattack) { drawEnemywithRole(1); roleAttackEnemy(); if (touchsum==2 && isclick && (isright||isleft||isup||isdown)) { updateRoleLocation(); } }else if (isright && isclick) { drawEnemywithRole(1); updateRoleLocation(); }else if (isleft && isclick) { drawEnemywithRole(1); updateRoleLocation(); }else if (isup && isclick) { drawEnemywithRole(1); updateRoleLocation(); }else if (isdown && isclick) { drawEnemywithRole(1); updateRoleLocation(); }else if (isbeattacked) { drawEnemywithRole(1); }else { drawEnemywithRole(0); } updateEnemyLocation();//更新怪位置 judgeToDoor();//判断是否到达传送门 } if (progressblood<=0) { progressblood=1; isdead=true; } }else { if (enemystate[0]==0) { mainrole[8].drawAnimation(canvas, paint, myimagex, myimagey); }else { mainrole[9].drawAnimation(canvas, paint, myimagex, myimagey); } for (int i = 0; i < 3; i++) { if (!enemies[i][enemystate[i]].isMisDead()) {//绘制敌人 enemies[i][enemystate[i]].setMisEnd(true); enemies[i][enemystate[i]].setPlayid(0); enemies[i][enemystate[i]].drawAnimation(canvas, paint, enemyx[i], enemyy[i]); } } showDeadInfo(); } drawMoney(); touchBigSkill(); controldirection.drawMyButton(canvas, paint); controlattack.drawMyButton(canvas, paint); if (MyFulluse.isbigattack1) { drawBigSkill(MyFulluse.setbig1, screenwidth-170, screenheight-80); } if (MyFulluse.isbigattack2) { drawBigSkill(MyFulluse.setbig2, screenwidth-161, screenheight-161); } if (MyFulluse.isbigattack3) { drawBigSkill(MyFulluse.setbig3, screenwidth-80, screenheight-170); } canvas.drawBitmap(gamerole, 10, 5, paint); drawProgress(); drawSmallMap(); drawMedicineSum(); drawChooseBack(); }else {//未加载完显示界面 drawStrtip("加载中...", 18, screenwidth/2-50, screenheight/2); } } private void updateRoleLocation() { if (isclick) { if (isdown) { myposy+=MY_STEP; if (myscreeny >= screenheight-100) { if (myindexy>=mapycount-19 && myindexy<mapycount-7) {//10+6=16 mapy-=MY_STEP; doory-=MY_STEP; for (int i = 0; i < 3; i++) { enemyy[i]-=10; if (moneyposition[i][2]==1) { moneyposition[i][1]-=10; } } }else { myscreeny+=MY_STEP; } }else { myscreeny+=MY_STEP; } }else if (isup) { myposy-=MY_STEP; if (myscreeny<=100) { if (myindexy>=7 && myindexy<19) { mapy+=MY_STEP; doory+=MY_STEP; for (int i = 0; i < 3; i++) { enemyy[i]+=10; if (moneyposition[i][2]==1) { moneyposition[i][1]+=10; } } }else { myscreeny-=MY_STEP; } }else { myscreeny-=MY_STEP; } }else if (isright) { myposx+=MY_STEP; if (myscreenx>=screenwidth-100) { if (myindexx>=mapxcount-25 && myindexx<mapxcount-6) {//16+2+5=23 mapx-=MY_STEP; doorx-=MY_STEP; for (int i = 0; i < 3; i++) { enemyx[i]-=10; if (moneyposition[i][2]==1) { moneyposition[i][0]-=10; } } }else { myscreenx+=MY_STEP; } }else { myscreenx+=MY_STEP; } }else if (isleft) { myposx-=MY_STEP; if (myscreenx<=100) { if (myindexx>=6 && myindexx<25) {//对称 mapx+=MY_STEP; doorx+=MY_STEP; for (int i = 0; i < 3; i++) { enemyx[i]+=10; if (moneyposition[i][2]==1) { moneyposition[i][0]+=10; } } }else { myscreenx-=MY_STEP; } }else { myscreenx-=MY_STEP; } } //防止地图越界 if (mapx>=0) { mapx=0; }else if (mapx<=-(gamemapwidth-screenwidth)) { mapx=-(gamemapwidth-screenwidth); } if (mapy>=0) { mapy=0; }else if (mapy<=-(gamemapheight-screenheight)) { mapy=-(gamemapheight-screenheight); } //在二维数组中的索引 myindexx=myposx/MAP_LENGH; myindexy=myposy/MAP_LENGH; if (gamemap[myindexy][myindexx]==1) { myposx=backmyposx; myposy=backmyposy; myscreenx=backmyscreenx; myscreeny=backmyscreeny; }else { backmyposx=myposx; backmyposy=myposy; backmyscreenx=myscreenx; backmyscreeny=myscreeny; } myimagex=myscreenx-75; myimagey=myscreeny-95; } } private void updateEnemyLocation() { //enemy1和2 for (int i = 0; i < 2; i++) { if (enemydelay[i]<=6) { enemydelay[i]++; }else if (!enemies[i][enemystate[i]].isMisDead()) { enemies[i][enemystate[i]].setMisEnd(false); enemyposx[i]=enemyx[i]+105; enemyposy[i]=enemyy[i]+110; if (enemyposx[i]<myscreenx-60) { enemystate[i]=1;//右移 if (Math.abs(enemyposx[i]-myscreenx)>60) { enemyx[i]+=4; } }else if (enemyposx[i]>myscreenx+60) { enemystate[i]=0;//左移 if (Math.abs(enemyposx[i]-myscreenx)>60) { enemyx[i]-=4; } } if ((Math.abs(enemyposx[i]-myscreenx)<140)) { if (Math.abs(enemyposy[i]-myscreeny)>40) {//纵轴 if (enemyposy[i]<myscreeny-40) { enemyy[i]+=4; }else if (enemyposy[i]>myscreeny+40) { enemyy[i]-=4; } } if (Math.abs(enemyposy[1]-enemyposy[0])<40) {//enemy1和2不能重合 if (enemyposy[1]>=enemyposy[0]) { enemyy[0]-=4; enemyy[1]+=4; }else { enemyy[0]+=4; enemyy[1]-=4; } } } if (Math.abs(enemyposx[i]-myscreenx)<60 && Math.abs(enemyposy[i]-myscreeny)<60) { if (progressblood>=0 && enemies[i][enemystate[i]].getFlag() && !enemies[i][enemystate[i]].isMisEnd()) { progressblood-=2; if (isattack || isup || isdown || isleft || isright) { isbeattacked=false; }else { isbeattacked=true; if (enemystate[i]==0) { rolestate=6; }else { rolestate=7; } if (mainrole[rolestate].getPlayid()==4) { mainrole[rolestate].setPlayid(0); } } if (progressblood<=0) { progressblood=1; isdead=true; } }else { isbeattacked=false; } } } if(enemies[i][enemystate[i]].isMisDead() && bossbeattacksum1<4){ //重新定位 enemies[i][0].setMisDead(false); enemies[i][1].setMisDead(false); if (i==0) { if (Math.abs(myscreenx-10)<=Math.abs(myscreenx+270-gamemapwidth)) { enemyx[i]=gamemapwidth-270; if (Math.abs(enemyposx[1]-enemyposx[0])<=80) { enemyx[0]-=90; } enemyy[i]=50; enemystate[i]=0; }else { enemyx[i]=5; enemyy[i]=60; enemystate[i]=1; } }else { if (Math.abs(myscreenx-10)<=Math.abs(myscreenx+210-gamemapwidth)) { enemyx[i]=gamemapwidth-210; if (Math.abs(enemyposx[1]-enemyposx[0])<=80) { enemyx[1]+=90; } enemyy[i]=150; enemystate[i]=0; }else { enemyx[i]=5; enemyy[i]=160; enemystate[i]=1; } } beattackcount[i]=0; } }//end for //enemy 3 if (enemydelay[2]<=6) { enemydelay[2]++; }else if (!enemies[2][enemystate[2]].isMisDead()) { enemies[2][enemystate[2]].setMisEnd(false); enemyposx[2]=enemyx[2]+100; enemyposy[2]=enemyy[2]+90; if (enemyposx[2]<myscreenx-30) { enemystate[2]=1;//右移 if (Math.abs(enemyposx[2]-myscreenx)>70) { enemyx[2]+=6; } }else if (enemyposx[2]>myscreenx+30) { enemystate[2]=0;//左移 if (Math.abs(enemyposx[2]-myscreenx)>70) { enemyx[2]-=6; } } if (Math.abs(enemyposy[2]-myscreeny)>30) {//纵轴 if (enemyposy[2]<myscreeny-20) { enemyy[2]+=6; }else if (enemyposy[2]>myscreeny+30) { enemyy[2]-=6; } } if (Math.abs(enemyposx[2]-myscreenx)<80 && Math.abs(enemyposy[2]-myscreeny)<80) { if (progressblood>=0 && enemies[2][enemystate[2]].getFlag() && !enemies[2][enemystate[2]].isMisEnd()) { progressblood-=3; if (isattack || isup || isdown || isleft || isright) { isbeattacked=false; }else { isbeattacked=true; if (enemystate[2]==0) { rolestate=6; }else { rolestate=7; } if (mainrole[rolestate].getPlayid()==4) { mainrole[rolestate].setPlayid(0); } } if (progressblood<=0) { progressblood=1; isdead=true; } }else { isbeattacked=false; } } } if(enemies[2][enemystate[2]].isMisDead() && bossbeattacksum1<4 && progressmagic!=0){ //重新定位 enemies[2][0].setMisDead(false); enemies[2][1].setMisDead(false); bossbeattacksum1++;//计算boss被攻击总数 if (Math.abs(myscreenx-enemyx[2])<=Math.abs(myscreenx-gamemapwidth+190)) { enemyx[2]=gamemapwidth-190; enemyy[2]=100; enemystate[2]=0; }else { enemyx[2]=65; enemyy[2]=110; enemystate[2]=1; } beattackcount[2]=0; } } private void roleAttackEnemy() { for (int i = 0; i < 3; i++) { if (!enemies[i][enemystate[i]].isMisDead()) { if (Math.abs(enemyposx[i]-myscreenx)<70 && Math.abs(enemyposy[i]-myscreeny)<70) { if (progressblood>=0 && mainrole[rolestate].getFlag()) { enemies[i][enemystate[i]].setPlayid(0); enemies[i][enemystate[i]].setMisEnd(true); if (rolestate==4 && myscreenx<=enemyposx[i]+70) { enemyx[i]+=2; enemydelay[i]=0; beattackcount[i]++; }else if(rolestate==5 && myscreenx>=enemyposx[i]-70){ enemyx[i]-=2; enemydelay[i]=0; beattackcount[i]++; } } } } if (beattackcount[i]>=10) { enemies[i][0].setMisDead(true); enemies[i][1].setMisDead(true); } } } private void showDeadInfo() { StringBuffer deadinfo=new StringBuffer("诶, 挑战失败,继续加油吧。 "); String str2=deadinfo.toString(); String str=deadinfo.substring(0,endpoint); if (endpoint<str2.length()) { endpoint++; } int x=(screenwidth-300)>>1; int y=30; drawStrtip(str, 24, x, y); } private void drawSmallMap() { canvas.drawBitmap(smallmap, smallmapx, smallmapy, paint); int x=smallmapx+myindexx*2; int y=smallmapy+(myindexy-5)*2; paint.setColor(Color.BLACK); canvas.drawRect(x, y, x+4, y+4, paint); paint.setColor(Color.YELLOW); x=smallmapx+(gamemapwidth-35)*2/15; y=smallmapy+(gamemapheight-160)/15; canvas.drawRect(x, y, x+6, y+10, paint);//12=2*3;10=2*5; } @SuppressWarnings("static-access") private void drawProgress() { int color=paint.getColor(); paint.setColor(Color.BLACK); paint.setStyle(Style.FILL.STROKE); int w=55; int h=20; canvas.drawRect(w, h, w+150, h+12, paint); canvas.drawRect(w, h+20, w+150, h+32, paint); int w1=150*progressblood/100; int w2=150*progressmagic/100; paint.setColor(Color.RED); paint.setStyle(Style.FILL); canvas.drawRect(w+1, h+1, w+w1, h+11, paint); paint.setColor(Color.GRAY); canvas.drawRect(w+1, h+21, w+w2, h+31, paint); paint.setColor(color); } private void drawMedicineSum() { if (medicinesum>0) { backblood.drawMyButton(canvas, paint); String str=String.valueOf(medicinesum); int x=screenwidth-210-(int)paint.measureText(str); int y=screenheight-40; drawStrtip(str, 18, x, y); } } private void drawMoney() { for (int i = 0; i < 3; i++) { if (moneyposition[i][2]==1) { canvas.drawBitmap(money1, moneyposition[i][0]-20, moneyposition[i][1], paint); canvas.drawBitmap(money2, moneyposition[i][0], moneyposition[i][1], paint); } if (moneyposition[i][2]==1 && Math.abs(moneyposition[i][0]-myscreenx)<40 && Math.abs(moneyposition[i][1]-myscreeny)<80) { if (i==2) { goldmoney+=4; drawStrtip("金币 +4", 14, myscreenx, myscreeny-90); }else { goldmoney+=2; drawStrtip("金币 +2", 14, myscreenx, myscreeny-90); } System.out.println(goldmoney); moneyposition[i][2]=0; } } } private void drawBigSkill(int type, int w, int h){ switch (type) { case 1: canvas.drawBitmap(bigattackbm1, w, h, paint); break; case 2: canvas.drawBitmap(bigattackbm2, w, h, paint); break; case 3: canvas.drawBitmap(bigattackbm3, w, h, paint); break; case 4: canvas.drawBitmap(bigattackbm4, w, h, paint); break; default: canvas.drawBitmap(bignone, w, h, paint); break; } } private void drawEnemies() { if (enemyy[2] >= enemyy[1] && enemyy[2] >= enemyy[0]) {//最后一只boss处于外面 for (int i = 0; i < 3; i++) { if (!enemies[i][enemystate[i]].isMisDead()) { enemies[i][enemystate[i]].drawAnimation(canvas, paint, enemyx[i], enemyy[i]); } } }else if (enemyy[2] <= enemyy[1] && enemyy[2] <= enemyy[0]) {//最后一只boss处于里面 for (int i = 2; i >=0 ; i--) { if (!enemies[i][enemystate[i]].isMisDead()) { enemies[i][enemystate[i]].drawAnimation(canvas, paint, enemyx[i], enemyy[i]); } } }else {//最后一只boss处于中间 if (enemyy[0]<enemyy[1]) { if (!enemies[0][enemystate[0]].isMisDead()) { enemies[0][enemystate[0]].drawAnimation(canvas, paint, enemyx[0], enemyy[0]); } if (!enemies[2][enemystate[2]].isMisDead()) { enemies[2][enemystate[2]].drawAnimation(canvas, paint, enemyx[2], enemyy[2]); } if (!enemies[1][enemystate[1]].isMisDead()) { enemies[1][enemystate[1]].drawAnimation(canvas, paint, enemyx[1], enemyy[1]); } }else { if (!enemies[1][enemystate[1]].isMisDead()) { enemies[1][enemystate[1]].drawAnimation(canvas, paint, enemyx[1], enemyy[1]); } if (!enemies[0][enemystate[0]].isMisDead()) { enemies[0][enemystate[0]].drawAnimation(canvas, paint, enemyx[0], enemyy[0]); } if (!enemies[2][enemystate[2]].isMisDead()) { enemies[2][enemystate[2]].drawAnimation(canvas, paint, enemyx[2], enemyy[2]); } } } for (int i = 0; i < 3; i++) { if (enemies[i][enemystate[i]].isMisDead()) { if (bossbeattacksum1<4) { moneyposition[i][0]=enemyposx[i]; moneyposition[i][1]=enemyposy[i]; moneyposition[i][2]=1; }else if (bossbeattacksum1>=4 && !isgothere[i]) { moneyposition[i][0]=enemyposx[i]; moneyposition[i][1]=enemyposy[i]; moneyposition[i][2]=1; isgothere[i]=true; } } } } private void judgeToDoor() { if (bossbeattacksum1>=4) { if (!isgothere[3]) { int n=0; for (int i = 0; i < 3; i++) { if (enemies[i][enemystate[i]].isMisDead()) { n++; if (n>=3) { canvas.drawBitmap(doorpic, doorx, doory, paint); if (myscreenx>doorx-5 && myscreenx<(doorx+44) && myscreeny>doory-10 && myscreeny<(doory+90)) { System.out.println("success to door ok"); isgothere[3]=true; isrun=false; closeTimer(); MyFulluse.golden += goldmoney; MyFulluse.progressblood=progressblood; MyFulluse.progressmagic=progressmagic; if (MyFulluse.stage==1) { MyFulluse.stage += 1; } MyFulluse.tempstage=2;//下一关为2 MyFulluse.tempmoney=goldmoney; MyFulluse.tempminutes=minutes; MyFulluse.tempseconds=seconds; saveSharedPre(); Intent intent=new Intent(context, SuccessActivity.class); context.startActivity(intent); Stage1Activity activity=(Stage1Activity) context; activity.finish(); } } } } } } } private void drawEnemywithRole(int type){ if (myscreeny>enemyposy[0]+20 && myscreeny>enemyposy[1]+20 && myscreeny>enemyposy[2]+20) { drawEnemies(); if (type==0) { mainrole[rolestate].drawFrame(canvas, paint, myimagex, myimagey, 0); }else { mainrole[rolestate].drawAnimation(canvas, paint, myimagex, myimagey); } }else { if (type==0) { mainrole[rolestate].drawFrame(canvas, paint, myimagex, myimagey, 0); }else { mainrole[rolestate].drawAnimation(canvas, paint, myimagex, myimagey); } drawEnemies(); } } private void touchBigSkill(){ if (isuseskill && !isdead) { switch (skilltype) { case 1: System.out.println("大招1"); if (!isstartskill) { skillmovex=myscreenx-75; skillmovey=myscreeny-90; } isstartskill=true; progressmagic=0; stoptime=0; delaytime=5; big1anim[skilldirection].drawFrame(canvas, paint, skillmovex, skillmovey, skillcount); for (int i = 0; i < 3; i++) { if (big1anim[skilldirection].isAttackok(skillcount, enemyposx[i], enemyposy[i])) { beattackcount[i]+=2; if (skilldirection==0) { enemyx[i]+=3; }else { enemyx[i]-=3; } } } skillcount++; if (skillcount>=3) { if (skilldirection==0) { skillmovex+=15; }else { skillmovex-=15; } } if (skillcount>=10) { skillcount=0; isstartskill=false; isuseskill=false; } break; case 2: System.out.println("大招2"); if (!isstartskill) { skillmovex=myscreenx-25; skillmovey=myscreeny-25; } isstartskill=true; progressmagic=0; stoptime=0; delaytime=7; big2anim[0].drawAnimation(canvas, paint, skillmovex+skillcount, skillmovey); big2anim[1].drawAnimation(canvas, paint, skillmovex, skillmovey+skillcount); big2anim[2].drawAnimation(canvas, paint, skillmovex-skillcount, skillmovey); big2anim[3].drawAnimation(canvas, paint, skillmovex, skillmovey-skillcount); big2anim[4].drawAnimation(canvas, paint, skillmovex+(int)(skillcount*0.707), skillmovey+(int)(skillcount*0.707)); big2anim[5].drawAnimation(canvas, paint, skillmovex+(int)(skillcount*0.707), skillmovey-(int)(skillcount*0.707)); big2anim[6].drawAnimation(canvas, paint, skillmovex-(int)(skillcount*0.707), skillmovey+(int)(skillcount*0.707)); big2anim[7].drawAnimation(canvas, paint, skillmovex-(int)(skillcount*0.707), skillmovey-(int)(skillcount*0.707)); skillcount+=10; for (int i = 0; i < 8; i++) { if (big2anim[i].isAttackok(0, enemyposx[0], enemyposy[0])) { beattackcount[0]+=4; }else if (big2anim[i].isAttackok(0, enemyposx[1], enemyposy[1])) { beattackcount[1]+=4; }else if (big2anim[i].isAttackok(0, enemyposx[2], enemyposy[2])) { beattackcount[2]+=4; } } if (skillcount>=200) { skillcount=0; isstartskill=false; isuseskill=false; } break; case 3: System.out.println("大招3"); if (!isstartskill) { skillmovex=myscreenx-60; skillmovey=myscreeny-150; } isstartskill=true; progressmagic=0; stoptime=0; delaytime=9; big3anim[0].drawAnimation(canvas, paint, skillmovex+skillcount, skillmovey); big3anim[1].drawAnimation(canvas, paint, skillmovex, skillmovey+skillcount); big3anim[2].drawAnimation(canvas, paint, skillmovex-skillcount, skillmovey); big3anim[3].drawAnimation(canvas, paint, skillmovex, skillmovey-skillcount); big3anim[4].drawAnimation(canvas, paint, skillmovex+(int)(skillcount*0.707), skillmovey+(int)(skillcount*0.707)); big3anim[5].drawAnimation(canvas, paint, skillmovex+(int)(skillcount*0.707), skillmovey-(int)(skillcount*0.707)); big3anim[6].drawAnimation(canvas, paint, skillmovex-(int)(skillcount*0.707), skillmovey+(int)(skillcount*0.707)); big3anim[7].drawAnimation(canvas, paint, skillmovex-(int)(skillcount*0.707), skillmovey-(int)(skillcount*0.707)); skillcount+=12; for (int i = 0; i < 8; i++) { if (big3anim[i].isAttackok(0, enemyposx[0], enemyposy[0])) { beattackcount[0]+=5; }else if (big3anim[i].isAttackok(0, enemyposx[1], enemyposy[1])) { beattackcount[1]+=5; }else if (big3anim[i].isAttackok(0, enemyposx[2], enemyposy[2])) { beattackcount[2]+=5; } } if (skillcount>=200) { skillcount=0; isstartskill=false; isuseskill=false; } break; case 4: System.out.println("大招4"); skillmovex=myscreenx-96; skillmovey=myscreeny-96; progressmagic=0; progressblood=100; stoptime=0; delaytime=12; big4anim.drawFrame(canvas, paint, skillmovex, skillmovey, skillcount); skillcount++; if (skillcount>=20) { skillcount=0; isuseskill=false; } break; default: break; } for (int i = 0; i < 3; i++) {//判断是否击毙 if (beattackcount[i]>=10) { enemies[i][0].setMisDead(true); enemies[i][1].setMisDead(true); } } } } private void drawStrtip(String tipstr, int size, int x, int y){ int color=paint.getColor(); paint.setColor(Color.WHITE); paint.setTextSize(size); canvas.drawText(tipstr, x+1, y, paint); canvas.drawText(tipstr, x, y+1, paint); canvas.drawText(tipstr, x-1, y, paint); canvas.drawText(tipstr, x, y-1, paint); paint.setColor(Color.BLACK); canvas.drawText(tipstr, x, y, paint); paint.setColor(color); } private void drawChooseBack() { if (isexit && !isdead ) {//要退出显示的界面 mainrole[rolestate].drawFrame(canvas, paint, myimagex, myimagey, 0); for (int i = 0; i < 3; i++) { if (!enemies[i][enemystate[i]].isMisDead()) {//绘制敌人 enemies[i][enemystate[i]].setMisEnd(true); enemies[i][enemystate[i]].setPlayid(0); enemies[i][enemystate[i]].drawAnimation(canvas, paint, enemyx[i], enemyy[i]); } } canvas.drawBitmap(info_show, infox, infoy, paint); okbutton.drawMyButton(canvas, paint); cancelbutton.drawMyButton(canvas, paint); drawStrtip("提示:", 14, infox+50, infoy+70); drawStrtip("任务未完成,", 14, infox+70, infoy+90); drawStrtip("将获得金币"+goldmoney+"*50%,", 14, infox+70, infoy+110); drawStrtip("是否退出?", 14, infox+70, infoy+130); } if (isdead) { canvas.drawBitmap(info_show, infox, infoy, paint); okbutton.drawMyButton(canvas, paint); cancelbutton.drawMyButton(canvas, paint); drawStrtip("提示:", 14, infox+50, infoy+70); drawStrtip("使用生命符可原地复活", 14, infox+70, infoy+90); drawStrtip("直接离开则这次金币将丢失", 14, infox+70, infoy+110); drawStrtip("是否使用生命符?", 14, infox+70, infoy+130); } } private void saveSharedPre() { Stage1Activity myactivity=(Stage1Activity) context; SharedPreferences sharedPreferences=myactivity.getSharedPreferences("fulluse", Activity.MODE_WORLD_WRITEABLE); Editor editor=sharedPreferences.edit(); MyFulluse.medicinesum=medicinesum; editor.putInt("golden", MyFulluse.golden); editor.putInt("lifesum", MyFulluse.lifesum); editor.putInt("stage", MyFulluse.stage); editor.putInt("medicinesum", MyFulluse.medicinesum); editor.putInt("progressblood", MyFulluse.progressblood); editor.putInt("progressmagic", MyFulluse.progressmagic); editor.commit(); } public void setChoose(){ isexit=true; }
@Override public boolean onTouchEvent(MotionEvent event) { isclick=false; isattack=false; isbeattacked=false; int action=event.getAction(); touchsum=event.getPointerCount(); for (int i = 0; i < touchsum; i++) { clickx=(int) event.getX(i); clicky=(int) event.getY(i); if (controldirection.isClick(clickx, clicky) && !isexit) { isclick=true; if (controldirection.isUp(clickx, clicky)) { isup=true; isdown=false; isleft=false; isright=false; rolestate=2; }else if (controldirection.isDown(clickx, clicky)) { isdown=true; isup=false; isleft=false; isright=false; rolestate=3; }else if (controldirection.isLeft(clickx, clicky)) { isleft=true; isup=false; isdown=false; isright=false; rolestate=1; }else if (controldirection.isRight(clickx, clicky)) { isright=true; isup=false; isdown=false; isleft=false; rolestate=0; }else { isup=false; isdown=false; isleft=false; isright=false; isclick=false; } } if (controlattack.isClick(clickx, clicky)) { isattack=true; if (rolestate==0) { rolestate=4; }else if (rolestate==1) { rolestate=5; }else if (rolestate==2||rolestate==3) { if (enemystate[0]==0) { rolestate=4; }else { rolestate=5; } }else if (rolestate==6) { rolestate=4; }else if (rolestate==7) { rolestate=5; } } } switch (action) { case MotionEvent.ACTION_DOWN: if (backblood.isClick(clickx, clicky)&& !isexit) { if (progressblood!=100 && medicinesum>0 && !isdead) { progressblood+=30; medicinesum--; if (progressblood>=100) { progressblood=100; } } } if (progressmagic>=100 && !isexit && !isdead) { if (MyFulluse.isbigattack1 && bigattack1.isClick(clickx, clicky)) { skilltype=MyFulluse.setbig1; if (rolestate==0 || rolestate==2 || rolestate==4 || rolestate==6) { skilldirection=0; }else { skilldirection=1; } isuseskill=true; }else if (MyFulluse.isbigattack2 && bigattack2.isClick(clickx, clicky)) { skilltype=MyFulluse.setbig2; if (rolestate==0 || rolestate==2 || rolestate==4 || rolestate==6) { skilldirection=0; }else { skilldirection=1; } isuseskill=true; }else if (MyFulluse.isbigattack3 && bigattack3.isClick(clickx, clicky)) { skilltype=MyFulluse.setbig3; if (rolestate==0 || rolestate==2 || rolestate==4 || rolestate==6) { skilldirection=0; }else { skilldirection=1; } isuseskill=true; } } if (isexit && !isdead) { if (okbutton.isClick(clickx, clicky)) { closeTimer(); MyFulluse.golden += goldmoney*0.5; MyFulluse.progressblood=progressblood; MyFulluse.progressmagic=progressmagic; saveSharedPre(); Stage1Activity activity=(Stage1Activity) context; activity.finish(); }else if (cancelbutton.isClick(clickx, clicky)) { isexit=false; } } if (isdead) { if (okbutton.isClick(clickx, clicky)) { if (MyFulluse.lifesum>0) { MyFulluse.lifesum--; Toast.makeText(context, "剩余生命符"+MyFulluse.lifesum, Toast.LENGTH_SHORT).show(); progressblood=100; isdead=false; isexit=false; }else { Toast.makeText(context, "对不起,已经没有生命符", Toast.LENGTH_SHORT).show(); } }else if (cancelbutton.isClick(clickx, clicky)) { closeTimer(); Stage1Activity activity=(Stage1Activity) context; activity.finish(); } } break; case MotionEvent.ACTION_UP: isup=false; isdown=false; isleft=false; isright=false; isclick=false; isattack=false; break; default: break; } return true; }
@Override public void run() { while (isrun) { synchronized (holder) { canvas = holder.lockCanvas(); updateDraw(); holder.unlockCanvasAndPost(canvas); } try { Thread.sleep(200); } catch (InterruptedException e) { } } }
@Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }
@Override public void surfaceCreated(SurfaceHolder holder) { isrun = true; new Thread(this).start(); }
@Override public void surfaceDestroyed(SurfaceHolder holder) { isrun = false; }
}

浙公网安备 33010602011771号