﻿<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>A1VBCode Forums / Classic Visual Basic (VB 6 or earlier) / Game Programming  / Hello, help with DirectDraw / Latest Posts</title><generator>InstantForum.NET v4.1.1</generator><description>A1VBCode Forums</description><link>http://www.a1vbcode.com/vbforums/</link><webMaster>forums@a1vbcode.com</webMaster><lastBuildDate>Thu, 29 Jul 2010 18:36:33 GMT</lastBuildDate><ttl>20</ttl><item><title>Hello, help with DirectDraw</title><link>http://www.a1vbcode.com/vbforums/Topic27225-8-1.aspx</link><description>Greetings,&lt;/P&gt;&lt;P&gt;i've been programming with Bitblt (VB6) for a while and i'm trying to learn DirectDraw7.&lt;/P&gt;&lt;P&gt;I'm trying to use BltFast to convert this background into a tiled map.&lt;/P&gt;&lt;P&gt;actually, i was sucessfull of making tiles, but when the sprites run over the background i get visual errors,&lt;/P&gt;&lt;P&gt;so it seems i'm having problems with refreshing the background.&lt;/P&gt;&lt;P&gt;here's the unedited code i started with.&lt;/P&gt;&lt;P&gt;my question is, what do i have to change to make this a tiled map in BltFast?&lt;/P&gt;&lt;P&gt;&lt;FONT color=#33bb33&gt;Option Explicit&lt;BR&gt;Option Base 0&lt;BR&gt;&lt;BR&gt;'Windows &lt;/FONT&gt;&lt;A class=kLink oncontextmenu="return false;" id=KonaLink2 &amp;#111;nmouseover=adlinkMouseOver(event,this,2); style="POSITION: static; TEXT-DECORATION: underline! important" &amp;#111;nclick=adlinkMouseClick(event,this,2); &amp;#111;nmouseout=adlinkMouseOut(event,this,2); href="http://www.xtremevbtalk.com/showthread.php?t=304851#" target=_top&gt;&lt;FONT style="FONT-WEIGHT: 400; FONT-SIZE: 10pt; COLOR: blue! important; FONT-FAMILY: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; POSITION: static" color=#33bb33&gt;&lt;SPAN class=kLink style="FONT-WEIGHT: 400; FONT-SIZE: 10pt; COLOR: blue! important; FONT-FAMILY: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; POSITION: relative"&gt;API&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;FONT color=#33bb33&gt; functions and structures&lt;BR&gt;Private Declare Function GetTickCount _&lt;BR&gt;    Lib "kernel32" () As Long&lt;BR&gt;&lt;BR&gt;'program constants&lt;BR&gt;Const SCREENWIDTH As Long = 640&lt;BR&gt;Const SCREENHEIGHT As Long = 480&lt;BR&gt;Const MAXFRAMERATE As Long = 100&lt;BR&gt;Const NUMSPRITES As Long = 30&lt;BR&gt;&lt;BR&gt;'program controls&lt;BR&gt;Dim WithEvents Picture1 As PictureBox&lt;BR&gt;&lt;BR&gt;'DirectDraw variables&lt;BR&gt;Dim objDX As DirectX7&lt;BR&gt;Dim ddraw As DirectDraw7&lt;BR&gt;Dim objDDClip As DirectDrawClipper&lt;BR&gt;Private ddcKey As DDCOLORKEY&lt;BR&gt;&lt;BR&gt;'primary display surface variables&lt;BR&gt;Dim ddScreen As DirectDrawSurface7&lt;BR&gt;Private ddsdScreen As DDSURFACEDESC2&lt;BR&gt;Private rScreen As RECT&lt;BR&gt;&lt;BR&gt;'double buffer variables&lt;BR&gt;Dim ddBackBuffer As DirectDrawSurface7&lt;BR&gt;Private ddsdBackBuffer As DDSURFACEDESC2&lt;BR&gt;Dim rBackBuffer As RECT&lt;BR&gt;&lt;BR&gt;'background image variables&lt;BR&gt;Dim ddBackground As DirectDrawSurface7&lt;BR&gt;Private ddsdBackground As DDSURFACEDESC2&lt;BR&gt;Dim rBackground As RECT&lt;BR&gt;&lt;BR&gt;'sprite variables&lt;BR&gt;Dim ddSprites(NUMSPRITES) As DirectDrawSurface7&lt;BR&gt;Dim SpriteX(NUMSPRITES) As Long&lt;BR&gt;Dim SpriteY(NUMSPRITES) As Long&lt;BR&gt;Dim SpeedX(NUMSPRITES) As Long&lt;BR&gt;Dim SpeedY(NUMSPRITES) As Long&lt;BR&gt;Private ddsdSprite As DDSURFACEDESC2&lt;BR&gt;Dim rSprite As RECT&lt;BR&gt;&lt;BR&gt;'program variables&lt;BR&gt;Dim rTemp As RECT&lt;BR&gt;Dim bRunning As Boolean&lt;BR&gt;Dim n As Long&lt;BR&gt;&lt;BR&gt;Private Sub Form_Load()&lt;BR&gt;    Static lStartTime As Long&lt;BR&gt;    Static lCounter As Long&lt;BR&gt;    Static lNewTime As Long&lt;BR&gt;    &lt;BR&gt;    bRunning = True&lt;BR&gt;    Randomize GetTickCount&lt;BR&gt;    &lt;BR&gt;    'set up the main form&lt;BR&gt;    With Form1&lt;BR&gt;        .Width = SCREENWIDTH * Screen.TwipsPerPixelX&lt;BR&gt;        .Height = SCREENHEIGHT * Screen.TwipsPerPixelY&lt;BR&gt;        .AutoRedraw = False&lt;BR&gt;        .ClipControls = False&lt;BR&gt;        .KeyPreview = True&lt;BR&gt;        .ScaleMode = 3&lt;BR&gt;        .BorderStyle = 1&lt;BR&gt;        .Show&lt;BR&gt;    End With&lt;BR&gt;&lt;BR&gt;    'create the PictureBox control&lt;BR&gt;    Set Picture1 = Controls.Add("VB.PictureBox", "Picture1")&lt;BR&gt;    With Picture1&lt;BR&gt;        .AutoRedraw = False&lt;BR&gt;        .BorderStyle = 1&lt;BR&gt;        .ClipControls = False&lt;BR&gt;        .ScaleMode = 3&lt;BR&gt;        .BackColor = RGB(0, 0, 0)&lt;BR&gt;        .Left = 0&lt;BR&gt;        .Top = 0&lt;BR&gt;        .Width = Form1.ScaleWidth&lt;BR&gt;        .Height = Form1.ScaleHeight&lt;BR&gt;        .Visible = True&lt;BR&gt;    End With&lt;BR&gt;&lt;BR&gt;    'create the DirectX object&lt;BR&gt;    Set objDX = New DirectX7&lt;BR&gt;    &lt;BR&gt;    'create the DirectDraw object&lt;BR&gt;    Set ddraw = objDX.DirectDrawCreate("")&lt;BR&gt;&lt;BR&gt;    'set up primary display surface&lt;BR&gt;    ddraw.SetCooperativeLevel Picture1.hWnd, DDSCL_NORMAL&lt;BR&gt;    ddsdScreen.lFlags = DDSD_CAPS&lt;BR&gt;    ddsdScreen.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE&lt;BR&gt;    ddsdScreen.lWidth = SCREENWIDTH&lt;BR&gt;    ddsdScreen.lHeight = SCREENHEIGHT&lt;BR&gt;    Set ddScreen = ddraw.CreateSurface(ddsdScreen)&lt;BR&gt;    &lt;BR&gt;    'set surface rectangle&lt;BR&gt;    rScreen.Bottom = ddsdScreen.lHeight&lt;BR&gt;    rScreen.Right = ddsdScreen.lWidth&lt;BR&gt;    &lt;BR&gt;    'create the clipper object&lt;BR&gt;    Set objDDClip = ddraw.CreateClipper(0)&lt;BR&gt;    objDDClip.SetHWnd Picture1.hWnd&lt;BR&gt;    ddScreen.SetClipper objDDClip&lt;BR&gt;    &lt;BR&gt;    'create the back buffer&lt;BR&gt;    ddsdBackBuffer.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT&lt;BR&gt;    ddsdBackBuffer.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN&lt;BR&gt;    ddsdBackBuffer.lWidth = SCREENWIDTH&lt;BR&gt;    ddsdBackBuffer.lHeight = SCREENHEIGHT&lt;BR&gt;    Set ddBackBuffer = ddraw.CreateSurface(ddsdBackBuffer)&lt;BR&gt;    rBackBuffer.Bottom = ddsdBackBuffer.lHeight&lt;BR&gt;    rBackBuffer.Right = ddsdBackBuffer.lWidth&lt;BR&gt;    &lt;BR&gt;    'load the background image&lt;BR&gt;    ddsdBackground.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT&lt;BR&gt;    ddsdBackground.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN&lt;BR&gt;    ddsdBackground.lWidth = SCREENWIDTH&lt;BR&gt;    ddsdBackground.lHeight = SCREENHEIGHT&lt;BR&gt;    Set ddBackground = ddraw.CreateSurfaceFromFile(App.Path &amp;amp; _&lt;BR&gt;        "\blueyellow.bmp", ddsdBackground)&lt;BR&gt;    rBackground.Bottom = ddsdBackground.lHeight&lt;BR&gt;    rBackground.Right = ddsdBackground.lWidth&lt;BR&gt;    ddBackBuffer.BltFast 0, 0, ddBackground, rBackground, _&lt;BR&gt;        DDBLTFAST_WAIT&lt;BR&gt;    &lt;BR&gt;    'set up the sprite information&lt;BR&gt;    ddsdSprite.lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT&lt;BR&gt;    ddsdSprite.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN&lt;BR&gt;    ddsdSprite.lWidth = 64&lt;BR&gt;    ddsdSprite.lHeight = 64&lt;BR&gt;    ddcKey.low = 0&lt;BR&gt;    ddcKey.high = 0&lt;BR&gt;    &lt;BR&gt;    'load the sprites&lt;BR&gt;    For n = 0 To NUMSPRITES&lt;BR&gt;        Set ddSprites(n) = ddraw.CreateSurfaceFromFile(App.Path &amp;amp; _&lt;BR&gt;            "\directx.bmp", ddsdSprite)&lt;BR&gt;        rSprite.Bottom = ddsdSprite.lHeight&lt;BR&gt;        rSprite.Right = ddsdSprite.lWidth&lt;BR&gt;        SpriteX(n) = Random(SCREENWIDTH - ddsdSprite.lWidth)&lt;BR&gt;        SpriteY(n) = Random(SCREENHEIGHT - ddsdSprite.lHeight)&lt;BR&gt;        Do Until SpeedX(n) &amp;lt;&amp;gt; 0&lt;BR&gt;            SpeedX(n) = Random(6) - 3&lt;BR&gt;        Loop&lt;BR&gt;        Do Until SpeedY(n) &amp;lt;&amp;gt; 0&lt;BR&gt;            SpeedY(n) = Random(6) - 3&lt;BR&gt;        Loop&lt;BR&gt;        ddSprites(n).SetColorKey DDCKEY_SRCBLT, ddcKey&lt;BR&gt;    Next n&lt;BR&gt;    &lt;BR&gt;    'main game loop&lt;BR&gt;    Do While bRunning&lt;BR&gt;        lCounter = GetTickCount - lStartTime&lt;BR&gt;        If lCounter &amp;gt; lNewTime Then&lt;BR&gt;            'update game display&lt;BR&gt;            Game_Update lCounter&lt;BR&gt;            'update frame count&lt;BR&gt;            lNewTime = lCounter + 1000 / MAXFRAMERATE&lt;BR&gt;        End If&lt;BR&gt;        DoEvents&lt;BR&gt;    Loop&lt;BR&gt;    &lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)&lt;BR&gt;    If KeyCode = 27 Then Shutdown&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)&lt;BR&gt;    Shutdown&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;Private Sub Form1_Click()&lt;BR&gt;    Shutdown&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;Private Sub Picture1_Click()&lt;BR&gt;    Shutdown&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;Private Sub Shutdown()&lt;BR&gt;    bRunning = False&lt;BR&gt;    Form1.Hide&lt;BR&gt;    ddraw.RestoreDisplayMode&lt;BR&gt;    ddraw.SetCooperativeLevel Picture1.hWnd, DDSCL_NORMAL&lt;BR&gt;    Set ddraw = Nothing&lt;BR&gt;    Set objDX = Nothing&lt;BR&gt;    End&lt;BR&gt;End Sub&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;A class=kLink oncontextmenu="return false;" id=KonaLink3 &amp;#111;nmouseover=adlinkMouseOver(event,this,3); style="POSITION: static; TEXT-DECORATION: underline! important" &amp;#111;nclick=adlinkMouseClick(event,this,3); &amp;#111;nmouseout=adlinkMouseOut(event,this,3); href="http://www.xtremevbtalk.com/showthread.php?t=304851#" target=_top&gt;&lt;FONT style="FONT-WEIGHT: 400; FONT-SIZE: 10pt; COLOR: blue! important; FONT-FAMILY: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; POSITION: static"&gt;&lt;FONT color=#33bb33&gt;&lt;SPAN class=kLink style="FONT-WEIGHT: 400; FONT-SIZE: 10pt; COLOR: blue! important; FONT-FAMILY: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; POSITION: relative"&gt;Public &lt;/SPAN&gt;&lt;SPAN class=kLink style="FONT-WEIGHT: 400; FONT-SIZE: 10pt; COLOR: blue! important; FONT-FAMILY: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; POSITION: relative"&gt;Function&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;FONT color=#33bb33&gt; Random(ByVal lNum As Long) As Long&lt;BR&gt;    Random = CLng(lNum * Rnd)&lt;BR&gt;End Function&lt;BR&gt;&lt;BR&gt;Public Sub Game_Update(ByVal MS As Long)&lt;BR&gt;    Static lTimer As Long&lt;BR&gt;    Static lStart As Long&lt;BR&gt;    Static lCounter As Long&lt;BR&gt;&lt;BR&gt;    'start counting draw time&lt;BR&gt;    lStart = GetTickCount&lt;BR&gt;&lt;BR&gt;    'erase sprites&lt;BR&gt;    For n = 0 To NUMSPRITES&lt;BR&gt;        rTemp.Left = SpriteX(n)&lt;BR&gt;        rTemp.Top = SpriteY(n)&lt;BR&gt;        rTemp.Right = rTemp.Left + ddsdSprite.lWidth&lt;BR&gt;        rTemp.Bottom = rTemp.Top + ddsdSprite.lHeight&lt;BR&gt;        ddBackBuffer.BltFast SpriteX(n), SpriteY(n), ddBackground, _&lt;BR&gt;            rTemp, DDBLTFAST_WAIT&lt;BR&gt;    Next n&lt;BR&gt;    &lt;BR&gt;    'move and draw the sprites&lt;BR&gt;    For n = 0 To NUMSPRITES&lt;BR&gt;        'update X position&lt;BR&gt;        SpriteX(n) = SpriteX(n) + SpeedX(n)&lt;BR&gt;        If SpriteX(n) &amp;lt; 1 Then&lt;BR&gt;            SpeedX(n) = -SpeedX(n)&lt;BR&gt;            SpriteX(n) = 1&lt;BR&gt;        ElseIf SpriteX(n) + ddsdSprite.lWidth &amp;gt; SCREENWIDTH Then&lt;BR&gt;            SpeedX(n) = -SpeedX(n)&lt;BR&gt;            SpriteX(n) = SCREENWIDTH - ddsdSprite.lWidth - 1&lt;BR&gt;        End If&lt;BR&gt;&lt;BR&gt;        'update Y position&lt;BR&gt;        SpriteY(n) = SpriteY(n) + SpeedY(n)&lt;BR&gt;        If SpriteY(n) &amp;lt; 1 Then&lt;BR&gt;            SpeedY(n) = -SpeedY(n)&lt;BR&gt;            SpriteY(n) = 1&lt;BR&gt;        ElseIf SpriteY(n) + ddsdSprite.lHeight &amp;gt; SCREENHEIGHT Then&lt;BR&gt;            SpeedY(n) = -SpeedY(n)&lt;BR&gt;            SpriteY(n) = SCREENHEIGHT - ddsdSprite.lHeight - 1&lt;BR&gt;        End If&lt;BR&gt;&lt;BR&gt;        'draw the sprite&lt;BR&gt;        rTemp.Left = SpriteX(n)&lt;BR&gt;        rTemp.Top = SpriteY(n)&lt;BR&gt;        rTemp.Right = SpriteX(n) + ddsdSprite.lWidth&lt;BR&gt;        rTemp.Bottom = SpriteY(n) + ddsdSprite.lHeight&lt;BR&gt;        ddBackBuffer.Blt rTemp, ddSprites(n), rSprite, _&lt;BR&gt;            DDBLT_WAIT Or DDBLT_KEYSRC&lt;BR&gt;    Next n&lt;BR&gt;    &lt;BR&gt;    'copy double buffer to the screen&lt;BR&gt;    objDX.GetWindowRect Picture1.hWnd, rScreen&lt;BR&gt;    ddScreen.Blt rScreen, ddBackBuffer, rBackBuffer, DDBLT_WAIT&lt;BR&gt;&lt;BR&gt;    'count the frames per second&lt;BR&gt;    If MS &amp;gt; lTimer + 1000 Then&lt;BR&gt;        lStart = GetTickCount - lStart&lt;BR&gt;        Form1.Caption = "FPS = " &amp;amp; lCounter &amp;amp; ", MS = " &amp;amp; lStart&lt;BR&gt;        lTimer = MS&lt;BR&gt;        lCounter = 0&lt;BR&gt;    Else&lt;BR&gt;        lCounter = lCounter + 1&lt;BR&gt;    End If&lt;BR&gt;End Sub&lt;/FONT&gt;</description><pubDate>Tue, 10 Mar 2009 18:51:04 GMT</pubDate><dc:creator>Wolfstrike</dc:creator></item></channel></rss>