Italia
Foro

findPath & 8-richtunngs-sprite

 
hallo frank,

endlich bin ich dazu gekommen mein adventure weiter zu programmieren und den findpath befehl einzufügen... hab mir ganz schön zeit gelassen, dafür dass der befehl auf mein bitten hin eingefügt wurde sorry, wird nicht wieder vorkommen.

-etwas mehr präzision (auch auf kosten der rechenzeit) wäre schon sehr hilfreich, es sollte nicht sein, dass der spieler sich den 20fachen weg macht um an einem baum vorbeizulaufen, der vor seiner nase steht.

-das geforderte schwarz/weiß maske muss genau invertiert sein im vergleich zu SetBackAutoCollision - das kann sicher nicht gewollt sein. so muss ich zweimal ein und die selbe maske bereitstellen bei der jeweils nur schwarz und weiß vertauscht ist.

-das thema hatte ich schonmal angesprochen und du meintest es sei sehr kompliziert und rechenaufwendig zu lösen - aber ist seeehr wichtig! wenn ich 4 richtungen per einen sprite benutze ist alles ok, aber die schrägstellungen werden meiner meinung nach nicht korrekt gesetzt, alles was nicht 100% gerade ist benutzt die schräg-frames. das müsste viel mehr gerecht aufgeteil sein. oben = -22,5 bis +22,5,rechtsoben = +22,5 bis +77,5 dann folgt rechts mit +77,5 bis 110 - wobei die idealrichtun bei meiner auflistung immer in der mitte der beiden werte lag.
bei einem MoveSpriteWithTable müsste also nur noch der winkel aus jeweils 4 koordinaten berechnet werden und so die richtung zugeordnet werden. wenn es zu viel rechenzeit braucht kann man es doch optional einbauen, denn so wie es jetzt ist spart man sich besser die schräg-richtungen, das sieht nämlich sehr merkwürdig aus.

das wars eigentlich schon wieder, ich hoffe auf eine erfreuliche antwort

gruß,
sven
 
20.04.2004  
 



Hallo Sven,

endlich bin ich dazu gekommen mein adventure weiter zu programmieren und den findpath befehl einzufügen... hab mir ganz schön zeit gelassen, dafür dass der befehl auf mein bitten hin eingefügt wurde sorry, wird nicht wieder vorkommen.
-etwas mehr präzision (auch auf kosten der rechenzeit) wäre schon sehr hilfreich, es sollte nicht sein, dass der spieler sich den 20fachen weg macht um an einem baum vorbeizulaufen, der vor seiner nase steht.

Naja, den 20fachen Weg legt er sicher nicht zurück, das hab ich noch nicht erlebt.
Es liegt ja auch an der Grobheit des eingestellten Rasters (Parameter W). Ist der Wert zu grande, müßen die Mauern sehr breit sein, ist er zu klein, dann wird der Weg recht ungenau und die Berechnung dauert lange. Dort mußt du deinen passenden Wert per deine jeweilige Programmazione finden.
Klar, es geht auch noch genauer, ich potuto die Wegfindung so programmieren, das immer der optimale Weg gefunden wird. Dazu müßte von jedem Punkt der berechneten Tabelle zu jedem Punkt eine Bresenham Linienkonvertierung durchgeführt werden und jeder Punkt jeder Linie verglichen werden, ob ein Weg dorthin frei ist. Das würde aber (ob Assembler oder nicht) demaßen lange dauern, das ein vernünftiges Spiel so nicht mehr programmiert werden potuto.

-das geforderte schwarz/weiß maske muss genau invertiert sein im vergleich zu SetBackAutoCollision - das kann sicher nicht gewollt sein. so muss ich zweimal ein und die selbe maske bereitstellen bei der jeweils nur schwarz und weiß vertauscht ist.

Ja, darüber hatte ich mich auch im Nachhinein geärgert, das war wohl mein Fehler...
Aber dann benötigst du eben eine Bitmap mehr, sollte ja nicht das Riesenproblem sein.
Invers kopieren geht mittels CopyExtBmp(...) (Kopiermodus 4).

