Android_(游戏)打飞机04:绘画敌机、添加子弹
(游戏)打飞机01:前言 传送门
(游戏)打飞机02:游戏背景滚动 传送门
(游戏)打飞机03:控制玩家飞机 传送门
(游戏)打飞机04:绘画敌机、添加子弹 传送门
(游戏)打飞机05:处理子弹,击中敌机,添加计分板 传送门
(游戏)打飞机06:后续 传送门
绘画敌机、添加子弹效果
package com.example.administrator.myapplication; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager; import java.util.ArrayList;
import java.util.List;
import java.util.Random; /**
* Created by Administrator on 2018/8/9.
*/ public class dafeijiGameView extends SurfaceView implements
SurfaceHolder.Callback,Runnable,android.view.View.OnTouchListener{ private Bitmap my;//自己
private Bitmap baozha;//爆炸
private Bitmap bg;//背景
private Bitmap diren;//敌人
private Bitmap zidan;//子弹
private Bitmap erjihuancun;//二级缓存
private WindowManager windowManager;//获得界面长宽高
private int display_w; //界面的宽
private int display_h; //界面的高
private ArrayList<GameImage> gameImage = new ArrayList();
private ArrayList<Zidan> zidans = new ArrayList<Zidan>(); public dafeijiGameView(Context context) {
super(context);
getHolder().addCallback(this);
//事件注册
this.setOnTouchListener(this);
} private void init(){
//加载照片
my= BitmapFactory.decodeResource(getResources(),R.drawable.my);
baozha= BitmapFactory.decodeResource(getResources(),R.drawable.baozha);
bg= BitmapFactory.decodeResource(getResources(),R.drawable.bg);
diren= BitmapFactory.decodeResource(getResources(),R.drawable.diren);
zidan= BitmapFactory.decodeResource(getResources(),R.drawable.zidan); erjihuancun=Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888);
gameImage.add(new BeijingImage(bg)); //先加入背景照片
gameImage.add(new FeijiImage(my));
gameImage.add(new DijiImage(diren)); } FeijiImage selectfeiji;
@Override
public boolean onTouch(View v, MotionEvent event) {
//手接近屏幕产生的事件
if(event.getAction()==MotionEvent.ACTION_DOWN){
for(GameImage game: gameImage){
if(game instanceof FeijiImage){ FeijiImage feiji = (FeijiImage)game; //判断条件为真时选中飞机
if(feiji.getX()<event.getX()&&
feiji.getY()<event.getY()&&
feiji.getX()+feiji.getWidth()>event.getX() &&
feiji.getY()+feiji.getHeigth()>event.getY()){
selectfeiji=feiji; }else{
selectfeiji=null;
}
break;
}
}
}else if(event.getAction()==MotionEvent.ACTION_MOVE){
//移动鼠标
if( selectfeiji!=null){
selectfeiji.setX((int)event.getX()-selectfeiji.getWidth()/2);
selectfeiji.setY((int)event.getY()-selectfeiji.getHeigth()/2);
} }else if(event.getAction()==MotionEvent.ACTION_UP){
//松开鼠标
selectfeiji=null;
} return true;
} private interface GameImage{
public Bitmap getBitmap();
public int getX();
public int getY();
} private class Zidan implements GameImage{ Bitmap zidan;
private FeijiImage feiji;
private int x;
private int y; public Zidan(FeijiImage feiji,Bitmap zidan){
this.feiji=feiji;
this.zidan=zidan; x=(feiji.getX()+feiji.getWidth()/2)-25;//居中位置
y=feiji.getY()-zidan.getHeight();
} public Bitmap getBitmap() {
y-=19;
if(y<=-10){
zidans.remove(this);
}
return zidan;
} @Override
public int getX() {
return x;
} @Override
public int getY() {
return y;
}
} private class DijiImage implements GameImage{ private Bitmap diren = null; private List<Bitmap> bitmaps = new ArrayList<Bitmap>();
private int x;
private int y; public DijiImage(Bitmap diren){
this.diren=diren;
bitmaps.add(Bitmap.createBitmap(diren,0,0,diren.getWidth()/4,diren.getHeight()));
bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*1,0,diren.getWidth()/4,diren.getHeight()));
bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*2,0,diren.getWidth()/4,diren.getHeight()));
bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*3,0,diren.getWidth()/4,diren.getHeight())); y=-diren.getHeight();
Random ran = new Random();
x=ran.nextInt(display_w-(diren.getWidth()/4)); } private int index=0;
private int num =0;
@Override
public Bitmap getBitmap() {
Bitmap bitmap = bitmaps.get(index);
//控制切换四个飞机的频率
if(num == 7){
index++;
if(index == bitmaps.size()){
index=0;
}
num=0;
}
y+=3;
num++; if(y>display_h){
gameImage.remove(this);
} return bitmap;
} @Override
public int getX() {
return x;
} @Override
public int getY() {
return y;
}
} private class FeijiImage implements GameImage{ private Bitmap my;
private int x;
private int y;
private int width;
private int heigth; private int getWidth(){
return width;
} private int getHeigth(){
return heigth;
} private List<Bitmap> bitmaps = new ArrayList<Bitmap>(); private FeijiImage(Bitmap my){
this.my=my;
bitmaps.add(Bitmap.createBitmap(my,0,0,my.getWidth()/4,my.getHeight()));
bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4),0,my.getWidth()/4,my.getHeight()));
bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*2,0,my.getWidth()/4,my.getHeight()));
bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*3,0,my.getWidth()/4,my.getHeight()));
//得到战机的高和宽
width=my.getWidth()/4;
heigth=my.getHeight();
x=(display_w - my.getWidth()/4)/2;
y=display_h-my.getHeight()-30;
} private int index=0;
private int num =0;
@Override
public Bitmap getBitmap() {
Bitmap bitmap = bitmaps.get(index);
//控制切换四个飞机的频率
if(num == 7){
index++;
if(index == bitmaps.size()){
index=0;
}
num=0;
}
num++;
return bitmap;
} @Override
public int getX() {
return x;
} @Override
public int getY() {
return y;
} public void setY(int y){
this.y=y;
} public void setX(int x){
this.x=x;
} } //负责背景照片的处理
private class BeijingImage implements GameImage{
private Bitmap bg;
private BeijingImage(Bitmap bg){
this.bg=bg;
newBitmap = Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888);
} private Bitmap newBitmap = null;
private int height = 0; public Bitmap getBitmap(){
Paint p = new Paint();
Canvas canvas = new Canvas(newBitmap);
canvas.drawBitmap(bg,
new Rect(0,0,bg.getWidth(),bg.getHeight()),
new Rect(0,height,display_w,display_h+height),p); canvas.drawBitmap(bg,
new Rect(0,0,bg.getWidth(),bg.getHeight()),
new Rect(0,-display_h+height,display_w,height),p); height++;
if(height==display_h){
height=0;
}
return newBitmap;
} public int getX(){
return 0;
} public int getY(){
return 0;
}
} private boolean state = false;
private SurfaceHolder holder; //绘画中心
public void run() {
Paint p1 = new Paint();
int diren_num=0;//
int zidan_num=0;
try{
while(state){
if(selectfeiji!=null){
if(zidan_num==10){
zidans.add(new Zidan(selectfeiji,zidan));
zidan_num=0;
}
zidan_num++;
} Canvas newCanvas = new Canvas(erjihuancun);
for(GameImage image:(List<GameImage>)gameImage.clone()){
newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1);
} for(GameImage image:(List<GameImage>)zidans.clone()){
newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1);
} if(diren_num==150){
diren_num=0;
gameImage.add(new DijiImage(diren));
}
diren_num++;
Canvas canvas = holder.lockCanvas();
canvas.drawBitmap(erjihuancun,0,0,p1);
holder.unlockCanvasAndPost(canvas);
Thread.sleep(10);
}
}catch(Exception e){
}
} @Override
public void surfaceCreated(SurfaceHolder holder) {
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
state = false;
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
//得到屏幕的宽和高
display_w=width;
display_h=height;
init();
this.holder=holder;
state = true;
new Thread(this).start();
} }
dafeijiGameView.java
package com.example.administrator.myapplication; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; public class MainActivity extends AppCompatActivity{ @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//去掉标题
// requestWindowFeature(Window.FEATURE_NO_TITLE);
dafeijiGameView view = new dafeijiGameView(this); setContentView(view);
} }
MainActivity.java
实现过程
绘制敌机
private class DijiImage implements GameImage{ private Bitmap diren = null; private List<Bitmap> bitmaps = new ArrayList<Bitmap>();
private int x;
private int y; public DijiImage(Bitmap diren){
this.diren=diren;
bitmaps.add(Bitmap.createBitmap(diren,0,0,diren.getWidth()/4,diren.getHeight()));
bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*1,0,diren.getWidth()/4,diren.getHeight()));
bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*2,0,diren.getWidth()/4,diren.getHeight()));
bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*3,0,diren.getWidth()/4,diren.getHeight())); y=-diren.getHeight();
Random ran = new Random();
x=ran.nextInt(display_w-(diren.getWidth()/4)); } private int index=0;
private int num =0;
@Override
public Bitmap getBitmap() {
Bitmap bitmap = bitmaps.get(index);
//控制切换四个飞机的频率
if(num == 7){
index++;
if(index == bitmaps.size()){
index=0;
}
num=0;
}
y+=3;
num++; if(y>display_h){
gameImage.remove(this);
} return bitmap;
} @Override
public int getX() {
return x;
} @Override
public int getY() {
return y;
}
}
DijiImage.java
初始化游戏时候加载敌机类
private void init(){
//加载照片
my= BitmapFactory.decodeResource(getResources(),R.drawable.my);
baozha= BitmapFactory.decodeResource(getResources(),R.drawable.baozha);
bg= BitmapFactory.decodeResource(getResources(),R.drawable.bg);
diren= BitmapFactory.decodeResource(getResources(),R.drawable.diren);
zidan= BitmapFactory.decodeResource(getResources(),R.drawable.zidan); erjihuancun=Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888);
gameImage.add(new BeijingImage(bg)); //先加入背景照片
gameImage.add(new FeijiImage(my));
gameImage.add(new DijiImage(diren));
}
绘制敌机飞行动画
private List<Bitmap> bitmaps = new ArrayList<Bitmap>();
将四张敌机加入链表
bitmaps.add(Bitmap.createBitmap(diren,0,0,diren.getWidth()/4,diren.getHeight()));
bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*1,0,diren.getWidth()/4,diren.getHeight()));
bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*2,0,diren.getWidth()/4,diren.getHeight()));
bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*3,0,diren.getWidth()/4,diren.getHeight()));
public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
从原始位图剪切图像,这是一种高级的方式。可以用Matrix(矩阵)来实现旋转等高级方式截图
Bitmap source:要从中截图的原始位图
int x:起始x坐标
int y:起始y坐标
int width:要截的图的宽度
int height:要截的图的宽度
Bitmap.Config config:一个枚举类型的配置,可以定义截到的新位图的质量

