Game Programming All in One 2 nd Edition phần 6 docx

74 327 0
Game Programming All in One 2 nd Edition phần 6 docx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

scroll window. It is common to use the entire screen in scrolling-shooter games, but role- playing games often use a smaller window on the screen for scrolling, using the rest of the screen for gameplay (combat, inventory, and so on) and player/party information (see Figure 10.2). You could display one huge bitmap image in the virtual game world representing the cur- rent level of the game, and then copy (blit) a portion of that virtual world onto the screen. This is the simplest form of scrolling. Another method uses tiles to create the game world, which I’ll cover shortly. First, you’ll write a short program to demonstrate how to use bitmap scrolling. A Limited View of the World I have written a program called ScrollScreen that I will show you. The \chapter10\ScrollScreen folder on the CD-ROM contains the bigbg.bmp file used in this program. Although I encourage you to write the program yourself, feel free to load the project in either KDevelop, Dev-C++, or Visual C++. Figure 10.3 shows the bigbg.bmp file. When you run the program, the program will load the bigbg.bmp image into the virtual buffer and display the upper-left corner in the 640×480 screen. (You can change the reso- lution if you want, and I also encourage you to try running the program in full-screen mode using GFX_AUTODETECT_FULLSCREEN for the best effect.) The program detects when the A Limited View of the World 341 Figure 10.2 Some games use a smaller scroll window on the game screen. arrow keys have been pressed and adjusts the x and y variables accordingly. Displaying the correct view is then a simple matter of blitting with the x and y variables (see Figure 10.4). Chapter 10 ■ Programming Tile-Based Backgrounds with Scrolling342 Figure 10.3 The bigbg.bmp file is loaded into the virtual memory buffer for scrolling. Figure 10.4 The ScrollScreen program demonstrates how to perform virtual buffer scrolling. note You could just as easily create a large virtual memory bitmap at run time and draw on that bitmap using the Allegro drawing functions you have learned thus far. I have chosen to create the bitmap image beforehand and load it into the program to keep the code listing shorter. Either method works the same way. #include <conio.h> #include <stdlib.h> #include “allegro.h” //define some convenient constants #define MODE GFX_AUTODETECT_FULLSCREEN #define WIDTH 640 #define HEIGHT 480 #define STEP 8 //virtual buffer variable BITMAP *scroll; //position variables int x=0, y=0; //main function void main(void) { //initialize allegro allegro_init(); install_keyboard(); install_timer(); set_color_depth(16); if (set_gfx_mode(MODE, WIDTH, HEIGHT, 0, 0) != 0) { set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); allegro_message(allegro_error); return; } //load the large bitmap image from disk scroll = load_bitmap(“bigbg.bmp”, NULL); if (scroll == NULL) { set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); A Limited View of the World 343 allegro_message(“Error loading bigbg.bmp file”); return; } //main loop while (!key[KEY_ESC]) { //check right arrow if (key[KEY_RIGHT]) { x += STEP; if (x > scroll->w - WIDTH) x = scroll->w - WIDTH; } //check left arrow if (key[KEY_LEFT]) { x -= STEP; if (x < 0) x = 0; } //check down arrow if (key[KEY_DOWN]) { y += STEP; if (y > scroll->h - HEIGHT) y = scroll->h - HEIGHT; } //check up arrow if (key[KEY_UP]) { y -= STEP; if (y < 0) y = 0; } //draw the scroll window portion of the virtual buffer blit(scroll, screen, x, y, 0, 0, WIDTH-1, HEIGHT-1); Chapter 10 ■ Programming Tile-Based Backgrounds with Scrolling344 Introduction to Tile-Based Backgrounds 345 //slow it down rest(20); } destroy_bitmap(scroll); return; } END_OF_MAIN(); The first thing I would do to enhance this program is create two variables, lastx and lasty , and set them to equal x and y , respectively, at the end of the main loop. Then, before blit- ting the window, check to see whether x or y has changed since the last frame and skip the blit function. There is no need to keep blitting the same portion of the virtual back- ground if it hasn’t moved. Introduction to Tile-Based Backgrounds You have seen what a simple scroller looks like, even though it relied on keyboard input to scroll. A high-speed scrolling arcade game would automatically scroll horizontally or vertically, displaying a ground-, air-, or space-based terrain below the player (usually rep- resented by an airplane or a spaceship). The point of these games is to keep the action moving so fast that the player doesn’t have a chance to rest from one wave of enemies to the next. Two upcoming chapters have been dedicated to these very subjects! For the time being, I want to keep things simple to cover the basics of scrolling before you delve into these advanced chapters. If you have gotten the ScrollScreen program to work, then you have taken the first step to creating a scrolling arcade-style game (or one of the hundred-thousand or so games released in the past 20 years). In the old days, getting the scroller working was usually the first step to creating a sports game. In fact, that was my first assignment at Semi-Logic Entertainments back in 1994, during the prototype phase of Wayne Gretzky and the NHLPA All-Stars —to get a hockey rink to scroll as fast as possible. Back then, I was using Borland C++ 4.5, and it just wasn’t fast enough. First of all, this was a 16-bit compiler, while the 80×86- and Pentium-class PCs of the day were capable of 32-bit memory copies ( mov instruction) that could effectively draw four pixels at a time in 8-bit color mode or two pixels at a time in 16-bit mode. Fortunately,Allegro already uses high-speed assembly instructions for blitting, as the low-level functions are optimized for each operating system using assembly language. tip For an in-depth look at vertical scrolling, see Chapter 13, “Vertical Scrolling Arcade Games.” If you prefer to go horizontal, you can look forward to Chapter 14, “Horizontal Scrolling Platform Games.” Backgrounds and Scenery A background is comprised of imagery or terrain in one form or another, upon which the sprites are drawn. The background might be nothing more than a pretty picture behind the action in a game, or it might take an active part, as in a scroller. When you are talking about scrollers, they need not be relegated only to the high-speed arcade games. Role- playing games are usually scrollers too, as are most sports games. You should design the background around the goals of your game, not the other way around. You should not come up with some cool background and then try to build the game around it. (However, I admit that this is often how games are started.) You never want to rely on a single cool technology as the basis for an entire game, or the game will be forever remembered as a trendy game that tried to cash in on the latest fad. Instead of following and imitating, set your own precedents and make your own standards! What am I talking about, you might ask? You might have the impression that anything and everything that could possibly have been done with a scrolling game has already been done ten times over. Not true. Not true! Remember when Doom first came out? Everyone had been imitating Wolfenstein 3-D when Carmack and Romero bumped up the notch a few hundred points and raised everyone’s expectations so high that shockwaves reverber- ated throughout the entire game industry—console and PC alike. Do you really think it has all been done before and there is no more room for innovation, that the game industry is saturated and it’s impossible to make a successful “indie” game? That didn’t stop Bungie from going for broke on their first game project. Halo has made its mark in gaming history by upping everyone’s expectations for superior physics and intelligent opponents. Now, a few years hence, what kinds of games are coming out? What is the biggest industry buzzword? Physics. Design a game today without it, and suddenly your game is so 1990s in the gaming press. It’s all about physics and AI now, and that started with Halo. Rather, it was perfected with Halo—I can’t personally recall a game with that level of interaction before Halo came along. There is absolutely no reason why you can’t invent the next innovation or revolution in gaming, even in a 2D game. tip Eh…all this philosophizing is giving me a headache. Time for some Strong Bad. Check out http://www.homestarrunner.com/sbemail94.html for one of my favorites. Okay, back to business. Chapter 10 ■ Programming Tile-Based Backgrounds with Scrolling346 Creating Backgrounds from Tiles The real power of a scrolling background comes from a technique called tiling. Tiling is a process in which there really is no background, just an array of tiles that make up the background as it is displayed. In other words, it is a virtual virtual background and it takes up very little memory compared to a full bitmapped background (such as the one in ScrollScreen). Take a look at Figure 10.5 for an example. Can you count the number of tiles used to construct the background in Figure 10.5? Eighteen tiles make up this image, actually. Imagine that—an entire game screen built using a handful of tiles, and the result is pretty good! Obviously a real game would have more than just grass, roads, rivers, and bridges; a real game would have sprites moving on top of the background. How about an example? I thought you’d like that idea. Tile-Based Scrolling The TileScroll program uses tiles to fill the large background bitmap when the program starts. Other than that initial change, the program functions exactly like the ScrollScreen program. Take a look at Figure 10.6. You might wonder why the screen looks like such a mess. That was intentional, not a mistake. The tiles are drawn to the background randomly, so they’re all jumbled incoherently— which is, after all, the nature of randomness. After this, I’ll show you how to place the tiles in an actual order that makes sense. Also, you can look forward to an entire chapter ded- icated to this subject in Chapter 12, “Creating a Game World: Editing Tiles and Levels.” Introduction to Tile-Based Backgrounds 347 Figure 10.5 A bitmap image constructed of tiles Why an entire chapter just for this subject? Because it’s huge! You’re just getting into the basics here, but Chapter 12 will explore map editors, creating game worlds, and other higher- level concepts. The actual bitmap containing the tiles is shown in Figure 10.7. Here’s the source code for the TileScroll program: #include <conio.h> #include <stdlib.h> #include “allegro.h” //define some convenient constants #define MODE GFX_AUTODETECT_FULLSCREEN #define WIDTH 640 #define HEIGHT 480 #define STEP 8 #define TILEW 32 #define TILEH 32 #define TILES 39 #define COLS 10 //temp bitmap BITMAP *tiles; //virtual background buffer BITMAP *scroll; //position variables int x=0, y=0, n; Chapter 10 ■ Programming Tile-Based Backgrounds with Scrolling348 Figure 10.6 The TileScroll program demonstrates how to perform tile-based background scrolling. Figure 10.7 The source file containing the tiles used in the TileScroll program int tilex, tiley; //reuse our friendly tile grabber from chapter 9 BITMAP *grabframe(BITMAP *source, int width, int height, int startx, int starty, int columns, int frame) { BITMAP *temp = create_bitmap(width,height); int x = startx + (frame % columns) * width; int y = starty + (frame / columns) * height; blit(source,temp,x,y,0,0,width,height); return temp; } //main function void main(void) { //initialize allegro allegro_init(); install_keyboard(); install_timer(); srand(time(NULL)); set_color_depth(16); //set video mode if (set_gfx_mode(MODE, WIDTH, HEIGHT, 0, 0) != 0) { set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); allegro_message(allegro_error); return; } //create the virtual background scroll = create_bitmap(1600, 1200); if (scroll == NULL) { set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); allegro_message(“Error creating virtual background”); return; Introduction to Tile-Based Backgrounds 349 } //load the tile bitmap tiles = load_bitmap(“tiles.bmp”, NULL); if (tiles == NULL) { set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); allegro_message(“Error loading tiles.bmp file”); return; } //now draw tiles randomly on virtual background for (tiley=0; tiley < scroll->h; tiley+=TILEH) { for (tilex=0; tilex < scroll->w; tilex+=TILEW) { //pick a random tile n = rand() % TILES; //use the result of grabframe directly in blitter blit(grabframe(tiles, TILEW+1, TILEH+1, 0, 0, COLS, n), scroll, 0, 0, tilex, tiley, TILEW, TILEH); } } //main loop while (!key[KEY_ESC]) { //check right arrow if (key[KEY_RIGHT]) { x += STEP; if (x > scroll->w - WIDTH) x = scroll->w - WIDTH; } //check left arrow if (key[KEY_LEFT]) { x -= STEP; if (x < 0) x = 0; } Chapter 10 ■ Programming Tile-Based Backgrounds with Scrolling350 [...]... 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,... 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,... B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B,... B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B,... B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B,... 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; It’s not complicated—simply a bunch of twos (grass) bordered by zeroes (stone) The trick here is that this is really only a single-dimensional... B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,B,B,B, B,B,B,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,B,B,B, B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,... of all, you should realize that the tiles are numbered and should be referenced this way in the map array Here is what the array looks like, as defined in the GameWorld program: int map[MAPW*MAPH] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0,... TILEH #define SCROLLW 310 #define SCROLLH 375 //define some colors #define TAN makecol (25 5 ,24 2, 169 ) #define BURST makecol (25 5,189,73) #define BLACK makecol(0,0,0) #define WHITE makecol (25 5 ,25 5 ,25 5) #define GRAY makecol( 128 , 128 , 128 ) #define GREEN makecol(0 ,25 5,0) //define the sprite structure typedef struct SPRITE Enhancing Tank War { //new elements int dir, alive; int x,y; int width,height; int xspeed,yspeed;... movebullet(int num); void drawbullet(int num); void fireweapon(int num); void forward(int num); void backward(int num); void turnleft(int num); void turnright(int num); void getinput(); void setuptanks(); void setupscreen(); int inside(int,int,int,int,int,int); BITMAP *grabframe(BITMAP *, int, int, int, int, int, int); #endif Bullet Functions I have transplanted all of the routines related to handling bullets . { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; It’s. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; It’s. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 2 ,2, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; It’s

Ngày đăng: 12/08/2014, 19:20

Từ khóa liên quan

Mục lục

  • CH 11 Timers, Interrupt Handlers, and Multi-Threading

Tài liệu cùng người dùng

Tài liệu liên quan