Diagonales Grid,verzerrbar, Problem bei gewisser erkennung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

JC2008

Betreff: Diagonales Grid,verzerrbar, Problem bei gewisser erkennung

BeitragFr, Aug 13, 2010 11:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Servus,

Vor kurzen hab ich damit angefangen ein Tile based Game zu progen, als es dann darum ging eine Maus-Felderkennung zu basteln hatte ich das Problem das meine Maus nicht ganz genau auf die Ausmaße der Felder reagiert, nach einer Weile rumprobieren wurde es nicht viel besser also hab ich hier das forum durchstöbert u. es viel mir auf das bei den meisten die auch fertige Ideen u. Beispiele anboten ein ähnliches Problem aufgetreten ist. Also dachte ich mir ich bastle mir ein diagonales Grid in dem ich über Linerarefunktionen eine Punktgenaue Mausfelderkennung habe u. ich das Grid beliebig verzerren kann.

So u. hier nun mein Problem:^^

Das ganze Funktioniert prima solange die Kästchen genau die gleichen Seitenlängen haben oder ich es in Y-Richtung verzerre, jedoch sobald ich es nur um wenige Pixel in X-Richtung verzerre markiert es ir alle Kästchen di in horizontaler Richtung zum eigentlich angeklickten Kästchen liegen.

Hier mein Code
PS: Ist net grad der beste Proficode aber er soll ja vorerst nur als Dummy dienen

Code: [AUSKLAPPEN]

Graphics 1900,1600,2
SetBuffer BackBuffer()

time = CreateTimer(30)

Size_X   = 1000   ;x <= y?
Size_Y   = 1000
Spalten   = 5      ;Anzahl Spalten >= Zeilen wenn x > y, wenn x < y dann sind weniger Spalten möglich, aber nur das genau ein Hundertstel von Size_X?
Zeilen   = 5
T_BX   = 50;Size_X/Spalten
T_BY   = 50;Size_Y/Zeilen
Pos_X   = (1900/2)-(T_BX/2)
Pos_Y   = 50

Dim map(Spalten,Zeilen)

While Not KeyHit(1)
  Cls

   
   mx  = MouseX()
   my  = MouseY()
   md  = 1            ;nur für Testzwecke
   mh1 = MouseHit(1)
   mh2 = MouseHit(2)
   
   status = 0
   
   For Ts = 1 To Spalten

      If Status = 0 Then
         T_X1 = Pos_X
         T_Y1 = Pos_Y
         T_X2 = T_X1
         T_Y2 = T_Y1
      ElseIf status = 1
         T_X2 = T_X2 + (T_BX/2)
         T_X1 = T_X2
         T_Y2 = T_Y2 + (T_BY/2)
         T_Y1 = T_Y2
         status = 0
      EndIf
   
      For Tz = 1 To Zeilen
      
         If Status <> 0 Then
            T_X1 = T_X1 - (T_BX/2)
            T_Y1 = T_Y1 + (T_BY/2)
         Else
            Status = 1
         EndIf

         A_X = T_X1+(T_BX/2)
         A_Y = T_Y1
         
         B_X = T_X1+T_BX
         B_Y = T_Y1+(T_BY/2)
         
         C_X = T_X1+(T_BX/2)
         C_Y = T_Y1+T_BY
         
         D_X = T_X1
         D_Y = T_Y1+(T_BY/2)
         
         If md = 1 Then
         
            h1_1 = ((((A_Y-D_Y)/(A_X-D_X))*(mx-D_X))+D_Y)
            h1_2 = ((((B_Y-C_Y)/(B_X-C_X))*(mx-C_X))+C_Y)
            h1_3 = ((((A_Y-B_Y)/(A_X-B_X))*(mx-B_X))+B_Y)
            h1_4 = ((((D_Y-C_Y)/(D_X-C_X))*(mx-C_X))+C_Y)

            If my >= h1_1 And my <= h1_2 And my >= h1_3 And my <= h1_4 Then
               Save_T_X1 = T_X1
               Save_T_Y1 = T_Y1
               MSObjCheck = 1
               If mh1 = 1 Then
                  If map(Ts,Tz) = 0 Then
                     map(Ts,Tz) = 1
                  Else   
                     map(Ts,Tz) = 0
                  EndIf
               EndIf
            EndIf
         EndIf

         Line D_X, D_Y, A_X, A_Y
         Line A_X, A_Y, B_X, B_Y
         Line B_X, B_Y, C_X, C_Y
         Line C_X, C_Y, D_X, D_Y
         
         Text T_X1+20,T_Y1+20,map(Ts,Tz)
         
      Next
   Next
   
   If md = 1 And MSObjCheck = 1 Then
      
      T_X1 = Save_T_X1
      T_Y1 = Save_T_Y1
         
      A_X = T_X1+(T_BX/2)
      A_Y = T_Y1
      
      B_X = T_X1+T_BX
      B_Y = T_Y1+(T_BY/2)
      
      C_X = T_X1+(T_BX/2)
      C_Y = T_Y1+T_BY
      
      D_X = T_X1
      D_Y = T_Y1+(T_BY/2)
   
      Color 40,255,40
      Line D_X, D_Y, A_X, A_Y
      Line A_X, A_Y, B_X, B_Y
      Line B_X, B_Y, C_X, C_Y
      Line C_X, C_Y, D_X, D_Y
      Color 255,255,255
      
   EndIf
   
   MSObjCheck = 0
   
   TEST1# = (Save_T_X1-(Pos_X-(Size_X/2)))/(T_BX/2)
   TEST2# = ((Save_T_Y1-Pos_Y)/(T_BY/2))+1
   
   Locate 0,10
   Print "Mouse("+mx+"/"+my+")"
   Print "("+TEST1#+"/"+TEST2#+")"
   Print "h1_1/2("+h1_1+"/"+h1_2+")"
   Print "h1_3/4("+h1_3+"/"+h1_4+")"
   
  WaitTimer time
  Flip
Wend

End


Ich hoffe ihr könnt mir helfen o. sogar Verbesserungsvorschläge gäben, denn ich weis einfach grad net wo ich mich verkupfert oder quer gedacht habe^^

Schonmal im Voraus THX
~Die Logik im Chaos ergibt das spiel~

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Aug 13, 2010 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst dann einfach das Y das ins X reingerechnet wird halbieren etc...

Hier sieh selbst:

Code: [AUSKLAPPEN]
Graphics 512,512,0,2
SetBuffer FrontBuffer()

Local Timer=CreateTimer(60)
Local Breite#=80
Local Hoehe#=40

Local Verhaeltnis#=Breite/Hoehe

Local MX, XPos
Local MY, YPos




For MY=0 To 512 Step 2
   For MX=0 To 512 Step 2
      XPos=Floor((MX-MY*Verhaeltnis)/Breite)
      YPos=Floor((MX+MY*Verhaeltnis)/Breite)
      Color (XPos*64) Mod 256,(128+YPos*64) Mod 256,0
      Rect MX,MY,2,2,1
   Next
Next




While Not KeyHit(1)
   
   MX=MouseX()
   MY=MouseY()
   
   XPos=Floor((MX-MY*Verhaeltnis)/Breite)
   YPos=Floor((MX+MY*Verhaeltnis)/Breite)
   
   Color 0,0,0:Rect 0,0,200,22,1:Color 255,255,255
   Text 20,4,"Feld: X="+XPos+" Y="+YPos
   
   WaitTimer Timer
Wend
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group