Option Explicit

'**************************************************************
'
'                        《梦想之翼》
'
'VB+DirectX7编写,包括图像、键盘、鼠标、声音处理。
'
'经过多次改进和完善,是一个比较易用的引擎。
'
'                                    ----作者:袁进峰
'
'                                        2004年9月13日
'
'**************************************************************

'=========================《鼠标指针位置》======================
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Type POINTAPI
    X As Long
    Y As Long
End Type
'========================《显示或隐藏鼠标》=====================
Public Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long

'==================《用于显示、控制速度的函数》================
Private Declare Function GetTickCount Lib "kernel32" () As Long
Dim FPS_Count As Long
'显示速度所用变量
Dim mTimer As Long
Dim AddFPS As Long
'==============================================================
Public Type POS
    X As Integer
    Y As Integer
End Type
'==============================================================

Dim ObjhWnd As Long
Dim BlthWnd As Long

Dim Dx As New DirectX7
Dim DDraw As DirectDraw7

Public KeJianMian As DirectDrawSurface7
Public HuanChong As DirectDrawSurface7

Dim Clipper As DirectDrawClipper

Dim Gamea As DirectDrawGammaControl

Public destRect As RECT
Public srcRect As RECT

Dim DI As DirectInput

Public KeyDevice As DirectInputDevice
Public KeyState As DIKEYBOARDSTATE

Public dimouse As DirectInputDevice
Public MouseState As DIMOUSESTATE

Dim DSound As DirectSound

Dim objdmloader As DirectMusicLoader
Dim objdmperf As DirectMusicPerformance
Public objdmseg As DirectMusicSegment
Public objdmsegst As DirectMusicSegmentState

Dim g_MapW As Integer
Dim g_MapH As Integer

Dim StdFont As New StdFont
Dim Font As IFont

Public Type DSurface
    Image As DirectDrawSurface7
    W As Integer
    H As Integer
End Type

'初始化DDraw
Public Sub InitEngine(FormhWnd As Long, _
Optional Width As Integer, Optional Height As Integer, _
Optional FullScreen As Boolean = False, _
Optional FWidth As Integer = 640, Optional FHeight As Integer = 480, _
Optional Color As Integer = 16)
    g_MapW = Width
    g_MapH = Height
    ObjhWnd = FormhWnd
    Set DDraw = Dx.DirectDrawCreate("")
    '========================《设置显示模式》==============================
    If FullScreen = True Then
        Call DDraw.SetCooperativeLevel(FormhWnd, DDSCL_FULLSCREEN Or DDSCL_EXCLUSIVE)
        Call DDraw.SetDisplayMode(FWidth, FHeight, Color, 0, DDSDM_DEFAULT)
    Else
        Call DDraw.SetCooperativeLevel(FormhWnd, DDSCL_NORMAL)
    End If
    '======================================================================
    '定义变量
    Dim ddsd As DDSURFACEDESC2
    '========================《设置主表面》================================
    ddsd.lFlags = DDSD_CAPS 'Or DDSD_BACKBUFFERCOUNT
    ddsd.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE
    Set KeJianMian = DDraw.CreateSurface(ddsd)
    '========================《设置缓冲表面》==============================
    ddsd.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT
    ddsd.lWidth = Width
    ddsd.lHeight = Height
    ddsd.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_SYSTEMMEMORY
    Set HuanChong = DDraw.CreateSurface(ddsd)
    '==========================《初始化字体》==============================
    Set Font = StdFont
    Font.Name = "宋体"
    '************************************************************
    Call InitDI(FormhWnd)
    Call InitMid
    Call initGamma
End Sub

'===========================《Gamea色彩控制》==========================
Sub initGamma()
    Dim mmap As DDGAMMARAMP
    Set Gamea = KeJianMian.GetDirectDrawGammaControl
    Call Gamea.GetGammaRamp(DDSGR_DEFAULT, mmap)
End Sub

'=======================《剪切》=======================================
'窗体调用成功后,调用,必写
Public Sub ClipperhWnd(hWnd As Long)
    BlthWnd = hWnd
    Set Clipper = DDraw.CreateClipper(0)
    Clipper.SetHWnd hWnd
    KeJianMian.SetClipper Clipper
    Call Dx.GetWindowRect(hWnd, destRect)
End Sub

''LoadImge(DirectDrawSurface7变量,图像路径,透明色)
Public Function LoadImage(FileName As String, Optional Color As Long = &HF81F) As DSurface
    On Error GoTo LoadImageErr
   
    Dim ddsd As DDSURFACEDESC2
    ddsd.lFlags = DDSD_CAPS
    ddsd.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_SYSTEMMEMORY
   
    '装载图像
    Set LoadImage.Image = DDraw.CreateSurfaceFromFile(FileName, ddsd)
    'Set image = DDraw.CreateSurfaceFromResource(, "PIC1", ddsd)
    LoadImage.W = ddsd.lWidth
    LoadImage.H = ddsd.lHeight
    '设置透明色
    Dim key As DDCOLORKEY
    key.low = Color
    key.high = Color
    Call LoadImage.Image.SetColorKey(DDCKEY_SRCBLT, key)
    Exit Function
LoadImageErr:
    MsgBox "没有找到" + FileName + "图像文件。"
End Function

'*********************************************************************
'BltImage(DirectDrawSurface7变量,输X,输Y,宽,高,取X,取Y)
Public Sub BltImage(Image As DSurface, X1 As Integer, Y1 As Integer, _
Width As Integer, Height As Integer, Optional X2 As Integer, _
Optional Y2 As Integer)
    Dim ImageRECT As RECT              '输入输出时图像的大小
    Dim BX As Integer, BY As Integer   '输出图像的位置
    BX = X1
    BY = Y1
    '-----------------输出图像的大小------------------
    ImageRECT.Left = X2
    ImageRECT.Top = Y2
    ImageRECT.Right = Width + X2
    ImageRECT.Bottom = Height + Y2
    '自己做的自动剪切处理,比DirectX提供的快很多
    '----------------若碰边自动剪切--------------------
    If X1 < 0 Then
        BX = 0
        ImageRECT.Left = Abs(X1) + X2
        If ImageRECT.Left >= ImageRECT.Right Then Exit Sub
    End If
   
    If Y1 < 0 Then
        BY = 0
        ImageRECT.Top = Abs(Y1) + Y2
        If ImageRECT.Top >= ImageRECT.Bottom Then Exit Sub
    End If
 
    If Width + X1 > g_MapW Then
        ImageRECT.Right = X2 - X1 + g_MapW
    End If
   
    If Height + Y1 > g_MapH Then
        ImageRECT.Bottom = Y2 - Y1 + g_MapH
    End If
    '一点也没出画出来
    If ImageRECT.Right <= 0 Or ImageRECT.Bottom <= 0 Then Exit Sub
    '-------------------------------------------------
    '透明绘图
    Call HuanChong.BltFast(BX, BY, Image.Image, ImageRECT, DDBLTFAST_SRCCOLORKEY)  'DDBLTFAST_WAIT
End Sub

'************************画出所有**************************************
'BltImageAll(图像,X,Y)
Public Sub BltImageAll(Image As DSurface, X1 As Integer, Y1 As Integer)
    Dim ImageRECT As RECT              '输入输出时图像的大小
    Dim BX As Integer, BY As Integer   '输出图像的位置
    BX = X1
    BY = Y1
    '-----------------输出图像的大小------------------
    ImageRECT.Left = 0
    ImageRECT.Top = 0
    ImageRECT.Right = Image.W
    ImageRECT.Bottom = Image.H
   
    '自己做的自动剪切处理,比DirectX提供的快很多
    '----------------若碰边自动剪切--------------------
    If X1 < 0 Then
        BX = 0
        ImageRECT.Left = Abs(X1)
        If ImageRECT.Left >= ImageRECT.Right Then Exit Sub
    End If
   
    If Y1 < 0 Then
        BY = 0
        ImageRECT.Top = Abs(Y1)
        If ImageRECT.Top >= ImageRECT.Bottom Then Exit Sub
    End If
 
    If Image.W + X1 > g_MapW Then
        ImageRECT.Right = g_MapW - X1
    End If
   
    If Image.H + Y1 > g_MapH Then
        ImageRECT.Bottom = g_MapH - Y1
    End If
    '一点也没出画出来
    If ImageRECT.Right <= 0 Or ImageRECT.Bottom <= 0 Then Exit Sub
    '-------------------------------------------------
    '透明绘图
    Call HuanChong.BltFast(BX, BY, Image.Image, ImageRECT, DDBLTFAST_SRCCOLORKEY)  'DDBLTFAST_WAIT
