Hilfestellungen zu meinem projekt

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

kog

Betreff: Hilfestellungen zu meinem projekt

BeitragDi, Jun 05, 2012 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag zusammen,

user posted image

Ich weiss nicht ob jemand schonmal ein ähnliches Problem hatte, wie man erkennt, sind die roten Dots an der Spiegelverkehrten stelle :/

Hat jemand gerade eine Idee so auf den Ersten blick was es sein könnte, oder soll ich Code posten?
Suche schon seit Stunden, weil das komische ist, bei manchen Aktionen (Häuser setzen oder hügel anheben stimmen die Koordinaten ...
  • Zuletzt bearbeitet von kog am Mi, Jun 06, 2012 11:20, insgesamt 2-mal bearbeitet

BladeRunner

Moderator

BeitragDi, Jun 05, 2012 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Es liegt an der Position des Jupiter in Relation zu den Maisfeldern von Bauer Knolle.
...
NATÜRLICH brauchen wir Code, Mann!
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

kog

BeitragDi, Jun 05, 2012 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich dachte es wäre ein Grundlegendes Problem und jemand hätte gerade die Zauberlösung Wink

BlitzMax: [AUSKLAPPEN]
Type Terrain
Const STD_HEIGHT_DIFFERENCE:Byte=10

Const MAX_HEIGHT_DIFFERENCE:Short=1*STD_HEIGHT_DIFFERENCE


Function GetColrow:Float[](x:Float,y:Float)
Local col:Float=((x / Float(TMapData.isotilewidth)) + (y / Float(TMapData.isotileheight)))
Local row:Float=((y / Float(TMapData.isotileheight)) - (x / Float(TMapData.isotilewidth)))
Return [col,row]
End Function


End Type

*Engine
Function Build()
If Not curbuild Return
Local x:Int=tapp.mpos[0]
Local y:Int=tapp.mpos[1]
If Not tapp.map.isfree[x,y] Return
If Not tapp.map.tile[x,y]=0 Return
tapp.map.obj[x,y]=curbuild

tapp.map.isfree[x,y]=False

End Function

*TMapData
Method GetPosition:Int[](isox:Int,isoy:Int)
Local colrow:Float[]=Terrain.GetColRow(isox,isoy)

Local col:Int=colrow[0]
Local row:Int=colrow[1]
Local distance:Int=getdistance(col,row,isox,isoy)
Local data:Int[]=Getmindistance(distance,col,row,isox,isoy)

Local minDistance:Int=data[0]
Local minNodeCol:Int=data[1]
Local minNodeRow:Int=data[2]

Local distance1:Int = getDistance(minNodeCol - 1, minNodeRow - 1, isoX, isoY)
Local distance2:Int = getDistance(minNodeCol , minNodeRow - 1, isoX, isoY)
Local distance3:Int = getDistance(minNodeCol + 1, minNodeRow - 1, isoX, isoY)
Local distance4:Int = getDistance(minNodeCol - 1, minNodeRow , isoX, isoY)
Local distance5:Int = getDistance(minNodeCol + 1, minNodeRow , isoX, isoY)
Local distance6:Int = getDistance(minNodeCol - 1, minNodeRow + 1, isoX, isoY)
Local distance7:Int = getDistance(minNodeCol , minNodeRow + 1, isoX, isoY)
Local distance8:Int = getDistance(minNodeCol + 1, minNodeRow + 1, isoX, isoY)

Local distanceA:Int = distance1 + distance2 + distance4
Local distanceB:Int = distance2 + distance3 + distance5
Local distanceC:Int = distance4 + distance6 + distance7
Local distanceD:Int = distance5 + distance7 + distance8

If Not Self.indata(minnodecol,minnoderow)
Return [-1,-1]
EndIf

If distanceA < distanceb
If distancea<distancec
If distancea < distanced
Return [minnodecol-1,minnoderow-1]
Else
Return [minnodecol,minnoderow]
EndIf
Else
If distancec<distanced
Return [minnodecol-1,minnoderow]
Else
Return [minnodecol,minnoderow]
EndIf
EndIf
Else
If distanceb<distancec
If distanceb < distanced
Return [minnodecol,minnoderow-1]
Else
Return [minnodecol,minnoderow]
EndIf
Else
If distancec < distanced
Return [minnodecol-1,minnoderow]
Else
Return [minnodecol,minnoderow]
EndIf
EndIf
EndIf
Return [0,0]
End Method

Method GetDistance:Int(col:Int,row:Int,isox:Int,isoy:Int)
Local xy:Int[]=GetIsoXY_F(col,row)
Local x:Int=xy[0]
Local y:Int=xy[1] - Self.GetNodeHeight(col,row) / Terrain.STD_HEIGHT_DIFFERENCE * 4

Return (isox - x) *(isox -x) + (isoy-y) * (isoy-y) *4
End Method

Method GetMinDistance:Int[](minDistance:Int,col:Int,row:Int,isox:Int,isoy:Int)
Local data:Int[]
Local distance:Int=0

distance=GetDistance(col-1,row-1,isox,isoy)
If distance < mindistance
data=GetMinDistance(distance,col-1,row-1,isox,isoy)
mindistance=data[0]
EndIf
distance=GetDistance(col+1,row-1,isox,isoy)
If distance < mindistance
data=GetMinDistance(distance,col+1,row-1,isox,isoy)
mindistance=data[0]
EndIf
distance=GetDistance(col+1,row+1,isox,isoy)
If distance < mindistance
data=GetMinDistance(distance,col+1,row+1,isox,isoy)
mindistance=data[0]
EndIf
distance=GetDistance(col-1,row+1,isox,isoy)
If distance < mindistance
data=GetMinDistance(distance,col-1,row+1,isox,isoy)
mindistance=data[0]
EndIf

distance=GetDistance(col-1,row,isox,isoy)
If distance < mindistance
data=GetMinDistance(distance,col-1,row,isox,isoy)
mindistance=data[0]
EndIf
distance=GetDistance(col,row-1,isox,isoy)
If distance < mindistance
data=GetMinDistance(distance,col,row-1,isox,isoy)
mindistance=data[0]
EndIf
distance=GetDistance(col+1,row,isox,isoy)
If distance < mindistance
data=GetMinDistance(distance,col+1,row,isox,isoy)
mindistance=data[0]
EndIf
distance=GetDistance(col,row+1,isox,isoy)
If distance < mindistance
data=GetMinDistance(distance,col,row+1,isox,isoy)
mindistance=data[0]
EndIf

If data.length<=0
data=New Int[3]
data[0]=mindistance
data[1]=col
data[2]=row
EndIf
Return data
End Method

Method GetData:Int(x:Int,y:Int)
If Not Self.indata(x,y) Return 0
Return Self.data[x,y]
End Method

Method GetIsoXY_I:Int[](col:Int,row:Int)
Return GetIsoXY_F(Float(col)+.5,Float(row)+.5)
End Method

Method GetNodeHeight:Int(col:Int,row:Int)
If Not Self.indata(col,row)
Return 0
Else
Return Self.data[col,row]
End If
End Method

Method GetIsoXY_F:Int[](col:Float,row:Float)
Local isohalfwidth:Int=isotilewidth/2
Local isohalfheight:Int=isotileheight/2
Local isox0:Int=(col-row)*isohalfwidth
Local isoy0:Int=(col+row)*isohalfheight

Return [isox0,isoy0]
End Method



Drawing:
BlitzMax: [AUSKLAPPEN]

Method Draw()
Local isox0:Int=TEngine.scrollx - isotilewidth/2
Local isoy0:Int=TEngine.scrolly - isotileheight
Local colrow:Float[]=Terrain.getcolrow(isox0,isoy0)

Local col0:Int=colrow[0]
Local row0:Int=colrow[1]
Local xy:Int[]=getisoxy_f(col0,row0)

Local xOffset:Int = xy[0] - isoX0 - isoTileWidth;
Local yOffset:Int = xy[1] - isoY0 - isoTileHeight;
Local yCount:Int=0
For Local y:Int=yoffset Until WinRes[1]+16 Step isotileheight/2
Local adjustedxoffset:Int=xoffset
If (ycount Mod 2) = 1
adjustedxoffset:-isotilewidth/2
EndIf
Local xcount:Int=0
Local halfycount:Int=ycount/2
Local halfycountp1:Int=(ycount+1)/2
For Local x:Int=adjustedxoffset Until WinRes[0]+32 Step isotilewidth
Local col:Int=col0+xcount+halfycount
Local row:Int=row0-xcount+halfycountp1
Self.DrawTile(x,y,col,row)
xcount:+1
Next
ycount:+1
Next

ycount=0

For Local y:Int=yoffset Until WinRes[1] Step isotileheight/2
Local adjustedxoffset:Int=xoffset
If (ycount Mod 2) = 1
adjustedxoffset:-isotilewidth/2
EndIf
Local xcount:Int=0
Local halfycount:Int=ycount/2
Local halfycountp1:Int=(ycount+1)/2
For Local x:Int=adjustedxoffset Until WinRes[0] Step isotilewidth
Local col:Int=col0+xcount+halfycount
Local row:Int=row0-xcount+halfycountp1
xcount:+1
Self.DrawObjects(x,y,col,row)

Next
ycount:+1
Next
End Method

Method DrawObjects(x:Int,y:Int,col:Int,row:Int)
If Not Self.indata(row,col) Return
Rem
Local node0:Int = Self.Getdata(row,col) / Terrain.STD_HEIGHT_DIFFERENCE
Local node1:Int = Self.getdata(row,col + 1) / Terrain.STD_HEIGHT_DIFFERENCE
Local node2:Int = Self.getdata(row + 1,col + 1) / Terrain.STD_HEIGHT_DIFFERENCE
Local node3:Int = Self.getdata(row + 1,col) / Terrain.STD_HEIGHT_DIFFERENCE
Local maxHeight:Int = node0
If node1 > maxheight maxheight=node1
If node2 > maxheight maxheight=node2
If node3 > maxheight maxheight=node3
Local baseelevation:Int=maxheight*4
End Rem

Local baseelevation:Int=Self.height[row,col]
If Self.obj[col,row]

DrawImage house1,x,(y-baseelevation)-(house1.height-16)
Return
EndIf

If Self.isfree[col,row]
If Self.tile[col,row]=0 Or Self.tile[col,row]=85
SetColor 0,255,0
Else
SetColor 255,0,0
EndIf
DrawImage dot,x+16,(y-baseelevation/2)+8
SetColor 255,255,255
EndIf
End Method

Method DrawTile(x:Int,y:Int,col:Int,row:Int)
If Not Self.indata(row,col) Return
Local id:Int=Self.tile[row,col]
Local baseelevation:Int=Self.height[row,col]
Select Self.ground[col,row]
Case 1 DrawImage greentiles[id],x,y-baseelevation
Case 2
SetColor 100,100,100
DrawImage greentiles[id],x,y-baseelevation
SetColor 255,255,255

Default DrawImage whitetiles[id],x,y-baseelevation
End Select




If TEngine.scol=col And TEngine.srow=row
SetColor 255,0,0
DrawImage greentiles[id],x,y-baseelevation
SetColor 255,255,255
EndIf
End Method


mpos ist die Variable mit den Maus Koordinaten auf der Iso Map, ermittelt mit GetPosition(mx+scrollx,my+scrolly)

wie gesagt, ich weiss nichtmal wieso es bei manchen Sachen stimmt und bei manchen nicht.


Der Code wurde von Java in Bmax umgeschrieben von mir.

Chrise

BeitragMi, Jun 06, 2012 2:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Also jetzt ohne den Code genauer anzusehen sähe das für mich nach einem klassischen Fall von "X mit Y vertauscht" aus. Ich würde mal alle deine Schleifen genau anschauen, ob die Verschachtelung von x und y Schleifen auch immer gleich konstruiert ist.

Sry Bladerunner, ich denke du weißt warum ich mich genau an dieser Stelle entschuldige Wink

Chrise
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

kog

BeitragMi, Jun 06, 2012 6:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe gerade nochmal den Code durchgesucht, jedoch auf kein Ergebniss gekommen.
Keine X oder Y Variable die vertauscht ist, bzw. wo ich es nicht sehe ....


Kurz vor der verzweiflung ....

*Edit*
Endlich die entscheidende Stelle:

Original
Code: [AUSKLAPPEN]
  public void lift(int nodeCol, int nodeRow) {
    if ((nodeCol < 0) || (nodeRow < 0)
       || (nodeCol >= nodeElevations[0].length)
       || (nodeRow >= nodeElevations.length)) {
      // out of range...
    }
    else {
      short height = (short)(nodeElevations[nodeRow][nodeCol] + STD_HEIGHT_DIFFERENCE);
      if ((isMaxDifference(nodeCol - 1, nodeRow - 1, height))
          && (isMaxDifference(nodeCol, nodeRow - 1, height))
          && (isMaxDifference(nodeCol + 1, nodeRow - 1, height))
          && (isMaxDifference(nodeCol + 1, nodeRow, height))
          && (isMaxDifference(nodeCol + 1, nodeRow + 1, height))
          && (isMaxDifference(nodeCol, nodeRow + 1, height))
          && (isMaxDifference(nodeCol - 1, nodeRow + 1, height))
          && (isMaxDifference(nodeCol - 1, nodeRow, height))) {
        // increase height
        nodeElevations[nodeRow][nodeCol] += STD_HEIGHT_DIFFERENCE;
      }
    }
  }


und ich hatte
Code: [AUSKLAPPEN]
nodeElevations[nodeCol][nodeRow] += STD_HEIGHT_DIFFERENCE

weil das beim Programmieren logisch war und überall auch, jedcoh begreiffe ich nicht warum es da vertauscht wird ... jedenfalls ist es nun richtig...

user posted image

BladeRunner

Moderator

BeitragMi, Jun 06, 2012 9:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Sry Bladerunner, ich denke du weißt warum ich mich genau an dieser Stelle entschuldige

NP, es mag ja immer wieder den Fall geben dass man auch ohne tieferen Einblick erkennt woran es liegt - ich hätte ein Vertauschen von Achsen eigentlich ausgeschlossen da ich da eine Rotation erwartet hätte, keine Spiegelung.
Zudem ist es im allgemeinen einfach günstiger möglichst umfassend die Problematik zu erläutern, denn darauf zu hoffen dass es jemand sieht und dann denkt: 'Moment, das hatte ich doch auch mal' ist eher selten zielführend.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

kog

BeitragMi, Jun 06, 2012 9:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Oke, aufjedenfall funktioniert es so. Jedoch verstehe ich nicht wieso ich (bzw. der Programmierer) es da vertauscht?

Hat jemand für diesen Grund eine Idee?


Eine Andere Frage, hat jemand eine Idee, wie man sauber und schön Wasser darstellen könnte? ich dachte, das es vl. bis zur mitte des Tiles kommt bei der Schräge, jedoch krieg ich es beim Zeichen nicht hin, Würdet ihr einfach Tiles machen, welches Wasser und Land beinhaltet?

user posted image

SpionAtom

BeitragMi, Jun 06, 2012 10:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest auch zwei Arten von Tiles machen. Einmal Bodentiles, die wirklich nur für die flache Ebene sind. Darunter fällt auch das Wasser.
Und darauf könntest du die ganzen Hügeltiles legen. Hieße, du hast für jedes Feld zwei Bildinformationen.

Es ist leider nie weit fortgeschritten, aber ich hatte es mal so gemacht: https://www.blitzforum.de/foru...+adventure
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

kog

BeitragMi, Jun 06, 2012 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann müsste ich also jeweils einen Hügel mit z.b. Wasser und Grass machen oder?

SpionAtom

BeitragMi, Jun 06, 2012 10:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Eben nicht, das wollte ich dir ja ersparen.
Mache den Hügel mit tranzparenten Boden.

Zeichne also erst den Boden (Wasser oder Wiese oder wasauchimmer), dann den Hügel darüber.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

kog

BeitragMi, Jun 06, 2012 10:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Sooo aktuell einbisschen umgeändert und gebastelt, aber ich denke, es wird so schlussendlich am besten kommen.

user posted image


---------------


Welchen Algo. würdet ihr für Pathfinding empfehlen? Schaute schon den A*8 an , jedoch ob der für Iso Map optimalsten ist?

Nova

BeitragMi, Jun 06, 2012 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Drehung der Tiles ändert nichts am Wegfindungsalgorithmus. Wink
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Blitzcraft

BeitragMi, Jun 06, 2012 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Eien Isomap ist eigentlich nichts anderes als eine Tilemap mit Höhe, d.h. A* (meinst du doch oder?) lässt sich verwenden.

Du musst nur angeben welche Tiles nicht begehbar sind, zu welchen in der Isomap auch Klippen u.a. gehören.

Am Algorithmus musst du erst etwas ändern wenn du zB Brücken erstellen willst.
Screenshot aus meinem ersten Projekt

kog

BeitragDi, Jun 12, 2012 13:58
Antworten mit Zitat
Benutzer-Profile anzeigen
*Edit*

Erledigt, hatte den richtigen Ansatz, jedoch eine Variable vergessen Very Happy



Hallo zusammen, ich brauche einen logischen Denkansatz:

Ich habe es nun geschafft, das wenn dem männchen beim laufen etwas in den Weg kommt, es mit A* den nächsten freien punkt auf seiner Ziellinie findet...
Jedoch gibt mir aktuell den A* Algo eine neue TList.

user posted image

wie würdest ihr es am besten Lösen die neuen Punkte zur aktuellen Pfadliste hinzuzufügen?

mfg

kog

BeitragFr, Jun 15, 2012 11:07
Antworten mit Zitat
Benutzer-Profile anzeigen
user posted image

Guten tag Zusammen, ich melde mich mal mit einem Problem zurück..
Also ich habe "Zellen" welche die Map sozusagen unterteilt, jedoch muss ich ja um die Männchen zu bewegen die gesamte liste abrattern und Updaten. Jedoch wie man sehen kann wird das bei 2600 Objekten ziemlich zeitaufwendig ...
Ich frage mich wie BlueByte das damals auf einer 166mhz CPU zum laufen brachte mit weit über 1000 Siedler.

Habt ihr einen Ansatz, wie ihr das lösen würdet?
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

BladeRunner

Moderator

BeitragFr, Jun 15, 2012 11:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Die meisten der Siedler damals hatten fest zugewiesene Routen, die man als Spielr wenig bis nicht beeinflussen konnte. Wenn es doch mal mehr Einheiten wurden die man sendete kam der Rechner instant ins Schwitzen.
Ansonsten lass nur eine bestimmte Anzahl Wegfindungen pro zyklus zu und der Rest der Einheiten idled bis er mit berechnen dran war.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

kog

BeitragFr, Jun 15, 2012 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
mhh nunja es liegt nicht am Pathfinding ... sondern das ich pro Frame durch die komplette Welt rattere... alle Objekte checken ob Update


Mhhh hab den übeltäter gefunden, es liegt an der Kollisionsüberprüfung mit den Anderen Siedler... obwohl viele faktoren berücksichtigt wird und nur die eigene Zelle gecheckt wird, dauert das durchrattern lange :/
Muss wohl warten bis ich eine alternative gefunden habe ... (Event system?)

*edit*
eindeutig, Kollisionscheck, ohne ihn könnten locker 6000 Objekte da sein...
user posted image

*edit*
Das Programm zum testen: http://kognetwork.ch/Die%20Erbauer/Client.rar (Windows)

mit Rechtsklick setzt man ein Haus.
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group