Diagonales Grid,verzerrbar, Problem bei gewisser erkennung
Übersicht

JC2008Betreff: Diagonales Grid,verzerrbar, Problem bei gewisser erkennung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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~ |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group