PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Differenz in


WeakPeak
28.07.2009, 13:14
hiho .. eigentlich müsst ich nun 50 zeilen schreiben, liest aber keiner also kurz:

Ich baue an nem Browsergame, beim selbstgebauten Tweening kommt es zu ungenauigkeiten, obwohl ich mit der selben Formel rechne erhalte ich beim tweenen in unterschiedliche Richtungen unterschiedliche ergebnisse (Aufbau: Player steht in der Mitte des Spielfeldes und der Hintergrund bewegt sich).

Nach 3 Wochen suchen habe ich ein kleines fallbeispiel erstellt und darin solange reduziert bis ich nun auf eine minimalistiche Formel kam, nachdem dort auch unregelmässigkeiten auftraten habe ich jegliche formeln raus geschmissen und rechne nun mit absoluten Werten, dennoch bleibt die tolleranz bestehen.

Fallbeispiel:

http://www.file-upload.net/download-1792795/TweenLiteDifferenceExample_fixed-rate_exp_all_fixed.rar.html

in der fla ist eine Variable "tweenRunTime" steht diese auf 0 wird bei jedem Frame neu berechnet, setzt man sie auf irgendwas über einen wert von 4 so wird nur jeder 4te Frame neu berechnet und die zwischenergebnisse Interpoliert wodurch sich die Tolleranz von 10% auf 1% reduziert...

btw. das Beispiel oben tweent nur nach rechts oder links alsbald die mouse taste gedrückt wird, ich hab alles störende raus genommen...

hat dazu jemand ne erklärung?

mfg


gencha
28.07.2009, 14:49
Das Beispiel von dir benutzt doch TweenLite und sieht so weit eigentlich ganz normal aus.

WeakPeak
28.07.2009, 16:56
Jo das benutzt jetzt tweenLite weil ich sicher gehen wollte das es nicht daran liegt...(btw mit tweenLite isses noch ungenauer)

Setzt du nun aber in oben besagter Variablen "frameRunTime" eine 0 ein, so das tweenLite nur diesen einen Schritt berechnet und dann imemrwieder überschreibt bei JEDEM enterFrame event erhälst du bei einem Tween von Links nach Rechts eine Laufzeit von insgesammt 94-96 sekunden, in die andere Richtung dann jedoch 88-89 Sekunden (vorrausgesetzt eine speed von 1000)...

Und das ist das Problem was ich habe... denn auch wenn der Hintergrund sich jetzt da langsam bewegt so musst Du mit einem Multiplikator von 32 Rechnen den dann andere Spieler haben werden und wenn das bei anderen Spielern auch so Unterschiedlich ist( es weicht nämlich auch von PC zu PC ab) macht sich das sehr Stark bemerkbar, also ums mal durch zu rechnen...

9 sekunden Unterschied sind ~10%, bei einer Strecke von 1500px sind das 150 px unterschied, bei einem Multiplikator von 32 sind das 5000px unterschied auf eine laufzeit von 90 sekunden,was bei einer laufzeit von nur 10 sekunden Tween schon 500 px wären die die spieler charaktäre auseinander liegen...

und das ist mein Problem:)

mfg

EDIT:
... Ich werde natürlich nicht jeden enterFrame auswerten nachher und Unterschiede ausgleichen lassen über ein eingreifen des gameServers wo die Strecken ebenfalls berechnet werden.. alleine schon um betrügereien aus zu schliessen

NUR hier werden die Werte ja auch richtig berechnet... woran liegts also?
Am enterFrame?
An der Laufzeit der Berchnungen im enterFrame?
Am MouseDown event ansich auch wenn dieser nur ein mal "gefeuert" wird?

Das wäre nun so gesehen die eigentliche Frage, nenn mich einen Idealisten aber ich weiss immer ganz gerne warum etwas nicht so funktioniert wie es berechnet war.

gencha
28.07.2009, 18:02
Also dein Problem hab ich jetzt auf jeden Fall verstanden.
Habe leider nur grade keine Zeit mir das fla noch einmal anzuschaun.
Was ich dir aber definitv sagen kann, sich auf das ENTER_FRAME event zu verlassen ist keine gute Idee.

Stellt man sein Projekt auf 25fps ein dann garantiert dies nur, dass ENTER_FRAME höchstens 25 mal pro Sekunge getriggert wird. Vielleicht aber auch weniger. Und die Abstände sind auch auf keinen Fall konstant.

Ich vermute, dir ist wichtig, dass die Geschwindigkeit der Spieler immer konstant ist.
Dies würde ich so lösen, dass ich einfach die Laufzeit eines Tweens berechne.
Hier mal ein kleines Beispiel:


var testObject:Sprite = new Sprite();
var positionOld:Point = new Point( 0, 0 );
var positionNew:Point = new Point( 100, 50 );

const SPEED:Number = 10; // Units per second
var distanceX:Number = positionNew.x - positionOld.x;
var distanceY:Number = positionNew.y - positionOld.y;
var distance:Number = Math.sqrt( distanceX * distanceX + distanceY * distanceY );
var duration:Number = distance / SPEED;
trace( "Trvalling the distance of: " + distance + " units will take " + duration + " seconds" );

