wie zeige ich am besten den SICHTRADIUS ein?? [erledigt]
Übersicht

![]() |
KryanBetreff: wie zeige ich am besten den SICHTRADIUS ein?? [erledigt] |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
wie kann ich es programmiertechnisch am günstigsten lösen, dass der bewegungsradius... ![]() dargestellt wird?? die einheit hab ich in einem type gespeichert... eine pathfinding-methode ist auch schon vorhanden.... Vielen Dank, kryan |
||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
- Zuletzt bearbeitet von Kryan am Sa, März 18, 2006 21:47, insgesamt einmal bearbeitet
![]() |
Triton |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nutze den altbekannten Fog of War ![]() ![]() |
||
Coding: silizium-net.de | Portfolio: Triton.ch.vu |
ke^kx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@Triton:
Kryan hat Folgendes geschrieben: wie kann ich es programmiertechnisch am besten lösen ![]() Hm, ich stimme Triton zu, dass es Grafisch so am schönsten ist. Mach es am besten so, dass du dir von Blitzbase die Pixelmanipulationsroutine runterlädst und damit rumprobierst. Oder du erstellst, was warscheinlich am schnellsten wäre ein durchscheinendes Sechseck(ich weiß aber grad nicht wie weit B2D das unterstützt) und legst es über den Gesamten Bildschirm, außer halt über die erreichbaren Tiles. Oder du machst es mit einer der Methoden, die im Transparenz Thread geschildert werden (wenn ich es mir gerade so überlege sind das wahrscheinlich die besten Methoden ![]() Jiriki |
||
http://i3u8.blogspot.com
Asus Striker II Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-) Geforce 9800 GTX 2GB RAM |
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Für die grafische Darstellung reicht es auch eine extra "dunkle" Tilemap für den FogOfWar zu haben, dann wird das nicht langsamer.
Für die Ermittlung der begehbaren Felder einfach ein A* Pathfinding benutzen, was halt jeweils abgebrochen wird, sobald die Bewegungspunkte verbraucht sind. Alle begehbaren Felder werden dann markiert und dann eben mit dem hellen Tileset, der Rest mit dem dunklen Tileset eingezeichnet... Somit kann der dann auch nicht über Wasser laufen und Gelände mit höherem Bewegungsverbrauch wird auch berücksichtigt... |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wieso nicht einfach mit nem 6-eckigen fake-transperenz tile, welches du auf alle felder legst, die nicht im raduis sind?!
P.S.: Mit Fake-Transperenz mein ich ca. jeden 2. Pixel in der Maskfarbe und den andern in nem grau. Wenn man das immer wieder macht und die Maskfarbe ausblendet, so entsteht en transperenz effekt ![]() |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
ke^kx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also von der framerate her ist BIG BUGs Lösung relativ sicher die schnellste. Aber lass uns warten, was Kryan am besten passt ![]() Jiriki |
||
http://i3u8.blogspot.com
Asus Striker II Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-) Geforce 9800 GTX 2GB RAM |
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
so...ich werde auch BIG BUGs Lösung nehmen,zuerst dachte ich es wäre zu mühsam, scheint aber die einzige für mich realisierbare Lösung zu sein...
also vielen dank für eure hilfe! edit: zwischen welchen punkten sollte ich dann die pathfinding-methode anwenden?? es besteht nämlich das problem, dass wenn ich mit einem x-beliebigen punkt, es machen würde, er ja nicht in alle richtung geht, oder irre ich mich da ![]() hier noch n beispiel, welches das problem erläutern soll: ![]() der grüne punkt sei der spieler und der blaue ein x-belieber punkt hm...-.- edit2: hab nun folgende version: Code: [AUSKLAPPEN] For y=1 To mapheight
For j=1 To 0 Step -1 For rx=1 To mapwidth Step 2 x=rx+j xpos=MapPointToCoord(x,y,1) ypos=MapPointToCoord(x,y,2) If (x>unit\coord\x-13 And x<unit\coord\x+13) And (x>unit\coord\y-13 And x<unit\coord\y+13) Then If InReichweite(unit\coord,x,y,unit\actap) Then DrawImage markierung,xpos+1,ypos+1 End If Next Next Next das allein schon braucht aber pro hauptschleifendurchlauf 2.7 sekunden -.- ahja: nich von der komischen for-schleifen-struktur verwirren lassen, die is notwendig damit nichts falsch angezeigt wird ^^ |
||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Kryan,
deine Bedenken das die Pathfinding Methode nicht alle Felder Findet sind berechtigt. Ich würde es anders und auch viel einfacher lösen. Auf dem Bild ganz oben sieht man ja sehr deutlich das der Aktionsradius des "Wesnoth" Elben Rangers nur 2 Tiles ist. Allso kann er alle Felder erreichen die im Bereich von -X2,-y2 bis +x2,+y2 seine aktuellen Position liegen. Jetzt ist natürlich nur noch zu klären wie die Map genau aufgebaut ist. Ich meine Damit das du bei einer Hexmap ja eine Verschiebung der Tiles berücksichtigen musst. Pseudocode ganze map komplett mit dunklen tiles versehen danach: For Y = AktuellY-Reichweite to AktuellY+Reichweite For X = AktuellX-Reichweite to AktuellX+Reichwete if FeldGeblockt then DunklesTile DrawBlock dunkelTile ,x,y else drawblock hellTile ,x,y endif next next |
||
Er soll an den Spielen teilnehmen bis er spielend stirbt. MCP - TRON |
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
eh ja...aber wenn du das spiel wirklich so gut kennen würdest, dann wüsstest du, dass die verschiedenen felder verschieden viele bewegungspunkte "kosten"...und genau da liegt mein problem...man BRAUCHT pathfinding! | ||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
![]() |
Artemis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann probier es folgendermaßen:
Du nimmst das Tile über der Figur. Dann lässt du Pathfinding durchlaufen und markierst es als erreichbar oder nicht. Dann gehst du im Uhrzeigersinn einmal um die Figur herum und überprüfst jedes der übrigen 5 Tiles. Jetzt guckst du, ob keins der Tiles erreichbar ist. Wenn ja, dann kannst du aufhören, da man dann ja auch kein weiter entfernteres Tiles mehr erreichen kann. Dieses kreisförmige Suchen, mit der Überprüfung, ob überhaupt ein Tile erreichbar ist machst du jetzt immer weiter, nur halt jeweils einen Ring weiter außen. Wenn dann bei einem Ring nichts mehr erreichbar ist, bist du fertig. |
||
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: eh ja...aber wenn du das spiel wirklich so gut kennen würdest, dann wüsstest du, dass die verschiedenen felder verschieden viele bewegungspunkte "kosten"...und genau da liegt mein problem...man BRAUCHT pathfinding!
Hi. Man braucht kein Pathfinding um zu berechnen wohin die Figur gehen kann Meine Pseudocode Beispiel sollte auch nur als Ansatz einer Lösung dienen. Von Wegekosten war im übrigen bisher auch noch nicht die rede soweit ich das mitbekommen habe. (Ausser geblock em und nicht geblocktem Feld) Berechne doch den Weg Sternförmig von der Aktuellen Positon in alle Himmmelsrichtungen. Ziehe von deimem Aktionsradius die Wegkosten des zu prüfenden Feldes ab dann weist du ob du noch gehen kannst oder nicht. Ist doch nicht soooo schwer. |
||
Er soll an den Spielen teilnehmen bis er spielend stirbt. MCP - TRON |
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
@artemis: so ungefähr mache ich es ja schon...ergebnis: 2.5 sekunden/durchlauf gehen allein schon dabei flöten
edit: erledigt...mit bisschen herumspielen des A*-Pathfinding-Algorithmusses hab ich es nun geschafft |
||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
ke^kx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie denn genau? Würd mich auch mal interessieren ![]() Jiriki |
||
http://i3u8.blogspot.com
Asus Striker II Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-) Geforce 9800 GTX 2GB RAM |
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich hab die pathfinding0-funktion von blitzbase.de bisschen umgestellt:
Code: [AUSKLAPPEN] Function AllWaysInRadius(startx,starty,unit.figur)
radius=unit\actap Delete Each node Delete Each open Delete Each path Dim nodemap(mapwidth,mapheight) node.node=New node node\x=startx node\y=starty open.open=New open open\node=node nodemap(startx,starty)=1 .again0 node=Null cost=2147483647 For open=Each open If open\node\cost<cost Then cost=open\node\cost node=open\node tempopen.open=open EndIf Next If node=Null Then Goto again1 Delete tempopen For i=0 To directions j=0 If node\x Mod 2=1 Then j=1 x=node\x+dirx(i,j) y=node\y+diry(i,j) If x=>0 And y=>0 And x<=mapwidth And y<=mapheight Then If map(x,y)<>1000 And nodemap(x,y)=0 Then If dmap(x,y)<>Null Then kosten=Wegkosten(unit,dmap(x,y)) End If tempnode.node=New node tempnode\parent=node tempnode\cost=node\cost+kosten tempnode\x=x tempnode\y=y open.open=New open open\node=tempnode nodemap(x,y)=1 EndIf EndIf Next If finish=0 Then Goto again0 .again1 While tempnode\parent<>Null path.path=New path path\node=tempnode tempnode=tempnode\parent Wend path.path=New path path\node=tempnode For y=1 To mapheight For rx=0 To 1 For node.node=Each node If node\y=y And node\x Mod 2<>rx Then xpos=MapPointToCOord(node\x,node\y,1) ypos=MapPointToCOord(node\x,node\y,2) If node\cost > radius Then If dmap(node\x,node\y)<>Null Then If dmap(node\x,node\y)\dpic<>0 Then DrawImage dmap(node\x,node\y)\dpic,xpos+plus,ypos Else DrawImage markierung,xpos+plus,ypos End If End If End If End If Next Next Next End Function |
||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
ke^kx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ach so, thx ![]() Jiriki |
||
http://i3u8.blogspot.com
Asus Striker II Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-) Geforce 9800 GTX 2GB RAM |
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
oh...mir fällt grad auf, dass der titel dieses threads überhaupt nicht passt ![]() |
||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group