Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Как самому создать компьютерную игру #10 часть 1


Служба Рассылок Subscribe.Ru проекта Citycat.Ru
Как самому создать компьютерную игру
Выпуск 10 Часть 1

Сайт рассылки - временно не работает ;-( 
Адрес для обратной связи - gamemaker@pisem.net

Приветствую всех, кто читает эту рассылку!

Сегодня в выпуске:
1. Болтовня не по теме.
2. О тетрисе.
3. Растровое отображение объектов. Часть 1.
4. Наши друзья.
5. Банерная сеть.
6. Вопросы и ответы.
7. В следующем выпуске.



      Этот выпуск получился очень большой и превысил лимит 60 кб, который установлен на ГорКоте. Поэтому он будет состоять из двух частей. Вторая часть завтра, т.к. на ГорКоте есть ограничение не более одного выпуска в день. Думаю, что это не страшно :)

Болтовня не по теме.

      Ну вот, просто немыслимыми усилиями вышел в свет очередной выпуск рассылки. К сожалению (не то слово!), ничего ни с одного компьютера восстановить не удалось, но работоспособность большинства из них уже восстановлена. Пожалуйста, не обижайтесь на меня за некоторые неудобства, возникшие у Вас, в связи с очень нерегулярным выходом рассылки. Поверьте, это совсем не повод, чтобы от нее отписываться. Просто иногда нужно понять, что то, что случилось с нами, может случиться почти с каждым из Вас (не дай Бог!). И я надеюсь, что хотя бы не все, но большинство из 5000 подписчиков поймут это и не будут сильно на меня обижаться. ;-) Ну а тех, кто по каким-либо причинам решил отписаться от рассылки, я прошу написать мне в письме, почему именно вы приняли такое решение.
      Из всего того, что случилось я сделал несколько выводов. Впредь я не буду писать в рассылку то, что не проверил самостоятельно. В прошлом выпуске было написано, что на сайте выложены книги и некоторые файлы: После проверки оказалось, что их просто-напросто нет. Обидно. Просто мне не часто приходится разочаровываться в людях, которым я доверял. В связи с этим, если среди подписчиков есть люди, которые хотели бы увидеть свои произведения в рассылке, пишите. А так же все остальные. Я жду от Вас писем с мыслями, пожеланиями, впечатлениями, замечаниями итд на тему "как работать в команде". Просто интересно, сталкивались ли Вы со всякими проблемами, и какие способы их решения находили. Какой Вы видите идеальную "связь" для работы в команде, сколько там должно быть человек, без кого там просто не обойтись, а кого можно с легкостью заменить итд. Еще одна тема, по которой я хотел бы услышать Ваши отзывы: что для Вас более важно при разработке программ. Наишите мне.
      Все, я думаю, что хватит писать не по делу. Обсудим темы, напрямую связанные с названием рассылки:


О тетрисе.


      К сожалению, многое из того, что было задумано, не получилось. А жаль. Хотелось сделать что-то, подобное практикуму по программированию почти в реальном времени, пока не вышло. Но, надеюсь, все впереди. А пока что попробуем посмотреть примеры реализации очевидного алгоритма игры тетрис. Для удобства его понимания листинги приведены на нескольких языках. Но перед этим приведу листинг программы, структуру которой я описывал в прошлом выпуске.
//////////Файл tetr.c//////////
#include "tetr.h"
unsigned Shift_Y, Shift_X;
unsigned static Glass[N_Y][N_X], Box[4][4];
BOOL checkTimeStart=0;
time_t first;
double idleTime=0.5;
char key='y';
int Score;

