Карта уровня представляет собой прямоугольный массив номеров картинок. Обычно полное изображение карты заметно превосходит разрешение экрана и возникает необходимость вывода только тех картинок и спрайтов,4 которые видны на экране (рис. 4.8).

При этом каждая клетка имеет размер tile Width на tile Heigt пикселов. Считаем, что верхний левый угол экрана (окна) имеет глобальные координаты (orgX, orgY). Простейший вариант реализации игры представлен ниже.

S3 // File stategy.cpp
include "mouse.h" include "array.rT include "video.h" include "image.h" include "sprite.h"
char screenMap [MAX_TILE_X][MAX_TILE_Y];
Image * tiles [MAX_TILES];
. Array * sprites;
Sprite mouse;
int orgX = Q;
int orgY = 0;
int done = 0;
void drawScreen () {

int Ю = orgX / tileWidth;

int i1 = (orgX + screen Width -1) / tileWidth;

int xO = Ю * tileWidth - orgX;

int jO = orgY / tileHeight;
int j1 = (orgY + screenHeight -1) / tileHeight;
int yO = jO * tileHeight - orgY;

for (int i = iO, x = xO; i <= i1; i++, x += tileWidth) for (int j = jO, у = yO; j <= j1; j++, у += tileHeight) tiles [screenMap [i][j]j -> draw ( x, у );

for (i = 0; i < sprites -> getCount (); i++ )

Компьютерная графика. Полигональные модели

((Sprite *) sprites -> objectAt (i)) -> draw (); mouse.draw (); swapBuffers ();
}
main () {
MouseState mouseState;
loadMap ();
loadTiles 0;
loadSprites ();
initVideo {);
resetMouse 0;
for (; Idone; ) {
performActions (); drawScreen (); readMouseState (mouseState );
if ( mouseState.loc.x >= screenWidth - 2 && orgX < maxOrgX) orgX++;
else
if ( mouseState.loc.x <= 2 && orgX > 0 ) orgX-;
if ( mouseState.loc.y >= screenHeight - 2 && orgY < maxOrgY ) orgY++;
else
if ( mouseState.loc.y <= 2 && orgY > 0 ) orgY--;
mouse.set ( mouseState.loc.x + orgX, mouseState.loc.y + orgY );
if (mouseState.buttons )
handleMouse (mouseState);
handleKeyboard ();

⇐ Предыдущая| |Следующая ⇒