Fragen zu Arrays?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

blackmaster

Betreff: Fragen zu Arrays?

BeitragMo, März 10, 2008 0:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
wie bekomme ich am einfachsten solche Feld positionen hin:
Screen

Also die Kugeln sollen nicht alle gleichmäßig untereinander gezeichnet werden, sondern jede 2te Zeile sollen die Kugeln um 10 Pixel nach rechts und -2 Pixel nach oben verschoben werden.

Ich habe das mit 2 x und y durchläufe versucht, die werden alle jede 2te Zeile gezeichnet mit Step 2.
Hier mal der Code:
Code: [AUSKLAPPEN]
Graphics 1024,768,16,2
SetBuffer BackBuffer()

;Spielfeld erstellen
Dim Map(21,26)

;Map Daten einlesen
Restore map_data
For y=0 To 26
  For x=0 To 21
    Read Map(x,y)
  Next
Next

ClsColor 147,188,255
Repeat
  Cls

  ;Kugel jede 2te Zeile zeichnen
  For y=0 To 26 Step 2
    For x=0 To 21
      maps = Map(x,y)
      If maps = 1 Then
        Color 0,0,0
        ;Kugeln so positionieren, das diese in der Mitte des Fensters ausgerichtet werden
        Oval GraphicsWidth()/2-(22*20/2)+x*20,100+y*18,20,20,0
      EndIf
    Next
  Next

  ;Kugel jede 2te Zeile zeichnen
  For y=0 To 26 Step 2
    For x=0 To 21
      maps = Map(x,y)
      If maps = 1 Then
        Color 0,0,0
        ;Kugeln so positionieren, das diese in der Mitte des Fensters ausgerichtet werden
        ;aber diesmal um 18 Pixel nach unten und 10 Pixel nach rechts verschieben
        Oval GraphicsWidth()/2-(22*20/2)+10+x*20,100+y*18+18,20,20,0
      EndIf
    Next
  Next

  Flip
Until KeyHit(1)

End

;Daten für die Map
.map_data
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1


Das ist aber Schwachsinn, wie könnte ich das ambesten lösen?

Ich bedanke mich schonmal im Voraus.

MfG

skey-z

BeitragMo, März 10, 2008 1:01
Antworten mit Zitat
Benutzer-Profile anzeigen
du brauchst keine 2 Schleifen, arbeite mit offsets

in jedem durchlauf machst du

Code: [AUSKLAPPEN]

x_off = 1 - x_off
y_off = y_off + 2


beim zeichnen

Code: [AUSKLAPPEN]

oval x+(x_off*halbekugelbreite), y-y_off, breite, höhe


hier noch ein kleines Beispiel, damit du siehst, wo du es einsetzen musst

Code: [AUSKLAPPEN]

Graphics 800, 600
SetBuffer BackBuffer()

Repeat
   
   For y = 0 To 10
      For x = 0 To 20
         
         Oval x*16+(x_off*8), y*16-y_off, 16, 16 ,0
      Next
      x_off = 1 -x_off
      y_off = y_off + 2
   Next
   
   x_off = 0
   y_off = 0
   
   Flip
   Cls

Until KeyHit(1)

End
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter
 

blackmaster

BeitragMo, März 10, 2008 1:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich danke Dir.

So ähnlich hatte ich es auch erst, aber ich lasse im Feld eine Kugel in Richtung Maus fliegen, wenn diese gedrückt wurde und muss dann auch feststellen in welches Feld sich gerade die Kugel befindet, wenn sie fliegt.
Deshalb weiss ich nicht, ob diese Variante gut ist, da jede 2te Zeile die Felder dann weiter nach rechts sich befinden.

MfG
 

blackmaster

BeitragMo, März 10, 2008 21:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt es vieleicht eine bessere lösung das hinzubekommen?

Hier mal mein Code wie es im Moment abläuft:
Code: [AUSKLAPPEN]
Graphics 1024,768,16,2
SetBuffer BackBuffer()

Global Timer = CreateTimer(50)
Global GX#,GY#
Global pos_x# = GraphicsWidth()/2-20/2
Global pos_y# = 589
Global Winkel#
Global Speed = 5
Global Bewegen