void main(void)
{
clrscr();
textmode(C40);
_setcursortype(_NOCURSOR);
GlassDraw();
WindMessage(14, 2, 20, 6,"Score=====", 2);
randomize();
NewFigura(2);
NewFigura(1);
while( Control() );
clrscr();
textmode(C80);
textcolor(WHITE);
cprintf("Copyright (c)1997\n\rChamrov Software Research Labs.\n\rALL
RIGHTS RESERVED");
cprintf("\nRelated by \rgamemaker.by.ru\n comp.soft.prog.gamemaker");
sleep(2);
}

//////////////////////////////////////////////////////////////

// Рисуем стаканчикс !
void GlassDraw(void)
{
int i;
clrscr();
textcolor(GREEN);
for(i=1;i < =N_Y;i++)
        {
        cprintf("¦");
        gotoxy(N_X+2,i);
        cprintf("¦");
        cprintf("\r\n");
        if(i==N_Y)
                {
                cprintf("L");
                gotoxy(N_X+2,N_Y+1);
                cprintf("-");
                }
        }
gotoxy(2,N_Y+1);
for(i=2; i < =N_X+1; i++)
        cprintf("=");
}

// ФУНКЦИЯ ОБРАБОТКИ КЛАВИШ
BOOL Control(void)
{
unsigned i;
if( bioskey(1) )
        switch( bioskey(0) )
                        {
// фигурку вниз
                case KEY_DOWN:
                        if(CheckShifting(DOWN))
                                {
                                Screen(1);
                                Shift_Y++;
                                Screen(2);
                                }
                        else
                                {
                                CopyBoxToGlass();
                                GlassCut();
                                if( !NewFigura(1) )
                                        {
                                        WindMessage(5, 5, 28, 8,"GAME
OVER! Once More ?     (y,n)...",1);
                                        if(key == 'y' || key == 'Y')
                                                NewGame();
                                        else
                                                return 0;
                                        }
                                Screen(2);
                                Score += 10;
                                }break;
// Проверяем на предмет выхода
                case ESCAPE:
                        switch( Menu() )
                                {
                                case 1:
                                        WindMessage(5, 5, 31, 8,"Are You
Sure You Mant To Start New Game ? (y,n)...",1);
                                        if(key == 'y' || key == 'Y')
                                                NewGame();
                                        break;
                                case 2:
                                        break;
                                case 3:
                                                WindMessage(5, 5, 30, 8,
"Are You Sure You Want ToQuit? (y,n)...",1);
                                                if(key == 'y' || key ==
'Y')
                                                        return 0;
                                }
                                break;
//  фигурку вправо
                case KEY_RIGHT:
                        if(CheckShifting(RIGHT))
                                {
                                Screen(1);
                                Shift_X++;
                                Screen(2);
                                }break;
// фигурку влево
                case KEY_LEFT:
                        if(CheckShifting(LEFT))
                                {
                                Screen(1);
                                Shift_X--;
                                Screen(2);
                                }break;
                case ENTER:
                                Screen(1);
                                while( CheckShifting(DOWN) )
                                        Shift_Y++;
                                Screen(2);
                                CopyBoxToGlass();
                                GlassCut();
                                if( !NewFigura(1) )
                                        return 0;
                                Screen(2);
                                Score += 10;
                                break;
                case F1:
                        WindMessage(9, 2, 33, 6, "Ха, наивный!... Ты
что,не знаешь,как в Тетрис играть ?!", 1);
                        break;
                case SPASE:
                case KEY_UP:
                        Reverse();
                        break;
                case P :
                        WindMessage(9, 2, 15, 4, "PAUSE",1);
                }
if( CheckTime() )
        {
        if(CheckShifting(DOWN))
                {
                Screen(1);
                Shift_Y++;
                Screen(2);
                Score -= 1;
                }
        else
                {
                CopyBoxToGlass();
                GlassCut();
                if( !NewFigura(1) )
                        {
                        WindMessage(5, 5, 28, 8,"GAME OVER! Once More
?     (y,n)...",1);
                        if(key == 'y' || key == 'Y')
                                NewGame();
                        else
                                return 0;
                        }
                Screen(2);
                Score += 10;
                }
        }
textcolor(LIGHTGRAY);
gotoxy(15, 5);
cprintf("%i ", Score);
textcolor(LIGHTBLUE);
return 1;
}

// Сия функция развращает экран !
void Screen(unsigned int Deistvie)
{
unsigned int i, j;
textcolor(LIGHTBLUE);
                for(i=2; i < 6; i++)
                        for(j=1; j < 5; j++)
                                if(Box[j-1][i-2] == 1)
                                        {
                                        gotoxy(Shift_X+i,Shift_Y+j);
                                        switch(Deistvie)
                                                {
                                                case 1: cprintf(" ");
break;
                                                case 2: cprintf("-");
                                                }
                                        }
if( Deistvie == REPAINT )
        {
        clrscr();
        GlassDraw();
        textcolor(LIGHTBLUE);
        for(i=0; i < N_Y; i++)
                for(j=0; j < N_X; j++)
                        if( Glass[i][j] == 1 )
                                {
                                gotoxy(j+2, i+1);
                                cprintf("-");
                                }
                        WindMessage(14, 2, 20, 6,"Score=====", 2);
        }
}

// Функция проверки на смещение
BOOL CheckShifting( unsigned int Direction )
{
BOOL yn;
int Koord_Glass, Koord_Box, cnt;
switch( Direction )
        {
        case DOWN:
                for(yn=TRUE, cnt=0; cnt < 4 && yn==TRUE &&
Shift_X+cnt < N_X; cnt++)
                        {
                        for(Koord_Box=3; Koord_Box > =0; Koord_Box--)
                                if( Box[Koord_Box][cnt]==1)
                                        break;
                        if(Koord_Box==-1)
                                return 1;
                        for(Koord_Glass=Shift_Y; Koord_Glass < N_Y;
Koord_Glass++)
                                if( Glass[Koord_Glass][Shift_X+cnt]==1 )
                                        break;
                        if( Koord_Box+Shift_Y+1 == Koord_Glass ||
Shift_Y+Koord_Box  > = N_Y )
                                yn = FALSE;
                        }
                break;
        case RIGHT:
                for(yn=TRUE, cnt=0; cnt < 4 && yn==TRUE; cnt++)
                        {
                        for(Koord_Box=3; Koord_Box > =0; Koord_Box--)
                                if( Box[cnt][Koord_Box]==1)
                                        break;
                        if(Koord_Box==-1)
                                return 1;
                        for(Koord_Glass=Shift_X; Koord_Glass < N_X;
Koord_Glass++)
                                if( Glass[Shift_Y+cnt][Koord_Glass]==1 )
                                        break;
                        if( Koord_Box+Shift_X+1 == Koord_Glass ||
Shift_X+Koord_Box  > = N_X-1 )
                                yn=FALSE;
                        }
                break;
        case LEFT:
                for(yn=TRUE, cnt=0; cnt < 4 && yn==TRUE; cnt++)
                        {
                        for(Koord_Glass=Shift_X; Koord_Glass > =0;
Koord_Glass--)
                                if( Glass[Shift_Y+cnt][Koord_Glass]==1 )
                                        break;
                        for(Koord_Box=0; Koord_Box < 4; Koord_Box++)
                                if( Box[cnt][Koord_Box]==1)
                                        break;
                        if( Koord_Box+Shift_X-1 == Koord_Glass ||
Shift_X==0 )
                                yn = FALSE;
                        }
                break;
        }
return yn;
}

//Сия функция копирует Box в Glass
void CopyBoxToGlass(void)
{
unsigned int i, j;
for(i=0; i < 4; i++)
        for(j=0; j < 4; j++)
                if(Box[j][i] == 1)
                        Glass[Shift_Y+j][Shift_X+i]=1;
}

// Непременно фигурку сменить надобно, непременно
BOOL NewFigura(int mode)
{
unsigned i,j;
static unsigned swp[4][4];
switch( mode )
{
case 1:
        Shift_X = 4;
        Shift_Y = 0;
        for(i=0; i < 4; i++)
                for(j=0; j < 4; j++)
                        Box[i][j] = swp[i][j];
        Screen(2);
case 2:
        for(i=0; i < 4; i++)
                for(j=0; j < 4; j++)
                        swp[i][j]=0;
        switch(random(7))
                {
                case 0: for(i=0; i < 4; i++)
                                        swp[i][0]=1; break;
                case 1: for(i=0; i < 2; i++)
                                        for(j=0; j < 2; j++)
                                                swp[i][j]=1; break;
                case 2: for(i=0; i < 3; i++)
                                                        swp[i][0]=1;
                                 swp[2][1]=1; break;
                case 3: for(i=0; i < 3; i++)
                                        swp[i][1]=1;
                                 swp[2][0]=1; break;
                case 4: for(i=0; i < 3; i++)
                                                        swp[i][0]=1;
                                 swp[1][1]=1; break;
                case 5: for(i=0; i < 2; i++)
                                                        swp[i][0]=1;
                                for(i=1; i < 3; i++)
                                        swp[i][1]=1; break;
                case 6: for(i=1; i < 3; i++)
                                                        swp[i][0]=1;
                                for(i=0; i < 2; i++)
                                        swp[i][1]=1; break;
                }
WindMessage(14, 8, 19, 15,"Next====", 2);
textcolor(LIGHTBLUE);
for(i=0; i < 4; i++)
        for(j=0; j < 4; j++)
                {
                gotoxy(i+15, j+11);
                if( swp[j][i] == 1 )
                        cprintf("-");
                else
                        cprintf(" ");
                }
}
if( !CheckOverflow() )
        return 0;
return 1;
}

// А вдруг стаканчикс переполнился, а ?
BOOL CheckOverflow(void)
{
BOOL yn;
int Koord_Glass, Koord_Box, cnt;

for(yn=TRUE, cnt=0; cnt < 4 && yn==TRUE; cnt++)
        {
        for(Koord_Glass=0; Koord_Glass < N_Y; Koord_Glass++)
                if( Glass[Koord_Glass][Shift_X+cnt]==1 )
                        break;
        for(Koord_Box=3; Koord_Box > =0; Koord_Box--)
                if( Box[Koord_Box][cnt]==1)
                        break;
        if( Koord_Box  > = Koord_Glass )
                yn = FALSE;
        }
return yn;
}

void NewGame(void)
{
int i,j;
clrscr();
_setcursortype(_NOCURSOR);
GlassDraw();
NewFigura(2);
NewFigura(1);
for(i=0; i < N_Y; i++)
        for(j=0; j < N_X; j++)
                Glass[i][j]=0;
Score = 0;
WindMessage(14, 2, 20, 6,"Score=====", 2);
}

// Фигурку переворачиваемс !
void Reverse(void)
{
unsigned i, j, tmp[4][4], save[4][4], cnt;
BOOL yn;
yn = TRUE;
for(i=0; i < 4; i++)
        for(j=0; j < 4; j++)
                save[i][j] = Box[i][j];
Screen(1);
for(i=0; i < 4; i++)
        for(j=0; j < 4; j++)
                tmp[i][j] = Box[j][i];
for(i=0; i < 4; i++)
        for(j=0; j < 4; j++)
                Box[i][j] = tmp[i][3-j];
while(yn==TRUE)
        {
        for(yn=TRUE,i=0; i < 4; i++)
                if(Box[i][0]!=0)
                        yn=FALSE;
        if(yn==TRUE)
                for(i=0; i < 4; i++)
                        for(j=1; j < 4; j++)
                                {
                                Box[i][j-1] = Box[i][j];
                                Box[i][j] = 0;
                                }
        }
for(yn=TRUE,i=0; i < 4; i++)
        for(j=0; j < 4 && yn==TRUE; j++)
                if(Box[i][j]==1 && Glass[Shift_Y+i][Shift_X+j]==1)
                        yn = FALSE;
for(i=0; i < 4; i++)
        for(j=0; j < 4 && yn==TRUE; j++)
                if( Box[i][j]==1 )
                        if( i+Shift_Y  > N_Y-1 || j+Shift_X  > N_X-1
)
                                yn=FALSE;
if(yn!=TRUE)
        for(i=0; i < 4; i++)
                for(j=0; j < 4; j++)
                        Box[i][j] = save[i][j];
Screen(2);
}

// Проверяем на раздраконивание вниз (время)
int CheckTime(void)
{
time_t second;
if(!checkTimeStart)
        first = time(NULL);  /* Gets system time */
second = time(NULL); /* Gets system again */
if(difftime(second,first) > idleTime)
        {
        checkTimeStart=FALSE;
        return 1;
        }
checkTimeStart=TRUE;
return 0;
}

void GlassCut(void)
{
BOOL yn;
unsigned i, j, k, skolkoStr;
skolkoStr=0;
for(i=0; i < N_Y; i++)
        {
        for(yn=TRUE,j=0; j < N_X; j++)
                if( Glass[i][j]!=1 )
                        yn = FALSE;
        if( yn==TRUE )
                {
                skolkoStr++;
                for(k=i-1; k > 0; k--)
                        for(j=0; j < N_X; j++)
                                {
                                Glass[k+1][j] = Glass[k][j];
                                Glass[k][j] = 0;
                                }
                Screen(REPAINT);
                }
        }
switch(skolkoStr)
        {
        case 1: Score+=50; break;
        case 2: Score+=150; break;
        case 3: Score+=250; break;
        case 4: Score+=400; break;
        }
}

void WindMessage(int UpX, int UpY, int DownX, int DownY,  char *text,
int mode)
{
unsigned i, j, k;
char swp[4096];
gettext(UpX, UpY, DownX, DownY, swp);
textcolor(RED);
for(i=UpX+1; i < DownX; i++)
                {
                gotoxy(i, DownY);
                cprintf("=");
                gotoxy(i, UpY);
                cprintf("=");
                }
for(j=UpY+1; j < DownY; j++)
                {
                gotoxy(DownX, j);
                cprintf("¦");
                gotoxy(UpX, j);
                cprintf("¦");
                }
gotoxy(UpX, UpY);
cprintf("г");
gotoxy(DownX, UpY);
cprintf("¬");
gotoxy(UpX, DownY);
cprintf("L");
gotoxy(DownX, DownY);
cprintf("-");
for(i=UpX+1; i < DownX; i++)
        for(j=UpY+1; j < DownY; j++)
                {
                gotoxy(i, j);
                cprintf(" ");
                }
textcolor(LIGHTGRAY);
gotoxy(UpX+1, UpY+1);
for(k=1,j=i=0; text[i]!='\0'; i++,j++)
        {
        if(j+1 == DownX - UpX)
                {
                j=0;
                k++;
                gotoxy(UpX+1, UpY+k);
                }
        cprintf("%c",text[i]);
        }
if(mode == 1)
        {
        key = getch();
        puttext(UpX, UpY, DownX, DownY, swp);
        }
}

int Menu(void)
{
int n=1;
char save[112];
gettext(5, 5, 12, 11,save);
WindMessage(5, 5, 12, 11, "MENU  ======",2);
textcolor(YELLOW);
for(;;)
        {
        if(n==1) textbackground(GREEN);
        else textbackground(BLACK);
        gotoxy(6,8);
        cprintf("New");
        textbackground(BLACK);

        if(n==2) textbackground(GREEN);
        else textbackground(BLACK);
        gotoxy(6,9);
        cprintf("Return");
        textbackground(BLACK);

        if(n==3) textbackground(GREEN);
        else textbackground(BLACK);
        gotoxy(6,10);
        cprintf("Quit");
        textbackground(BLACK);

        switch(bioskey(0))
                {
                case KEY_DOWN: if(n==3)
                                                        n=1;
                                                else
                                                        n++;
                                                        break;
                case KEY_UP:    if(n==1)
                                                        n=3;
                                                else
                                                        n--;
                                                        break;
                case ENTER:
                                puttext(5, 5, 12, 11,save);
                                return n;
                }
        }
}
////////tetr.h////////
#include < stdio.h >
#include < stdlib.h >
#include < dos.h >
#include < bios.h >
#include < time.h >
#include < conio.h >
#define DOWN 6
#define LEFT 7
#define RIGHT 8
#define BOOL unsigned int
#define TRUE 1
#define FALSE 0
#define KEY_DOWN 20480
#define KEY_RIGHT 19712
#define KEY_LEFT 19200
#define KEY_UP 18432
#define ESCAPE 283
#define SPASE 14624
#define ENTER 7181
#define REPAINT 9
#define P  6512
#define F1 15104
#define N_Y 20
#define N_X 10
BOOL CheckShifting(unsigned int);
void Screen(unsigned int);
BOOL NewFigura(int);
void NewGame(void);
void CopyBoxToGlass(void);
void GlassDraw(void);
BOOL CheckOverflow(void);
BOOL Control(void);
void Reverse(void);
int CheckTime(void);
void GlassCut(void);
void WindMessage(int, int, int, int, char*, int);
int Menu(void);

 
      Вот и все. Попытайтесь разобраться и, если потребуется, почитайте предыдущий выпуск. А теперь посмотрим то, что у Вас получилось. Ниже приведены лучшие программы из тех, которые мне прислали после выхода прошлого выпуска. К некоторым дан краткий комментарий автора. (Кстати, были и еще хорошие программы, но все уместить в одном выпуске невозможно. Может быть, к этому еще вернемся. Да, кстати, некоторые программы не опубликованы, т.к. их авторы мне их не прислали заново после крушения системы. )
      Продолжение читайте во второй части.



Растровое отображение объектов. Часть 1.


      Один раз я получил письмо с вопросом: "как заставить точку двигаться по окружности". Человеку, который это спрашивал, нужно было срочно узнать ответ, поэтому я, наверное, опоздал. Опоздал с написанием кода, т.к. в теории я на этот вопрос ответил. Думаю, что большинство знают ответ на этот простенький вопрос. Ведь знания, которые здесь требуются, не выходят за пределы школьных. Вспоминаем формулу x^2+y^2=R^2 и все. Радиус задан. Выражаем любую переменную (х или у) и получаем результат. Далее пишем цикл с шагом по другой переменной. Все. Но мне пришел ответ, что мол, напиши код на таком-то языке. Времени писать, конечно, не было. Но вот о чем я подумал. Неужели у читателей возникают проблемы с написанием такого простецкого цикла. Ну ничего. Попробуем этот пробел устранить. Ну а для тех, кто это все знает - наберитесь терпения. Вдруг что-нибудь новое все-таки узнаете. :-)
      Итак, напишем код. На каком языке? Просили на паскале. Но, для чистоты эксперимента, попробую написать на дельфи. Правда, я этого языка не знаю, и никогда не писал на нем, но когда-нибудь надо начинать. ;) Пойду хелп хотя бы почитаю, посмотрю, как программы там пишутся: Вот и все. Готово. Я писал на дельфи5. Т.к. это первое, что я на нем написал, на всякие тонкости, типа очистки GDI можно не смотреть. В этом я не разбирался.
      Итак. Создаем новый проект. В нем открывается форма1. Выбираем в закладке Additional элемент Image. Устанавливаем его размер. Далее рядом создаем button и пишем обработчик событий OnClick. У меня он называется zzz.
      Ниже приводится текст процедуры.

 procedure TForm1.zzz(Sender: TObject);  
      var x,y,r,x0,y0:integer; 
   // x,y - коордиаты начальной точки  
   // r - радиус окружности  
    begin  
      r:=50;  
      x0:=90;  
      y0:=90;  
   // центр окружности - (x0,y0)  
      y:=y0-r;  
   // определяем координату х из формулы x^2+y^2=r^2  
      x:=x0+Round(sqrt(abs(r*r-(y-y0)*(y-y0))));  
   // закрасим наш рисунок  
      Image1.Canvas.Brush.Color:=clBlack;  
      Image1.Canvas.FillRect(ClientRect);  
   // рисуем первую точку  
      Image1.Canvas.Pixels[x,y]:=clWhite; 
         repeat  
   // ждем немного, чтобы что-то видно было :)  
             sleep(100);  
   // закрасим старую точку  
            Image1.Canvas.Pixels[x,y]:=clBlack;  
   // задаем новые координаты с шагом 1 по у  
            y:=y+1;  
            x:=x0+Round(sqrt(abs(r*r-(y-y0)*(y-y0))));  
   // рисуем новую точку  
             Image1.Canvas.Pixels[x,y]:=clWhite;  
   // выводим это на экран  
            Application.ProcessMessages;  
   // пока что у увеличивается  
   // далее он будет уменьшаться  
        until y=y0+r;  
        repeat  
   // ждем немного, чтобы что-то видно было :)  
             sleep(100);  
   // стерли старую точку  
             Image1.Canvas.Pixels[x,y]:=clBlack;  
   // задаем новые координаты с шагом 1 по у  
             y:=y-1;  
   // знак меняем, т.к. теперь точка слева от центра  
             x:=x0-Round(sqrt(abs(r*r-(y-y0)*(y-y0))));  
   // рисуем новую точку  
             Image1.Canvas.Pixels[x,y]:=clWhite;  
   // выводим это на экран  
            Application.ProcessMessages;  
         until y=y0-r; 
    end;  


     Ну как, запустили? Что получилось? Кажется, что точка движется по окружности: А теперь закомментируйте строчки Image1.Canvas.Pixels[x,y]:=clBlack; в обоих циклах. Теперь точки не будут закрашиваться, и мы сможем проследить траекторию движения по шлейфу. Видно, что в середине рисуется очень точно, а ближе к полюсам образуются "дырки". В чем же дело? В шаге. Мы его выбрали равным 1. Для более точного представления следовало бы выбрать его поменьше.
      Но есть способ лучше. (с) реклама. Это алгоритм растрового представления, английский вариант названия которого MidPoint Algorithm (алгоритм средней точки).
      Продолжение читайте во второй части.



Наши друзья.


      Вот несколько рассылок, которые заслуживают Вашего внимания. Если Вам интересны темы этих рассылок, то советую на них подписаться. И, надеюсь, Вы не пожалеете!
Рассылки Subscribe.Ru
G-PLAY: информация об играх
      Также, возможно, Вам будет интересно посмотреть на сайт этой рассылки: www.g-play.ru.

     Следующая рассылка посвящена хостингу. Тут Вы найдете ответы на любые вопросы, касающиеся хостинга. Выбирайте место для Вашего сайта вместе с этой рассылкой!
Рассылки Subscribe.Ru
Хостинг: Место для вашего сайта. Обзоры, Вопросы,Ответы

      Теперь, что касается программирования. Хотите научиться программировать на VB? Нет проблем! А поможет в этом следующая рассылка:
Рассылки Subscribe.Ru
Программирование на Visual Basic и Active Server Pages

      Cледующая рассылка предложит Вам кучу головоломок.
Рассылки Subscribe.Ru
Головоломки для умных людей

      А кроме головоломок Вы можете порешать интересные задачки... Достаточно ли Вы сообразительны?
Рассылки Subscribe.Ru
Логические задачи на сообразительность

      Ну и, конечно, еще две рассылки, которые Вы уже знаете...
Рассылки:
Кодировка:
Формат:
Ваш E-Mail:
Выберете рассылку:
Мир компьютерных и настольных РПГ
Мир 3d-Action Games




Банерная сеть.

Текстовая обменная сеть.

      TLE (http://www.tle.ru) - это уникальная сеть обмена ссылками, позволяющая увеличить посещаемость Вашего сайта. Показывая у себя на сайте 100 баннеров, вы зарабатываете всего 80 показов Ваших баннеров. Показывая 100 рекламных блоков TLE.RU, Вы зарабатываете 255 показов Ваших ссылок! Почуствуйте разницу! Высокий CTR%, удобная панель управления, мгновенная регистрация. Спешите! Только до 15 мая каждому новому участнику 50,000 БЕСПЛАТНЫХ показов! Узнать подробности и стать участником сети можно на сайте http://www.tle.ru.



Вопросы и ответы.


      Читайте во второй части.



В следующем выпуске.


      Читайте во второй части.



SlyMagic.

"Как самому создать компьютерную игру" (с) 2001
Использование любых материалов рассылки возможно только с разрешения автора.
Тираж 5000 экземпляров.


http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное