x bzw. y koords in dim speichern

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

dominik

Betreff: x bzw. y koords in dim speichern

BeitragFr, Jan 16, 2004 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
wiso funtz des net?
eigentlich sollte des prog. doch 11 burgstellen speichern können. aber irgentwie kann ich nur des erste setzen und die anderen werden aber nicht mehr gespeichert.

Code: [AUSKLAPPEN]

Graphics 640, 480
SetBuffer BackBuffer()
burg = LoadImage("castle.bmp")
maus = LoadImage("pointer.bmp")
hinterg = LoadImage("hinterg.bmp")
hintergb = LoadImage("hintergb.bmp")
ScaleImage burg, .5, .5
speicher = 1

MoveMouse 250, 200
Dim vo(100), xo(100), yo(100)

Repeat
X = MouseX()
Y = MouseY()
Gosub karte_neu_zeichnen
If X > 630 Then x = 630
If speicher = 2 Then
   If X > 470 Then x = 470
   If y > 440 Then y = 440
EndIf
If Y > 460 Then Y = 460
Text 500, 50, "Speicher: " + speicher
If speicher = 1 Then DrawImage maus, x, y
If speicher = 2 Then DrawImage burg, x, y
If KeyDown(3) Then speicher = 2
If KeyDown(2) Then speicher = 1
If speicher = 2 Then
   If MouseDown(1) Then
      For i = 0 To 10
       If vo(i) = 0 Then
          vo(i) = 1
          Xo(i) = X
          Yo(i) = y
         EndIf
      Next
      speicher = 1
   EndIf
EndIf

Flip
Until KeyDown(1)
End


.karte_neu_zeichnen
Cls
TileBlock hinterg, 0, 0
DrawImage hintergb, 500, 0
For i = 0 To 10
If vo(i) = 1 Then DrawImage burg, Xo(i), yo(i)
Next

Return
 

BIG BUG

BeitragFr, Jan 16, 2004 14:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Du speicherst mit deinem Mausklick nicht nur eine Burg, sondern alle an der gleichen Stelle...

versuchs mal so:
Code: [AUSKLAPPEN]

If speicher = 2 Then
   If MouseDown(1) Then
      For i = 0 To 10
       If vo(i) = 0 Then
          vo(i) = 1
          Xo(i) = X
          Yo(i) = y
          exit; <<<< das muss da rein
         EndIf
      Next
      speicher = 1
   EndIf
EndIf
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

BladeRunner

Moderator

BeitragFr, Jan 16, 2004 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
hmmm.. ich denke das hier:
Code: [AUSKLAPPEN]
For i = 0 To 10
       If vo(i) = 0 Then
          vo(i) = 1
          Xo(i) = X
          Yo(i) = y
         EndIf
      Next
alle x und y beim ersten durchlauf gesetzt werden, da zu beginn ja für alle vo(i) =0 gilt.
Du könntest entweder prüfen ob i-1 <>0 ist und nur dann x und y setzen (achtung : schleife muß dann rückwärts laufen (10 to 0) und du brauchst für vo(0) ne Sonderregelung)
oder du machst n pointer auf den zuletzt gesetzten Speicher, welchen du dann erhöhst ..
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

dominik

BeitragFr, Jan 16, 2004 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
ok danke des funtzt jetzt perfekt.

hab aber inderzwischen zeit noch nen neues prob.

und zwar möchte ich mit der maus nen route festlegen (zur bewegung der einheiten) und zwar mit der maus dabei wir in zwei anfangs variablen (lax, lay) die anfangs x und y koords gespeicxhert wenn man dann mit der maus zu einem anderen punkt fährt wird in 2 endvariablen (lex, ley) die endvariablen gespeichert. und dann soll die linie zwischen den zwei punkten gezeichnet werden . eigentlich ganz logische und einfach funtzt bloß nich so ganz. Confused

Code: [AUSKLAPPEN]


Graphics 640, 480
SetBuffer BackBuffer()
turm = LoadImage("castle.bmp")
maus = LoadImage("pointer.bmp")
hinterg = LoadImage("hinterg.bmp")
hintergb = LoadImage("hintergb.bmp")
mauer = LoadImage("mauer.bmp")
haus1 = LoadImage("haus1.bmp")
haus2 = LoadImage("haus2.bmp")
ScaleImage turm, .5, .5
ScaleImage mauer, .5, .5
speicher = 1

