Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 4 из 4

Тема: TextDraw Arcanoid

  1. #1
    Аватар для Osetin
    •Администратор•

    Статус
    Оффлайн
    Регистрация
    26.03.2013
    Адрес
    ♔Osetia, Vladikavkaz♔
    Сообщений
    3,432
    Репутация:
    1093 ±

    TextDraw Arcanoid

    TextDraw Arcanoid Filterscript

    Автор:
    OFFREAL

    Идея:
    Классический арканоид. Необходимо разбомбить шариком блоки, и при этом не потерять сам шарик

    Использование:
    - Команда для начала игры /arc
    - Команда для завершения игры /arc_stop
    - Управление отражателем кнопки шаг влево - шаг вправо
    - Чтобы изменить угол отскока шарика, двигайте отражатель в момент касания



    Недостатки системы:
    [-] Одновременно может использовать только один игрок
    [-] Нерациональное использование ресурсов сервера

    Исходный код
    PHP код:
    /*
    arc.pwn
    Textdraw Arcanoid by OFFREAL
    (Арканоид на текстдрвава)
    22.08.2011
    NOT Commercial - OpenSource

    // ВНИМАНИЕ !!!
    Данный скрипт нерационально использует ресурсы сервера!
    Поэтому я не рекомендую его для использования на серверах с онлайном > 30

    Текстдравов: 67
    Таймеров: 1 ( 50 мс )
    */


    #include <a_samp>            // подключаем какой-то инклуд xD

    #define VERSION "1.0 beta"    // версия
    #define MAX_BLOCKS 60        // максимум блоков
    #define MAX_LVL 3           // максимум уровней

    forward UpdateBall();

    // основные переменные
    new
        
    Arcanoid,    // основной таймер
        
        
    Floatball_a 8.0,                            // шаг вектора
        
    Floatball_vector[2],                          // вектор шарика
        
    Floatball_coord[2],                           // координаты шарика
        
    Floatball_td_offset[2] = { -6.00, -9.00 },    // смещение центра текстдрава
        
    Floatbar_Y 440.00,                          // поверхность отражатела
        
    Floatbar_X,                                   // координата отражателя
        
    FloatBarSize 80.00,                         // размер отражателя
        
    FloatK,                                       // коэффициент наклона линии проходящей через противоположные углы блока
        
        
    Textball_td,              // текстдрав шарика
        
    Textbar_td,               // текстдрав отражателя
        
    TextScoreTD,              // текстдрав очков
        
    TextBKG,                  // текстдрав заднего фона
        
    TextInfoTD,               // текстдрав уведомлений
        
    Textblock_td[MAX_BLOCKS], // массив текстдраваов блоков
        
        
    Score,              // очки
        
    CurLVL,             // текущий уровень
        
    WaitTime = -1,      // время паузы основного таймера
        
    arc_player = -1,    // ИД игрока
        
    ball_speed 50,    // частота срабатывания основного таймера

        
    killed// переменная основного таймера для посчета "убитых" блоков
        
    time;   // переменная хранит unix_time

    // структура маасива блоков
    enum b_info {
    Float:maxXFloat:maxYFloat:minXFloat:minY,
    Float:bcstatbool:active
    }

    new 
    block[MAX_BLOCKS][b_info];

    // цвета блоков
    new ColorBlock[] = { 00xFF0000440xFF8000440xFFFF00440x00FF00440x00FFFF44 };

    // конфигурация уровней
    new block_stat[MAX_LVL][MAX_BLOCKS] = {
    {
    1,2,3,3,4,5,5,4,3,3,2,1,
    1,2,3,4,5,4,4,5,4,3,2,1,
    1,2,3,4,5,5,5,5,4,3,2,1,
    1,2,3,4,5,4,4,5,4,3,2,1,
    1,2,3,4,3,4,4,3,4,3,2,1
    },
    {
    4,3,4,0,0,1,1,0,0,4,3,4,
    4,4,3,4,0,1,1,0,4,3,4,4,
    4,2,4,3,4,1,1,4,3,4,2,4,
    0,4,2,4,4,1,1,4,4,2,4,0,
    4,0,4,2,0,4,4,0,2,4,0,4
    },
    {
    3,2,1,0,0,5,5,0,0,1,2,3,
    4,3,2,1,0,0,0,0,1,2,3,4,
    0,4,3,2,1,0,0,1,2,3,4,0,
    0,0,4,3,2,1,1,2,3,4,0,0,
    0,0,0,4,3,2,2,3,4,0,0,0
    }
    };

    stock minrand(minmax)
    {
       return 
    random(max min) + min;
    }

    stock Float:floatrand(Float:minFloat:max)
    {
        new 
    imin;
        
    imin floatround(min);
        return 
    float(random((floatround(max) - imin) * 100) + (imin 100)) / 100.0;
    }

    // функция отрисовки шарика
    stock DrawBoll(FloatXFloatY)
    {
        
    TextDrawDestroyball_td );
        
    ball_td TextDrawCreate(ball_td_offset[0], ball_td_offset[1], "o");
        
    TextDrawSetShadow(ball_td0);
        
    TextDrawFont(ball_td1);
        
    TextDrawLetterSize(ball_td,0.41.3 );
        
    ball_coord[0] = Xball_coord[1] = Y;
        
    TextDrawShowForPlayer(arc_playerball_td);
    }

    // функция отрисовки фона
    stock DrawBKG()
    {
        
    TextDrawDestroyBKG );
        
    BKG TextDrawCreate0.000.00"_");
        
    TextDrawUseBox(BKG ,1);
        
    TextDrawBoxColor(BKG0x00000080 );
        
    TextDrawTextSize(BKG640.00,0.00);
        
    TextDrawLetterSize(BKG0.00480.00*0.135 );
        
    TextDrawShowForPlayer(arc_playerBKG);
    }

    // функция отрисовки блоков
    stock DrawBlockbidst )
    {
        if( 
    block[bid][active] )
        {
            
    TextDrawDestroyblock_tdbid ] );
        }
        
    block_tdbid ] = TextDrawCreate(block[bid][minX], block[bid][minY], "_");
        
    TextDrawUseBox(block_tdbid ],1);
        
    TextDrawBoxColor(block_tdbid ], ColorBlock[st] );
        
    TextDrawTextSize(block_tdbid ],block[bid][maxX],0.00);
        
    TextDrawLetterSize(block_tdbid ],0.00, (block[bid][maxY] - block[bid][minY])*0.102 );
        
    TextDrawShowForPlayer(arc_playerblock_tdbid ]);
        
    block[bid][active] = true;
        
    block[bid][ stat ] = st;
        
    block[bid][bc] = ( block[bid][maxY] - block[bid][minY] )/( block[bid][maxX] - block[bid][minX] );
    }

    // функция смещения отражателя
    stock MoveBarFloat:step )
    {
        
    bar_X += step;
        
        if(
    bar_X 580.00){ bar_X 580.00; }
        else if( 
    bar_X < -20.00 ){ bar_X = -20.00; }
        
        
    TextDrawDestroybar_td );
        
    bar_td TextDrawCreatebar_Xbar_Y"_");
        
    TextDrawUseBox(bar_td1);
        
    TextDrawBoxColor(bar_td, -);
        
    TextDrawTextSize(bar_tdbar_X BarSize0.00);
        
    TextDrawLetterSize(bar_td0.0010.00 );
        
    TextDrawShowForPlayer(arc_playerbar_td);
    }

    // функция обнаружения точки в квадрате
    stock IsBallInBlockFloat:XFloat:YFloat:mxXFloat:mxYFloat:mnXFloat:mnY // 2D
    {
        if( 
    mxX ) {return false;}
        if( 
    mxY ) {return false;}
        if( 
    mnX ) {return false;}
        if( 
    mnY ) {return false;}
        return 
    true;
    }

    // функция загрузки уровня
    stock LoadLevellvl )
    {
            if( 
    arc_player == -) { return; }
            new 
    str[64]; format(str64"~r~Level ~w~%d"lvl);
            
    SendInfostr );
            
    WaitTime 50;
            
    CurLVL lvl;
             
    DrawBKG();
            
    bar_X 0.00;
            
    MoveBar280.00 );
            
    ball_coord[0] = bar_X 40.00;
            
    ball_coord[1] = bar_Y ball_td_offset[1];
            
    ball_vector[0] = 0.25 float(random(50))/100ball_vector[1] = -0.75;

            for(new 
    i=0;i<MAX_BLOCKS;i++)
            {
                
    DrawBlockblock_stat[lvl][ ]);
            }
    }

    // функция отправки уведомлений
    stock SendInfotext[] )
    {
        
    TextDrawSetString(InfoTDtext);
        
    TextDrawShowForPlayer(arc_playerInfoTD);
    }

    // функция для отображения набранных очков
    stock SetScoretoscore )
    {
        
    Score += toscore;
        new 
    str[64];
        if(
    Score 0)
        { 
    format(strsizeof(str),"~r~%d",Score); }
        else if( 
    Score 3000 )
        { 
    format(strsizeof(str),"~w~%d",Score); }
        else if( 
    Score 6000 )
        { 
    format(strsizeof(str),"~y~~h~%d",Score); }
        else if( 
    Score 9000 )
        { 
    format(strsizeof(str),"~g~~h~%d",Score); }
        else if( 
    Score 12000 )
        { 
    format(strsizeof(str),"~b~~h~%d",Score); }
        else
        { 
    format(strsizeof(str),"~p~~h~%d",Score); }

        
    TextDrawSetString(ScoreTDstr);
        
    TextDrawShowForPlayer(arc_playerScoreTD);
    }

    // основной таймер
    public UpdateBall()
    {
        if( 
    WaitTime 0)
        {
            
    WaitTime--;
            return;
        }
        else if( 
    WaitTime == )
        {
            
    ball_coord[0] = bar_X 40.00;
            
    ball_coord[1] = bar_Y ball_td_offset[1] ;
            
    ball_vector[0] = 0.25 float(random(50))/100ball_vector[1] = -0.75;
            
    TextDrawHideForPlayer(arc_playerInfoTD);
            
    WaitTime = -1;
        }
        
        if(
    arc_player != -1)
        {
            if( 
    time && time gettime() )
            {
                
    SetScore( -10 );
            }
            
    time gettime();
            
            
    // захват клавиш игрока
            
    new lr;
            
    GetPlayerKeys(arc_playerlrlrlr);

            
    // перемещение отражателя
            
    if(lr 0) { MoveBar10.00 ); }
            else if(
    lr 0) { MoveBar( -10.00 ); }
        
            
    // условие касания левого и правого краев
            
    if( ball_coord[0] > 640.00+ball_td_offset[0] || ball_coord[0] < - ball_td_offset[0] )
            {
                
    ball_vector[0] *= -1;
                
    //ball_vector[0] += float(minrand( -150, 150 ))/1000;
            
    }

            
    // условие касания верхнего края
            
    if( ball_coord[1] < - ball_td_offset[1] )
            {
                
    ball_vector[1] *= -1;
                
    //ball_vector[1] += float(minrand( -150, 150 ))/1000;
            
    }
            
            
    // условие касания нижнего края - проверка отражателя
            
    if( ball_coord[1] > bar_Y ball_td_offset[1] )
            {
                if( 
    bar_X 5.00 ball_coord[0] < bar_X BarSize 5.00 )
                {
                    
    ball_vector[1] *= -1;

                    if(
    lr 0)
                    {
                        
    ball_vector[0] += 0.20;
                    }
                    else if(
    lr 0)
                    {
                        
    ball_vector[0] -= 0.20;
                    }
                    
                     if( 
    ball_vector[0] > 1.00 ) { ball_vector[0] = 1.00; }
                     else if( 
    ball_vector[0] < -1.00 ) { ball_vector[0] = -1.00; }

                }
                else
                {
                    
    SetScore( -5000 );
                    
    SendInfo"~r~LOOSER !!!" );
                    
    WaitTime 60;
                }
            }
            
            
    // автоматические ускорение шарика
            
    if( -0.75 ball_vector[1] < 0.75 )
            {
                if(
    ball_vector[1] < 0) { ball_vector[1] -= 0.01; }
                else {
    ball_vector[1] += 0.01;}
            }

               
    // условие удара о блоки
            
    for(new i=0;i<MAX_BLOCKS;i++)
            {
                if( !
    block[i][stat] ) { killed++; continue; }
                
                if(    
    IsBallInBlock(    ball_coord[0] + ball_vector[0]*ball_aball_coord[1] + ball_vector[1]*ball_a,
                    
    block[i][maxX], block[i][maxY], block[i][minX], block[i][minY] ))
                {

                    
    = ( ball_coord[1] - (block[i][maxY]+block[i][minY])*0.5 ) /
                        ( 
    ball_coord[0] - (block[i][maxX]+block[i][minX])*0.5 );
                        
                    
    block[i][ stat ] --;
                    
    DrawBlock(iblock[i][ stat ]);

                    
    PlayerPlaySound(arc_player,10560.000.000.00);
                    
    SetScore100 );
                    
                    
    //printf("%f | %f", ball_vector[0], ball_vector[1]);
                     
                    
    if( floatabs) > block[i][ bc ] )
                    {
                        
    ball_vector[1] *= -1;
                        
    ball_vector[0] += float(minrand( -150150 ))/1000;
                        if( 
    ball_vector[0] > 1.00 ) { ball_vector[0] = 1.00; }
                        else if( 
    ball_vector[0] < -1.00 ) { ball_vector[0] = -1.00; }
                    }
                    else
                    {
                        
    ball_vector[0] *= -1;
                        
    ball_vector[1] += float(minrand( -150150 ))/1000;
                        if( 
    ball_vector[1] > 1.00 ) { ball_vector[1] = 1.00; }
                        else if( 
    ball_vector[1] < -1.00 ) { ball_vector[1] = -1.00; }
                    }
                    break;
                }
            }
            
            
    killed 0;
            
            
    // подсчет "убитых" блоков
            
    for(new i=0;i<MAX_BLOCKS;i++)
            {
                if( !
    block[i][stat] ) { killed++; }
                if( 
    killed == MAX_BLOCKS ) { LoadLevel( ( CurLVL+)%MAX_LVL ); WaitTime 60; }
            }
            
            
    // отрисовка шарика исходя из полученных данных
            
    DrawBollball_coord[0] + ball_vector[0]*ball_aball_coord[1] + ball_vector[1]*ball_a );

        }
    }

    public 
    OnFilterScriptInit()
    {
        
    TextDrawCreate(640.00480.00"BuggedTD");
        
        for(new 
    =0i<MAX_BLOCKSi++)
        {
            
    block[i][minX] = 30.00 + ( i%12 )*50;
            
    block[i][maxX] = block[i][minX] + 30.00;
            
            
    block[i][minY] = 20.00 + (i/12)*50;
            
    block[i][maxY] = block[i][minY] + 30.00;
        }

        
    ball_td TextDrawCreate(0.000.00"o");
        
    BKG TextDrawCreate0.000.00"_");
        
        
    InfoTD TextDrawCreate(320.00360.00"_" );
        
    TextDrawLetterSize(InfoTD1.253.00 );
        
    TextDrawAlignment(InfoTD0);
        
        
    ScoreTD TextDrawCreate(85.00370.00"_" );
        
    TextDrawLetterSize(ScoreTD0.802.00 );
        
    TextDrawAlignment(ScoreTD2);

        
    DrawBoll40.0040.00 );
        
    Arcanoid SetTimer("UpdateBall",ball_speedtrue);
        return 
    1;
    }

    public 
    OnFilterScriptExit()
    {
        
    KillTimerArcanoid );
        
    TextDrawDestroyball_td );
        for(new 
    i=0;i<MAX_BLOCKS;i++)
        {
            
    TextDrawDestroyblock_td] );
        }
        
    TextDrawDestroybar_td );
        
    TextDrawDestroyBKG );
        
    TextDrawDestroyInfoTD );
        
    TextDrawDestroyScoreTD );
        
    TogglePlayerControllable(arc_player,1);
        return 
    1;
    }

    main()
    {
        print(
    "\n----------------------------------");
        print(
    "FS Arcanoid by OFFREAL");
        print(
    "----------------------------------\n");
    }


    public 
    OnPlayerConnect(playerid)
    {
        return 
    1;
    }

    public 
    OnPlayerDisconnect(playeridreason)
    {
        return 
    1;
    }

    public 
    OnPlayerSpawn(playerid)
    {
        return 
    1;
    }

    public 
    OnPlayerCommandText(playeridcmdtext[])
    {
        if (
    strcmp("/arc"cmdtexttrue10) == 0)
        {
            if( 
    arc_player != -)
            {
                
    SendClientMessage(playerid, -1"В Арканоид уже кто-то играет =(");
                return 
    1;
            }
            
            
    Score 0;
            
    TogglePlayerControllable(playerid,0);
            
    arc_player playerid;
            
    LoadLevel);
            
            return 
    1;
        }
        if (
    strcmp("/arc_stop"cmdtexttrue10) == 0)
        {
            if( 
    playerid != arc_player )
             {
                
    SendClientMessage(playerid, -1"Вы не играете в Арканоид");
                return 
    1;
            }
            
            
    TogglePlayerControllable(arc_player,1);
            
            
    TextDrawHideForPlayer(arc_playerbar_td);
            
    TextDrawHideForPlayer(arc_playerBKG);
            
    TextDrawHideForPlayer(arc_playerball_td);
            
    TextDrawHideForPlayer(arc_playerInfoTD);
            
    TextDrawHideForPlayer(arc_playerScoreTD);
            
            for(new 
    i=0;i<MAX_BLOCKS;i++)
            {
                
    TextDrawHideForPlayer(arc_playerblock_td]);
            }
            
             
    arc_player = -1;
        }
        return 
    0;


  2. #2
    Аватар для D_TRAY
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.11.2013
    Сообщений
    51
    Репутация:
    3 ±
    Если бы не 2 минуса причём значительных то система была бы очень хороша, а так даже хз.

  3. #3
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    Вприципе норм:)

  4. #4
    Аватар для TimoXa32
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.11.2013
    Сообщений
    195
    Репутация:
    21 ±
    Нечего так
    Двойной класс

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •