Postów:
1004
Dołączył:
2009-01-20
Napisano dnia: 2010-11-09 17:41:01
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
Napisano dnia: 2010-11-09 18:18:32
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
Napisano dnia: 2010-11-09 20:41:37
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
Napisano dnia: 2010-11-09 21:35:00
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
Postów:
1004
Dołączył:
2009-01-20
Napisano dnia: 2010-11-11 00:02:49
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
Napisano dnia: 2010-11-11 10:35:06
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
Postów:
1004
Dołączył:
2009-01-20
Napisano dnia: 2010-11-20 19:45:01
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
Napisano dnia: 2010-11-20 22:30:51
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