MoveMouse 250, 200
Dim vo(1000), xo(100), yo(100), lax(1), lay(1), lex(1), ley(1), la(1)


;                                       hauptschleife
Repeat
X = MouseX()
Y = MouseY()
Gosub karte_neu_zeichnen
If X > 630 Then x = 630
If speicher = 2 Or speicher = 3 Then
   If X > 470 Then x = 470
   If y > 422 Then y = 422
EndIf


;                                               des is der teil zur zeichnung der linie
If speicher = 1 Then
 If MouseDown(1) Then
   For i = 0 To 1
    Lax(I) = X
    lay(I) = Y
    la(I) = 1
   Next
 EndIf

 If la(I) = 1 Then
    If MouseDown(1) Then
     la(I) = 0
     For i = 0 To 1
       lex(I) = x
       Ley(I) = y
       Lax(I) = 0
       lay(I) = 0
      Next
    EndIf
 EndIf
EndIf
;                             bis hier die linie wird dann im unterprog gezeicnet
Text 500, 70, la(I)
Text 500, 80, lax(I)
Text 500, 90, lay(I)
Text 500, 100, lex(I)
Text 500, 110, ley(I)

If Y > 460 Then Y = 460
Text 500, 50, "Speicher: " + speicher
If speicher = 1 Then DrawImage maus, x, y
If speicher = 2 Then DrawImage turm, x, y
If speicher = 3 Then DrawImage mauer, x, y
If speicher = 4 Then DrawImage haus1, x, y
If speicher = 5 Then DrawImage haus2, x, y
If MouseDown(2) Then speicher = 1
If KeyDown(2) Then speicher = 1
If KeyDown(3) Then speicher = 2
If KeyDown(4) Then speicher = 3
If KeyDown(5) Then speicher = 4
If KeyDown(6) Then speicher = 5
;turm
If speicher = 2 Then
   If MouseDown(1) Then
      For i = 0 To 50
       If vo(i) = 0 Then
          vo(i) = 1
          Xo(i) = X
          Yo(i) = y
   Exit
        EndIf
       Next
      speicher = 1
   EndIf
EndIf

;                                      hier hab ich nen bischen code weggekürtzt

Flip
Until KeyDown(1)
End
;                                                                              ende der hauptschleife

.karte_neu_zeichnen
Cls
TileBlock hinterg, 0, 0
DrawImage hintergb, 500, 0

;If la(I) = 1 Then
Line lax(I), lay(I), leX(I), leY(I)

;turm
For i = 0 To 50
If vo(i) = 1 Then DrawImage turm, Xo(i), yo(i)
Next
;mauer
For i = 0 To 50
If vo(i) = 3 Then DrawImage mauer, Xo(i), yo(i)
Next
;haus1
For i = 0 To 50
If vo(i) = 4 Then DrawImage haus1, Xo(i), yo(i)
Next
;haus2
For i = 0 To 50
If vo(i) = 5 Then DrawImage haus2, Xo(i), yo(i)
Next
Return



in LA(I) wird geprüft ob "die linie gerade am courser hängt" also gezeichnet werden soll oder nicht.

dominik

BeitragFr, Jan 16, 2004 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
kann mir hier keiner helfen oder was?
 

walski

Ehemaliger Admin

BeitragFr, Jan 16, 2004 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwie ahten meine Codes in letzter Zeit immer etwas aus Embarassed

Naja, ich poste es trotzdem ma:

Code: [AUSKLAPPEN]

; just a tiny type demo
; (c) 2004 by walski


Const Key_Esc = 1,Key_Del = 211,Key_Space = 57
Const Screen_Fullscreen = 1,Screen_Windowed = 2
Const Screen_Width = 800,Screen_Height = 600,Screen_Depth = 16,Screen_Mode = Screen_Fullscreen

Type Units
   Field ID
   Field x,y
   Field TieID
End Type

Type UnitFreeIDs
   Field ID
End Type

Global TieMode = 0,CurTie = 0,SelID = 0,TieShift = -1
Global Unit_Radius = 20,Unit_Filled = 0,Unit_LastID = 0,Unit.Units
Global UnitFreeID.UnitFreeIDs


Graphics Screen_Width,Screen_Height,Screen_Depth,Screen_Mode
SetBuffer BackBuffer()

timer = CreateTimer(100)

While Not KeyDown(Key_Esc)
   Cls
   If TieShift>0 Then
      Text 1,1,"!TIE!"
   EndIf
   If MouseHit(1) Then
      Unit = New Units
         Unit\ID = NextUnitID()
         nUID = Unit\ID
         Unit\x = MouseX()
         Unit\y = MouseY()
         If CurTie>0 Then
            Unit\TieID = CurTie
            If TieShift>0 Then
               CurTie = Unit\ID
            Else
               CurTie = 0
            EndIf
         Else
            CurTie = Unit\ID
         EndIf      
   EndIf

   ;Tie Point
   If MouseHit(2)
      If SelID>0 And CurTie>0 And CurTie<>SelID Then
         For Unit = Each Units
            If Unit\ID = SelId Then
               tSelUnitX = Unit\x
               tSelUnitY = Unit\y
               Goto JumpForEach
            EndIf
         Next
         .JumpForEach
         Unit = New Units
            Unit\ID = NextUnitID()
            nUID = Unit\ID
            Unit\x = tSelUnitX
            Unit\y = tSelUnitY
         If CurTie>0 Then
            Unit\TieID = CurTie
            If TieShift>0 Then
               CurTie = Unit\ID
            Else
               CurTie = 0
            EndIf
         Else
            CurTie = Unit\ID
         EndIf   
      ElseIf SelID>0
         CurTie = SelID
      EndIf
   EndIf

   
   ;TieShifting   
   If KeyHit(Key_Space) Then
      TieShift = TieShift*-1
   EndIf
   
   ;Delete point
   If KeyDown(Key_Del) And SelID>0 Then
      For Unit = Each Units
         If Unit\TieID = SelID Then
            Unit\TieID = 0
         EndIf
         If Unit\Id = SelID Then
            UnitFreeID = New UnitFreeIDs
               UnitFreeID\ID = Unit\ID
            Delete Unit
         EndIf
      Next
   EndIf
      
   ;Draw Points
   DrawUnits()
   
   WaitTimer(timer)
   Flip
Wend
End

Function DrawUnits()
   tMx = MouseX()
   tMy = MouseY()
   SelID = 0
   For Unit = Each Units
      Color 0,255,0
      If CurTie=Unit\ID Then
         Color 255,0,0
         tSelUnitX = Unit\x
         tSelUnitY = Unit\y
      ElseIf inCircle(Unit\x,Unit\y,Unit_Radius/2,tMx,tMy)
         Color 0,0,255
         SelID = Unit\ID         
      EndIf
      Oval Unit\x-(Unit_Radius/2),Unit\y-(Unit_Radius/2),Unit_Radius,Unit_Radius,Unit_Filled
      If Unit\TieID>0 Then
         For tUnit.Units = Each Units
            If tUnit\ID = Unit\TieID Then
               Color 0,255,0
               Line Unit\x,Unit\y,tUnit\x,tUnit\y
               Goto jumpForEach
            EndIf
         Next
         .JumpForEach
      EndIf
   Next
   Color 255,255,255
   WritePixel tMx,tMy,$ffffffff
   Oval tMx-(Unit_Radius/2),tMy-(Unit_Radius/2),Unit_Radius,Unit_Radius,Unit_Filled
   If CurTie > 0 Then
      Line tMx,tMy,tSelUnitX,tSelUnitY
   EndIf
End Function

Function inCircle(x,y,Radius,x2,y2)
   RVar = 0
   tx = Abs(x-x2)
   ty = Abs(y-y2)
   If Sqr(tx^2+ty^2)<=Radius Then
      RVar=1
   EndIf
   Return RVar
End Function

Function NextUnitID()
   rVar = 0
   For UnitFreeID = Each UnitFreeIDs
      If UnitFreeID\ID Then
         rVar = UnitFreeID\ID
         Delete UnitFreeID
         Goto JumpForEach
      EndIf
   Next
   .JumpForEach
   If rVar>0 Then
      Return rVar
   EndIf
   Unit_LastID = Unit_LastID + 1
   Return Unit_LastID
End Function


Das ganze benutzt keine Arrays sondern Types, da sie VIEL dynamischer und damit besser geignet sind für das was du machen möchtest.

Ich wollte erst noch ne Array Lösung coden, aber ich muss jetzt los.

walski
buh!

dominik

BeitragFr, Jan 16, 2004 23:46
Antworten mit Zitat
Benutzer-Profile anzeigen
aha danke ich hab keinen plan was du da mit ID, funktionen und sonst noch für nen zeugs geproggt hast abe ich habs in der zwischenzeit selber ohne array und dims gelöst in zwei zeilen mit ganznormalen variablen.

du hast deinen code auch nich getestet oder?
Code: [AUSKLAPPEN]

 nUID = Unit\ID


sonst wäre dir das auf jedenfall aufgefallen.

was hast du eigentlich gegen dims ich hab bisher immer nur gehört das dims vieeeeeel besser als arrays sein sollen. ich hab selber die erfahrung gemacht das ich mit arrays immer schnelll die übersicht verliere.

seit wann codest du mit goto. ich dachte immer du seist einer von den pro's aber jeder lernt doch schon am ersten tag das man keine goto verwenden soll oder?

BladeRunner

Moderator

BeitragSa, Jan 17, 2004 4:16
Antworten mit Zitat
Benutzer-Profile anzeigen
@ dominik...

ich denke du kannst sicher sein, dass Walski nur Gotos verwendet wo sie unerlässlich sind ( im vorliegenden beispiel als schleifenausstieg, noch dazu in minuten gecodet...)
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

walski

Ehemaliger Admin

BeitragSa, Jan 17, 2004 10:41
Antworten mit Zitat
Benutzer-Profile anzeigen
dominik hat Folgendes geschrieben:


du hast deinen code auch nich getestet oder?
Code: [AUSKLAPPEN]

 nUID = Unit\ID


sonst wäre dir das auf jedenfall aufgefallen.

Das ist in der Debug-Phase entstanden und ich hab es vergessen zu löschen! Es stört ja nicht, is nur überflüssig! Und sei dir sicher: Ich habe den Code getestet!

Zitat:

was hast du eigentlich gegen dims ich hab bisher immer nur gehört das dims vieeeeeel besser als arrays sein sollen. ich hab selber die erfahrung gemacht das ich mit arrays immer schnelll die übersicht verliere.

"Dims" sind doch nur dazu da um Arrays zu dimensionieren Wink
Also Dims=Arrays du meinst sicherlich eher Types<>Arrays.
Da gibt es unterschiedliche Meinungen, ich bevorzuge der Flexibilität wegen meist Types. Wobei es sicherlich auch viele Gebiete gibt bei denen Arrays viel sinnvoller sind! Aber das ist ein Streit den ich jetzt hier nicht anfangen will: Jedem das seine!

Zitat:

seit wann codest du mit goto. ich dachte immer du seist einer von den pro's aber jeder lernt doch schon am ersten tag das man keine goto verwenden soll oder?


Das hat BladeRunner ja schon richtig erkannt!
Ich könnte natürlich auch ohne das Goto fortfahren, so spare ich aber Zeit! Und eine umständlichere "First"-"Next"... Konstruktion mit While oder so is mir an der Stelle zu umständlich gewesen!

M.f.G.

walski
buh!

dominik

BeitragSa, Jan 17, 2004 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
ok ok ich nehm alles zurück

und hab schon wieder nen prob.
wiso wird hier mauszeiger nich 2 wenn ich mit der maus über den turm fahre?

Code: [AUSKLAPPEN]

;wenn sich mauszeiger und turm überschneifen dann ......
If speicher = 1 Then
  For i = 0 To 50
   If ImagesOverlap(maus,x,y,turm,xo(I),yo(I)) = 1 Then
     mausspeicher = 2
   EndIf
   If ImagesOverlap(maus,x,y,turm,xo(I),yo(I)) <> 1 Then
     mausspeicher = 1
   EndIf
  Next
EndIf

Holzchopf

Meisterpacker

BeitragSa, Jan 17, 2004 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Da du ja alles in einer Schleife abfragst, kann es sein, dass du zum beispiel über den Turm mit Index 3 fährst, aber nicht über die mit den Indizen 4-50, wo dann mausspeicher wieder auf 1 gesetzt wird.
Sobald du also über einen Turm fährst, solltest du die Schleife beenden:

Code: [AUSKLAPPEN]

;wenn sich mauszeiger und turm überschneiden dann ......
If speicher = 1 Then
  For i = 0 To 50
   If ImagesOverlap(maus,x,y,turm,xo(I),yo(I)) = 1 Then
     mausspeicher = 2
     Exit
   Else
     mausspeicher = 1
   EndIf
  Next
EndIf


Ausserdem kannst du, statt zweimal die Kollision abzufragen, ganz einfach beim zweiten ein Else hinschreiben, denn entweder überlapts (If ImagesOverlap(maus etc... ), oder es überlapt nicht (Else).

MfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group