#1 19-07-2011 21:00

DelFast
Registered: 19-07-2011
Posts: 10

Циклы

Доброго времени суток.
Я в кодинге новичок, но усваиваю быстро (знаю PHP, c#, pawno).
Надо телепортировать игрока из места в место, не по нажатию кнопки.
Есть 20 координат (x,y,z), и по всем этим координатам меня нужно ТПшить.
После этого - цикл повторялся.
(еще раз повторю, новичок, в других языках есть цикл for, тут как осуществить - не знаю)

Цикл что то типа:

1
2
3
4
5
6
00A1: put_actor $PLAYER_ACTOR at 1455.405 750.6191 11.0234
00A1: put_actor $PLAYER_ACTOR at 1000.6517 640.98744 8.647687
00A1: put_actor $PLAYER_ACTOR at 1132.6357 350.3544 15.653587
00A1: put_actor $PLAYER_ACTOR at 535.63517 653.98534 1.6535
00A1: put_actor $PLAYER_ACTOR at 1150.65537 51.987524 1.523687
................

Offline

#2 19-07-2011 22:04

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Re: Циклы

А почему не по нажатию? Просто при спавне?
Тогда:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{$CLEO}
wait 5000                   //просто ждем 5сек, игра все равно загружается
repeat                     //Основной цикл
wait 0                    //Чтобы не вылетело       
          repeat         //Цикл проверки того, существует ли игрок
             wait 0                                                
          until Player.Defined($PLAYER_CHAR)           
             00A1: put_actor $PLAYER_ACTOR at 1455.405 750.6191 11.0234
             wait 3000     //Ожидание 3 сек, чтобы все успело прогрузиться при очередной телепортации, да и чтобы успеть увидеть, куда попал
             00A1: put_actor $PLAYER_ACTOR at 1000.6517 640.98744 8.647687
             wait 3000
             00A1: put_actor $PLAYER_ACTOR at 1132.6357 350.3544 15.653587
             wait 3000
             00A1: put_actor $PLAYER_ACTOR at 535.63517 653.98534 1.6535
             wait 3000
             00A1: put_actor $PLAYER_ACTOR at 1150.65537 51.987524 1.523687
             wait 3000
until false                //Цикл будет выполняться бесконечно

Ну и можно еще обычными if..then..else. Способов еще много.

Offline

#3 19-07-2011 22:42

DelFast
Registered: 19-07-2011
Posts: 10

Re: Циклы

Ухх..
Спасибо огромное. Суть понял
Ещё.
Как при нажатии кнопки начинался цикл, если нажал паузу и снова нажал кнопку - не начинает сначала, а продолжает дальше

Offline

#4 20-07-2011 06:45

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: Циклы

DelFast wrote:

Как при нажатии кнопки начинался цикл, если нажал паузу и снова нажал кнопку - не начинает сначала, а продолжает дальше

С середины цикла? Для этого нужно выполнять проверки после каждого действия... Например так:

(действие)
gosub @check
(действие)
gosub @check
(действие)
...

:check
if
  8AB0: not key_pressed (номер)
then
  return
end
repeat
  wait 100
until 0AB0: key_pressed (номер)

оффтоп:
Знаешь php? Где учился?

Offline

#5 20-07-2011 13:30

DelFast
Registered: 19-07-2011
Posts: 10

Re: Циклы

Можно полный код?

p.s. cамоучка)

Offline

#6 21-07-2011 03:54

DelFast
Registered: 19-07-2011
Posts: 10

Re: Циклы

Написал.
Не могу сделать одно:
Чтобы цикл продолжался до того момента, пока не будет нажата кнопка.
Делал по разному, не получается.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{$VERSION 3.1.0027}
{$CLEO .cs}
 
0000: NOP
 
:LOALA
wait 0 ms
 
if
0AB0:   key_pressed 19
jf @LOALA
         
 
repeat
wait 0 ms
           
    00A1: put_actor $PLAYER_ACTOR at 2229.7996 -2284.3499 13.5469
    
    wait 8000
   
    00A1: put_actor $PLAYER_ACTOR at 2171.4026 -2255.0449 13.3036
    
    wait 8000
   
until 0AB0:  key_pressed 35
 
jump @LOALA

Last edited by DelFast (22-07-2011 01:25)

Offline

#7 23-07-2011 02:59

DelFast
Registered: 19-07-2011
Posts: 10

Re: Циклы

Ребят, помогайте

Offline

#8 23-07-2011 09:27

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Re: Циклы

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{$CLEO .cs}
wait 4000
 
:1
repeat       
wait 1    //Проверка существования игрока
until Player.Defined($PLAYER_CHAR)
 
      repeat
        wait 1     //Проверка нажатия "1"
      until 0AB0:   key_pressed 0x31
 
        repeat
        wait 0
           
      00A1: put_actor $PLAYER_ACTOR at 2229.7996 -2284.3499 13.5469 //Телепортация по этим двум координатам пока зажата кнопка "1"
    
        wait 3000                   
   
      00A1: put_actor $PLAYER_ACTOR at 2171.4026 -2255.0449 13.3036
    
        wait 3000
   
      until 8AB0:  key_pressed 31   //Проверка на то, отпущена ли кнопка "1", если отпущена, то выход из цикла
 
jump @1

P.S число 8 в начале опкода 0AB0 означает обратное действие опкода. Это работает и на других опкодах проверки чего-либо.

Last edited by Jack Daniel's (23-07-2011 09:32)

Offline

#9 23-07-2011 13:02

DelFast
Registered: 19-07-2011
Posts: 10

Re: Циклы

Я имел ввиду не то..
Нажал кнопку - цикл начался, нажал кнопку - цикл закончился.

Offline

#10 24-07-2011 09:59

Jack Daniel's
Registered: 05-07-2011
Posts: 211

Re: Циклы

DelFast wrote:

Я имел ввиду не то..
Нажал кнопку - цикл начался, нажал кнопку - цикл закончился.

Короче, после каждого действия в цикле надо делать проверку на нажатие.

Хотя, лучше сделать на зажатие, либо на ожидание нажатия, перед выполнением каждого действия, все из-за того, что проверка на нажатие между телепортациями будет проходить слишком быстро, так что чтобы остановить цикл, тебе придется жать помногу раз на кнопку.

Last edited by Jack Daniel's (24-07-2011 10:30)

Offline

#11 24-07-2011 15:01

mfisto
From: Russia Perm
Registered: 01-02-2008
Posts: 558
Website

Re: Циклы

Лучше замени клавишу пауза, например, на клавишу мыши.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
{$CLEO .cs}
0000:
while true
    wait 0
    if
        not Player.Defined($PLAYER_CHAR)
    then
        continue
    end
    if
        8AB0:   not key_pressed 1
    then
        0@ = 0
    else
        if
            not 0@ == 1
        then
            0@ = 1
            if
                1@ == 0
            then
                1@ = 1
                32@ = 0
                00A1: put_actor $PLAYER_ACTOR at 2229.7996 -2284.3499 13.5469
            else
                1@ = 0
            end
        end
    end
    if
        not 1@ == 0
    then
        if and
            32@ >= 8000
            32@ < 16000
        then
            if
                not 1@ == 2
            then
                1@ = 2
                00A1: put_actor $PLAYER_ACTOR at 2171.4026 -2255.0449 13.3036
            end
        end
        if
            32@ >= 16000
        then
            if
                not 1@ == 1
            then
                32@ = 0
                1@ = 1
                00A1: put_actor $PLAYER_ACTOR at 2229.7996 -2284.3499 13.5469
            end
        end
    end
end

I know everything and nothing...

Offline

Board footer

Powered by FluxBB