private int index=0;
private int num =0;
@Override
public Bitmap getBitmap() {
Bitmap bitmap = bitmaps.get(index);
//控制切换四个飞机的频率
if(num == 7){
index++;
if(index == bitmaps.size()){
index=0;
}
num=0;
} //y+=3控制敌机下降速度
y+=3;
随机位置生成敌机
y=-diren.getHeight();
Random ran = new Random();
x=ran.nextInt(display_w-(diren.getWidth()/4));
在游戏绘画中心中添加敌机出现
//绘画中心
public void run() {
Paint p1 = new Paint();
int diren_num=0;//
try{
while(true){
Canvas newCanvas = new Canvas(erjihuancun);
for(GameImage image:(List<GameImage>)gameImage.clone()){
newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1);
}
if(diren_num==150){
diren_num=0;
gameImage.add(new DijiImage(diren));
}
diren_num++;
Canvas canvas = holder.lockCanvas();
canvas.drawBitmap(erjihuancun,0,0,p1);
holder.unlockCanvasAndPost(canvas);
Thread.sleep(10);
}
}catch(Exception e){
}
}
敌机出现频率
if(diren_num==150){
diren_num=0;
gameImage.add(new DijiImage(diren));
}
diren_num++;
package com.example.administrator.myapplication; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager; import java.util.ArrayList;
import java.util.List;
import java.util.Random; /**
* Created by Administrator on 2018/8/9.
*/ public class dafeijiGameView extends SurfaceView implements
SurfaceHolder.Callback,Runnable,android.view.View.OnTouchListener{ private Bitmap my;//自己
private Bitmap baozha;//爆炸
private Bitmap bg;//背景
private Bitmap diren;//敌人
private Bitmap zidan;//子弹
private Bitmap erjihuancun;//二级缓存
private WindowManager windowManager;//获得界面长宽高
private int display_w; //界面的宽
private int display_h; //界面的高
private ArrayList<GameImage> gameImage = new ArrayList(); public dafeijiGameView(Context context) {
super(context);
getHolder().addCallback(this);
//事件注册
this.setOnTouchListener(this);
} private void init(){
//加载照片
my= BitmapFactory.decodeResource(getResources(),R.drawable.my);
baozha= BitmapFactory.decodeResource(getResources(),R.drawable.baozha);
bg= BitmapFactory.decodeResource(getResources(),R.drawable.bg);
diren= BitmapFactory.decodeResource(getResources(),R.drawable.diren);
zidan= BitmapFactory.decodeResource(getResources(),R.drawable.zidan); erjihuancun=Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888);
gameImage.add(new BeijingImage(bg)); //先加入背景照片
gameImage.add(new FeijiImage(my));
gameImage.add(new DijiImage(diren));
} FeijiImage selectfeiji;
@Override
public boolean onTouch(View v, MotionEvent event) {
//手接近屏幕产生的事件
if(event.getAction()==MotionEvent.ACTION_DOWN){
for(GameImage game: gameImage){
if(game instanceof FeijiImage){ FeijiImage feiji = (FeijiImage)game; //判断条件为真时选中飞机
if(feiji.getX()<event.getX()&&
feiji.getY()<event.getY()&&
feiji.getX()+feiji.getWidth()>event.getX() &&
feiji.getY()+feiji.getHeigth()>event.getY()){
selectfeiji=feiji; }else{
selectfeiji=null;
}
break;
}
}
}else if(event.getAction()==MotionEvent.ACTION_MOVE){
//移动鼠标
if( selectfeiji!=null){
selectfeiji.setX((int)event.getX()-selectfeiji.getWidth()/2);
selectfeiji.setY((int)event.getY()-selectfeiji.getHeigth()/2);
} }else if(event.getAction()==MotionEvent.ACTION_UP){
//松开鼠标
selectfeiji=null;
} return true;
} private interface GameImage{
public Bitmap getBitmap();
public int getX();
public int getY();
} private class DijiImage implements GameImage{ private Bitmap diren = null; private List<Bitmap> bitmaps = new ArrayList<Bitmap>();
private int x;
private int y; public DijiImage(Bitmap diren){
this.diren=diren;
bitmaps.add(Bitmap.createBitmap(diren,0,0,diren.getWidth()/4,diren.getHeight()));
bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*1,0,diren.getWidth()/4,diren.getHeight()));
bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*2,0,diren.getWidth()/4,diren.getHeight()));
bitmaps.add(Bitmap.createBitmap(diren,(diren.getWidth()/4)*3,0,diren.getWidth()/4,diren.getHeight())); y=-diren.getHeight();
Random ran = new Random();
x=ran.nextInt(display_w-(diren.getWidth()/4)); } private int index=0;
private int num =0;
@Override
public Bitmap getBitmap() {
Bitmap bitmap = bitmaps.get(index);
//控制切换四个飞机的频率
if(num == 7){
index++;
if(index == bitmaps.size()){
index=0;
}
num=0;
}
y+=3;
num++; if(y>display_h){
gameImage.remove(this);
} return bitmap;
} @Override
public int getX() {
return x;
} @Override
public int getY() {
return y;
}
} private class FeijiImage implements GameImage{ private Bitmap my;
private int x;
private int y;
private int width;
private int heigth; private int getWidth(){
return width;
} private int getHeigth(){
return heigth;
} private List<Bitmap> bitmaps = new ArrayList<Bitmap>(); private FeijiImage(Bitmap my){
this.my=my;
bitmaps.add(Bitmap.createBitmap(my,0,0,my.getWidth()/4,my.getHeight()));
bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4),0,my.getWidth()/4,my.getHeight()));
bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*2,0,my.getWidth()/4,my.getHeight()));
bitmaps.add(Bitmap.createBitmap(my,(my.getWidth()/4)*3,0,my.getWidth()/4,my.getHeight()));
//得到战机的高和宽
width=my.getWidth()/4;
heigth=my.getHeight();
x=(display_w - my.getWidth()/4)/2;
y=display_h-my.getHeight()-30;
} private int index=0;
private int num =0;
@Override
public Bitmap getBitmap() {
Bitmap bitmap = bitmaps.get(index);
//控制切换四个飞机的频率
if(num == 7){
index++;
if(index == bitmaps.size()){
index=0;
}
num=0;
}
num++;
return bitmap;
} @Override
public int getX() {
return x;
} @Override
public int getY() {
return y;
} public void setY(int y){
this.y=y;
} public void setX(int x){
this.x=x;
} } //负责背景照片的处理
private class BeijingImage implements GameImage{
private Bitmap bg;
private BeijingImage(Bitmap bg){
this.bg=bg;
newBitmap = Bitmap.createBitmap(display_w,display_h, Bitmap.Config.ARGB_8888);
} private Bitmap newBitmap = null;
private int height = 0; public Bitmap getBitmap(){
Paint p = new Paint();
Canvas canvas = new Canvas(newBitmap);
canvas.drawBitmap(bg,
new Rect(0,0,bg.getWidth(),bg.getHeight()),
new Rect(0,height,display_w,display_h+height),p); canvas.drawBitmap(bg,
new Rect(0,0,bg.getWidth(),bg.getHeight()),
new Rect(0,-display_h+height,display_w,height),p); height++;
if(height==display_h){
height=0;
}
return newBitmap;
} public int getX(){
return 0;
} public int getY(){
return 0;
}
} private boolean state = false;
private SurfaceHolder holder; //绘画中心
public void run() {
Paint p1 = new Paint();
int diren_num=0;//
try{
while(true){
Canvas newCanvas = new Canvas(erjihuancun);
for(GameImage image:(List<GameImage>)gameImage.clone()){
newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1);
}
if(diren_num==150){
diren_num=0;
gameImage.add(new DijiImage(diren));
}
diren_num++;
Canvas canvas = holder.lockCanvas();
canvas.drawBitmap(erjihuancun,0,0,p1);
holder.unlockCanvasAndPost(canvas);
Thread.sleep(10);
}
}catch(Exception e){
}
} @Override
public void surfaceCreated(SurfaceHolder holder) {
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
state = false;
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
//得到屏幕的宽和高
display_w=width;
display_h=height;
init();
this.holder=holder;
state = true;
new Thread(this).start();
} }
dafeijiGameView
游戏中添加子弹
private class Zidan implements GameImage{ Bitmap zidan;
private FeijiImage feiji;
private int x;
private int y; public Zidan(FeijiImage feiji,Bitmap zidan){
this.feiji=feiji;
this.zidan=zidan; x=(feiji.getX()+feiji.getWidth()/2)-25;//居中位置
y=feiji.getY()-zidan.getHeight();
} public Bitmap getBitmap() {
y-=19;
if(y<=-10){
zidans.remove(this);
}
return zidan;
} @Override
public int getX() {
return x;
} @Override
public int getY() {
return y;
}
}
zidan.class
判断子弹出现飞机位置
public Zidan(FeijiImage feiji,Bitmap zidan){
this.feiji=feiji;
this.zidan=zidan; x=(feiji.getX()+feiji.getWidth()/2)-25;//居中位置
y=feiji.getY()-zidan.getHeight();
}
(-25是自己微调)
子弹超出边界的时候释放子弹内存,减少手机开销
public Bitmap getBitmap() {
y-=19;
if(y<=-10){
zidans.remove(this);
}
return zidan;
}
不断的出现新的子弹
if(selectfeiji!=null){
if(zidan_num==10){
zidans.add(new Zidan(selectfeiji,zidan));
zidan_num=0;
}
zidan_num++;
}
便利所有的子弹
for(GameImage image:(List<GameImage>)zidans.clone()){
newCanvas.drawBitmap(image.getBitmap(),image.getX(),image.getY(),p1);
}
Android_(游戏)打飞机04:绘画敌机、添加子弹的更多相关文章
- Android_(游戏)打飞机05:处理子弹,击中敌机,添加计分板
(游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹 传送门 (游戏)打飞机05:处理子弹, ...
- Android_(游戏)打飞机06:后续
(游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹 传送门 (游戏)打飞机05:处理子弹, ...
- Android_(游戏)打飞机03:控制玩家飞机
(游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹 传送门 (游戏)打飞机05:处理子弹, ...
- Android_(游戏)打飞机02:游戏背景滚动
(游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹 传送门 (游戏)打飞机05:处理子弹, ...
- Android_(游戏)打飞机01:前言
(游戏)打飞机01:前言 传送门 (游戏)打飞机02:游戏背景滚动 传送门 (游戏)打飞机03:控制玩家飞机 传送门 (游戏)打飞机04:绘画敌机.添加子弹 传送门 (游戏)打飞机05:处理子弹, ...
- Python小游戏之 - 飞机大战美女 !
用Python写的"飞机大战美女"小游戏 源代码如下: # coding=utf-8 import os import random import pygame # 用一个常量来存 ...
- 微信小游戏 demo 飞机大战 代码分析 (二)(databus.js)
微信小游戏 demo 飞机大战 代码分析(二)(databus.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码分析(三)(spirit. ...
- 微信小游戏 demo 飞机大战 代码分析 (一)(game.js, main.js)
微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码分析(二)(databus.js) 微信小游戏 demo 飞机大战 代码分析(三)(spirit. ...
- 微信demo小游戏:飞机大战从无到有
微信demo游戏飞机大战从无到有 现在创建新项目会默认给飞机大战的demo,这里给大家从基础开始讲解游戏的从无到有是怎么实现的. 具体实现步骤: 创建背景图->背景图运动起来->创建飞机并 ...
随机推荐
- 2019CCPC-江西省赛 -A Cotree (树形DP,求树上一点到其他点的距离之和)
我是傻逼我是傻逼 #include<bits/stdc++.h> using namespace std; const int maxn=4e5+50; typedef long long ...
- JWT了解和实际使用
一.JWT JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案.虫虫今天给大家介绍JWT的原理和用法. 1.跨域身份验证 Internet服务无法与用户身份验证分开.一般过程如下 ...
- 禁用Win10自带截图工具快捷键(Shift+Win+S)
由于在微信之前,多年使用QQ的缘故,已经习惯了使用Ctrl+Alt+A进行截图,虽然QQ后来还专门提供了TIM(Office-QQ),但仍然渐渐的以微信为主,TIM甚至已经很少登录,之前登录也仅仅是为 ...
- Codeforces 1221E. Game With String
传送门 首先每一段连续的 $...$ 都是互不影响的,所以可以一段段考虑 考虑最简单的情况,此时每一段都大于等于 $a$ 并且小于 $2b$ ,那么每一段都只能放一次,胜负直接根据段数即可得到答案 考 ...
- 【原创】大叔经验分享(55)spark连接kudu报错
spark-2.4.2kudu-1.7.0 开始尝试 1)自己手工将jar加到classpath spark-2.4.2-bin-hadoop2.6+kudu-spark2_2.11-1.7.0-cd ...
- Git复习(六)之标签管理
标签管理 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库 ...
- 移动端H5开发自适应技巧
移动端H5开发,必要要做到自适应各种分辨率的手机,下面由我为大家大致说一下,需要3步走 第一:head标签中添加: <meta name="viewport" content ...
- java实现spark常用算子之filter
import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...
- 分布式的几件小事(四)dubbo负载均衡策略和集群容错策略
1.dubbo负载均衡策略 ①random loadbalance 策略 默认情况下,dubbo是random loadbalance 随机调用实现负载均衡,可以对provider不同实例设置不同的权 ...
- yarn的安装步骤
yarn依赖npm,是npm中的一个包 https://www.npmjs.com/package/yarn 1.安装 npm i -g -yarn 2.测试是否安装成功 yarn --vresion ...