zoukankan      html  css  js  c++  java
  • 2D游戏编程7—星空案例

    // INCLUDES ///////////////////////////////////////////////
    #define WIN32_LEAN_AND_MEAN  // just say no to MFC
    
    #include <windows.h>   // include important windows stuff
    #include <windowsx.h> 
    #include <mmsystem.h>
    #include <iostream.h> // include important C/C++ stuff
    #include <conio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <memory.h>
    #include <string.h>
    #include <stdarg.h>
    #include <stdio.h> 
    #include <math.h>
    #include <io.h>
    #include <fcntl.h>
    
    // DEFINES ////////////////////////////////////////////////
    
    // defines for windows 
    #define WINDOW_CLASS_NAME "WINCLASS1"
    #define WINDOW_WIDTH      400
    #define WINDOW_HEIGHT     300
    
    // starfield defines
    #define NUM_STARS            256
    
    // MACROS /////////////////////////////////////////////////
    
    #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
    #define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
    
    // TYPES //////////////////////////////////////////////////
    
    typedef struct STAR_TYP
            {
            int x,y;        // position of star
            int vel;        // horizontal velocity of star
            COLORREF col;   // color of star
            } STAR, *STAR_PTR;
    
    // PROTOTYPES /////////////////////////////////////////////
    
    void Erase_Stars(void);
    void Draw_Stars(void);
    void Move_Stars(void);
    void Init_Stars(void);
    
    // GLOBALS ////////////////////////////////////////////////
    
    HWND      main_window_handle = NULL; // globally track main window
    HINSTANCE hinstance_app      = NULL; // globally track hinstance
    
    HDC       global_dc          = NULL; // tracks a global dc
    
    char buffer[80];                     // general printing buffer
    
    STAR stars[256];                     // holds the starfield
    
    // FUNCTIONS //////////////////////////////////////////////
    LRESULT CALLBACK WindowProc(HWND hwnd, 
                                UINT msg, 
                                WPARAM wparam, 
                                LPARAM lparam)
    {
    // this is the main message handler of the system
    PAINTSTRUCT        ps;        // used in WM_PAINT
    HDC                hdc;    // handle to a device context
    char buffer[80];        // used to print strings
    
    // what is the message 
    switch(msg)
        {    
        case WM_CREATE: 
            {
            // do initialization stuff here
            // return success
            return(0);
            } break;
       
        case WM_PAINT: 
            {
            // simply validate the window 
               hdc = BeginPaint(hwnd,&ps);     
            
            // end painting
            EndPaint(hwnd,&ps);
    
            // return success
            return(0);
               } break;
    
        case WM_DESTROY: 
            {
    
            // kill the application, this sends a WM_QUIT message 
            PostQuitMessage(0);
    
            // return success
            return(0);
            } break;
    
        default:break;
    
        } // end switch
    
    // process any messages that we didn't take care of 
    return (DefWindowProc(hwnd, msg, wparam, lparam));
    
    } // end WinProc
    
    ///////////////////////////////////////////////////////////
    
    void Init_Stars(void)
    {
    // this function initializes all the stars
    
    for (int index=0; index < NUM_STARS; index++)
        {
        // select random position
        stars[index].x = rand()%WINDOW_WIDTH;
        stars[index].y = rand()%WINDOW_HEIGHT;
    
        // set random velocity   
        stars[index].vel = 1 + rand()%16;
    
        // set intensity which is inversely prop to velocity for 3D effect
        // note, I am mixing equal amounts of RGB to make black -> bright white    
        int intensity = 15*(17 - stars[index].vel);
        stars[index].col = RGB(intensity, intensity, intensity); 
    
        } // end for index
    
    } // end Init_Stars
    
    ////////////////////////////////////////////////////////////
    
    void Erase_Stars(void)
    {
    // this function erases all the stars
    for (int index=0; index < NUM_STARS; index++)
        SetPixel(global_dc, stars[index].x, stars[index].y, RGB(0,0,0));
    
    } // end Erase_Stars
    
    ////////////////////////////////////////////////////////////
    
    void Draw_Stars()
    {
    // this function draws all the stars
    for (int index=0; index < NUM_STARS; index++)
        SetPixel(global_dc, stars[index].x, stars[index].y, stars[index].col);
    
    
    } // end Draw_Stars
    
    ////////////////////////////////////////////////////////////
    
    void Move_Stars(void)
    {
    // this function moves all the stars and wraps them around the 
    // screen boundaries
    for (int index=0; index < NUM_STARS; index++)
        {
        // move the star and test for edge
        stars[index].x+=stars[index].vel;
    
        if (stars[index].x >= WINDOW_WIDTH)
            stars[index].x -= WINDOW_WIDTH;
        
        } // end for index
    
    } // end Move_Stars
    
    ////////////////////////////////////////////////////////////
    
    int Game_Main(void *parms = NULL, int num_parms = 0)
    {
    // this is the main loop of the game, do all your processing
    // here
    
    // get the time
    DWORD start_time = GetTickCount();
    
    // erase the stars
    Erase_Stars();
    
    // move the stars
    Move_Stars();
    
    // draw the stars
    Draw_Stars();
    
    // lock to 30 fps
    while((start_time - GetTickCount() < 33));
    
    // for now test if user is hitting ESC and send WM_CLOSE
    if (KEYDOWN(VK_ESCAPE))
       SendMessage(main_window_handle,WM_CLOSE,0,0);
    
    // return success or failure or your own return code here
    return(1);
    
    } // end Game_Main
    
    ////////////////////////////////////////////////////////////
    
    int Game_Init(void *parms = NULL, int num_parms = 0)
    {
    // this is called once after the initial window is created and
    // before the main event loop is entered, do all your initialization
    // here
    
    // first get the dc to the window
    global_dc = GetDC(main_window_handle);
    
    // initialize the star field here
    Init_Stars();
    
    // return success or failure or your own return code here
    return(1);
    
    } // end Game_Init
    
    /////////////////////////////////////////////////////////////
    
    int Game_Shutdown(void *parms = NULL, int num_parms = 0)
    {
    // this is called after the game is exited and the main event
    // loop while is exited, do all you cleanup and shutdown here
    
    // release the global dc
    ReleaseDC(main_window_handle, global_dc);
    
    // return success or failure or your own return code here
    return(1);
    
    } // end Game_Shutdown
    
    // WINMAIN ////////////////////////////////////////////////
    int WINAPI WinMain(    HINSTANCE hinstance,
                        HINSTANCE hprevinstance,
                        LPSTR lpcmdline,
                        int ncmdshow)
    {
    
    WNDCLASSEX winclass; // this will hold the class we create
    HWND       hwnd;     // generic window handle
    MSG           msg;         // generic message
    HDC        hdc;      // graphics device context
    
    // first fill in the window class stucture
    winclass.cbSize         = sizeof(WNDCLASSEX);
    winclass.style            = CS_DBLCLKS | CS_OWNDC | 
                              CS_HREDRAW | CS_VREDRAW;
    winclass.lpfnWndProc    = WindowProc;
    winclass.cbClsExtra        = 0;
    winclass.cbWndExtra        = 0;
    winclass.hInstance        = hinstance;
    winclass.hIcon            = LoadIcon(NULL, IDI_APPLICATION);
    winclass.hCursor        = LoadCursor(NULL, IDC_ARROW); 
    winclass.hbrBackground    = (HBRUSH)GetStockObject(BLACK_BRUSH);
    winclass.lpszMenuName    = NULL;
    winclass.lpszClassName    = WINDOW_CLASS_NAME;
    winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
    
    // save hinstance in global
    hinstance_app = hinstance;
    
    // register the window class
    if (!RegisterClassEx(&winclass))
        return(0);
    
    // create the window
    if (!(hwnd = CreateWindowEx(NULL,                  // extended style
                                WINDOW_CLASS_NAME,     // class
                                "T3D Game Console Star Demo", // title
                                WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                                 0,0,      // initial x,y
                                400,300,  // initial width, height
                                NULL,      // handle to parent 
                                NULL,      // handle to menu
                                hinstance,// instance of this application
                                NULL)))    // extra creation parms
    return(0);
    
    // save main window handle
    main_window_handle = hwnd;
    
    // initialize game here
    Game_Init();
    
    // enter main event loop
    while(TRUE)
        {
        // test if there is a message in queue, if so get it
        if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
           { 
           // test if this is a quit
           if (msg.message == WM_QUIT)
               break;
        
           // translate any accelerator keys
           TranslateMessage(&msg);
    
           // send the message to the window proc
           DispatchMessage(&msg);
           } // end if
        
           // main game processing goes here
           Game_Main();
           
        } // end while
    
    // closedown game here
    Game_Shutdown();
    
    // return to Windows like this
    return(msg.wParam);
    
    } // end WinMain
    
    ///////////////////////////////////////////////////////////
  • 相关阅读:
    HTML中ID与NAME的区别
    三层架构的学习感悟(二)
    linux svn安装和配置,不结合apache
    _dopostback回发后台的局限
    ASP.NET 服务器端控件响应客户端事件
    linux centos 下面httpd支持的svn 服务器端安装
    最简单的html tab选项卡
    VC2010 控件的事件窗口面板空白解决办法
    记录一次低版本手机h5页面不能进行跳转
    设计模式的理解
  • 原文地址:https://www.cnblogs.com/seebro/p/3325304.html
Copyright © 2011-2022 走看看