End Sub

Public Sub PrintText(Text As String, X As Integer, Y As Integer, _
Optional FontSize As Integer = 10, Optional Color As Long = 0)
    Font.Size = FontSize
    HuanChong.SetFont Font
    HuanChong.SetForeColor Color
    HuanChong.DrawText X, Y, Text, False
End Sub

'全屏下淡入
Public Sub FadeIn()
    Dim NewGammamp As DDGAMMARAMP, i As Integer, j As Integer, K As Long
   
    For i = 256 To 0 Step -8
        For j = 0 To 255
            K = CLng(j) * CLng(i)
            If K > 32767 Then K = K - 65536
            NewGammamp.red(j) = K
            NewGammamp.green(j) = K
            NewGammamp.blue(j) = K
        Next j
        Call Gamea.SetGammaRamp(DDSGR_DEFAULT, NewGammamp)
    Next i
End Sub

'全屏下淡出
Public Sub FadeOut()
    Dim NewGammamp As DDGAMMARAMP, i As Integer, j As Integer, K As Long
   
    For i = 0 To 256 Step 8
        For j = 0 To 255
            K = CLng(j) * CLng(i)
            If K > 32767 Then K = K - 65536
            NewGammamp.red(j) = K
            NewGammamp.green(j) = K
            NewGammamp.blue(j) = K
        Next j
        Call Gamea.SetGammaRamp(DDSGR_DEFAULT, NewGammamp)
    Next i
End Sub

Sub BltScreen()
    Call Dx.GetWindowRect(BlthWnd, destRect)
    Call KeJianMian.Blt(destRect, HuanChong, srcRect, DDBLT_WAIT)
End Sub

'=========================键盘和鼠标处理=======================
Public Sub InitDI(hWnd As Long)
    Set DI = Dx.DirectInputCreate() ' Create the DirectInput Device
    Set KeyDevice = DI.CreateDevice("GUID_SysKeyboard") ' Set it to use the keyboard.
    KeyDevice.SetCommonDataFormat DIFORMAT_KEYBOARD ' Set the data format to the keyboard format
    KeyDevice.SetCooperativeLevel hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE ' Set Cooperative level
    KeyDevice.Acquire
   
    Set dimouse = DI.CreateDevice("guid_sysmouse")
    dimouse.SetCommonDataFormat DIFORMAT_MOUSE
    dimouse.SetCooperativeLevel hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE
    dimouse.Acquire
End Sub

'========================音效处理==============================
Public Sub InitWav(hWnd As Long)
    Set DSound = Dx.DirectSoundCreate("")
    DSound.SetCooperativeLevel hWnd, DSSCL_PRIORITY
End Sub

Public Function LoadWav(FileName As String) As DirectSoundBuffer
    Dim BufferDesc As DSBUFFERDESC
    Dim WaveFormat As WAVEFORMATEX
   
    BufferDesc.lFlags = DSBCAPS_CTRLVOLUME Or DSBCAPS_CTRLPAN Or DSBCAPS_CTRLFREQUENCY Or DSBCAPS_CTRLPOSITIONNOTIFY
    Set CreSound = DSound.CreateSoundBufferFromFile(FileName, BufferDesc, WaveFormat)

End Function

Public Sub PlayWav(Sound As DirectSoundBuffer, nClose As Boolean, LoopSound As Boolean)
    If nClose Then
      Sound.Stop
      Sound.SetCurrentPosition 0
    End If
 
    If LoopSound Then
      Sound.Play 1
    Else
      Sound.Play 0
    End If