testObject.x = positionOld.x;
testObject.y = positionOld.y;
testObject.graphics.beginFill( 0xff0000 );
testObject.graphics.drawCircle( 5, 5, 10 );
testObject.graphics.endFill();
addChild( testObject );
TweenMax.to( testObject, duration, { x:positionNew.x, y:positionNew.y } );


Ich hoffe das hilft :)

WeakPeak
29.07.2009, 04:32
Jo so ungefähr hab ich das auch, ... für die zweite steuermöglichkeit... das anklicken auf der übersicht ... aber darum gehts nicht...

bei deinem Beispiel wird keine Differenz auftreten da keine der Bedingungen die dazu führen das die Differenz endsteht vorhanden ist, also gedrückte moustaste und enter Frame:rolleyes: btw. den ENTER_FRAME brauche ich für meine Tweenklasse, die Überprüfung ob die Maustaste weiterhin gedrückt ist sowie einen Endlostween.

btw. du weisst schon das tweenLite auch ENTER_FRAME für die Tweens benutzt und lediglich einen Timer für die garbage collection hat? schau mal in die Klassen rein;)

Zu 25fps... hmm es ist eigenstellt auf 120 und läuft normalerweise bei 55-65 fps... Da allerdings alles anhand der DATE.getTime() Methode getweent wird sollte dies eigentlich keine Rolle Spielen. was es bei mir auch nicht wirklich tut, ob jemand 30 oder 60 fps hat es ist egal, die tweens laufen Gleich schnell bei beiden Usern.. Nur laufen sie in entgegen gesetzter Richtung bei gedrückter maus taste unterschiedlich lang.... auch auf dem selben pc... UND DAS ist das Problem...


Danke Trotzdem, du bist nicht der erste der das Problem nicht wirklich erfasst und keine zeit hat:)

nur mal so zur Info... das game hat Inzwischen ne grösse von über 2000 Zeilen clientseitig und 1500 serverseitig, ich programmiere seit öhm 9 jahren , 7 davon in actionscript, 3 in java(die 14 anderen sprachen mal weg gelassen)... ich glaub nen einfachen tween zu implemtieren schaff ich gerade noch, nur warum 2 events einen Tween ausbremsen verstehe ich nicht:)

gencha
29.07.2009, 04:55
Also von mir aus kann man für die Basis der Animation sowohl Timer als auch ENTER_FRAME nutzen. So lange man die Zeitdifferenz zur letzten Iteration ordentlich berücksichtigt.
Das TweenLite ENTER_FRAME verwendet hat wohl hauptsächlich einen Performance Hintergrund.

Da deine Bewegung eh linear ist gibt es keinen Unterschied zwichen einmal Maustaste drücken und Maustaste gedrückt halten.
Im ersten Fall setzt du einmal einen Zielwert, im zweiten Fall setzt du einfach bei jeder Iteration ein neues Ziel.

Und deinen Lebenslauf hätte ich persönlich an dieser Stelle mal weg gelassen. Weil das wirkt eher peinlich wenn du an diesem Problem versagst.

Viel Spaß noch mit deinem Flashgame :)

WeakPeak
30.07.2009, 13:30
Und deinen Lebenslauf hätte ich persönlich an dieser Stelle mal weg gelassen. Weil das wirkt eher peinlich wenn du an diesem Problem versagst.

Viel Spaß noch mit deinem Flashgame :)
peinlich ists wohl eher wenn jemand zu blöd zum lesen ist, am problem vorgbei redet und jemand anders der bereits nun zum 6ten male schreibt das er einen fehler im flashplayer vermutet als dumm darstellt weil man selber zu faul war den beitrag durch zu lesen...

denken ist halt nicht deine stärke, aber mach dir nichts draus... nicht jeder ist inteligent genug ein beschriebenes problem wo auch noch ein fallbeispiel zu gegeben wird nach zu vol ziehen man muss halt nicht nur beispiele vond er greensock seite abkopieren können soondern auch denken vor dem reden...

viel spass in deinem königreich, einäugiger;)

es iss jedesmal der selbe mist in sonem forum, die leute ham keine zeit was durch zu lesen, schreiben irgendeinen mist der nichts mit dem thema zu tun hat und werden dann auch noch persöhnlich wenn man ihnen ihre unfäigkeit aufzeigt:)... so langsam sollt ichs eigentlich wissen... bei uns gibts nen sprichwort... wenn man keine ahnung hat einfach mal die fresse halten, empfehle ich dir auch...

übrigens danke das du mir nun bschrieben hast was ich seit monaten als code vorliegen habe...trottel ey has ins beispiel geschaut ja... anscheinend nicht ... kauf dir mal n hirn

z3r0x
31.07.2009, 00:08
@WeakPeak
Ich finde es absolut daneben, was du nun von dir gibst.
gencha hat einfach nur versucht dir zu helfen.

Und auch wenn du mit seinen Informationen nun nichts anfangen konntest, hätte man zumindest einmal mit einem "Danke, dass du es versucht hast" antworten können.

Es gibt absolut keinen Grund beleidigend zu werden.