游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7830|回复: 27

C++的效率

[复制链接]

9

主题

102

帖子

343

积分

中级会员

Rank: 3Rank: 3

积分
343
发表于 2008-7-21 17:07:00 | 显示全部楼层 |阅读模式
手工只需要写以下代码,就可以创造一个看图软件
(用DDraw进行缩放(自动剪裁)+自动创建ddraw及surf+自动Present(可缩放)+自动调整客户区大小+总在最前)

VB6+vb6runtime根本做不到,VB6+ddraw就更不可能了
(创建ddraw及表面都要写半天,苦..还有剪裁,特别是缩放中的剪裁计算,就算懂"点的映射"思想也要写半天)

好,就算我吃亏,姑且让你用vb6runtime,Form,PictureBox,
那你AdjustWindow把client调整到800*600也需要一定的枯燥代码,AlwaysOnTop也要自己写.
而且你想处理所有WM_xxx消息也是很费事的。
而且,你这还没有使用 dx, 怎么算做游戏?


#include <instGameWnd.h>
#include <inst2D.h>
using namespace inst;
using namespace inst::i2d;

Bool g_bExit = False;

SmartPtr<CGameWnd> g_pMainWnd;
HWND g_hwnd;
const POS g_Width = 800, g_Height = 600;

SmartPtr<CGraphics> g;
SmartPtr<CSurf> pback;
SmartPtr<CSurf> pic_ori;

POS pic_x =0 , pic_y = 0;
Float scale = 1.0f;

void MainWnd_WinProc(UINT msg,WPARAM wparam,LPARAM lparam)
{
    Switch (msg)
    {
    Case WM_KEYDOWN:
        Switch (wparam)
        {
        case 'A': pic_x += 50 ;break;
        case 'S': pic_y -= 50 ;break;
        case 'D': pic_x -= 50 ;break;
        case 'W': pic_y += 50 ;break;
        case 'Q': scale*=1.05f ;break;
        case 'E': scale/=1.05f ;break;
        }
        break;
    Case WM_DESTROY:
        g_bExit=True;
        break;
    }
}

void Init()
{
    g_pMainWnd = new CGameWnd(L"TestWnd");
    g_pMainWnd->SetCallback(&MainWnd_WinProc);
    g_pMainWnd->Show();
    g_hwnd = g_pMainWnd->GetHWnd();

    CGraphics::CreateGraphics(g_Width,g_Height,g_hwnd);
    g = CGraphics::GetGraphics();
    pback = g->GetBackBuffer();

    pic_ori = new CSurf( L"C:\\a.bmp" );
}

void Render()
{
    if( (g_pMainWnd->GetStyle()&WS_MINIMIZE) != 0 ) return;
    pback->FillRect(0,0,pback->GetW(),pback->GetH(),Rgb(0,0,0));
    pback->Stretch( pic_x, pic_y, pic_ori->GetW() * scale, pic_ori->GetH() * scale,
        pic_ori, 0, 0, pic_ori->GetW(), pic_ori->GetH(), False);
    g-&gtresent();
}

Bool MsgLoop()
{
    if(g_bExit)return True;
    ::MSG msg;
    ZeroMemory(&msg,sizeof(msg));
    if(:eekMessage(&msg,0,0U,0U,PM_REMOVE))
    {
        ::TranslateMessage(&msg);
        :ispatchMessage(&msg);
    }
    Render();
    return False;
}

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR CmdLine,int nShowCmd)
{
    Init();
    While (1)
        if(MsgLoop())break;
    return 0;
}

9

主题

102

帖子

343

积分

中级会员

Rank: 3Rank: 3

积分
343
 楼主| 发表于 2008-7-21 17:21:00 | 显示全部楼层

Re:C++的效率

下面对几个重点进行说明(这些语句省略了以前的大量枯燥代码):

g_pMainWnd = new CGameWnd(L"TestWnd");
// 创建一个OverlappedWindow风格的窗口
// 然后,通过它的AdjustSize等方法可以方便地调整窗口,但本程序中,直接交给了下面的函数,真省事!

CGraphics::CreateGraphics(g_Width,g_Height,g_hwnd,[True],[True]);
// 根据传入的BackBuf尺寸,建立ddraw及前后台缓冲,
// 然后,根据客户区(==BackBuf尺寸)自动调整窗口的尺寸,调整窗口位置(居中)
// (如果可选的第4个参数(windowed)为False,则调整窗口风格为无边匡标题兰的最大化窗口)
// 当然如果不想自动调整窗口,可以把可选的第5个参数指定为False


