Bits haben falsche position
Übersicht

MatthiasBetreff: Bits haben falsche position |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hay
Habe mir mal den Pfadfinding vorgeknöpft und mir stört das in nodemap (DimFeld) nur 0 und 1 gespeiechert werden also nur 1Bit aber verbrauchen tue ich drozdem 32Bits das wolte ich nun eigentlich ändern aber irgendwie funktioniert das nicht. Vieleicht kann mir jemand helfen. mit Leertaste Weg Finden l=Map Laden s=Map Speichern Code: [AUSKLAPPEN] Graphics 800,600,16,2 SetBuffer BackBuffer() ClsColor 255,255,255 Global startx =07 Global starty =14 Global endx =22 Global endy =14 Global PfadAnz Global Ras=20 Global mapwidth=Int(800/Ras):Global mapheight=Int(600/Ras) Dim map(mapwidth,mapheight) Dim nodemap(mapwidth,mapheight) Dim dirx(7) Dim diry(7) Dim dirz(7) For i=0 To 7 Read dirx(i) Read diry(i) Read dirz(i) Next ClsColor 255,255,255:Cls MAPAUFB() ERSTMAP() Function MAPAUFB() R=Ras*.5 For ZX=0 To mapwidth-1:For ZY=0 To mapHeight-1 Color 230,230,230 Select Map(ZX,ZY):Case 0:Default:Color 0,0,0:End Select Rect ZX*Ras,ZY*Ras,Ras-1,Ras-1 Next:Next Select PfadAnz:Case 1 Color 255,0,0 For path.path=Each path Rect path\node\x*Ras,path\node\y*Ras,Ras-1,Ras-1,1 NX=path\node\x:NY=path\node\y nodes3=nodes3+1 Next End Select Color 0,255,0 Rect startx*Ras,starty*Ras,Ras-1,Ras-1,1 Color 100,200,255 Rect endx*Ras,endy*Ras,Ras-1,Ras-1,1 End Function Function ERSTMAP() Repeat:Tas$=Chr(GetKey()) MX=Int(MouseX()/Ras):MY=Int(MouseY()/Ras) Select MouseDown(1):Case 1:Color 0,0,0:Rect MX*Ras,MY*Ras,Ras-1,Ras-1:Map(MX,MY)=1:End Select Select MouseDown(2):Case 1:Color 230,230,230:Rect MX*Ras,MY*Ras,Ras-1,Ras-1:Map(MX,MY)=0:End Select Select Tas$:Case "s":SAVEMAP():End Select Select Tas$:Case "l":LOADMAP():MAPAUFB(): Case "1":StartX=MX:StartY=MY:MAPAUFB() Case "2":EndX=MX:EndY=MY:MAPAUFB() Case " ":Zeit=MilliSecs():pathfinding1(startx,starty,endx,endy) :PfadAnz=1-PfadAnz:MAPAUFB() End Select AppTitle nodemap(MX,MY) Flip Until KeyDown(1)=1 End End Function Function SAVEMAP() File=WriteFile("Map.Dat") For ZX=0 To mapwidth-1:For ZY=0 To mapHeight-1 WriteByte(File,Map(ZX,ZY)) Next:Next CloseFile File File=WriteFile("StartEnde.ini") WriteLine(File,StartX) WriteLine(File,StartY):WriteLine(File,EndX):WriteLine(File,EndY) CloseFile File End Function Function LOADMAP() File=ReadFile("Map.Dat") For ZX=0 To mapwidth-1:For ZY=0 To mapHeight-1 Map(ZX,ZY)=ReadByte(File) Next:Next CloseFile File File=ReadFile("StartEnde.ini") StartX=ReadLine(File):StartY=ReadLine(File):EndX=ReadLine(File):EndY=ReadLine(File) CloseFile File End Function Type node Field parent.node Field cost Field x Field y End Type Type open Field node.node End Type Type path Field node.node End Type ;--------------------------------------------------------------------- Function pathfinding1(startx,starty,endx,endy) Delete Each node Delete Each open Delete Each path Dim nodemap(mapwidth,mapheight) If startx=endx And starty=endy Then Return node.node=New node node\x=startx node\y=starty open.open=New open open\node=node ;"------------------Problemzone----------------" Po=Startx/32:Ws=Startx Mod 32 nodemap(Po,starty)=2^Ws ;"-------------------------------------------------" .again1 node=Null cost=2147483647 For open=Each open delta=Abs(open\node\x-endx)+Abs(open\node\y-endy) If open\node\cost+delta<cost Then cost=open\node\cost+delta node=open\node tempopen.open=open EndIf Next If node=Null Then Return Delete tempopen If KeyDown(200)=1 Then Return For i=0 To 7 x=node\x+dirx(i) y=node\y+diry(i) If x=>0 And y=>0 And x<=mapwidth And y<=mapheight Then ;"------------Problemzone-------------------------------" Po=Int(X/32):Ws=X Mod 32 If map(x,y)=0 And ((nodemap(Po,y) And 2^Ws)<>0) Then ;"-----------------------------------------------------------" If dirz(i)=1 Then If map(x,node\y)=1 And map(node\x,y)=1 Then Goto jump1 EndIf tempnode.node=New node tempnode\parent=node tempnode\cost=node\cost+1 tempnode\x=x tempnode\y=y open.open=New open open\node=tempnode ;"-------------------------Problemzone------------- Po=X/32:Ws=X Mod 32 nodemap(po,y)=nodemap(po,y)+2^Ws ;"------------------------------------------------------- If x=endx And y=endy Then finish=1:Exit .jump1 EndIf EndIf Next If finish=0 Then Goto again1 While tempnode\parent<>Null path.path=New path path\node=tempnode tempnode=tempnode\parent Wend path.path=New path path\node=tempnode End Function |
||
![]() |
FOODy |
![]() Antworten mit Zitat ![]() |
---|---|---|
Meiner Meinung nach ist das alles andere als Sinnig.
Aber naja: https://www.blitzforum.de/foru...hp?t=19901 Gruß, FOODy |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Was Ist dan daran unsinnig??? Wenn ich ein DimFeld habe mit 1024x1024auf 32Bit (an 4096x4096 nicht zu denken)
dann sind das ca 4200KB=4,2MB Rammspeicher aber ich will nicht zahlen bis 32Bit Speichern sondernt nur 1Bit das sind dann 131KB also 4MB weniger. Warum gleich mit Kannonen auf Spatzen schießen??? |
||
![]() |
FOODy |
![]() Antworten mit Zitat ![]() |
---|---|---|
Weil das Zeitintensiv ist jeden Bit einzeln anzusprechen.
Kann man in B3B den keine Byte-Dims erstellen? ![]() Ansonsten machst du "einfach" eine Bank die du mit Bytes fütterst statt ein IntegerDimFeld. Gruß, FOODy |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja schon da habe ich dan 24Bits schonmal gespart und aber es sind immernoch 7Bits unnütze auserdem dauert das Speichern in einer Bank genauso lange als würde ich gleich das auf 1Bit kürzen. Auserdem mus der Pfad nicht bei jedenm Schleifendurchgang gefunden werden.
Nun Hilf mir dochmal Bitte. Du kannst das doch bestimmt. Und frage nicht nach sinn und zweck. Umsomehr Ramspeicher übrig ist um so mehr Palmen oder Fahrzeuge kann ich Benutzen. Auserdem brauche ich das auch noch für ein Radar map und auch für ein Kampfstärken Map. Da habe ich jetzt schon drei Felder. Glaub mir das ist schon sinvoll. |
||
![]() |
FOODy |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann tu die 3 Felder in ein einziges Feld ![]() Ein Byte hat 8 Bits. Die kannste dann ausnutzen. Falls du sowas nicht gemacht hast hier ein Beispiel: (nur mit Blitzmax getestet ![]() Code: [AUSKLAPPEN] ;Framework BRL.StandardIO
Const CONST_SCHALTER_1:Int = %00000001 Const CONST_SCHALTER_2:Int = %00000010 Const CONST_SCHALTER_3:Int = %00000100 Local feld1:Int = CONST_SCHALTER_1|CONST_SCHALTER_3 Local feld2:Int = CONST_SCHALTER_1|CONST_SCHALTER_2 Local feld3:Int = CONST_SCHALTER_2|CONST_SCHALTER_3 Print "feld1(schalter 1): "+(feld1&CONST_SCHALTER_1<>0) Print "feld1(schalter 2): "+(feld1&CONST_SCHALTER_2<>0) Print "feld1(schalter 3): "+(feld1&CONST_SCHALTER_3<>0) Print "feld2(schalter 1): "+(feld2&CONST_SCHALTER_1<>0) Print "feld2(schalter 2): "+(feld2&CONST_SCHALTER_2<>0) Print "feld2(schalter 3): "+(feld2&CONST_SCHALTER_3<>0) Print "feld3(schalter 1): "+(feld3&CONST_SCHALTER_1<>0) Print "feld3(schalter 2): "+(feld3&CONST_SCHALTER_2<>0) Print "feld3(schalter 3): "+(feld3&CONST_SCHALTER_3<>0) Sowas schonma probiert? Gruß, FOODy |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein habe ich noch nicht aber das hilft mir auch nicht wirklich weiter es ist zu Algemein gehalten. Ich weis jetzt nicht wie ich das Beispiel in meinen Code Einsetzen Kann.
Naja vieleicht ist es einfach zu schwierig auch für dich. Aber drozdem nochmal Danke. |
||
![]() |
FOODy |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich glaub du hast mich nicht richtig verstanden ![]() Hier ist noch ein Beispiel: Code: [AUSKLAPPEN] ;Framework BRL.StandardIO
;Import BRL.Retro Const NODE_1:Int = %00000001 Const NODE_2:Int = %00000010 Const NODE_3:Int = %00000100 Const NODE_4:Int = %00001000 Const NODE_5:Int = %00010000 Const NODE_6:Int = %00100000 Const NODE_7:Int = %01000000 Const NODE_8:Int = %10000000 Local node:Byte = NODE_1|NODE_5 Print Right(Bin(node),8) Print "Feld 1 ist auf: "+NodeActive(node,NODE_1) Print "Feld 2 ist auf: "+NodeActive(node,NODE_2) Print "Feld 5 ist auf: "+NodeActive(node,NODE_5) Function NodeActive(node:Byte,id:Int) Return (node&id<>0) EndFunction Hier kann man 8 Felder in einem Byte speichern. (mit dem Wert 0|1) Im Prinzip ist es das gleiche wie vorhin, aber vllt sagt dir dieses mehr aus? Es ist die einzigste Lösung die mir so einfällt. Weniger als ein Byte kann man nicht an Speicher reservieren. So oder so, mindestens ein Byte wird gebraucht. Gruß, FOODy |
||
BlitzMax + MaxGUI, 64-bit Arch Linux: Intel Core² E8500 | 8 GB Ram | GeForce GTX 460 · 1024 MB |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group