// 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 ///////////////////////////////////////////////////////////

2D游戏编程7—星空案例的更多相关文章

  1. 2D游戏编程6—windows程序模板

    // INCLUDES /////////////////////////////////////////////// #define WIN32_LEAN_AND_MEAN // just say ...

  2. 2D游戏编程5—锁定频率

    核心利用win心跳函数GetTickCount利用差量锁定fps,如下代码锁定30fps,缺点为如果计算机不能以30fps运行,程序将低于30fps #define WIN32_LEAN_AND_ME ...

  3. 2D游戏编程3—GDI

    WM_PAINT消息触发程序重新绘制界面,过程如下: PAINTSTRUCT    ps;    // used in WM_PAINT HDC        hdc;    // handle to ...

  4. 2D游戏编程4—Windows事件

    windows消息传来的参数分解: Message: WM_ACTIVATE Parameterization: fActive      = LOWORD(wParam);       // act ...

  5. 2D游戏编程2--windows高级编程

      windows应用程序布局 编译流程 响应菜单事件消息 菜单消息处理实例: LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wpar ...

  6. 2D游戏编程1--windows编程模型

    一.创建一个windows程序步骤 1.创建一个windows类 2.创建一个事件处理程序 3.注册windows类 4.用之前创建的windows类创建一个窗口 5.创建一个主事件循环   二.存储 ...

  7. Windows游戏编程之从零开始d

    Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...

  8. 3D游戏编程大师技巧──2D引擎的编译问题

    接上一篇文章,这里将介绍2D引擎的编译,从现在开始才真正进入<3D游戏编程大师技巧>的学习.本书的第一.二章只是简介了游戏编程和windows编程,从第三章开始才是介绍<window ...

  9. 《Unity3D/2D游戏开发从0到1》正式出版发行

    <Unity3D/2D游戏开发从0到1>正式出版发行 去年个人编写的Unity书籍正式在2015年7月正式发行,现在补充介绍一下个人著作.书籍信息:      书籍的名称: <Uni ...

随机推荐

  1. React Native在虚拟运行app时,报错RCTRootView not found,怎么解决?

    报错: 解决方案:

  2. 详解MySQL中EXPLAIN解释命令(转)

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: expla ...

  3. sscanf用法简析

    1. 常见用法. char buf[512] = ; sscanf("123456 ", "%s", buf); printf("%s\n" ...

  4. 【Http】Http权威指南

    God Is Coder 2012-10-17 22:25 阅读:77 评论:0   <http权威指南>阅读笔记(十二) God Is Coder 2012-10-17 22:04 阅读 ...

  5. 关于JAVA面向对象基础整理以及个人的理解(适合初学者阅读)

    JAVA的基础语法等都跟C有很大的相似之处,所以这里就不多啰嗦了.直接从数组开始. 数组: 1.声明 int [] a; 在声明的过程中,并没有分配空间给数组.我们可以在声明的同时,用new来分配相应 ...

  6. java学习:用反射构造bean

    先贴一些反射的基本知识:-------------------------------------------------------------------- 一.什么是反射:反射的概念是由Smit ...

  7. Docker容器中运行ASP.NET Core

    在Linux和Windows的Docker容器中运行ASP.NET Core 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman就捷足先登了. ...

  8. ms flexbox 布局 (ko list)

    <!DOCTYPE html> <html> <head> <title></title> <script src="js/ ...

  9. shell中的内建命令, 函数和外部命令

    转自shell中的内建命令, 函数和外部命令 Shell识别三种基本命令:内建命令.Shell函数以及外部命令: (1)内建命令就是由Shell本身所执行的命令.    有些命令是由于其必要性才内建的 ...

  10. linux下查看文件编码及修改编码

    http://blog.csdn.net/jnbbwyth/article/details/6991425 查看文件编码在Linux中查看文件编码可以通过以下几种方式:1.在Vim中可以直接查看文件编 ...