Koordinatenkreuz - 0-Reihen Doppelt

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

McThyzer

Betreff: Koordinatenkreuz - 0-Reihen Doppelt

BeitragFr, Apr 08, 2011 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Ich habe (bzw. versuche) ein Programm geschrieben (zu schreiben), welches eine 101x101 Welt mit 64px * 64px Tiles darstellt.

(101, da nach oben 50, nach unten 50 und in der Mitte eine Reihe mit "0")

Wenn ich oben aus der Welt gehe, soll ich unten wieder kommen, das klappt alles.

Jedoch sind alle Reihen, dessen X oder Y Koordinaten 0 sind Doppelt, der (0|0) Punkt ist sogar 4x vorzufinden.

Bilder:

Die Zahlen sind die Koordinaten (links -> X Koordinate; rechts -> Y Koordinate)
Wenn man genau hinsieht, sieht man einen weißen Punkt, der befindet sich im richtigen (0|0) Feld und ist quasi Zentrum der Welt.
Der rote Punkt zeigt nur die Bildschirmmitte an.

Bild A
user posted image

Bild B
user posted image

Hier die relevante Script-Stelle:
Das Programm hat die Auflösung 1280x960.
TileSize - Da ich mich vorher noch nicht auf eine Tile Größe festlegen wollte, hab ich sie als Konstante eingerichtet, die steht immer auf 64.
CenterX/Y - Die X/Y-Koordinaten des Zentrums der Welt :O
FeldX/Y_px - Die Pixel-Koordinaten (also Pixel von oben Links) vom markiertem Feld.
FeldX/Y_koord - Die Feld-Koordinaten (also Distanz, in Feldern, von Zentrum) vom markiertem Feld.

Der Fehler muss bei der berechnung von "FeldX/Y_koord" passieren. Der Fehler findet auch statt, wenn ich diesen "Weltkugel Effekt" [+ 150) Mod 100 - 50] rausnehme.

Der Exakte Fehler ist, dass bei den Formeln
Code: [AUSKLAPPEN]
((MouseX() - TileSize/2 - CenterX)/TileSize)

Code: [AUSKLAPPEN]
((MouseY() - TileSize/2 - CenterY)/TileSize)

bei den beiden 0-Reihen das selbe rauskommt. Ich weiß aber nicht, wie ich das umgehe.

Code: [AUSKLAPPEN]
   Local FeldX_px = ((MouseX() - TileSize/2 - 1 - CenterX Mod TileSize)/TileSize) * TileSize + CenterX Mod TileSize + TileSize/2
   Local FeldY_px = ((MouseY() - TileSize/2 - 1 - CenterY Mod TileSize)/TileSize) * TileSize + CenterY Mod TileSize + TileSize/2
   Local FeldX_koord = (((MouseX() - TileSize/2 - CenterX)/TileSize) + 150) Mod 100 - 50
   Local FeldY_koord = (((MouseY() - TileSize/2 - CenterY)/TileSize) + 150) Mod 100 - 50
   
   SetColor(255, 0, 0)   
   DrawLine(FeldX_px, FeldY_px, FeldX_px+TileSize, FeldY_px)
   DrawLine(FeldX_px, FeldY_px, FeldX_px, FeldY_px+TileSize)
   DrawLine(FeldX_px+TileSize, FeldY_px+TileSize, FeldX_px, FeldY_px+TileSize)
   DrawLine(FeldX_px+TileSize, FeldY_px+TileSize, FeldX_px+TileSize, FeldY_px)
   SetColor(255, 255, 255)
   
   'Debug
   DrawText(FeldX_koord + " " + FeldY_koord, FeldX_px, FeldY_px)


Ich weiß, dass es extrem unübersichtlich ist, sorry. Ich finde in meinem Durcheinander zurecht und eigentlich schaut bei mir auch kein anderer rein.

Ich hoffe ihr könnt mir trotzdem Helfen und mir sagen wie ich die 0-Reihen repariere.

Edit:
Wenn ich wüsste, wie man hier was Anhängt, würde ich die .exe ja mit hochladen.

Midimaster

BeitragMo, Apr 11, 2011 8:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Die EXE-Datei und andere Anhänge (z.b. Bilder, Dateien, ...) kannst Du ins das Archiv packen. Hier hat jeder User einen Webspace von 10MB. Im Forumsbeitrag setzt Du dann einen Link zu dieser Datei.

In deinem Bild sieht man nicht sehr gut, was Du mit "doppelt" meinst...Für mich sehen sogar alle Reihen gleich aus Wink

Vielleicht wäre es besser, wenn Du mal schon ein anderes Tile auf die 0-Reihe zeichnen lässt, damit man den Effekt auch sieht?

Wenn hier wirklich Tile-Reihen doppelt sind, so kann es ja nix mit der Maus, sondern eher was mit der Zeichenroutine zu tun haben.

Ich denke, du meinst eher dass die Feldkoordinaten, die aus der Maus ausgerechnet werden sowohl im Feld (-1/0) als auch im Feld (0/0) beide Male ein scheinbares (0/0) ausrechnen. Dies entsteht wegen der Umwandung von negativem Fliesskommazahlen in INTEGER:

Du siehst es mit diesem Test-Code:
BlitzMax: [AUSKLAPPEN]
For i#=2 To -2 Step -0.3
j%=i
Print i + " wird zu " +j
Next


und dies wird angezeigt:
Zitat:
2.00000000 wird zu 2
1.70000005 wird zu 1
1.40000010 wird zu 1
1.10000014 wird zu 1
0.800000131 wird zu 0
0.500000119 wird zu 0
0.200000107 wird zu 0
-0.0999999046 wird zu 0
-0.399999917 wird zu 0
-0.699999928 wird zu 0
-0.999999940 wird zu 0
-1.29999995 wird zu -1
-1.59999990 wird zu -1
-1.89999986 wird zu -1


Bei deinem Beispiel, gibt es eine einfach zu verstehende Lösung:

Du zähltst vor dem Teilen einfach 1000*TileSize dazu und nach dem Teilen subtrahierst Du eine 1000.

Hier habe ich ein lauffähiges Beispiel:
BlitzMax: [AUSKLAPPEN]
Graphics 800,600
TileSize=64
TileZahl=100
CenterX=400-TileSize/2
CenterY=300-TileSize/2


Repeat

SetColor 255,255,0
DrawRect 0,0,800,600

For i=-7 To 6
For j=-5 To 5
X=i*TileSize+CenterX
Y=j*TileSize+CenterY

SetColor 1,1,1
DrawRect X, Y, TileSize-1 , TileSize-1
SetColor 111,111,111
DrawText i+"/"+j , X, Y
Next
Next

FeldX_koord = Int(( 1000*TileSize + MouseX()-CenterX ) / TileSize)-1000
FeldY_koord = Int(( 1000*TileSize + MouseY()-CenterY ) / TileSize)-1000


X=FeldX_koord * TileSize + CenterX
Y=FeldY_koord * TileSize + CenterY
SetColor 11,111,11
DrawRect X, Y, TileSize-1 , TileSize-1

SetColor(255, 255, 255)
DrawOval MouseX(),MouseY(),3,3
DrawText FeldX_koord + " " + FeldY_koord, MouseX()+15,MouseY()+15
Flip
Delay 50
Until KeyHit(Key_Escape)



Nachtrag:


Wenn Du das ganze später wieder scrollen willst, fallen ganz viele Parameter weg, die Du in deinem Code noch zu benötigen glaubst. z.B. ist es unnötig auf die TileSize/2 einzugehen. Ebenso ist das Zentrieren des Bildschirms, wie du es mit -50 bis +50 versuchtst unnötig.

Hier mal ein Beispiel bei dem es schon scrollt:

BlitzMax: [AUSKLAPPEN]
Graphics 800,600

TileSize%=64 ' größe der tiles
TileZahl%=15 ' wieviele Tiles

Global SpielFeldGross% = TileSize*TileZahl
Global RealX% , RealY%


RealX=RealX-400 ' Startkoordinate
RealY=RealY-300
MoveMouse 400,300


Repeat

SetColor 255,255,0
DrawRect 0,0,800,600


' scrollen wegen maus:
If MouseX() > 430
RealX = RealX+1
ElseIf MouseX() < 370
RealX = RealX-1
EndIf
If MouseY() > 330
RealY = RealY+1
ElseIf MouseY() < 270
RealY = RealY-1
EndIf
' über den Spielfeldrand wieder auf Gegenseite setzen:
RealX=( RealX + SpielFeldGross ) Mod SpielFeldGross
RealY=( RealY + SpielFeldGross ) Mod SpielFeldGross

' feinscrolling:
CenterX=-(RealX Mod TileSize)
CenterY=-(RealY Mod TileSize)


' welches Tile steht links oben bei 0/0
Start_I = RealX /TileSize
Start_J = RealY /TileSize


' von da den Bildschirm füllen lassen:
For i=0 To 13
For j=0 To 10
X=i * TileSize + CenterX
Y=j * TileSize + CenterY
SetColor 1,1,1
DrawRect X, Y, TileSize-1 , TileSize-1
SetColor 111,111,111

' dies sind die echten Feld-Koordinaten in der zukünftigen Spiel-Map:
BildTile_I= (Start_I + i ) Mod TileZahl
BildTile_J= (Start_J + j ) Mod TileZahl

DrawText BildTile_I + "/" + BildTile_J, X, Y
Next
Next


'Berechnung der Map-Kordinate aus der Maus
Feld_I = Int(( RealX + MouseX() ) / TileSize) Mod TileZahl
Feld_J = Int(( RealY + MouseY() ) / TileSize) Mod TileZahl


'Berechung der Bildschirm_Koordinate des Map-Tile unter der Maus:
X=((Feld_I -Start_I) * TileSize + CenterX + SpielFeldGross ) Mod SpielFeldGross
Y=((Feld_J -Start_J) * TileSize + CenterY + SpielFeldGross ) Mod SpielFeldGross

SetColor 11,111,11
DrawRect X, Y, TileSize-1 , TileSize-1

SetColor(255, 255, 255)
DrawOval MouseX(),MouseY(),3,3
DrawText Feld_I + " " + Feld_J, MouseX()+15,MouseY()+15
DrawText X + " " + Y, MouseX()+15,MouseY()+30
Flip 0
Delay 2
Until KeyHit(Key_Escape)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group