spiele maps

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Bei meinem Code gibt es praktisch keinen Context, das ist alles, was zur Koordinatenfindung nötig ist. Ich fange in der Screenmitte (plus eine halbe tlebreite, da es ja sonst nicht wirklich die mitte wäre) an zu zeichnen.

Code: Alles auswählen

Editor\DrawStartX= (Editor\MapW / 2)*#floorWidth + #floorWidth/2 
Die Screenmitte bei der ich zu zeichnen beginne berechne ich so. Editor\MapW ist nur die anzahl der zu zeichnenden Tilereihen/spalten (ich hab quadratische Spielfelder), also zum beispiel steht in MapW = 8, wenn ich ein Spielfeld von 8*8 Feldern habe.

#floorWidth ist die breite eines Tiles.

Code: Alles auswählen

yMouse=((2*Screen\MouseY - (Screen\MouseX-Editor\DrawStartX))/2)
xMouse=((Screen\MouseX-Editor\DrawStartX) + yMouse)  
x- und yMouse sind temporäre Variablen die zur berechnung nötig sind.
Screen\MouseX und Y sind die Koordinaten des Mauszeigers auf dem Screen. Ich habe dafür nur eine Struktur gebaut, weil sich mein Screen eventuel auf einem Fenster Befindet und ich dann die Screen Mauspositionen aus den Mauspositionen des Fenster errechne.

Code: Alles auswählen

MouseMapY = ((yMouse*2)/#floorWidth)
MouseMapX = ((xMouse*2)/#floorWidth)-1 
MouseMapX und Y enthalten nach dieser berechnung die Koordinaten deines Maparrays über denen die Maus steht.

Das ist auch schon alles, mehr passiert nicht zur Koordinatenfindung. Keine Kollisionen, keine weitere Trickserei.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

entschuldige, Zaphod.
spricht du gerade von Rechteckigen Tiles in einer senkrech/waagerechten Matrix?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Nein, es ist schon richtige Isometrie, aber die Sprites sind natürlich rechteckig. width meint die breite der Sprites, wobei ich davon ausgehe, dass die Iso Tiles mit den ecken die seiten des Sprites erreichen und die Tiles genau zweimal so breit wie hoch sind (übliche iso perspektive).

Ich möchte eigentlich ungern meinen neuen editor Komplett posten, aber wenn jemand ehrliches interesse anmeldet werde ich es trotzdem tun. Will mir blos nicht wieder die mühe machen wenn es sich eh niemand ansieht.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

is schon ok, mir gehts nur um die theorie.

wie sind deine ISO tiles denn angeordnet?

1) als einfache matrix 45° gedreht

Code: Alles auswählen

            1/1
         1/2   2/1
      1/3   2/2   3/1
   1/4   2/3   3/2   4/1
1/5   2/4   3/3   4/2   5/1
   2/5   3/4   4/3   5/2
      3/5   4/4   5/3
         4/5   5/4
            5/5
2) als senkrechte matrix, die muss dann versetzt sein.

Code: Alles auswählen

1/1   2/1   3/1
   1/2   2/2   3/2
1/3   2/3   3/3
   1/4   2/4   3/4
1/5   2/5   3/5
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

achso, ersteres, 45° gedreht.

Die senkrechte variante hab ich früher mal ausprobiert, kann davon aber nur abraten, weil die dabei produzierten koordinatenanomalien einem später echt das hirn zermartern.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo seh ich auch so.

ist halt zum verständnis deiner formeln notwendig, zu wissen, welche variante.
wollte jetzt nich rumraten. ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2239
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

>>kann davon aber nur abraten
ist mir auch nichts. das problem dabei ist eben: wenn man auf dem screen im zick-zack läuft, bewegt man sich im array 'geradlinig', also auf einer dimension.

und wenn man es vielleicht eher so macht..
2.)

Code: Alles auswählen

1/1    3/1    5/1

    2/1    4/1    6/1

1/2    3/2    5/2

    2/2    4/2    6/2

1/3    3/3    5/3
..entsprechen die benachbarten felder in der matrix , jenen auf dem screen, die sich mit der spitze berühren. ist genauso doof.



Zaphod. ich hab dein code mal versucht zu umzusetzten, aber es ist mir nicht gelungen. ^^

[edit: code entfernt]
Zuletzt geändert von #NULL am 18.10.2006 18:23, insgesamt 1-mal geändert.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Es ist grade nicht möglich, aber morgen lade ich mal meinen editor source rauf und verlinke ihn, dann könnt ihr die koordinatenfindung in aktion sehen.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> und wenn man es vielleicht eher so macht..

so wird es manches mal gelöst, ich meine mich zu erinnern, dass die anordnung in Civ3 so war.
das viel größere problem dabei:
jedes zweite koordinatenpaar ist verschwendet, wenn ich mit
direktzugriff auf ein Array arbeiten will, bleibt das array halb leer.

bei beiden möglichkeiten, deiner 2) und meiner 2),
besteht das hauptproblem darin, dass man nicht einfach ins
nachbarfeld gehen kann, sondern eine zuordnungsmaske bräuchte.

die rautenanordnung ist die, die auch ich bevorzuge.

manche scheinen es aber nicht zu mögen, diagonale kartenränder zu haben.
in vielen games werden senkrechte kartenränder bevorzugt,
obwohl der Mapaufbau eindeutig Isometrisch ist.
( Civ3, EmpireEarth )
ich persönlich empfinde keine einbuße im Gameplay bei diagonalen Rändern.
(AOE 1+2, RiseOfNations)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2239
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

so, hab jetzt auch die globale berechnug.
die map wird ab [offX,offY] gezeichnet.
mouseX/Y sind die pixel-koordinaten der maus ab [offX,offY].
mouseMapX/Y sind die indizes für das tile unter der maus.

Code: Alles auswählen

InitSprite()
hWin=OpenWindow(0, 50,50,800,600, "")
OpenWindowedScreen( hWin, 0,0,WindowWidth(0),WindowHeight(0), 0,0,0)

sprite=LoadSprite(#PB_Any, "C:\test\??????.bmp") ; << iso tile (2:1)
w=SpriteWidth(sprite)
h=SpriteHeight(sprite)

mapW=25
offX=150
offY=50
Repeat
  mouseX=WindowMouseX(0)-offX
  mouseY=WindowMouseY(0)-offY
  
  ;/////////////////////////////////////// von Pixel zu Index 
  mouseMapX= (mouseX + 2*mouseY) / w
  mouseMapY= (2*mouseY - mouseX) / w
  ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  
  For i=0 To mapW
    For k=0 To mapW
      If Not (i=mouseMapX And k=mouseMapY)

        ;/////////////////////////////////////// von Index zu Pixel
        x=offX + (i-k) * w/2
        y=offY + (i+k) * h/2
        ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        
        DisplayTransparentSprite(sprite, x-w/2, y)
      EndIf
    Next
  Next

  StartDrawing( ScreenOutput() )
    Circle(offX,offY, 2,$00ff00)
    ;LineXY(offX,offY, offX+mouseX,offY+mouseY, $cccccc)
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(mouseX+offX+15,mouseY+offY+00, "mouse["+Str(mouseX)+","+Str(mouseY)+"]", $88ff88)
    DrawText(mouseX+offX+15,mouseY+offY+20, "mouseMap[="+Str(mouseMapX)+","+Str(mouseMapY)+"]", $88ff88)
  StopDrawing()

  event=WindowEvent()
  Select event
    Case #PB_Event_CloseWindow
      quit=1
  EndSelect
  FlipBuffers()
  ClearScreen($333333)
  Delay(10)
Until quit
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten