• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            coreBugZJ

            此 blog 已棄。

            游戲 切水果

            本程序是模仿流行的水果忍者游戲,移動鼠標,來切除空中運動的水果,水果為隨機生成,作自由上拋落體運動。被切到的水果將裂為兩半,自由落下。切除一個水果加一分,分數在右上角顯示。炸彈會混在水果中拋出,一但切到炸彈,炸彈會爆炸,且分數歸零。






            /*
            Fruit.c

            Copyright (C) 2011, coreBugZJ, all rights reserved.

            游戲 切水果。
            使用 自己的 ImageZ 圖形庫 加載顯示圖像 ( ImageZ_201112291853 )。
            支持 Win32 和 Linux 平臺。
            Win32 平臺下使用 API 做界面。
            Linux 平臺下使用 Xlib 做界面。
            ImageZ 本身跨平臺。Win32 下提供 ImageZ.lib 和 ImageZ.dll。Linux 下提供 libImageZ.a。

            玩法:鼠標移動即可切水果,有加分。切到雷,則分數歸零。

            版本:201112292200
            */


                    /* 此宏若定義,則 Linux 平臺;否則 Win32 平臺 */
            /* #define  FRUIT_LINUX */


            #ifdef  FRUIT_LINUX
            /* Linux */

            #include <X11/Xlib.h>
            #include <sys/time.h>
            #include <signal.h>

            #else /* FRUIT_LINUX */
            /* Win32 */

            #include <Windows.h>
            #pragma comment( lib, "ImageZ.lib" )

            #endif /* FRUIT_LINUX */

            #include <string.h>
            #include <time.h>
            #include <stdlib.h>
            #include <stdio.h>
            #include <math.h>

            #include "ImageZ.h"


                    /* 游戲區域寬高 */
            #define  BOARD_WIDTH   640
            #define  BOARD_HEIGHT  480

                    /* 窗口寬高 */
            #define  WND_WIDTH     (BOARD_WIDTH)
            #define  WND_HEIGHT    (BOARD_HEIGHT)

                    /* 水果種類數,即 水果信息結構體 數組大小 */
            #define  NUM_FRUIT    10
                    /* 空中未被切的水果數最大值 */
            #define  NUM_INFO     3
                    /* 空中所有的物體數最大值,即 空中物體信息結構體 數組大小 */
            #define  NUM_INFO_H   (NUM_INFO + 256)
                    /* 切割時的折線段點數最大值 */
            #define  NUM_POINT    1024
                    /* 數字 */
            #define  NUM_NUMBER   10


            /* 空中物體信息結構體 標志值 */
                    /* 未使用,可分配 */
            #define  FLAG_NOT_USE      0
                    /* 水果 */
            #define  FLAG_FRUIT        1
                    /* 左半水果 */
            #define  FLAG_HALF_LEFT    2
                    /* 右半水果 */
            #define  FLAG_HALF_RIGHT   3
                    /* 雷 */
            #define  FLAG_THUNDER      4
                    /* 爆炸 */
            #define  FLAG_CRASH        5
                    /* 本結構體正在處理中 */
            #define  FLAG_DEAL         6


            /* 游戲狀態 */
                    /* 停止 */
            #define  STATE_STOP        0
                    /* 運行中 */
            #define  STATE_RUNNING     1


                    /* 生成的水果是雷的概率 */
            #define  THUNDER_PROB      9
                    /* 雷 一幀區域 */
            #define  THUNDER_WIDTH      64
            #define  THUNDER_HEIGHT     64
                    /* 雷一行幀數 */
            #define  THUNDER_LINE_NUM   16
                    /* 雷總幀數 */
            #define  THUNDER_FRAME_NUM  16

                    /* 爆炸一幀區域 */
            #define  CRASH_WIDTH       440
            #define  CRASH_HEIGHT      300
                    /* 爆炸一行幀數 */
            #define  CRASH_LINE_NUM    4
                    /* 爆炸總幀數 */
            #define  CRASH_FRAME_NUM   8

                    /* 幀間隔,單位 MS */
            #define  DELTA_TIME        100

                    /* 垂直加速度,單位 像素/幀/幀 */
            #define  ACCEL_Y           4
                    /* 新水果 垂直速度 最大值,單位 像素/幀 */
            #define  MAX_VY            55
                    /* 新水果 垂直速度 最小值,單位 像素/幀 */
            #define  MIN_VY            40
                    /* 新水果 水平速度 最大值的2倍,單位 像素/幀 */
            #define  MAX_VX            30
                    /* 水果切開后,左半 水平速度,單位 像素/幀 */
            #define  LEFT_VX           (-15)
                    /* 水果切開后,右半 水平速度,單位 像素/幀 */
            #define  RIGHT_VX          15
                    /* 水果旋轉因子,多少幀旋轉90度 */
            #define  ROTATE_FACTOR     1

                    /* 水果半徑,單位 像素。水果一律以圓形建模 */
            #define  RADIUS       28


                    /* 水果信息結構體,用于管理水果圖片 */
            struct _Fruit
            {
                    int     radius;              /* 半徑 */
                    ImageZ  img, imgLe, imgRi;   /* 圖像 整個,左半,右半 */
            };
            typedef  struct _Fruit  Fruit;

                    /* 空中物體信息結構體,用于管理空中物體 */
            struct _Info
            {
                    int     px, py;    /* 位置,像素 */
                    int     vx, vy;    /* 速度,像素/幀 */
                    int     flag;      /* 標志 */
                    int     type;      /* 類型,即 水果信息結構體 數組下標 */
                    ImageZ  img;       /* 對應圖片 */
            };
            typedef  struct _Info  Info;

                    /* 顯示圖片,平臺相關,分別實現 */
            #ifdef  FRUIT_LINUX
            /* Linux */

                    /* 顯示器信息結構體 */
            struct _Disp
            {
                    Display  *dsp;
                    Window   wnd;
                    GC       gc;
                    Visual   *vis;
            };
            typedef  struct _Disp  Disp;
            Disp  disp;

                    /* 在游戲初始化前,初始化顯示器 */
            void preInitGame( Display *dsp, Window wnd, GC gc, Visual *vis ) {
                    disp.dsp = dsp;
                    disp.wnd = wnd;
                    disp.gc  = gc;
                    disp.vis = vis;
            }

                    /* 將圖像子區域顯示在窗口子區域 */
            void showImage( int dispLeft, int dispTop,
                    int width, int height,
                    ImageZ img, int imgLeft, int imgTop  ) {
                    R32 res = displayImageZ( disp.dsp, disp.wnd,
                                    disp.gc, disp.vis,
                                    dispLeft, dispTop,
                                    width, height,
                                    img, imgLeft, imgTop  );
            }

            #else /* FRUIT_LINUX */
            /* Win32 */

                    /* 顯示器信息結構體 */
            struct _Disp
            {
                    HWND hWnd;
            };
            typedef  struct _Disp  Disp;
            Disp  disp;

                    /* 在游戲初始化前,初始化顯示器 */
            void preInitGame( HWND hWnd ) {
                    disp.hWnd = hWnd;
            }

                    /* 將圖像子區域顯示在窗口子區域 */
            void showImage( int dispLeft, int dispTop,
                    int width, int height,
                    ImageZ img, int imgLeft, int imgTop  ) {
                            HDC hdc = GetDC( disp.hWnd );
                            R32 res = displayImageZ( hdc, dispLeft, dispTop, width, height, img, imgLeft, imgTop );
                            ReleaseDC( disp.hWnd, hdc );
            }

            #endif /* FRUIT_LINUX */


                    /* 是否正在運行 */
            int     isRunning;
                    /* 游戲狀態 */
            int     state;
                    /* 得分 */
            int     score;
                    /* 水果信息結構體 數組,用于管理水果圖片 */
            Fruit   fruit[ NUM_FRUIT ];
                    /* 空中物體信息結構體 數組,用于管理空中物體 */
            Info    info[ NUM_INFO_H ];
                    /* 切割時的折線段中的點 */
            int     ptX[ NUM_POINT ], ptY[ NUM_POINT ], ptNum;
                    /* 背景圖 */
            ImageZ  imgBk;
                    /* 幀緩存 */
            ImageZ  imgFrame;
                    /* 數字 */
            ImageZ  imgNum[ NUM_NUMBER ];
                    /* 爆炸,此時,空中物體信息結構體 中 type 表示爆炸幀下標 */
            ImageZ  imgCrash;
                    /* 雷,此時,空中物體信息結構體 中 type 表示爆炸幀下標 */
            ImageZ  imgThunder;
                    /* 刀 */
            ImageZ  imgSword;


            void updateGame( int sig );

                    /* 啟動定時器 */
            void initTimer() {
            #ifdef  FRUIT_LINUX
            /* Linux */

                    struct itimerval  new_timeset;
                    long   n_sec, n_usecs;

                    signal( SIGALRM, updateGame );

                    n_sec   = DELTA_TIME / 1000;
                    n_usecs = ( DELTA_TIME % 1000 ) * 1000L;

                    new_timeset.it_interval.tv_sec  = n_sec;
                    new_timeset.it_interval.tv_usec = n_usecs;
                    new_timeset.it_value.tv_sec     = n_sec;
                    new_timeset.it_value.tv_usec    = n_usecs;

                    setitimer( ITIMER_REAL, &new_timeset, NULL );

            #else /* FRUIT_LINUX */
            /* Win32 */

                    SetTimer( disp.hWnd, 1, DELTA_TIME, NULL );
                   
            #endif /* FRUIT_LINUX */
            }

                    /* 關閉定時器 */
            void cancelTimer() {
            #ifdef  FRUIT_LINUX
            /* Linux */

                    /* defs */

            #else /* FRUIT_LINUX */
            /* Win32 */

                    KillTimer( disp.hWnd, 1 );

            #endif /* FRUIT_LINUX */
            }

                    /* 限定范圍的隨機數 */
            int randMod( int mod ) {
                    if ( 1 > mod ) mod = 1;
                    return rand() % mod;
            }

                    /* 初始化圖像 Alpha 域,因 bmp 不支持透明,視純白為透明色 */
            void initAlpha( ImageZ img ) {
                    U32 x, y, w, h, r, g, b, a;
                    U08 *ptrimg;

            #define  THRE_H  240
            #define  THRE_L  120

                    if ( (!isImageValidZ(img)) || (isImagePaletteUsedZ(img)) ) {
                            return;
                    }

                    w = getImageWidthZ( img );
                    h = getImageHeightZ( img );

                    for ( y = 0; y < h; ++y ) {
                            ptrimg = img->pPixel + y * img->linePitch;
                            for ( x = 0; x < w; ++x ) {
                                    b = ptrimg[ IMAGEZ_OFFSET_BLUE_Z  ];
                                    g = ptrimg[ IMAGEZ_OFFSET_GREEN_Z ];
                                    r = ptrimg[ IMAGEZ_OFFSET_RED_Z   ];
                                    if ( (THRE_H < b) && (THRE_H < g) && (THRE_H < r) ) {
                                            a = 0;
                                    }
                                    else {
                                            a = 255;
                                    }

                                    ptrimg[ IMAGEZ_OFFSET_ALPHA_Z ] = (U08)(a);
                                    ptrimg += IMAGEZ_COLOR_SIZE_Z;
                            }
                    }
            #undef  THRE_L
            #undef  THRE_H
            }

                    /* 初始化游戲 */
            void initGame() {
                    int i;
                    char base[ 30 ] = "./Res/fruit";
                    char ext[ 30 ]  = ".png";
                    char lef[ 30 ]  = "left";
                    char rig[ 30 ]  = "right";
                    char num[ 30 ];
                    char name[ 90 ] = "";

                    srand( (unsigned int)time( NULL ) );

                    imgBk      = createImageFromFilePngZ( "./Res/imgBk.png" );
                    imgFrame   = createImageFromImageInfoZ( imgBk );
                    imgCrash   = createImageFromFilePngZ( "./Res/crash.png" );
                    imgThunder = createImageFromFilePngZ( "./Res/thunder.png" );
                    imgSword   = createImageFromFilePngZ( "./Res/sword.png" );

                    score = 0;

                    ptNum = 0;

                    memset( info, 0, sizeof(info) );

                    memset( fruit, 0, sizeof(fruit) );
                    for ( i = 0; i < NUM_FRUIT; ++i ) {
                            fruit[ i ].radius = RADIUS;

                            strcpy( name, base );
                            sprintf( num, "%d", i );
                            strcat( name, num );
                            strcat( name, ext );
                            fruit[ i ].img = createImageFromFilePngZ( name );

                            strcpy( name, base );
                            sprintf( num, "%d", i );
                            strcat( name, num );
                            strcat( name, lef );
                            strcat( name, ext );
                            fruit[ i ].imgLe = createImageFromFilePngZ( name );

                            strcpy( name, base );
                            sprintf( num, "%d", i );
                            strcat( name, num );
                            strcat( name, rig );
                            strcat( name, ext );
                            fruit[ i ].imgRi = createImageFromFilePngZ( name );
                    }

                    for ( i = 0; i < NUM_NUMBER; ++i ) {
                            sprintf( name, "./Res/%d.bmp", i );
                            imgNum[ i ] = createImageFromFileBmpZ( name );
                            initAlpha( imgNum[ i ] );
                    }

                    state = STATE_RUNNING;
                    isRunning = 1;
                    initTimer();
            }

                    /* 新水果初始化 */
            void initFruitInfo( Info *pInf ) {
                    if ( NULL == pInf ) {
                            return;
                    }
                    pInf->flag = FLAG_DEAL;

                    destroyImageZ( pInf->img );
                    pInf->img = NULL;

                    pInf->px   = randMod( BOARD_WIDTH / 3 ) + BOARD_WIDTH / 6;
                    pInf->py   = BOARD_HEIGHT - MAX_VY;
                    pInf->vx   = randMod( MAX_VX ) - MAX_VX / 2;
                    pInf->vy   = -randMod( MAX_VY - MIN_VY ) - MIN_VY;

                    if ( randMod( THUNDER_PROB ) != 0 ) {
                            pInf->type = randMod( NUM_FRUIT );
                            pInf->img  = createImageFromImageZ( fruit[ pInf->type ].img );
                            pInf->flag = FLAG_FRUIT;
                    }
                    else {
                            pInf->type = 0;
                            pInf->img  = imgThunder;
                            pInf->flag = FLAG_THUNDER;
                    }
            }

                    /* 切掉水果 */
            void cutFruitInfo( Info *pInf ) {
                    int i, j;

                    if ( NULL == pInf ) {
                            return;
                    }

                            /* 雷 */
                    if ( FLAG_THUNDER == pInf->flag ) {
                            pInf->flag = FLAG_DEAL;

                            pInf->img   = imgCrash;
                            pInf->px   -= CRASH_WIDTH / 2;
                            pInf->py   -= CRASH_HEIGHT / 2;
                            pInf->type  = 0;
                            pInf->flag  = FLAG_CRASH;

                            score = 0;
                            return;
                    }

                            /* 不是水果 */
                    if ( FLAG_FRUIT != pInf->flag ) {
                            return;
                    }

                    pInf->flag = FLAG_DEAL;

                    i = NUM_INFO;
                    while ( (NUM_INFO_H > i) && (FLAG_NOT_USE != info[ i ].flag) ) {
                            ++i;
                    }
                    info[ i ].flag = FLAG_DEAL;
                    j = i + 1;
                    while ( (NUM_INFO_H > j) && (FLAG_NOT_USE != info[ j ].flag) ) {
                            ++j;
                    }
                    info[ j ].flag = FLAG_DEAL;

                    if ( NUM_INFO_H > j ) {
                            destroyImageZ( info[ i ].img );
                            info[ i ].img  = createImageFromImageZ( fruit[ pInf->type ].imgLe );
                            info[ i ].px   = pInf->px;
                            info[ i ].py   = pInf->py;
                            info[ i ].type = pInf->type;
                            info[ i ].vx   = LEFT_VX;
                            info[ i ].vy   = 0;
                            info[ i ].flag = FLAG_HALF_LEFT;

                            destroyImageZ( info[ j ].img );
                            info[ j ].img  = createImageFromImageZ( fruit[ pInf->type ].imgRi );
                            info[ j ].px   = pInf->px + getImageWidthZ(info[ i ].img);
                            info[ j ].py   = pInf->py;
                            info[ j ].type = pInf->type;
                            info[ j ].vx   = RIGHT_VX;
                            info[ j ].vy   = 0;
                            info[ j ].flag = FLAG_HALF_RIGHT;
                    }
                    else {
                            info[ i ].flag = FLAG_NOT_USE;
                            info[ j ].flag = FLAG_NOT_USE;
                    }

                    pInf->flag = FLAG_NOT_USE;
                    ++score;
            }

                    /* 檢查是否切到 */
            int checkCut( Info *pInf ) {
                    int cx, cy, r, r2, i;

                    if ( NULL == pInf ) {
                            return 0;
                    }

                    if ( FLAG_THUNDER == pInf->flag ) {
                            cx = THUNDER_WIDTH  / 2 + pInf->px;
                            cy = THUNDER_HEIGHT / 2 + pInf->py;
                            r  = RADIUS;
                    }
                    else if ( FLAG_FRUIT == pInf->flag ) {
                            cx = getImageWidthZ(pInf->img)  / 2 + pInf->px;
                            cy = getImageHeightZ(pInf->img) / 2 + pInf->py;
                            r  = fruit[ pInf->type ].radius;
                    }
                    else {
                            return 0;
                    }
                    r2 = r * r;

                    for ( i = 0; i < ptNum; ++i ) {
                            if ( (ptX[i]-cx) * (ptX[i]-cx) + (ptY[i]-cy) * (ptY[i]-cy) < r2 ) {
                                    return 1;
                            }
                    }

                    return 0;
            }

                    /* 定時器回調函數,一幀,更新游戲數據 */
            void updateGame( int sig ) {
                    static  int  rf = 0;
                    int  i, j, w, h, le;

                            /* 已經結束 */
                    if ( 0 == isRunning ) {
                            return;
                    }

                            /* 繪制背景 */
                    paintImageZ( imgFrame, 0, 0,
                            imgBk, 0, 0,
                            getImageWidthZ(imgBk), getImageHeightZ(imgBk) );

                            /* 繪制刀 */
            #define  SWORD_POINT  12
                    if ( SWORD_POINT <= ptNum ) {
                            ImageZ img = NULL;
                            int    lef, top, dx, dy, xh, xt, yh, yt;

                            img = createImageCropZ( imgSword, 0, 0, 100, 100 );

                            xh = yh = xt = yt = 0;
                            for ( i = 1; i <= SWORD_POINT; ++i ) {
                                    if ( SWORD_POINT / 2 >= i ) {
                                            xt += ptX[ ptNum - i ];
                                            yt += ptY[ ptNum - i ];
                                    }
                                    else {
                                            xh += ptX[ ptNum - i ];
                                            yh += ptY[ ptNum - i ];
                                    }
                            }
                            xh /= SWORD_POINT / 2;
                            yh /= SWORD_POINT / 2;
                            xt /= SWORD_POINT / 2;
                            yt /= SWORD_POINT / 2;

                            dx = xt - xh;
                            dy = yt - yh;

                            rotateImageZ( img,
                                    atan2( (double)(-dy), (double)dx ),
                                    ITP_BILINEAR_Z, NULL );
                            cropImageZ( img, (getImageWidthZ(img)-100)/2, (getImageHeightZ(img)-100)/2, 100, 100 );

                            /*
                            xt = ptX[ ptNum - 1 ];
                            yt = ptY[ ptNum - 1 ];
                            if ( 0 <= dx ) {
                                    if ( 0 <= dy ) {
                                            lef = xt - 55;
                                            top = yt - 55;
                                    }
                                    else {
                                            lef = xt - 55;
                                            top = yt - 35;
                                    }
                            }
                            else {
                                    if ( 0 <= dy ) {
                                            lef = xt - 35;
                                            top = yt - 55;
                                    }
                                    else {
                                            lef = xt - 35;
                                            top = yt - 35;
                                    }
                            }
                            */

                            lef = ptX[ ptNum - 1 ] - ( (0 <= dx) ? 55 : 35 );
                            top = ptY[ ptNum - 1 ] - ( (0 <= dy) ? 55 : 35 );

                            paintImageZ( imgFrame, lef, top,
                                    img, 0, 0, 100, 100 );
                            destroyImageZ( img );
                            img = NULL;
                    }

                            /* 檢查切割 */
                    for ( i = ptNum-1; i > 0; --i ) {
                            ptX[ ptNum ] = ( ptX[ i ] + ptX[ i - 1 ] ) / 2;
                            ptY[ ptNum ] = ( ptY[ i ] + ptY[ i - 1 ] ) / 2;
                            if ( NUM_POINT > ptNum ) {
                                    ++ptNum;
                            }
                    }
                    for ( i = 0; i < NUM_INFO; ++i ) {
                            if ( (FLAG_NOT_USE == info[ i ].flag) || (FLAG_DEAL == info[ i ].flag) ) {
                                    continue;
                            }
                            if ( checkCut( &(info[ i ]) ) ) {
                                    cutFruitInfo( &(info[ i ]) );
                            }
                    }
                    ptNum = 0;

                            /* 自由落體 */
                    for ( i = 0; i < NUM_INFO_H; ++i ) {
                            if ( (FLAG_NOT_USE == info[ i ].flag) || (FLAG_DEAL == info[ i ].flag) ) {
                                    continue;
                            }
                            info[ i ].px += info[ i ].vx;
                            info[ i ].py += info[ i ].vy;
                            info[ i ].vy += ACCEL_Y;
                            w = getImageWidthZ( info[ i ].img );
                            h = getImageHeightZ( info[ i ].img );
                            if ( (BOARD_HEIGHT < info[ i ].py + 5) ||
                                 (BOARD_WIDTH  < info[ i ].px + 5) || (-w+5 > info[ i ].px) ) {
                                    if ( (FLAG_THUNDER == info[ i ].flag) || (FLAG_CRASH == info[ i ].flag) ) {
                                            info[ i ].img = NULL;
                                    }
                                    info[ i ].flag = FLAG_NOT_USE;
                            }
                    }

                            /* 新水果 */
                    for ( i = 0; i < NUM_INFO; ++i ) {
                            if ( FLAG_NOT_USE == info[ i ].flag ) {
                                    initFruitInfo( &(info[ i ]) );
                            }
                    }

                            /* 繪制得分 */
                    i  = score;
                    le = BOARD_WIDTH - 60;
                    do {
                            j  = i % NUM_NUMBER;
                            i /= NUM_NUMBER;
                            paintImageZ( imgFrame, le, 7,
                                    imgNum[ j ], 0, 0,
                                    getImageWidthZ(imgNum[ j ]), getImageHeightZ(imgNum[ j ])  );
                            le -= getImageWidthZ(imgNum[ j ]) - 4;
                    } while ( 0 != i );

                            /* 繪制空中物體 */
                    rf = ( rf + 1 ) % ROTATE_FACTOR;
                    for ( i = 0; i < NUM_INFO_H; ++i ) {
                            if ( (FLAG_NOT_USE == info[ i ].flag) || (FLAG_DEAL == info[ i ].flag) ) {
                                    continue;
                            }

                            if ( FLAG_THUNDER == info[ i ].flag ) {
                                    paintImageZ( imgFrame, info[ i ].px, info[ i ].py,
                                            info[ i ].img, info[ i ].type % THUNDER_LINE_NUM * THUNDER_WIDTH,
                                            info[ i ].type / THUNDER_LINE_NUM * THUNDER_HEIGHT,
                                            THUNDER_WIDTH, THUNDER_HEIGHT   );
                                    info[ i ].type = ( info[ i ].type + 3 ) % THUNDER_FRAME_NUM;
                            }
                            else if ( FLAG_CRASH == info[ i ].flag ) {
                                    if ( CRASH_FRAME_NUM > info[ i ].type ) {
                                            paintImageZ( imgFrame, info[ i ].px, info[ i ].py,
                                                    info[ i ].img, info[ i ].type % CRASH_LINE_NUM * CRASH_WIDTH,
                                                    info[ i ].type / CRASH_LINE_NUM * CRASH_HEIGHT,
                                                    CRASH_WIDTH, CRASH_HEIGHT   );
                                            ++(info[ i ].type);
                                    }
                            }
                            else {
                                    if ( 0 == rf ) {
                                            rotateImage90degreeZ( info[ i ].img, FALSE );
                                    }
                                    paintImageZ( imgFrame, info[ i ].px, info[ i ].py,
                                            info[ i ].img, 0, 0,
                                            getImageWidthZ(info[ i ].img), getImageHeightZ(info[ i ].img) );
                            }
                    }

                            /* 顯示 */
                    showImage( 0, 0,
                            getImageWidthZ(imgFrame), getImageHeightZ(imgFrame),
                            imgFrame, 0, 0 );
            }

                    /* 處理鼠標移動消息 */
            void moveMouse( int x, int y ) {
                    ptX[ ptNum ] = x;
                    ptY[ ptNum ] = y;
                    ++ptNum;
            }

                    /* 游戲結束,釋放資源 */
            void finishGame() {
                    int i;
                    isRunning = 0;
                    cancelTimer();
                    for ( i = 0; i < NUM_FRUIT; ++i ) {
                            destroyImageZ( fruit[ i ].img );
                            destroyImageZ( fruit[ i ].imgLe );
                            destroyImageZ( fruit[ i ].imgRi );
                            fruit[ i ].img   = NULL;
                            fruit[ i ].imgLe = NULL;
                            fruit[ i ].imgRi = NULL;
                    }
                    for ( i = 0; i < NUM_NUMBER; ++i ) {
                            destroyImageZ( imgNum[ i ] );
                            imgNum[ i ] = NULL;
                    }
                    for ( i = 0; i < NUM_INFO_H; ++i ) {
                            if ( (FLAG_THUNDER != info[ i ].flag) && (FLAG_CRASH != info[ i ].flag) ) {
                                    destroyImageZ( info[ i ].img );
                            }
                            info[ i ].img = NULL;
                    }
                    destroyImageZ( imgBk );
                    imgBk = NULL;
                    destroyImageZ( imgFrame );
                    imgFrame = NULL;
                    destroyImageZ( imgCrash );
                    imgCrash = NULL;
                    destroyImageZ( imgThunder );
                    imgThunder = NULL;
                    destroyImageZ( imgSword );
                    imgSword = NULL;
            }


            #ifdef  FRUIT_LINUX
            /* Linux */

            int main() {
                    Display  *disp;
                    int      scr;
                    Window   wnd;
                    GC       gc;
                    Visual   *vis;
                    XEvent   e;

                    disp = XOpenDisplay( NULL );
                    if ( NULL == disp ) {
                            printf( "XOpenDisplay Failed!\n" );
                            return 0;
                    }
                    scr = XDefaultScreen( disp );
                    gc  = XDefaultGC( disp, scr );
                    vis = XDefaultVisual( disp, scr );
                    wnd = XCreateSimpleWindow( disp, RootWindow( disp, scr ),
                            200, 200, WND_WIDTH, WND_HEIGHT, 3,
                            BlackPixel( disp, scr ), WhitePixel( disp, scr )   );

                    XSelectInput( disp, wnd, ExposureMask | KeyPressMask | PointerMotionMask );

                    XMapWindow( disp, wnd );

                    preInitGame( disp, wnd, gc, vis );
                    initGame();

                    while ( 1 ) {
                            XNextEvent( disp, &e );

                            if ( Expose == e.type ) {
                            }

                            if ( MotionNotify == e.type  ) {
                                    moveMouse( e.xmotion.x, e.xmotion.y );
                            }

                            /*
                            if ( KeyPress == e.type )
                                    break;
                            */
                    }

                    finishGame();

                    XCloseDisplay( disp );

                    return 0;
            }

            #else /* FRUIT_LINUX */
            /* Win32 */

            LRESULT  CALLBACK  WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
                    PAINTSTRUCT ps;
                    HDC         hdc;

                    switch ( uMsg ) {
                    case WM_TIMER :
                            updateGame( 0 );
                            return 0;

                    case WM_MOUSEMOVE :
                            moveMouse( LOWORD(lParam), HIWORD(lParam) );
                            return 0;

                    case WM_CREATE :
                            preInitGame( hWnd );
                            initGame();
                            return 0;

                    case WM_PAINT :
                            hdc = BeginPaint( hWnd, &ps );
                            EndPaint( hWnd, &ps );
                            return 0;

                    case WM_DESTROY :
                            finishGame();
                            PostQuitMessage( 0 );
                            return 0;
                    }
                    return DefWindowProc( hWnd, uMsg, wParam, lParam );
            }

            INT  APIENTRY  WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR szCmdLine, INT iShow ) {
                    static TCHAR  className[] = TEXT("Fruit");
                    static TCHAR  wndName[]   = TEXT("Fruit");

                    WNDCLASSEX wc;
                    HWND       hWnd;
                    MSG        msg;

                    wc.cbClsExtra = 0;
                    wc.cbSize     = sizeof(wc);
                    wc.cbWndExtra = 0;
                    wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
                    wc.hCursor       = LoadCursor( NULL, IDC_ARROW );
                    wc.hIcon         = LoadIcon( NULL, IDI_APPLICATION );
                    wc.hIconSm       = LoadIcon( NULL, IDI_APPLICATION );
                    wc.hInstance     = hInst;
                    wc.lpfnWndProc   = WndProc;
                    wc.lpszClassName = className;
                    wc.lpszMenuName  = NULL;
                    wc.style         = 0;
                    RegisterClassEx( &wc );

                    hWnd = CreateWindowEx( 0, className, wndName,
                            WS_OVERLAPPEDWINDOW,
                            100, 100, WND_WIDTH, WND_HEIGHT,
                            NULL, NULL, wc.hInstance, NULL );

                    ShowWindow( hWnd, iShow );
                    UpdateWindow( hWnd );

                    while ( GetMessage( &msg, NULL, 0, 0 ) ) {
                            TranslateMessage( &msg );
                            DispatchMessage( &msg );
                    }

                    return msg.wParam;
            }

            #endif /* FRUIT_LINUX */

            posted on 2011-12-31 16:53 coreBugZJ 閱讀(4132) 評論(2)  編輯 收藏 引用 所屬分類: 課內作業娛樂

            Feedback

            # re: 游戲 切水果 2012-01-02 18:27 林羽飛揚

            雖然看不懂,但是感覺很牛逼的樣子  回復  更多評論   

            # re: 游戲 切水果 2013-07-26 15:43 chezai

            ImageZ.lib哪里來的?  回復  更多評論   


            久久精品国产精品亚洲下载| 午夜福利91久久福利| 色综合久久天天综线观看| 99热成人精品免费久久| 国产精品99久久精品爆乳| 国产精品久久久久9999| 成人久久精品一区二区三区| 久久香蕉国产线看观看99| 韩国无遮挡三级久久| 99久久精品国产一区二区蜜芽| 国产精品久久久99| 久久久亚洲精品蜜桃臀| 性欧美大战久久久久久久| 伊人久久大香线焦AV综合影院| 亚洲国产另类久久久精品小说| 久久超乳爆乳中文字幕| 国产成人久久777777| 久久性精品| 久久久久免费精品国产| 国产精品久久99| 一本伊大人香蕉久久网手机| 久久久青草青青国产亚洲免观| 久久99九九国产免费看小说| 久久久无码人妻精品无码| 国产精品成人99久久久久| 久久夜色精品国产亚洲| 久久精品天天中文字幕人妻| 久久免费香蕉视频| 热re99久久精品国99热| 久久精品国产亚洲Aⅴ香蕉| 亚洲国产精品成人久久| 97久久精品人人做人人爽| 久久精品国产99国产精品亚洲| 亚洲嫩草影院久久精品| 国内精品伊人久久久影院| 88久久精品无码一区二区毛片| 久久国产劲爆AV内射—百度| 办公室久久精品| 亚洲va中文字幕无码久久| 久久久久无码精品| 久久香蕉国产线看观看99|