Czy wiesz, że... możesz podsyłać newsy, artykuły, pliki i zdjęcia?
Strona główna forum Szukaj Rejestracja
Witaj, nieznajomy!
Poprzedni 1 Następny
Postów: 1004 Dołączył: 2009-01-20
#
Moją ciemną stroną w tym całym pisaniu misji są zaawansowane pętle sprawdzające gdzie np. jest ich cztery i każda ma coś z nich sprawdzić. Misje którą piszę jest ich cztery. Pierwsza ma za zadanie sprawdzić czy gracz wsiadł do pojazdu, druga czy auto zostało zniszczone, trzecia ma sprawdzić czy pasażer zginą i czwarta czy gracz wyszedł z samochodu. No i właśnie z tą czwartą zaczynają się problemy bo jaka ją dodam to po rozpoczęciu misji samochód od razu w raz z pasażerem znika i za nic nie mogę dojść dlaczego. Według mnie powinno to się dziać dopiero jak z niego wyjdzie a nie już na wstępie. Więc dlaczego tak się dziej i jak inaczej tą pętlę napisać albo co w nie poprawić żeby to działało jak trzeba. Poniżej fragment kodu

Kod:
:petla1
wait 10
if
Actor.InCar($PLAYER_ACTOR, $s1)
jf @petla2
Marker.Disable($ms1)

:petla2
wait 10
if
0119:   car $s1 wrecked 
jf @petla3
Marker.Disable($ms1)
Car.Destroy($s1)
009B: destroy_actor $p1

:petla3
wait 10
if
0118:   actor $p1 dead 
jf @petla4
009B: destroy_actor $p1
Marker.Disable($ms1)
Car.Destroy($s1)

:petla4
wait 10
if
not Actor.InCar($PLAYER_ACTOR, $s1)
jf @petla1
009B: destroy_actor $p1
Marker.Disable($ms1)
Car.Destroy($s1)
Postów: 878 Dołączył: 2009-01-20
#
Sprawdzaj, czy gracz wyszedł z auta, dopiero jak do niego wejdzie:

Kod:
:petla1
wait 10
if
Actor.InCar($PLAYER_ACTOR, $s1)
jf @petla2
Marker.Disable($ms1)

jump @petla4

:petla2
wait 10
if
0119: car $s1 wrecked
jf @petla3
Marker.Disable($ms1)
Car.Destroy($s1)
009B: destroy_actor $p1

:petla3
wait 10
if
0118: actor $p1 dead
jf @petla1
009B: destroy_actor $p1
Marker.Disable($ms1)
Car.Destroy($s1)

:petla4
wait 10
if
not Actor.InCar($PLAYER_ACTOR, $s1)
jf @petla4
009B: destroy_actor $p1
Marker.Disable($ms1)
Car.Destroy($s1)


Pozatym zamiast wait 10 możesz użyć wait 0 dla większej dokładności.

___________________
Administrator
Postów: 1004 Dołączył: 2009-01-20
#
A jak do tej pętli dodać pętle która sprawdzić czy gracz dotarł do wyznaczonego celu?
Postów: 628 Dołączył: 2009-01-22
#
Taką pętlę o wiele prościej napisać w konstrukcjach wysokiego poziomu, serio.

Jeśli nie poskąpisz sobie jednej zmiennej lokalnej (globalne w CLEO to zło!), to możesz ładnie połączyć to wszystko w jedną pętlę.

Zamieniłem $s1, $ms1 i $p1 na 1@, 2@ i 3@ (patrz - 'globalne w CLEO to zło!')

W tym przypadku zmienna 0@ będzie określała 'etap pętli':

Kod:
while true
    wait 0
    if or
        0118:   actor 3@ dead 
        0119:   car 1@ wrecked 
    then
        0164: disable_marker 2@
        00A6: destroy_car 1@ 
        009B: destroy_actor 3@ 
        break // Wyskakuje z pętli while
    end
    if
        0039:   0@ == 0 // Rzeczy poniżej będa sprawdzane tylko, gdy etap wynosi 0
    then
        if
            00DB:   actor $PLAYER_ACTOR in_car 1@ 
        then
            0164: disable_marker 2@
            0006: 0@ = 1 // Gracz jest w pojeździe, wkraczamy w następny etap 
        end
    end
    if
        0039:   0@ == 1 // Rzeczy poniżej będa sprawdzane tylko, gdy etap wynosi 1
    then
        if
            80DB:   not actor $PLAYER_ACTOR in_car 1@ 
        then
            00A6: destroy_car 1@ 
            009B: destroy_actor 3@  
            break // Wyskakuje z pętli while
        end
        if
            01AF:   car 1@ sphere 0 in_sphere 0.0 0.0 0.0 radius 0.2 0.2 1.0 // Sprawdza, czy pojazd jest w wyznaczonym celu
        then
            // Rób co chcesz
        end
    end
end