Global X_PX,Y_PX ;Pixel zähler für die Kugel
Global Feld_x,Feld_y

;Spielfeld erstellen
Dim Spielfeld(25,30)

;Map Daten einlesen
Restore map_data
For y=0 To 30
  For x=0 To 25
    Read Spielfeld(x,y)
  Next
Next

ClsColor 147,188,255
Repeat
  Cls

  WaitTimer(Timer)

  MX = MouseX()
  MY = MouseY()

  For y = 0 To 30
    For x = 0 To 25
      map = Spielfeld(x,y)
      If map = 2 Then
        Color 0,128,128
        Oval GraphicsWidth()/2-(26*20/2)+x*20+(x_off*10), 100+y*20-y_off, 20, 20 ,0
        If Bewegen = 0 Then
          If MouseDown(1) And MouseHit(1) Then
            Feld_x = 12
            Feld_y = 26
            Winkel = ATan2(MY-pos_y-10,MX-pos_x-10) ;Winkel für die Kugel berechnen
            GX = Cos(Winkel)*Speed
            GY = Sin(Winkel)*Speed
            Bewegen = 1
          EndIf
        EndIf
      EndIf
    Next
    x_off = 1 -x_off
    y_off = y_off + 2
  Next

  x_off = 0
  y_off = 0

  KugelShoot()

  Color 0,0,0
  ;Rahmen zeichnen für das Spielfeld
  Rect 291,99,452,490,0

  ;Kugel zeichnen
  Oval pos_x,pos_y,20,20,0
  Color 0,0,128
  Text 20,40,"X PX:"+X_PX
  Text 20,60,"Y PX:"+Y_PX
  Text 20,80,"Feld X:"+Feld_x
  Text 20,100,"Feld Y:"+Feld_y

  Flip
Until KeyHit(1)

End

Function KugelShoot()
  If Bewegen = 1 Then
    pos_x = pos_x + GX
    pos_y = pos_y + GY

    ;Pixel zähler für die X-Richtung
    X_PX = X_PX + GX
    ;Pixel zähler für die Y-Richtung
    Y_PX = Y_PX + GY
    If X_PX <= -18 Then
      Feld_x = Feld_x - 1
      X_PX = 0
    EndIf
    If X_PX >= 18 Then
      Feld_x = Feld_x + 1
      X_PX = 0
    EndIf
    If Y_PX <= -18 Then
      Feld_y = Feld_y - 1
      Y_PX = 0
    EndIf
    If Y_PX >= 18 Then
      Feld_y = Feld_y + 1
      Y_PX = 0
    EndIf

    If Spielfeld(Feld_x,Feld_y-1) = 2 Or Spielfeld(Feld_x,Feld_y+1) = 2 Or Spielfeld(Feld_x-1,Feld_y) = 2 Or Spielfeld(Feld_x+1,Feld_y) = 2 Then
      Spielfeld(Feld_x,Feld_y) = 2
      pos_x# = GraphicsWidth()/2-20/2
      pos_y# = 589
      Bewegen = 0
    EndIf
  EndIf
End Function

;Daten für die Map
.map_data
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0


Ich bekomme keine genaue Feld position angezeigt, da jede 2te Zeile die Felder anders positioniert sind.
Wenn ich eine Kugel abfeuer, dann wird sie nicht genau da rein gesetzt wo die Kugel kollidiert.

Ich wäre euch sehr dankbar für lösungsvorschläge.

MfG

Silver_Knee

BeitragMo, März 10, 2008 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
das ist jetzt nicht des rätsels lösung aber warum fragst du den Mousehit während der geschachtelten schleifen immer und immer wieder ab? wäre doch sinnvoller den ganzen if block davor oder dahinter zu setzten...
 

blackmaster

BeitragMo, März 10, 2008 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast recht, ich habe das erst in der Funktion KugelShoot() drin gehabt aber habe es dann in der Schleife gleich mit rein geschrieben.
Eigentlich ist es egal ob in der For Schleife oder in der Funktion.

Weiss wer eine lösung zu meinem Problem?

MfG

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group