End Sub

'===========================播放MID函数===============================
Public Sub InitMid()
    '建立directmusicloader对象
    Set objdmloader = Dx.DirectMusicLoaderCreate
    '建立directmusicperformance对象
    Set objdmperf = Dx.DirectMusicPerformanceCreate
    '初始化directmusicperformance对象
    objdmperf.Init Nothing, 0
    objdmperf.SetPort -1, 80
    objdmperf.SetMasterAutoDownload True
    objdmperf.SetMasterVolume 0
End Sub

Public Sub LoadMid(FileName As String)
    Set objdmseg = Nothing
    Set objdmseg = objdmloader.LoadSegment(FileName)
End Sub
 
Public Sub PlayMid(Optional Play As Boolean = True, Optional Start As Long)
    If Play = True Then
        If objdmperf.IsPlaying(objdmseg, objdmsegst) = True Then
            '停止播放
            Call objdmperf.Stop(objdmseg, objdmsegst, 0, 0)
        End If
        objdmseg.SetStartPoint (Start)
        Set objdmsegst = objdmperf.PlaySegment(objdmseg, 0, 0)
    Else
        '停止播放midi文件
        Call objdmperf.Stop(objdmseg, objdmsegst, 0, 0)
    End If
End Sub

Public Sub ScrollMid(Optional Value As Integer)
    Call objdmperf.SetMasterVolume(Value)
End Sub

'=========================================================
'*****************《控帧》*******************
Public Sub ControlFPS(Time As Integer)
    Do While GetTickCount - FPS_Count < Time
        DoEvents
    Loop
    FPS_Count = GetTickCount
End Sub

'***************《获得速度》*****************
Public Sub GetFPS(FPS As Integer)
    If GetTickCount() - mTimer >= 1000 Then
        mTimer = GetTickCount
        FPS = AddFPS + 1
        AddFPS = 0
    Else
        AddFPS = AddFPS + 1
    End If
End Sub
'======================退出Engine=========================
Public Sub ExitEngine()
    'ExitDDraw
    Call DDraw.RestoreDisplayMode
    Call DDraw.SetCooperativeLevel(ObjhWnd, DDSCL_NORMAL)
    Set HuanChong = Nothing
    Set KeJianMian = Nothing
    Set Dx = Nothing
    Set Gamea = Nothing
    'ExitMid
    Set objdmsegst = Nothing
    Set objdmseg = Nothing
    Set objdmperf = Nothing
    Set objdmloader = Nothing
    'ExitDI
    Set DI = Nothing
    Set KeyDevice = Nothing
    Set dimouse = Nothing
    'ExitWav
    Set DSound = Nothing
   
    Set StdFont = Nothing
    Set Font = Nothing
End Sub

转载于:https://www.cnblogs.com/liuhan/archive/2010/07/10/1774922.html

