Android Canvas打飛機之別人家的戰(zhàn)斗機

前面講解了<a href="http://www.lxweimin.com/p/8b65e7e73f70">主角</a>的誕生以及<a href="http://www.lxweimin.com/p/966a3e9d8bdf">武器配置</a>,只有主角在主場豈不是太寂寞?所以今天這里主要來實現(xiàn)敵方戰(zhàn)斗機的誕生。

1.敵機類型主要提供的樣式不多,主要實現(xiàn)一下不同敵機出場的飛行軌跡。創(chuàng)建一個DrawEnemy的敵機類,并且定義敵機類型
public class DrawEnemy extends DrawGame {
    /**
     * 敵機類型
     */
    public final static int TYPE_A=1;
    public final static int TYPE_B=2;
    public final static int TYPE_C=3;
    public final static int TYPE_D=4;
    public final static int TYPE_E=5;
    public final static int TYPE_F=6;
    public final static int TYPE_G=7;
    public final static int TYPE_H=8;
    public final static int TYPE_I=9;
    public final static int TYPE_J=10;
    public final static int TYPE_K=11;
    public final static int TYPE_L=12;
    public final static int TYPE_M=13;
    public final static int TYPE_N=14;
    public final static int TYPE_O=15;
    public final static int TYPE_P=16;
    public final static int TYPE_Q=17;
    public final static int TYPE_R=18;
    public final static int TYPE_S=19;
    /**
     * 高級敵機
     */
    public final static int TYPE_T=20;
    /**
     * 高級敵機
     */
    public final static int TYPE_U=21;
    /**
     * 敵機自動跟蹤主角
     */
    public final static int TYPE_V=22;
    /**
     * 敵機自動跟蹤主角
     */
    public final static int TYPE_W=23;
    public final static int TYPE_X=24;
    public final static int TYPE_Y=25;
    public final static int TYPE_Z=26;
2.敵機主要特性有生命值,飛行軌跡,飛行速度,旋轉運動,沖擊模式,是否死亡等自定義的一些屬性
/**
     * 敵機的生命值
     */
    private int mEnemyLife;
    /**
     * 當前敵機飛行模式
     */
    private int mEnemyType;
    /**
     * 敵機飛行速度
     */
    private float mEnemySpeed;
    private float mEnemySpeedX;
    private float mEnemySpeedY;
    /**
     * 敵機初始化位置距離左邊上邊的距離
     */
    private float mMarginLeft;
    private float mMarginTop;
    /**
     * 戰(zhàn)機是否死亡
     */
    private boolean isDead;
    private Random mRandom;
    private float mAngle;
    /**
     * 敵機在某一位置停留
     * 位置從屏幕左上角計算
     */
    private boolean mEnemyStopLeft, mEnemyStopTop;
    /**
     * 讓敵機在某一個位置停留一段時常
     */
    public int stopToTime;
    private float mTempEnemyY = 1f;
3.初始化敵機樣式,類型包括追蹤主角類型以及普通類型,追蹤主角類型需要接收到主角在屏幕的位置,然后計算出敵機的追蹤速度。
@Override
    void initialize(Object... objects) {
        super.initialize(objects);
        mRandom = new Random();
        this.mEnemy = (Bitmap) objects[0];
        this.mEnemyX = (float) objects[1];
        this.mEnemyY = (float) objects[2];
        this.mEnemyLife = (int) objects[3];
        this.mEnemyType = (int) objects[4];
        mMatrix = new Matrix();
        if(objects.length==6){//敵機去追殺主角的戰(zhàn)機類型
            mEnemySpeedY = ScreenUtils.getScreenHeight(getContext())/100;
            mEnemySpeedX = ((float)objects[5]-this.mEnemyY)/100;
        }else{//普通類型,不可追蹤主角
            onSetSpeed();
        }
    }
4.為了體驗出游戲中的真實感,敵機的頭部朝向需要對著主角的位置,這樣才有一種靈活對戰(zhàn)的感覺,實時實現(xiàn)角度根據(jù)主角變化
/**
     * 敵機相對于主角方向旋轉
     * 保證敵機頭部朝向跟隨主機位置移動
     */
    private Bitmap getMatrixBitmap(){
        if(mAngle==0){
            return mEnemy;
        }
        mMatrix.reset();
        //旋轉角度
        mMatrix.setRotate(mAngle);
        return Bitmap.createBitmap(mEnemy,0, 0, mEnemy.getWidth(), mEnemy.getHeight(), mMatrix, true);
    }
5.前面提到了兩種模式,其中追蹤主角模式就是敵機直接向主角方向移動
/**
     * 面向主角方向 重新計算移動坐標
     * isTrack 是否需要去追殺主角
     */
    public void getAngleRotate(float playerX,float playerY,boolean isTrack){
        float cx = playerX-mEnemyX;
        float cy = playerY-mEnemyY;
        float k = Math.abs(cy/cx);//計算偏移量 斜率
        mAngle = (float) (90-Math.toDegrees(Math.atan(k)));//把弧度轉換成角度
        if(cx>0){
            mAngle = -mAngle;
        }
        if(isTrack){//重新計算坐標 追殺主角
            mEnemySpeedX = cx/50;
            mEnemySpeedY = cy/50;
            if(cy<0){
                mEnemySpeedY=-mEnemySpeedY;
            }
            if((cx<0&&mEnemySpeedX>0)||(cx>0&&mEnemySpeedX<0)){
                mEnemySpeedX=-mEnemySpeedX;
            }
        }
    }
6.根據(jù)不同敵機的類型計算出不同的戰(zhàn)機運行速度。
/**
     * 計算敵機飛行速度
     */
    private void onSetSpeed(){
        float screenH = ScreenUtils.getScreenHeight(getContext());
        float screenW = ScreenUtils.getScreenWidth(getContext());
        switch (mEnemyType){
            case TYPE_E:
                float min = screenH/200;
                mEnemySpeed = new Random().nextInt(3)+min;
                break;
            case TYPE_R:
                mEnemySpeed  = screenH/160;
                mEnemySpeedX = 1;
                mEnemySpeedY = mEnemySpeed;
                break;
            case TYPE_S:
                mEnemySpeed = screenH/160;
                mEnemySpeedX = 1;
                mEnemySpeedY = mEnemySpeed;
                break;
            case TYPE_T:
                mEnemySpeed = 6;
                mEnemySpeedX = 2;
                mMarginLeft = mEnemy.getWidth()*3;
                mMarginTop = mEnemy.getHeight()*3;
                break;
            case TYPE_U:
                mEnemySpeed = 6;
                mEnemySpeedX = 2;
                mMarginLeft = screenW - mEnemy.getWidth()*4;
                mMarginTop = mEnemy.getHeight()*3;
                break;
            case TYPE_X:
                mEnemySpeed = screenH/80;
                mEnemySpeedX = mRandom.nextInt(10);
                if(mRandom.nextBoolean()){
                    mEnemySpeedX = -mEnemySpeedX;
                }
                mEnemySpeedY = screenH/160;
                break;
            case TYPE_Y:
                mEnemySpeed = screenH/160;
                mEnemySpeedX =screenH/160;
                mEnemySpeedY =screenH/160;
                break;
            case TYPE_Z:
                mEnemySpeed = screenH/220;
                break;
            default:
                mEnemySpeed = screenH/160f;
                break;
        }
    }```
######7.通過updateGame的方法來進行戰(zhàn)機移動,updateGame中實現(xiàn)了26種運行的軌跡算法,其實就是通過改變敵機XY坐標進行對應的移動動畫。

/**
* 更新敵機運行軌跡
* 并且判斷敵機是否離開屏幕
/
@Override
void updateGame(){
float screenH = ScreenUtils.getScreenHeight(getContext());
float screenW = ScreenUtils.getScreenWidth(getContext());
switch (mEnemyType){
case TYPE_A://左邊垂直下降
if(!isDead){
if(mEnemySpeed<=3){
mEnemySpeed+=1;
}
mEnemyY+=mEnemySpeed;
if(mEnemyY>screenH){
isDead=true;
}
}
break;
case TYPE_B:
if(!isDead){//向右傾斜下降
mEnemyX+=mEnemySpeed/2;
mEnemyY+=mEnemySpeed;
}
break;
case TYPE_C:
if(!isDead){//向左傾斜下降
mEnemyX-=mEnemySpeed/2;
mEnemyY+=mEnemySpeed;
}
break;
case TYPE_D:
if(!isDead){//右邊垂直傾斜下降
if(mEnemySpeed<=3){
mEnemySpeed+=1;
}
mEnemyY+=mEnemySpeed;
}
break;
case TYPE_E:
if(!isDead){//普通模式 子彈自動追蹤主角
if(mEnemyY>screenH){
isDead = true;
break;
}
mEnemyY+=mEnemySpeed;
}
break;
case TYPE_F:
if(!isDead){//向右橫向移動循環(huán)碰撞
if(mAngle>=360){
mAngle=0;
}
mAngle+=1;
if(mEnemyX>=screenW-mEnemy.getWidth()){
mEnemyStopLeft = true;
}else if(mEnemyX<=0){
mEnemyStopLeft = false;
}
if(mEnemyStopLeft){
mEnemyX-=mEnemySpeed;
}else{
mEnemyX+=mEnemySpeed;
}
mEnemyY+=mEnemySpeed/2;
}
break;
case TYPE_G:
if(!isDead){//向左橫向移動循環(huán)碰撞
if(mAngle<=-360){
mAngle=0;
}
mAngle-=1;
if(mEnemyX<=0){
mEnemyStopLeft = true;
}else if(mEnemyX>screenW-mEnemy.getWidth()){
mEnemyStopLeft = false;
}
if(mEnemyStopLeft){
mEnemyX+=mEnemySpeed;
}else{
mEnemyX-=mEnemySpeed;
}
mEnemyY+=mEnemySpeed/2;
}
break;
case TYPE_H:
if(!isDead){//想右切面運行
if(mEnemyY>=screenH/2||mEnemyX>screenW-mEnemy.getWidth()){
mEnemyStopLeft = true;
}
if(mEnemyStopLeft){
if(mEnemyStopTop){
mEnemyX +=0;
mEnemyY +=mEnemySpeed;
}else{
mEnemyX-=mEnemySpeed/2;
mEnemyY-=mEnemySpeed/2;
}
if(mEnemyY<=0){
mEnemyStopTop = true;
}
}else{
mEnemyX+=mEnemySpeed/2;
mEnemyY+=mEnemySpeed/2;
}
}
break;
case TYPE_I:
if(!isDead){//想左切面運行
if(mEnemyY>=screenH/2||mEnemyX-mEnemy.getWidth()<=0){
mEnemyStopLeft = true;
}
if(mEnemyStopLeft){
if(mEnemyStopTop){
mEnemyX+=0;
mEnemyY+=mEnemySpeed;
}else{
mEnemyX+=mEnemySpeed/2;
mEnemyY-=mEnemySpeed/2;
}
if(mEnemyY<=0){
mEnemyStopTop = true;
}
}else{
mEnemyX-=mEnemySpeed/2;
mEnemyY+=mEnemySpeed/2;
}
}
break;
case TYPE_J:
if(!isDead){//右邊V形運動
if(mEnemyY>=screenH/2){
mEnemyStopLeft = true;
}
if(mEnemyStopLeft){
mEnemyX+=mEnemySpeedX;
mEnemyY+=mEnemySpeedY;
}else{
mAngle=0;
mEnemyY+=mEnemySpeed;
mEnemyX+=mEnemySpeed/2;
}
}
break;
case TYPE_K:
if(!isDead){//左邊V形運動
if(mEnemyY>=screenH/2){
mEnemyStopLeft = true;
}
if(mEnemyStopLeft){
mEnemyX+=mEnemySpeedX;
mEnemyY+=mEnemySpeedY;
}else{
mAngle=0;
mEnemyY+=mEnemySpeed;
mEnemyX-=mEnemySpeed/2;
}
}
break;
case TYPE_L:
if(!isDead){//向上沖鋒戰(zhàn)斗機
if(mEnemyStopLeft){
mEnemyY-=mEnemySpeed/2;
stopToTime++;
if(mEnemyY<0||mEnemyY>screenH){
isDead = true;
break;
}
if(mEnemyY<=screenH/7){
if(stopToTime >=500){
mEnemySpeed=20;
}else{
mEnemyStopLeft =false;
}
}
}else{
mEnemyY+=mEnemySpeed/2;
if(mEnemyY>=screenH/3){
mEnemyStopLeft = true;
}
}
}
break;
case TYPE_M:
if(!isDead){//向下沖鋒戰(zhàn)斗機
if(mEnemyStopLeft){
stopToTime++;
mEnemyY-=mEnemySpeed/2;
if(mEnemyY<=screenH/7){
mEnemyStopLeft =false;
}
}else{
if(stopToTime >=500){
mEnemySpeed=20;
}
mEnemyY+=mEnemySpeed/2;
if(mEnemyY>=screenH/4){
if(stopToTime <300){
mEnemyStopLeft = true;
}else if(mEnemyY<0||mEnemyY>screenH){
isDead = true;
break;
}
}
}
}
break;
case TYPE_N://左邊由上至上到中間
if(mEnemyStopLeft){
mEnemyY-=mEnemySpeed;
mEnemyX+=mEnemySpeed/2;
if(mEnemyY<=mEnemy.getHeight()&&mEnemyX>=screenW/2-mEnemy.getWidth()){
mEnemyStopTop = true;
mEnemyStopLeft = false;
}
if(mEnemyY<mEnemy.getHeight()){
mEnemyY = mEnemy.getHeight();
}
if(mEnemyX>screenW/2-mEnemy.getWidth()){
mEnemyX = screenW/2-mEnemy.getWidth();
}
}else{
if(mEnemyStopTop){
mEnemyY+=mEnemySpeed;
if(mEnemyY>screenH){
isDead = true;
break;
}
}else{
mEnemyY+=mEnemySpeed
3;
if(mEnemyY>=(screenH/2)){
mEnemyStopLeft = true;
}
}
}
break;
case TYPE_O://右邊由上至上到中間
if(mEnemyStopLeft){
mEnemyY-=mEnemySpeed;
mEnemyX-=mEnemySpeed/2;
if(mEnemyY<=mEnemy.getHeight()&&mEnemyY<=screenW/2+mEnemy.getWidth()){
mEnemyStopTop = true;
mEnemyStopLeft = false;
}
if(mEnemyY<mEnemy.getHeight()){
mEnemyY = mEnemy.getHeight();
}
if(mEnemyX<screenW/2+mEnemy.getWidth()){
mEnemyX = screenW/2+mEnemy.getWidth();
}
}else{
if(mEnemyStopTop){
mEnemyY+=mEnemySpeed;
}else{
mEnemyY+=mEnemySpeed*3;
if(mEnemyY>=screenH/2){
mEnemyStopLeft = true;
}
}
}
break;
case TYPE_P://左側Z字形運動
if(mEnemyX>=screenW-mEnemy.getWidth()){
mEnemyStopLeft = true;
}else if(mEnemyX<=0){
mEnemyStopLeft = false;
}
if(mEnemyY<=0){
mTempEnemyY = -mTempEnemyY;
}
if(mEnemyStopLeft){
mEnemyY-= mTempEnemyY *2;
mEnemyX-=mEnemySpeed;
}else{
mEnemyY-= mTempEnemyY *2;
mEnemyX+=mEnemySpeed;
}
break;
case TYPE_Q://右側z字形運動
if(mEnemyX<=0){
mEnemyStopLeft = true;
}else if(mEnemyX>=screenW-mEnemy.getWidth()){
mEnemyStopLeft = false;
}
if(mEnemyY<=0){
mTempEnemyY = -mTempEnemyY;
}
if(mEnemyStopLeft){
mEnemyY-= mTempEnemyY 2;
mEnemyX+=mEnemySpeed;
}else{
mEnemyY-= mTempEnemyY 2;
mEnemyX-=mEnemySpeed;
}
break;
case TYPE_R://左邊中間螺旋出場
if(mAngle>=360){
mAngle = 0;
}
mAngle+=20;
if(mEnemyY>screenH/2+100){
mEnemySpeedY = - (mRandom.nextInt(3)+2);
}else if(mEnemyY<screenH/2){
mEnemySpeedY =mRandom.nextInt(3)+5;
}
mEnemyX+=mEnemySpeedX;
mEnemyY+=mEnemySpeedY;
if(mEnemyX>screenW){
isDead=true;
}
break;
case TYPE_S://右邊中間螺旋出場
if(mAngle<=-360){
mAngle = 0;
}
mAngle-=20;
if(mEnemyY>screenH/2+100){
mEnemySpeedY = - (new Random().nextInt(3)+2);
}else if(mEnemyY<screenH/2){
mEnemySpeedY = (new Random().nextInt(3)+5);
}
mEnemyX-=mEnemySpeedX;
mEnemyY+=mEnemySpeedY;
if(mEnemySpeedX<0){
isDead=true;
}
break;
case TYPE_T://左邊高級將領
if(mEnemyStopLeft){
if(mEnemyX>=mMarginLeft||mEnemyX<=0){
mEnemySpeedX= -mEnemySpeedX;
}
mEnemyY+=mEnemySpeedX
2;
if(mEnemyY>=mMarginTop){
mEnemyY = mMarginTop;
}
if(mEnemyY<=mEnemy.getHeight()){
mEnemyY=mEnemy.getHeight();
}
}else{
if(mEnemyX>=mMarginLeft){
mEnemySpeedX= -mEnemySpeedX;
mEnemyStopLeft =true;
}
}
mEnemyX+=mEnemySpeedX;
break;
case TYPE_U://右邊高級將領
if(mEnemyStopLeft){
if(mEnemyX<=mMarginLeft||mEnemyX>screenW-mEnemy.getWidth()){
mEnemySpeedX= -mEnemySpeedX;
}
mEnemyX+=mEnemySpeedX
2;
if(mEnemyY>=mMarginTop){
mEnemyY = mMarginTop;
}
if(mEnemyY<=mEnemy.getHeight()){
mEnemyY=mEnemy.getHeight();
}
}else{
if(mEnemyX<=mMarginLeft){
mEnemySpeedX= -mEnemySpeedX;
mEnemyStopLeft =true;
}
}
mEnemyX-=mEnemySpeedX;
break;
case TYPE_V://左邊自動追蹤
stopToTime++;
mEnemyY+=mEnemySpeedY;
mEnemyX+=mEnemySpeedX;
if(!mEnemyStopLeft){
if(mEnemyY>=screenH/4){
mEnemyStopLeft = true;
}
if(stopToTime %25==0){
mEnemyX = -mEnemySpeedX;
}
}else if(mEnemyY<0||mEnemyY>screenH||mEnemyX>screenW||mEnemyX<0){
isDead=true;
}
break;
case TYPE_W://右邊自動追蹤
stopToTime++;
mEnemyY+=mEnemySpeedY;
mEnemyX+=mEnemySpeedX;
if(!mEnemyStopLeft){
if(mEnemyY>=screenH/4){
mEnemyStopLeft = true;
}
if(stopToTime %25==0){
mEnemySpeedX = -mEnemySpeedX;
}
}else if(mEnemyY<0||mEnemyY>screenH||mEnemyX>screenW||mEnemyX<0){
isDead=true;
}
break;
case TYPE_X://中空旋轉混戰(zhàn)模式
if(mAngle>=360){
mAngle = 0;
}
mAngle++;
mEnemyX+=mEnemySpeedX;
mEnemyY+=mEnemySpeedY;
if((mEnemyY>=screenH/2&&mEnemySpeedY>=0)||(mEnemyY<=0&&mEnemySpeedY<=0)){
mEnemySpeedY=-mEnemySpeedY;
if(mEnemySpeedY>=0){
mEnemySpeedY =mRandom.nextInt((int) mEnemySpeed);
}
}
if((mEnemyX>=screenW-mEnemy.getWidth()&&mEnemySpeedX>=0)||(mEnemyX<=0&&mEnemySpeedX<=0)){
mEnemySpeedX = -mEnemySpeedX;
if(mEnemySpeedX>=0){
mEnemySpeedX = mRandom.nextInt((int) mEnemySpeed);
}
}
break;
case TYPE_Y://高級將領
if(mAngle<=-360){
mAngle=0;
}
mAngle-=2;
mEnemyX+=mEnemySpeedX;
mEnemyY+=mEnemySpeedY;
if((mEnemyY>=screenH-mEnemy.getHeight()&&mEnemySpeedY>=0)||(mEnemyY<=0&&mEnemySpeedY<=0)){
mEnemySpeedY=-mEnemySpeedY;
}
if((mEnemyX>=screenW-mEnemy.getWidth()&&mEnemySpeedX>=0)||(mEnemyX<=0&&mEnemySpeedX<=0)){
mEnemySpeedX = -mEnemySpeedX;
}
break;
case TYPE_Z:
mEnemyY+=mEnemySpeed;
break;
}
//消失在屏幕以后敵機失效死亡
if(mEnemyX>screenW||mEnemyY>screenH||mEnemyX<-1){
isDead=true;
}
}

敵機和前面講過的子彈邏輯一樣,一旦移動出屏幕或者不可見了,通過判斷變量isDead移除畫布。

為了保證游戲后面的邏輯性以及學習思路的正常進行,并且保證打飛機的效果,最后實現(xiàn)出來感覺就跟一個正常游戲基本一樣,所以這里寫算法消耗的時間有點多,但是通過敵機類可以更好的學習一些移動,旋轉等動畫,能夠以后自定義實現(xiàn)高效率動畫控件的時候提供非常大的幫助,敵機類暫時還沒有在GameView中使用,考慮到后面學習過程的順暢性以及不饒彎路,那么在下一節(jié)我會模擬實現(xiàn)一個游戲關卡,通過關卡來模擬敵機出場的順序和游戲對戰(zhàn),包括后面的碰撞效果。

敵機類源碼已經(jīng)通過Git更新。

<a >我是持續(xù)性更新的源碼</a>

<a href="http://www.lxweimin.com/p/966a3e9d8bdf">上一篇</a>      <a href="http://www.lxweimin.com/p/d1768755f1bc">下一篇</a>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容