pback->Stretch( pic_x, pic_y, pic_ori->GetW() * scale, pic_ori->GetH() * scale,
   pic_ori, 0, 0, pic_ori->GetW(), pic_ori->GetH(), False);
// 拉伸Blt表面。这里会先在逻辑层进行剪裁计算,不仅保证Blt不出错,还保证贴图的位置在逻辑上正确!

g-&gtresent();
// 根据windowed与否,以及窗口客户区大小等,进行Present.

77

主题

485

帖子

486

积分

中级会员

Rank: 3Rank: 3

积分
486
发表于 2008-7-21 17:49:00 | 显示全部楼层

Re:C++的效率

ScaleWidth,ScaleHeight,D3DXSprite,SetWindowPos就可以做自动缩放,看图片.

想投机取巧,少写东西,不如用VB吧.

77

主题

485

帖子

486

积分

中级会员

Rank: 3Rank: 3

积分
486
发表于 2008-7-21 17:50:00 | 显示全部楼层

Re:C++的效率

不要和懒汉,比懒啊.

77

主题

485

帖子

486

积分

中级会员

Rank: 3Rank: 3

积分
486
发表于 2008-7-21 17:53:00 | 显示全部楼层

Re:C++的效率

古时候有个故事这样说的:
从前有一对懒夫妻,男的从来不洗脸,女的从来不刷锅。
有一天有个小偷来家里偷东西,家里很乱找不到什么值钱的,正郁闷,被男主人发现了,于是慌乱中偷了锅就跑。男的就追。
过一会儿,男的回来了,跟老婆说,“那贼见我追上来,回身朝我脸上扎了一刀。不过幸亏我从来不洗脸,脸上全是污垢,他一刀没扎透,哈哈哈”
老婆说,“没事就好。看,幸亏我从来不刷锅,他偷走的只是上面那层污垢壳!”手里拎着个明晃晃的锅。

9

主题

102

帖子

343

积分

中级会员

Rank: 3Rank: 3

积分
343
 楼主| 发表于 2008-7-21 18:04:00 | 显示全部楼层

Re: Re:C++的效率

happyking: Re:C++的效率

ScaleWidth,ScaleHeight,D3DXSprite,SetWindowPos就可以做自动缩放,看图片.

想投机取巧,少写东西,不如用VB吧.


1 谁帮你建立D3DDevice?
2 建立D3DXSprite也比较麻烦
3 SetWindowPos能直接根据期望的client尺寸调整窗口大小马?

所谓,用过的,知道什么东西麻烦。
没有过的,我们在吵也毫无意义不是。

用VB?
文章开头我已经说了VB6写东西多麻烦了,
如果不用Form,用DX就更是恐怖,我都懒得打开VB写dx程序

9

主题

102

帖子

343

积分

中级会员

Rank: 3Rank: 3

积分
343
 楼主| 发表于 2008-7-21 18:05:00 | 显示全部楼层

Re: Re:C++的效率

happyking: Re:C++的效率

不要和懒汉,比懒啊.


那干脆用ASM,不,机器语言。
还有开机干脆用命令行,开个机也要十来分钟,多爽阿?

270

主题

6442

帖子

6446

积分

论坛元老

Rank: 8Rank: 8

积分
6446
发表于 2008-7-21 18:35:00 | 显示全部楼层

Re:C++的效率

楼主这贴应当发C++区, 比速度肯定是C++快过VB, 不用讲这些东西没意义,你用C++做出游戏你就牛,做不出就是初学者。

11

主题

1238

帖子

1782

积分

金牌会员

Rank: 6Rank: 6

积分
1782
发表于 2008-7-21 18:50:00 | 显示全部楼层

Re:C++的效率

又来了,看见都烦

77

主题

485

帖子

486

积分

中级会员

Rank: 3Rank: 3

积分
486
发表于 2008-7-22 14:58:00 | 显示全部楼层

Re:C++的效率

如果微软有一种工具,将VB的代码,直接转化成C,然后编译链接就好了.

这样VB开发快,简单,而且像VC一样执行快.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-21 22:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表