Spielbrett und fallende Steinchen
Übersicht

.erazerBetreff: Spielbrett und fallende Steinchen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich hab mir ein Knobelspiel ausgedacht, und fange gerade so mit BB an.
Also ich habe ein 8x8 großes spielbrett, und habe mittels dim dieses dimensioniert. Auch types habe ich genutzt, um die verschiedenen informationen in jedem feld zu speichern, also was für ein stein in welchem feld gerade ist, position etc. problem ist folgendes. durch verschiedene spielzüge werden spielfelder geleert, und die darüberliegenden steine müssen also nachrutschen. statisch bekomme ich das auch hin, indem ich einfach die spielsteininformation auf das jeweils darunter liegende feld tausche. aber wie macht man eine fallende bewegung, also dass die spielsteine nach unten gleiten. ich hab mir schon den kopf zerbrochen, aber es will einfach nicht klappen. mit code wollte ich etwas knausern, da ich glaube, dass meine idee meines spiels bisher noch niemand hatte. |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab das so gelöst, dass im Type der Steine zusätzlich zur Position im Dimfeld noch die eigentliche x- und y- Position in Pixel steht (Ist-Position). Und diese nähert sich immer der X|Y Position an, die anhand der Position im Dimfeld berechnet wird (Soll-Position). Im Normalzustand ändert sich nichts, weil Ist und Soll gleich ist. Fällt ein Stein nach unten, wird nur seine Soll-Position verändert und die Anpassung der Ist-Position übernimmt eine Berechnung (entweder lineare Bewegung, Beschleunigung oder wie auch immer). | ||
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2 |
![]() |
garret |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du hast ja für jeden Spielstein natürliche Zahlen, die seine Position angeben, also Y = 1,2,3 etc.
Sollen die Steine nun "runtergleiten", könntest du speziell für die Grafik extra Koordinaten vereinbaren, und diese als Zeichenkoordinaten angeben, also: Code: [AUSKLAPPEN] Type TSpielstein Field X,Y Field GrafikX, GrafikY End Type Ändern sich jetzt die Positionskoordinaten X oder Y, verschiebst du die Grafikkoordinate GrafikY um z.B. + 2, damit der Spielstein nach unten gleitet. Die Spielsteine zeichnest du dann an GrafikX und GrafikY. Eine Alternative wäre die Verwendung der jetzigen Positionskoordinaten als Zeichenkoordinaten, also beim Zeichnen der Steine DrawImage Block, X, Y statt DrawImage Block X*32, Y*32. In deinem Fall, wo sich die Spielsteine ja auf einem gedachten Gitter bewegen, empfiehlt sich auf jeden Fall der Einsatz von Mod ![]() Edit: Meine Positionskoordinaten entsprechen D2006' Soll-Position, die Zeichenkoordinaten so wie ich sie nenne der Ist-Position. Zeigt wenigstens, dass mein Ansatz nicht verkehrt ist ![]() MfG garret P.S.: Es gibt (fast) nichts, dass bisher noch nicht gedacht wurde - und Knobelspiele gibt's zuhauf. Ohne dich entmutigen zu wollen, aber deins klingt nach einer Variante von Bejeweled. |
||
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht) |
.erazer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@garret: nein sowas wie bejeweled wirds nicht, eigentlich hats sogar garnichts damit gemein.
@D2006: könntest du vielleicht nen beispielcode bringen, damit ich das verstehe?wäre megatoll. edit: habs jetzt mal zusammenhängend gelesen, so den ansatz hab ich verstanden. wozu mod gut sein soll erschliesst sich noch nicht ganz.wegen den bspw. 32x32 und den feldern. nen klitzekleiner passender code wäre super, so lern ich das ja auch. |
||
![]() |
garret |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, was wir (ich schließe D2006 jetzt mal mit ein ![]() 1. Positionskoordinaten: Diese sind wie die Felder eines Schachbrettes x,y, also 1,1; 3,4 etc. - wenn du diese jetzt zeichnest, nimmst du ja nicht DrawImage Stein, 1,1 (oder 3,4), sondern multiplizierst diese mit der Pixelgröße des Feldes, also DrawImage Stein x*32, y*32 2. Grafikkoordinaten: Hier stehen X und Y direkt für die Pixel, an deren Position die Grafik gezeichnet wird, also DrawImage Stein, X, Y Für die Erklärung nehme ich jetzt Grafikkoordinaten: Diese sind für den Ausgangswert sagen wir X = 32, Y = 96. Beide sind jeweils ohne Rest durch 32 teilbar, d.h. 32 Mod 32 = 0, da 32 geteilt durch 32 keinen Rest übrig hat. Bei 40 Mod 32 wäre der Rest 8. Das kannst du nun nutzen, um zu ermitteln, ob sich deine Grafik auf einer Position befindet, die genau durch 32 teilbar ist (und damit genau auf einem Schachbrettfeld steht). Du hast also eine Grafik mit X=32, Y=96, diese lässt du jetzt 32 Pixel tief fallen, damit sie wieder auf einem Feld steht. Dazu erhöhst du also den Y-Wert um z.B. 2 Pixel pro Durchgang. Code: [AUSKLAPPEN] ; Pseudo If SteinFaellt = True Y = Y + 2 If (Y Mod 32) = 0 SteinFaellt = False Sprich: Bleibt bei der Mod-Operation kein Rest, steht der Stein genau auf einem Feld und kann sich vorerst nicht weiter bewegen. MfG garret |
||
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht) |
.erazer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ah das hab ich verstanden.
so nen kleines feld als beispiel wäre das möglich für dich. so keine ahnung 5x5 felder. und auf tastendruck fällt unten ein stein weg und alle darüberliegenden fallen nach. wäre das möglich. wäre dir zutiefst dankbar. bin halt noch am anfang vom programmieren.(soll jetzt aber keine ausrede sein) |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Probier es erstmal selbst, und wenn dabei Fehler auftreten zeig den Code und man kann helfen. | ||
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 |
.erazer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
das tue ich natürlich, war nur eine Frage, hätte mir schonmal sehr geholfen. | ||
![]() |
garret |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du musst das Ganze nur in eine Schleife packen, da sonst nicht viel passiert:
Code: [AUSKLAPPEN] SetBuffer BackBuffer() X = 100; Grafikkoordinate (Pixel) Y = 0; Grafikkoordinate (Pixel) PosY = 0; Positionskoordinate Repeat : Cls If KeyHit(57) SteinFaellt = True If SteinFaellt = True Y = Y + 2 If (Y Mod 32) = 0 PosY = PosY + 1 SteinFaellt = False EndIf EndIf Delay 100 Rect X, Y, 32, 32 Text 10,10,"Y: "+Y Text 10,30,"PosY: "+PosY Flip : Until KeyHit(1) : End Leertaste drücken. Die Lösung mit Delay ist nicht sehr elegant, sondern nur für das Beispiel als Zeitbegrenzung eingebaut. MfG garret |
||
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht) |
- Zuletzt bearbeitet von garret am Do, Jun 05, 2008 19:30, insgesamt einmal bearbeitet
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
.erazer hat Folgendes geschrieben: bin halt noch am anfang vom programmieren.(soll jetzt aber keine ausrede sein)
Nichts für ungut, aber dann wäre der Beginnerbereich das nächste Mal die erste Wahl für dich. Denn eigentlich hätte meine Beschreibung reichen sollen und auch so: langfristig gesehen bringt es dir gar nichts immer nach Codes zu fragen. Mit fremden Codes ist das lernen viel viel schwieriger als mit Eigeninitiative und rumprobieren. |
||
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2 |
.erazer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
mir ging es nur um die funktionsweise, daher wäre code hilfreich gewesen.
@garret: ist dein beispiel auch für ein größeres feld geeignet? also eben ein 5x5 feld, wo irgendwo mittendrin ein stein, oder mehr entfernt werden, und dadurch alles darüberliegende runter fällt. so, nun nerv ich nicht weiter. p.s. ich lern schon anderem code, weil mir die funktionsweise dadurch offenbart wird. |
||
![]() |
garret |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mein Code sollte dir nur die Funktionsweise für einen Stein zeigen. Was hindert dich daran, es bei den 24 anderen Steinen prinzipiell auch so zu machen? ![]() Aber bitte übernimm den Code jetzt nicht 1:1 und verwende X1, X2 oder so! Dim ![]() ![]() -> Ich möchte aber betonen, dass du dich erst dann um das Gleiten der Steine kümmern solltest, wenn du es geschafft hast, dass diese überhaupt fallen, denn Gleiten ist ja nur Kosmetik ![]() Edit: Ich habe obigen Code noch mal überarbeitet, weil die Positionskoordinate ständig stieg. Jetzt ist ihre Bewegung von der Bedingung SteinFaellt = True abhängig. MfG garret |
||
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht) |
.erazer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
da hab ich schon hinbekommen, hab mittels types die steinfarbe gespeichert, und beim fallen werden die dann eben sozusagen verschoben. | ||
![]() |
SpionAtom |
![]() Antworten mit Zitat ![]() |
---|---|---|
https://www.blitzforum.de/foru...hp?t=27622
Zugegeben, leicht zu finden ist es nicht wenn man Bejeweled nicht kennt. |
||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group