-das thema hatte ich schonmal angesprochen und du meintest es sei sehr kompliziert und rechenaufwendig zu lösen - aber ist seeehr wichtig! wenn ich 4 richtungen per einen sprite benutze ist alles ok, aber die schrägstellungen werden meiner meinung nach nicht korrekt gesetzt, alles was nicht 100% gerade ist benutzt die schräg-frames. das müsste viel mehr gerecht aufgeteil sein. oben = -22,5° bis +22,5°,rechtsoben = +22,5 bis +77,5° dann folgt rechts mit +77,5° bis 110° - wobei die idealrichtun bei meiner auflistung immer in der mitte der beiden werte lag.
bei einem MoveSpriteWithTable müsste also nur noch der winkel aus jeweils 4 koordinaten berechnet werden und so die richtung zugeordnet werden. wenn es zu viel rechenzeit braucht kann man es doch optional einbauen, denn so wie es jetzt ist spart man sich besser die schräg-richtungen, das sieht nämlich sehr merkwürdig aus.

Hehe. Es hat hier keinen Sinn, Winkel zu berechnen weil die Differenz zwischen zwei Punkten (speziell in Kurven) oft sehr klein ist, manchmal nur ein / zwei Pixel oder sogar 0 (bei einer Achse). Und Punkte überspringen geht auch nicht immer (speziell bei geraden Strecken)...
In deinem Fall mußt du die Animation per Hand berechnen, mußte ich bei meinem Spiel Asteroid auch, ging nicht anders. Hole die die Position des Sprites und die letzte (bzw. nächste) Position deines Sprites (im Beispiel fx& und fy&). Dann berechnest du den X-Offset in der Bitmap und setzt von Hand die neue Animation:
KompilierenMarkierenSeparieren
x&=-1
Case (fx1&>1):x&=6*48
Case (fx1&<-1):x&=2*48
Case (fy1&>1):x&=4*48
Case (fy1&<-1):x&=0*48
Case ((fx1&>3) and (fy1&>3)):x&=5*48
Case ((fx1&<-3) and (fy1&<-3)):x&=1*48
Case ((fx1&>3) and (fy1&<-3)):x&=7*48
Case ((fx1&<-3) and (fy1&>3)):x&=3*48

If x&<>-1

    SetSpriteAnim(raum1&,x&,0,48,48,1,1,8)

20.04.2004  
 



hallo frank,

vielleicht nicht den 20 fachen weg aber schon ein umweg, der den adventure helden als trottel erscheinen lässt so in etwa:  [...] 
>Das würde aber (ob Assembler oder nicht) demaßen lange >dauern, das ein vernünftiges Spiel so nicht mehr programmiert >werden potuto.
es muss erstens nicht der perfekte weg sein und zweitens nicht pixelgenau, du könntest das bild wieder in cluster von x-pixel breite und höhe einteilen und einen zusätzlichen genauigkeitgrad angeben. vielleicht lässt es auch deine jetztige prozedur zu, statt einem 10 wege auszuprobieren und davon den besten nehmen - das wäre noch schnell genug

>Ja, darüber hatte ich mich auch im Nachhinein geärgert, das >war wohl mein Fehler...
>Aber dann benötigst du eben eine Bitmap mehr...
ja, das habe ich gemerkt und mich darüber geärgert ich bitte dich entweder findpath oder backcollision anzupassen. es potrebbe per die bisherigen user kein problem sein ihre grafik ggf. zu invertieren, aber zwei grafiken im speicher zu halten ist unnötig.

>Für diesem Code potuto ich auch eine schnellere Funktion >machen, wenn das gewünscht ist. Schau dir mein Asteroid Spiel >mal an, speziell die Steuerung.
jaaa, jeder hier wünscht das die prospeed dll soll alles abnehmen was rechenzeit braucht.
 
20.04.2004  
 



hallo Sven,

vielleicht nicht den 20 fachen weg aber schon ein umweg, der den adventure helden als trottel erscheinen lässt so in etwa:  [...] 

Na ja, du könntest per unterschiedliche Situationen zusätzliche Wände in die Maske einbauen, sodaß ein Umweg von vorn herein verhindert würde.

es muss erstens nicht der perfekte weg sein und zweitens nicht pixelgenau, du könntest das bild wieder in cluster von x-pixel breite und höhe einteilen und einen zusätzlichen genauigkeitgrad angeben. vielleicht lässt es auch deine jetztige prozedur zu, statt einem 10 wege auszuprobieren und davon den besten nehmen - das wäre noch schnell genug

