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

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Kryan

Betreff: wie zeige ich am besten den SICHTRADIUS ein?? [erledigt]

BeitragDo, März 16, 2006 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

wie kann ich es programmiertechnisch am günstigsten lösen, dass der bewegungsradius...user posted image
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

BeitragDo, März 16, 2006 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Nutze den altbekannten Fog of War Wink

user posted image
Coding: silizium-net.de | Portfolio: Triton.ch.vu
 

ke^kx

BeitragDo, März 16, 2006 22:54
Antworten mit Zitat
Benutzer-Profile anzeigen
@Triton:
Kryan hat Folgendes geschrieben:
wie kann ich es programmiertechnisch am besten lösen
Wink

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 Wink

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

BeitragFr, März 17, 2006 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, März 17, 2006 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

ke^kx

BeitragFr, März 17, 2006 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Also von der framerate her ist BIG BUGs Lösung relativ sicher die schnellste. Aber lass uns warten, was Kryan am besten passt Wink

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

BeitragFr, März 17, 2006 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Confused
hier noch n beispiel, welches das problem erläutern soll:
user posted image

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

BeitragFr, März 17, 2006 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, März 18, 2006 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, März 18, 2006 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, März 18, 2006 21:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, März 18, 2006 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragSa, März 18, 2006 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie denn genau? Würd mich auch mal interessieren Wink

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

BeitragSo, März 19, 2006 10:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 19, 2006 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach so, thx Smile

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

BeitragSo, März 19, 2006 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
oh...mir fällt grad auf, dass der titel dieses threads überhaupt nicht passt Very Happy
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group