I jeszcze jedno - w takich pętlach wystarczy jeden wait, tak jak użyłem tego wyżej.

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 1004 Dołączył: 2009-01-20
#
To tego to już całkowicie nie rozumiem :|. Ledwo łapie o co chodzi z tymi normalnymi pętlami a ty mi piszesz coś takiego :).
Postów: 628 Dołączył: 2009-01-22
#
To jak tego nie rozumiesz, to wklej kod w Sanny'ego, skompiluj i zdekompiluj od nowa. Będziesz miał to w konstrukcjach niskiego poziomu i dzięki temu lepiej to zrozumiesz :)

Poza tym, tu na forum nie widać TABów, które powstawiałem - z nimi kod jest o wiele czytelniejszy, a w takiej postaci wygląda tragicznie. Wkleiłem ten kod na pastebin, razem z tabulatorami - może w taki sposób lepiej to zrozumiesz.

http://silent.pastebin.com/RJk8cjEb

___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Postów: 1004 Dołączył: 2009-01-20
#
He to znowu ja. Zacząłem tworzyć wyścig do tego menu co robiłem wcześniej. Wyścig ma się zacząć robić po szpawnie w pojeździe. Kod mam na razie taki:

Kod:
{$CLEO .cs}
0000: NOP

:sprawdzacz
wait 0
if
Player.Defined($PLAYER_CHAR)
jf @sprawdzacz

//pojazdy
0247: request_model #kart
0247: request_model #glenshit
//obiekty
0247: request_model 1515
//postacie
0247: request_model 58
0247: request_model 72
038B: load_requested_models

04BB: select_interior 0
0860: link_actor $PLAYER_ACTOR to_interior 0
//00A1: put_actor $PLAYER_ACTOR at 1988.3821 -2361.3757 13.5469
//Actor.Angle($PLAYER_ACTOR) = 268.8906
02EB: restore_camera_with_jumpcut 

04BB: select_interior 0
0860: link_actor $PLAYER_ACTOR to_interior 0
00A5: $stunt = create_car #kart at -2196.6948 2405.1248 4.9607
0175: set_car $stunt z_angle_to 133.5149
05CB: AS_actor $PLAYER_ACTOR enter_car $stunt as_driver 0 ms 

:petla1
wait 10
if
Actor.InCar($PLAYER_ACTOR, $stunt)
jf @petla1

06D5: $cze_1 = create_racing_checkpoint_at -2229.8748 2370.562 4.2697 point_to -2229.8748 2370.562 4.2697 type 0 radius 3.0 
0996: set_racing_checkpoint $cze_1 Z_angle_to 468.214
018A: $punkt_1 = create_checkpoint_at -2229.8748 2370.562 4.2697       //1

jump @petla4

:czekpont_2
wait 0
if
00EE:   actor $PLAYER_ACTOR 0 near_point -2229.8748 2370.562 radius 2.0 2.0 in_car
jf @czekpont_2
018C: play_sound 1058 at 0.0 0.0 0.0
Marker.Disable($punkt_1)
06D6: disable_racing_checkpoint $cze_1 
06D5: $cze_2 = create_racing_checkpoint_at -2357.5327 2464.9763 4.277 point_to -2357.5327 2464.9763 4.277 type 0 radius 3.0 
0996: set_racing_checkpoint $cze_2 Z_angle_to 468.214
018A: $punkt_2 = create_checkpoint_at -2357.5327 2464.9763 4.277      //2

jump @petla4

:petla4
wait 10
if
not Actor.InCar($PLAYER_ACTOR, $stunt)
jf @petla4
Car.Destroy($stunt)
00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1
Marker.Disable($punkt_1)
06D6: disable_racing_checkpoint $cze_1 
Marker.Disable($punkt_2)
06D6: disable_racing_checkpoint $cze_2 

0A93: end_custom_thread


Powinien on działać w ten sposób że gdy wyjdziemy przed pierwszy czekpontem z pojazdu to misja się nie powiodła i owszem dzieje się tak ale pod warunkiem że nie ma tego pierwszego jumpa danego do pętli4. Dopiero jak zbiorę to pierwsze czerwone kuło i pojawi się to dorugie i potem wyjdę z pojazdu to dopiero pisze że misja się nie powiodła. Więc jak powinna wyglądać pętla sprawdzająca która przed każdym kółkiem i za każdym kułkim sprawdzi ci postać jest w pojeździe?

Ps, ostatnio dużo pytań zadaje i mam nadziej że to nie jest problem.
Postów: 628 Dołączył: 2009-01-22
#
Kod:
0247: request_model #kart
0247: request_model #glenshit


Dlaczego Ty używasz tak przestarzałej bazy opcodów? :/

Ten skrypt w ogóle nie będzie dobrze działał, bo gdy wejdziesz do pojazdu skrypt zaczyna się zapętlać na @petla4, więc nie będzie sprawdzał czy zebrałeś marker czy też nie. Widać, że musisz dokładnie jeszce raz przeczytać tutorial o pętlach.
No i zaktualizować bazę opcodów.
No i pozbyć się wait 10, zamienić je na wait 0.
No i pozbyć się ZMIENNYCH GLOBALNYCH.


___________________
Moderator
http://i.imgur.com/Abvv63y
Śledź mój kanał Twitter by być na bieżąco ze wszystkimi aktualizacjami moich modów!
Poprzedni 1 Następny
Zaloguj się lub zarejestruj się, żeby pisać na forum.
Created & Powered by MakG