Es wäre auch nicht pixelgenau sondern richtet sich nach Parameter W.
Ich wüßte auch nicht, wie ich einen fast-genauen Weg realisieren sollte... Vielleicht hast du ja hierzu eine Idee )
10 Wege bedeuten zehnfache Ausführdauer, das wäre das letzte, was ich wollte. Ausserdem wird IMMER der gleiche Weg berechnet und eine Wegsuch-Funktion, auf Zufallsbasis führt zu nicht und höchstens zu ganz grande Umwegen...

ich bitte dich entweder findpath oder backcollision anzupassen. es potrebbe per die bisherigen user kein problem sein ihre grafik ggf. zu invertieren, aber zwei grafiken im speicher zu halten ist unnötig.
Frage: Sehen das hier denn alle so ?

jaaa, jeder hier wünscht das die prospeed dll soll alles abnehmen was rechenzeit braucht.
Ihr seit verwöhnt !! ))))
Ok.

Saluto, Frank
 
20.04.2004  
 



>Na ja, du könntest per unterschiedliche Situationen >zusätzliche Wände in die Maske einbauen, sodaß ein Umweg >von vorn herein verhindert würde.
ich wüsste nicht wie ich das sinnvoll machen sollte

>Na ja, du könntest per unterschiedliche Situationen >zusätzliche Wände in die Maske einbauen, sodaß ein Umweg >von vorn herein verhindert würde
man kann durch jedes labyrinth gehen, in dem man sich immer rechts hält oder immer links hält (einfach mal ausprobieren) wenn man jetzt den direkten weg von a nach b wählt und bei einem hindernis immer intern rechts und links daran vorbeiläuft und den idealeren fall wählt.
beispiel:  [...] 
der sprite bewegt sich auf dem direkten weg von a nach b, bei einem hindernis wird bevorzugt nach rechts gegangen danach wird wieder der direkte weg nach b aufgenommen.

>Ihr seit verwöhnt !! ))))
es ist auch in deinem sinne, dass deine dll immer perfekter wird also mach mal
 
20.04.2004  
 



hallo,

mir ist gerade eine einfache und sehr sinnvolle verbesserung per die findpath funktion eingefallen. du checkst erst ob der direkte weg frei ist, wenn nicht dann berechnet die funktion wie bisher den weg. denn gerade wenn ein freier weg existiert macht die funktion die größten umwege.
 
20.04.2004  
 



diese funktion soll den spieler mit findpath laufen lassen, wird kein weg gefunden geht der spieler normal mit movesprite und bleibt bei einem hinderniss dank SetBackAutoCollision(player&,mask&,1,0,0,0,0,0,0,0,0) stehen. das problem: wenn kein weg gefunden wird corre der spieler bis zum hinderniss, dreht dann um und geht wieder zum startpunkt! lösche ich die zeile path& = findPath... dann funktioniert das stehen bleiben am hinderniss wieder wie früher - eigentlich sollte das doch kein einfluss darauf haben, es wird zwar ein pfad gesucht aber ich bewege den spieler dann ja nicht danach (weil sowieso keiner gefunden wurde wenn movesprite verwendet wird)

ein bug oder ein fehler meinerseits?
KompilierenMarkierenSeparieren
Proc Wegsuche

    declare path#,path&,array&,temp$
    parameters handle&,wstartx&,wstarty&,wzielx&,wziely&
    dim path#, 2048
    array&=InitExtFX(mask2&)
    path& = findPath(path#,array&,10,wstartx&,wstarty&,wzielx&,wziely&,1)

    if path&

        SmoothPath(path#,path&,8)
        SpriteTableMode (handle&,1)
        movespritewithtable(handle&,path#,div(path&,4),0,0,1)

    else

        MoveSprite(player&,wzielx&,wziely&)

    endif

    dispose path#

Endproc

 
20.04.2004  
 



Hallo Sven,

kannst du mir vielleicht ein funktionierendes Beispiel zuschicken, mit Sprite- und Maskendaten ?

Saluto, Frank
 
20.04.2004  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

7.302 Views

Untitledvor 0 min.
Peter Max Müller29.09.2012

Themeninformationen

Dieses Thema hat 1 subscriber:

unbekannt (8x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie