Programmiertechnikfrage zu Bejeweled o.ä.
Übersicht

![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich hab das leider mit der steinfallen animation immer noch nicht hinbekommen.
könnte mir da jemand nochmal helfen.bitte bitte bitte |
||
.erazer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group