Programmiertechnikfrage zu Bejeweled o.ä.

Übersicht BlitzBasic Allgemein

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

SpionAtom

BeitragSo, Apr 13, 2008 10:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Dass ich von unten anfange und nicht von oben hat schon seinen Sinn.

Stell dir vor du hast zwei Steine untereinander:
Code: [AUSKLAPPEN]

0X0
0X0
000

Logischerweise müssen beide ein Feld runterrutschen. Fängst du nun an, zuerst die oberste Reihe zu überprüfen, tut sich gar nichts, da unter dem obersten Stein ja keine Lücke ist. Erst der unterste Stein verschiebt sich. Du müsstest die Verschiebe-Schleife öfters wiederholen = nicht gerade perfomant.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

BB-Fan

BeitragSo, Apr 13, 2008 10:43
Antworten mit Zitat
Benutzer-Profile anzeigen
das ist mir gestern auch noch eingefallen, bzw. heute.
aber ich war zu müde um meinen post zu editieren.

soweit also alles verstanden, würde mich jetzt diese steinanimation interessieren....

vielen dank dir...

SpionAtom

BeitragSo, Apr 13, 2008 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Für die Animation braucht jeder Stein noch eine Animationsinformation, quasi wieviel Pixel er schon gefallen ist.
Drum ist das zweidimensionale Array "feld" jetzt dreidimensional.
feld(x, y, 0) ist also immer der Wert/die Farbe des Steins, und feld(x, y, 1) ist immer die Animationsphase des Steins.
zumal gibts eine Variable animation, wenn keine animation stattfindet, ist die Variable animation = 0.
Wird nun ein Stein ein Feld nach unten versetzt, so muss er animiert werden. Sein Animationswert wird auf -tileSize gesetzt, und die Variable animation wird auch auf tileSize gesetzt.

Wenn nun eine Animation stattfindet (animation <> 0), so wird die Animation pixelweise fortgesetzt. Sowohl animation, als auch feld(x, y, 1) werden immer um 1 erhöht. Und zwar so lange, bis sie bei 0 angekommen sind. Insgesamt wandern sie also von -tileSize nach 0.

Das ganze wird natürlich erst zur Animation, wenns angezeigt wird.
Die Position eines Steines ist nun nicht mehr:
Code: [AUSKLAPPEN]

px = x * tileSize
py = y * tileSize

sondern
Code: [AUSKLAPPEN]

px = x * tileSize
py = y * tileSize + feld(x, y, 1)

feld(x, y, 1) wird immer größer (von -tileSize nach 0), also wird py immer größer: Der Stein fällt.

Code: [AUSKLAPPEN]

Graphics 800, 600, 0, 2
SetBuffer BackBuffer()

   ;Initialiseriung
   Const tilesX = 10, tilesY = 20, tileSize = 30   
   Dim feld(tilesX - 1, tilesY - 1, 1)
   
   feld(3, 4, 0) = 1 ;rotes Feld
   feld(5, 6, 0) = 2 ;Grünes Feld
   feld(8, 8, 0) = 3 ;Blaues Feld
   feld(3, 5, 0) = 2
   
   animation = 0
   

   ;Hauptschleife
   Repeat


      ;Felder fallen lassen

      If KeyHit(57) And animation = 0 ;Leertaste
         For x = 0 To tilesX - 1
         For y = tilesY - 2 To 1 Step -1
            If feld(x, y, 0) <> 0 And feld(x, y + 1, 0) = 0 Then
               animation = -tileSize         ;Animation starten
               feld(x, y + 1, 1) = animation   ;Animation starten
               feld(x, y + 1, 0) = feld(x, y, 0)
               feld(x, y, 0) = 0
               
            End If
         Next
         Next
      End If
      

      If animation < 0 Then ;Animation
         animation = animation + 1
         For x = 0 To tilesX - 1
         For y = 0 To tilesY - 1
            If feld(x, y, 1) < 0 Then                        
               feld(x, y, 1) = animation
            End If
         Next
         Next         
      End If
   
   
      ;Feld anzeigen
      Cls
      For x = 0 To tilesX - 1
      For y = 0 To tilesY - 1
         Color 255, 255, 255: Rect x * tileSize, y * tileSize, tileSize, tileSize, 0
         px = x * tileSize
         py = y * tileSize + feld(x, y, 1)
         Select feld(x, y, 0)
            Case 1: Color 255, 0, 0: Rect px, py, tileSize, tileSize, 1
            Case 2: Color 0, 255, 0: Rect px, py, tileSize, tileSize, 1
            Case 3: Color 0, 0, 255: Rect px, py, tileSize, tileSize, 1
         End Select
      Next
      Next
      Flip()
   
   Until KeyDown(1)
   End


Desweiteren muss man bei dieser Lösung darauf achten, dass wenn eine Animation stattfindet, ein Stein nicht versetzt werden kann. Daher:
Code: [AUSKLAPPEN]
If KeyHit(57) And animation = 0 ;Leertaste
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

BB-Fan

BeitragSo, Apr 13, 2008 11:37
Antworten mit Zitat
Benutzer-Profile anzeigen
okay, danke dir, werd den code gleich mal durcharbeiten, ich will es ja auch verstehen.

als ersten fällt mir gleich das 3 dimensionale array auf.
mmmm da muss ich erstmal überall durchsteigen, , na ich werds schon irgendwie kapieren.
ich muss mir das nur noch auf types umstellen, da find ich mich dann auch eher zurecht, wird schon.danke dir
 

BB-Fan

BeitragSo, Apr 13, 2008 15:29
Antworten mit Zitat
Benutzer-Profile anzeigen
hab das jetzt mal versucht umzustellen auf mein beispiel.

kann es sein, dass es auf diese art und weise da nicht geht?

also ein komplett gefülltes feld, und wenn (durch mausklick auf einem feld(welches man abfragen können muss), oder ein anderes ereignis) irgendein, oder auch mehrere feld gelöscht werden sollen, dass dann die animation losgeht.

ich kann mich auch irren, aber ich glaube auf diese art klappt das so nicht ganz.

was müsste ich ändern?

könntest du nochmal helfen, SpionAtom?

ich glaube da gibt es auch noch das problem der mausabfrage, weil man ja jedem feld spezifische koordinaten zuweisen muss, oder liege ich da jetzt total daneben?
 

X-tra

BeitragSo, Apr 13, 2008 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab das jetzt auch mal so probiert, funktioniert auch.
aber wenn man eben felder in einem vollständig besetzten array löscht und dann alles nach unten gleitet, da bin ich auch noch nicht dahintergestiegen.
 

BB-Fan

BeitragDo, Mai 29, 2008 11:21
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab das leider mit der steinfallen animation immer noch nicht hinbekommen.
könnte mir da jemand nochmal helfen.bitte bitte bitte
 

.erazer

BeitragSo, Jul 13, 2008 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde das Thema auch gern nocheinmal aufgreifen wollen, hat da jemand inzwischen eine Lösung die wir uns ansehen können.
Hab angefangen für so ein spiel grafiken zu machen, aber ich steig durch die routine im falle von sprites auch nicht wirklich durch.

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group