用Android Studio制作游戏,先是定义一个MySurfaceView类来继承SurfaceView和实现SurfaceViewHolder.Callback和Runnable;先做游戏的背景图片,我方的飞机是一直向前走的所以背景也需要一直循环,只要用两张就行了,当一张打印结束另一张也紧随而来,如此反复的循环,便达到了背景一直在动的循环。第二个就是打印我方的战机了,定义一个绘制图形,新建一个Myplane的我方战机类,在飞机类中定义飞机的初始位置,做一个触碰的方法让战机跟着手指的移动而移动,然后在MySurfaceView调用打印就行了;接着新建一个bossplane的boss飞机类,和myplane一样设置初始位置,但是boss需要有其他的动作,这个就是自己手动添加了,比如加一个冲撞的方法。接着就是我方战机和boss的子弹了,然后设计我方子弹击打在boss身上和boss子弹击打我方战机以及boss冲撞等技能对我方战机的后果;最后还要加上子弹的声音以及游戏的背景音乐。大致思路就是这样,还有许多细节需要完善。
定义一个背景类;定义图片对象和两个y和y1的对象;因为要实现背景的循环滚动嘴上需要两张图片,当一张开始滚动之后,另一张随之而来,所以第二张图片的y1位置要等于第一张图片y的位置减去一张图片的高度。在MySurfaceView调用。
public BackGroud(Bitmap bitmap){
this.bitmap = bitmap;
y1 = 0;
y2 = y1-bitmap.getHeight();
}
接着定义一个方法来打印它们的初始位置;接着定义一个逻辑方法,让图片循环滚动,上述当第一张开始滚动的时候,第二张也要跟着滚动,便如下图
public void logic(){ //逻辑方法
y1+=10; y2+=10;
if(y1>=bitmap.getHeight()){
y1 = y2-bitmap.getHeight(); //移动在第二张上面
}
if(y2>=bitmap.getHeight()){
y2=y1-bitmap.getHeight();
}
}
这样便实现了图片的循环滚动。
定义一个飞机类;还是和背景类一样,定义图片对象和x,y横坐标,纵坐标,还有高度和宽度对象;打印构造方法。设置飞机的初始位置,定义一个touchEvent的方法,当手指触碰飞机的时候,是指移动让飞机也跟着移动。如果是boss飞机,需要设置boss的行动方式,还需要添加boss的一些技能。在MySurfaceView调用即可。
public void touchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
float ex = event.getX();
float ey = event.getY();
if (ex > x && ex < x + width && ey > y && ey < y + height) {
x = (int) (ex - width / 2);
y = (int) (ey - height / 2);
if (y < 0) {
y = 0;
}
if (y + height > MySurfaceView.height) {
y = MySurfaceView.height - height;
}
}
}
}
定义一个子弹类,照片对象,添加x,y横坐标,还有子弹的飞行速度;定义方法打印子弹的初始位置;定义一个logic逻辑类,使用swicth来区分boss子弹和战机子弹,以及boss子弹的飞行方向和战机子弹的飞行方向,它们是相反的。最后在MySurfaceView调用。
public void logic() {
switch (type){
//玩家子弹
case 0:
y -= speed;
if (y < 0) {
isDead = true;
}
break;
//boos子弹
case 1:
y += speed;
if (y < 0) {
isDead = true;
}
break;
}
}
我做得此游戏当前碰撞有3种:战机被boss碰撞;战机子弹碰撞boss;boss子弹碰撞到战机。
它们原理都是一样的:1.当战机的y坐标小于boss的y+boss的高度,并且战机y+战机高度大于boss的y左标时,便开始判断: 1.战机x坐标小于bossx坐标并且战机x+战机宽度大于boss 的x坐标,便得出战机与boss左侧碰撞;2.当战机x大于boss的x并且战机x+宽度小于boss的x+boss的宽度,便得出战机与bosss 中间碰撞;3.当战机大于boss的x坐标并且战机x+宽度大于boss的x+boss的宽度,便得出右边碰撞;这是战机与boss碰撞。
if(ybossplane.getY() ){
if (x < bossplane.getX() && x+width > bossplane.getX()) {//我方战机左边碰撞
noCollision = true;
if (Hp > 0) {
Hp--;
}
return true;
}
if (x > bossplane.getX() && x+width < bossplane.getX() + bossplane.getFrameW()) {//我方飞机中间碰撞
noCollision = true;
if (Hp > 0) {
Hp--;
}
return true;
}
if (x > bossplane.getX() && x+width > bossplane.getX()+bossplane.getFrameW()) {//我方飞机右边碰撞
noCollision = true;
if (Hp > 0) {
Hp--;
}
return true;
}
}
战机子弹碰撞boss:当战机子弹x大于boss的x坐标,并且战机子弹的x+子弹的宽度小于boss的x+boss的宽度并且战机子弹y大于boss的y坐标,并且战机子弹y小于boss的y+boss的高度。便判断出战机子弹与boss碰撞,boss掉血。
//我方战机子弹与boss飞机碰撞
public boolean isColision (Bullet bullet){
if(bullet.getX()>x&&bullet.getX()+bullet.getBitmap().getWidth()y&&bullet.getY()true);
if(bossHp<0){
MySurfaceView.GAME_STATE = 1;
}return true;
}
return false;
}
boss子弹碰撞战机:当boss子弹的x大于战机x并且boss子弹x小于战机x+战机宽度,并且boss子弹y大于战机y并且boss子弹y小于战机y+战机高度。判断战机被boss子弹击中,掉血。
//boss子弹与我方战机碰撞
if (bullet.getX() > x && bullet.getX() < x + width && bullet.getY() > y && bullet.getY() < y + height) {
noCollision = true;
if (Hp > 0) {
Hp--;
}
return true;
}
定义一个boom的类;添加x,y坐标,爆炸的图片是7张,需要一张一张的播放。来实现boss 的飞机爆炸效果。设置初始位置:当战机子弹击中boss时,就需要爆炸的效果,所以它的初始位置在boss的坐标点,具体坐标可以自己改动。
for(int i=0;i<boomVector.size();i++){
if (boomVector.elementAt(i).isEnd()) {
boomVector.remove(i);
}else{
boomVector.elementAt(i).draw(canvas,paint);//打印爆炸
}
}
创建一个GameSoundPool类;添加对象,导入音乐用于调用;switch来判断使用哪一个音乐。在需要音效的后面调用即可。
public class GameSoundPool {
private SoundPool soundPool;
private int s1,s2;
public GameSoundPool(Context context){
this.soundPool = new SoundPool(2,AudioManager.STREAM_MUSIC,0);
s1 = soundPool.load(context,R.raw.shoot,1);
s2 = soundPool.load(context,R.raw.explosion,1);
}
public void playSound(int s){
switch (s){
case 1:
soundPool.play(s1,1,1,1,0,1.0f);
break;
case 2:
soundPool.play(s2,1,1,1,0,1.0f);
break;
}
}
}
主程序的MySurfaceView使用了继承SurfaceView和实现了 SurfaceHolder.Callback,Runnable接口;
每个类中需要在自己类使用的对象都需要使用封装,比如:每个图片的x,y的坐标和一些需要使用的标志位;
学了这么些天,说没有收获是假的,纵使再怎么不会,也该学到了一些知识和技能。
这一个月来,江哥带领我们复习了java的基础知识并细心讲解,让我的之前的java的印象能够更深一点,然后慢慢的做一些小的游戏,又学习了许多别的知识。现在的飞机大战的游戏还不够完善,我希望并坚信我能够也可以让这个代码完善下去。
我收获了更多的java知识和android studio的知识,也充实了自己的生活,这让我感到生活很快乐。我需要不断的探索与学习,开拓更深的层次。