Advertisement

Drawing Lines in Direct Draw??

Started by July 02, 2002 08:19 PM
1 comment, last by brewknowc 22 years, 8 months ago
Hi, I posted this in directX, but thought it might be too basic for them to bother answering, so I''ll try it here. I''ve been working on an rpg for a while using DirectX 6 (yeah i know) and am using bitmaps for all the graphics. I want to draw a line between the player and the enemy (like laser fire) was wondering how this could be accomplished in DirectDraw? Any other help would be appreciated. Thanks BC
- Free Your Mind -
Try implementing Brasenham''s Line Algorithm. Look here for how it works, though you''ll have to port it to DirectX. It should give you the basic idea, though.

http://kmitnb05.kmitnb.ac.th/~tct04043/linebrasenham.htm

Or here: Taken from Lamothe''s Tricks of the Windows Game Programming Gurus


  int Draw_Line(int x0, int y0, // starting position               int x1, int y1, // ending position              UCHAR color,    // color index              UCHAR *vb_start, int lpitch) // video buffer and memory pitch{// this function draws a line from xo,yo to x1,y1 using differential error// terms (based on Bresenahams work)int dx,             // difference in x''s    dy,             // difference in y''s    dx2,            // dx,dy * 2    dy2,     x_inc,          // amount in pixel space to move during drawing    y_inc,          // amount in pixel space to move during drawing    error,          // the discriminant i.e. error i.e. decision variable    index;          // used for looping// pre-compute first pixel address in video buffervb_start = vb_start + x0 + y0*lpitch;// compute horizontal and vertical deltasdx = x1-x0;dy = y1-y0;// test which direction the line is going in i.e. slope angleif (dx>=0)   {   x_inc = 1;   } // end if line is moving rightelse   {   x_inc = -1;   dx    = -dx;  // need absolute value   } // end else moving left// test y component of slopeif (dy>=0)   {   y_inc = lpitch;   } // end if line is moving downelse   {   y_inc = -lpitch;   dy    = -dy;  // need absolute value   } // end else moving up// compute (dx,dy) * 2dx2 = dx << 1;dy2 = dy << 1;// now based on which delta is greater we can draw the lineif (dx > dy)   {   // initialize error term   error = dy2 - dx;    // draw the line   for (index=0; index <= dx; index++)       {       // set the pixel       *vb_start = color;       // test if error has overflowed       if (error >= 0)           {          error-=dx2;          // move to next line          vb_start+=y_inc;	   } // end if error overflowed       // adjust the error term       error+=dy2;       // move to the next pixel       vb_start+=x_inc;       } // end for   } // end if |slope| <= 1else   {   // initialize error term   error = dx2 - dy;    // draw the line   for (index=0; index <= dy; index++)       {       // set the pixel       *vb_start = color;       // test if error overflowed       if (error >= 0)          {          error-=dy2;          // move to next line          vb_start+=x_inc;          } // end if error overflowed       // adjust the error term       error+=dx2;       // move to the next pixel       vb_start+=y_inc;       } // end for   } // end else |slope| > 1// return successreturn(1);} // end Draw_Line  


-Arek the Absolute
-Arek the Absolute"The full quartet is pirates, ninjas, zombies, and robots. Create a game which involves all four, and you risk being blinded by the sheer level of coolness involved." - Superpig
Advertisement
Probably not the fastest way, but you can also draw line by acquiring an HDC, and then using the GDI MoveToEx() and LineTo() functions. Again, not the fastest, but it trades speed for ease of use.
Peon

This topic is closed to new replies.

Advertisement