If this page looks like garbage then you need one of these browsers...Please sign my programmer's page guestbook. |
Disecting the functionNow this is the first part of the function that we will disect...
if (w > 0) { thisSpr->width = w; if (h > 0) thisSpr->height = h; }
We're assigning the height and width of our sprite to the values of the w and h parameters (if they're greater than zero). Nothing tricky here. Let's look at the next if statement testing the parameter numFrames.
thisSpr->imgDynamic = dynamic; if (numFrames > 0) { thisSpr->frames=(char far **)malloc(numFrames*sizeof(char far *));
If we specified for there to 1 or more images for our sprite to hold (numFrames > 0) then the first thing we need to do is create an array of numFrames elements. The malloc line accomplishes that task for us. For some of you experienced C programmers of the DOS platform, you may be wondering whether or not I should've used farmalloc instead of malloc. After all, frames is a char far ** type variable. Actually, frames is a near pointer that points to an array of far pointers. The first point (*) is far (char far **), the second pointer (*) is near because there is no far modifier. The function farmalloc would've been used only if the frames variable was declared as char far * far *frames;. If malloc was successful in allocating the array, the number of frames will be set and each far pointer will be assigned an address to a specific image of NULL depending on whether the images are dynamic and whether both height and width are greater than zero. These are the lines that do this task:
if (thisSpr->frames != NULL) { thisSpr->noOfFrames = numFrames; for (i=0; i<numFrames; i++) if (dynamic && w > 0 && h > 0) { thisSpr->frames[i]=(char far *)farmalloc(w*h*sizeof(char)); if (thisSpr->frames[i] == NULL) retVal = 0; } else thisSpr->frames[i] = NULL; } else retVal = 0;
Of course if no frames we're asked for, that is if numFrames was zero or below, this line is read:
} else thisSpr->frames = NULL;
Finally we try to reserve memory for storing a background copy if we decide to erase sprites using dirty rectangles or not. (drtyRect parameter) Then we assign default values to the rest of the variables.
if (drtyRect) { thisSpr->background = (char far *)farmalloc(w * h * sizeof(char)); if (thisSpr->background == NULL && w && h) retVal = 0; thisSpr->backTransparent = 1; } else thisSpr->background = NULL; thisSpr->maxX = ScreenWidth - 1; thisSpr->maxY = ScreenHeight - 1; thisSpr->lenXcopy = thisSpr->width; thisSpr->lenYcopy = thisSpr->height; thisSpr->displayMem = videoMem; thisSpr->X = thisSpr->Y = thisSpr->lastX = thisSpr->lastY = thisSpr->minX = thisSpr->minY = thisSpr->startXoff = thisSpr->startYoff = thisSpr->currFrame = thisSpr->status = thisSpr->visible = thisSpr->clock = thisSpr->animThreshold = thisSpr->moveThreshold = 0; thisSpr->otherData = NULL; return retVal; } Send your questions, comments, or ideas here. This page hosted by
Get your own Free Home Page |