DX7游戏引擎(梦想之翼) for VB6相关推荐

  1. 魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~1游戏引擎

    魔塔之拯救白娘子 完整工程下载地址: 前边学习了DX8的相关知识后,想做一个游戏试试看.这里我选取了魔塔这个比较大众化的小游戏.主要是魔塔的游戏画面比较固定,也很简单,似乎很容易做.下边就开始做吧. ...

  2. DX9绘图-------VB6编程学习DX9游戏编程DirectX9编程2D小游戏源码冷风引擎CoolWind2D游戏引擎(8)

    DX9绘图 前边讲了一些绘图基础,看不懂不要紧,其实我也看不懂哦.数学基础不好的话,确实不容易看懂,但只要懂的调用,能完成想要做的工作,那就马马虎虎吧,若是深入研究的话,建议买本计算机视觉艺术,计算机 ...

  3. Cocos游戏引擎,让小保安成就大梦想

    秦丕胜是大连的一位保安.与非常多自学成才的人一样,2010年,在考上日照职业技术学院一年后便退了学. 因为没有高学历.加上喜欢自由,他来到了大连成为了一名保安.从高中開始,秦丕胜就酷爱代码,他曾自豪地 ...

  4. Direct3D体系结构-------VB6编程学习DX9游戏编程DirectX9编程2D小游戏源码冷风引擎CoolWind2D游戏引擎(3)

    Direct3D体系结构 以下为本人自学DX9的记录,整理出来是方便大家学习DX9底层基础知识的, 如果你不想学习Direct3D 的原理的话,想直接使用冷风引擎(CoolWind2D游戏引擎), 请 ...

  5. 开源图形/游戏引擎的点评

    开源图形/游戏引擎的点评 什么是游戏引擎?举个简单例子,在某游戏中的一个场景中,玩家控制的角色躲藏在屋子里,敌人正在屋子外面搜索玩家.突然控制的角色碰倒了桌子上的一个杯子,杯子坠地发出破碎声,敌人在听 ...

  6. Cocos2d手机游戏引擎介绍

    Cocos2d 是一个 Python 用来开发2D 游戏和其他图形化交互应用的框架. 主要特性 界面流程控制: 非常容易地管理不同场景(scenes)之间的流程控制 精灵: 快速而方便的精灵 动作: ...

  7. [转]Java游戏引擎

    JME(jMonkey Engine): JME是一个高性能的3D图形API,采用LWJGL作为底层支持.它的后续版本将支持JOGL.JME和Java 3D具有类似的场景结构,开发者必须以树状方式组织 ...

  8. 利用普普通通的游戏引擎实现普普通通的电梯调度算法

    注:这是目前WebGL2.0支持的浏览器版本号列表 稀疏 如同在那个慵懒的午后,贴心地给你指出你代码块的错误的主程老大的头发 WebGL2.0这目前稀疏的浏览器支持,着实令人唏嘘,不过我们要说的不是W ...

  9. 千百万Java开发者的福音:跨平台Cocos2d-Java游戏引擎诞生

    传送门 CocosEditor官网:http://cocoseditor.com/ 引擎工具下载及配置:Cocos2d-Java游戏引擎和相关开发工具的安装配置 前言 跨平台Cocos2d-Java游 ...

最新文章

  1. MySQL这样写UPDATE语句,劝退
  2. 关于Cocos2d-x中增加暂停按钮的步骤
  3. libevent中的缓冲区(二)
  4. PAT L2-005 集合相似度
  5. Cisco交换机实现端口安全与帮定
  6. 使用机器学习预测天气_使用机器学习的二手车价格预测
  7. 图片识别不了小程序怎么办_图片转文字【微信小程序】
  8. 前端vue适配不同的分辨率_前端面试时,被问到项目中的难点有哪些?
  9. python 偏函数装饰器
  10. matlab 圆和直线的交点,用matlab求直线和椭圆的交点坐标!
  11. unity 射线检测真机失效_Unity 2019 射线检测失效
  12. Git和Gitlab协同工作
  13. 计算机软件从高级语言向低级语言转换的两种方式
  14. [转]如何查找最新文献
  15. excel怎么按颜色统计单元格个数
  16. Previously configured interpreter中显示<No interpreter>的解决方法
  17. 带你入门多目标跟踪(一)领域概述
  18. 导购提成怎么算_导购提成应该怎么算?
  19. 重磅:保姆级Java技术图谱发布!够学到元宵节了,赶紧收藏!
  20. 微信公众号怎样获取用户基本信息(含是否已关注)

热门文章

  1. unity 多台 显示器 控制_设计专业显示器,哪些参数重要?明基PD2700U显示器给你答案...
  2. 股票市场量化分析matlab,(特价书)MATLAB金融算法分析实战:基于机器学习的股票量化分析...
  3. 小米2020校招笔试题及答案
  4. win10下点击开始菜单没响应的解决方案
  5. 浅析大规模多语种通用神经机器翻译方法
  6. 上一主题 下一主题 一个微信账号登陆信息提取软件,有人知道吗?
  7. unity2019安装完后打不开直接闪退_VS2019打不开或没反应该怎么解决?
  8. Arduino开发ESP8266网页服务器控制LED灯
  9. HDOJ - 2371 矩阵乘法
  10. 黑马C++笔记——模板(CPP)