Rechteck, welches mit DrawRect gezeichnet wurde, löschen
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
denismu321Betreff: Rechteck, welches mit DrawRect gezeichnet wurde, löschen |
Mi, Dez 22, 2021 22:34 Antworten mit Zitat |
|
---|---|---|
Ich arbeite gerade an einem kleinen Spiel.
So eine Art Pong , mit Steinen an der oberen Seite des Fensters, welche verschwinden sollen, wenn sie getroffen werden. Noch eine Frage wäre , wie ich ,wenn der Spieler das Spiel neu anfängt, alle Steine wieder resette ? Über eine kleine Antwort würde ich mich freuen, Danke, Denis. |
||
XeresModerator |
Mi, Dez 22, 2021 23:07 Antworten mit Zitat |
|
---|---|---|
Hallo.
Die Frage ist, wie du aktuell die Steine definierst. Ein Array wäre eine passende Datenstruktur dafür. Dann kannst du für jedes Level das Array mit dem Anfangszustand befüllen, aus einem Data-Block oder einer Datei. Wenn du hier den relevanten Code Ausschnitt mit einfügst, kann man dir konkretere Hilfe geben. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
denismu321 |
Mi, Dez 22, 2021 23:24 Antworten mit Zitat |
|
---|---|---|
Hallo Xeres,
im Moment benutze ich eine Funktion dazu ,diese hier : Code: [AUSKLAPPEN] Function buildBricks:Int(wallOneX:Int[]) For Local y=0 To 13 wallOneX[y] = y * 100 SetColor(30, 200, 0) DrawRect(wallOneX[y],wallOneY[y], width[y], height[y]) Next EndFunction damit lassen sich prima ca. 13 steine im oberen Bild positionieren. Jedes mal ,wenn der Ball einen Stein berührt gebrauche ich diesen code : Code: [AUSKLAPPEN] For Local x=0 To 13 If ((ballX > wallOneX[x] - width[x]) And (ballX < wallOneX[x] + width[x]) And (ballY <= wallOneY[x]) + height[x])) speedX = speedX * -1 speedY = speedY * -1 wallOneX[x] = -500 wallOneY[x] = -500 End If Next |
||
XeresModerator |
Do, Dez 23, 2021 0:52 Antworten mit Zitat |
|
---|---|---|
Wenn du die Blöcke über die Arrays abbildest, dann ist die Lösung für dein Anliegen die Werte einfach auf ihren Ursprünglichen Wert zurück zu setzen.
Ansonsten fällt mir auf: - Wenn du mehrere eindimensionale Arrays benutzt, sollten sie einheitlich benannt sein, damit klar ist, was zusammen gehört. - Wenn die Arrays schon global sind (und das müssen sie sein, wenn sie in der Funktion verwendet werden), dann übergebe nicht eins davon nochmal als Funktionsparameter - immer alles einheitlich machen. - Das SetColor(30, 200, 0) bleibt immer gleich, könnte also auch einmal vor der Schleife gesetzt werden. - Konstante Werte wie hier 13 für die Anzahl der Blöcke sollten in eine Variable, dann lässt sich das Zentral an einer Stelle anpassen. - Der "status" der Steine wird nirgendwo mit geschrieben, darum musst du die Steine gerade irgendwo auf negative Koordinaten verschieben. Um zu wissen ob alle Steine getroffen wurden, könntest du zumindest die Anzahl der deaktivierten Steine zählen. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
denismu321 |
Do, Dez 23, 2021 10:43 Antworten mit Zitat |
|
---|---|---|
Hallo Xeres noch mal,
ich werde versuchen meinen Code anzupassen und dann schauen ,ob er besser funktioniert. Du hast mir ja ein paar Punkte gegeben ,wo ich den code verbessern könnte. Ich melde mich in diesem Thread nochmal, wenn ich ein Stück weitergekommen bin, aber vorerst erstmal vielen Dank für deine Mühe. Hoffentlich bis bald, Denis. |
||
denismu321Betreff: Hallo und frohes Fest |
Fr, Dez 24, 2021 20:33 Antworten mit Zitat |
|
---|---|---|
Ich habe jetzt noch einmal etwas ausprobiert, aber ich muss sagen, ich kriege das mit dem Löschen von Elementen von Arrays mit mehr als einer Dimension nicht ganz hin.
Angeblich gibt es eine Delete Funktion ? Hier ein Stück Code: Code: [AUSKLAPPEN] If (ballX >= blockX[a,b] - width[a,b]) And (ballX <= blockX[a,b] + width[a,b]) And (ballY < blockY[a,b]) DebugLog("ball hit brick at " + a + " and " + b) speedX = speedX * -1 speedY = speedY * -1 blockX[a,b] = -1200 blockY[a,b] = -1200 DebugLog("block array has " + blockX.length + " elements") DebugLog("removing array at " + a + " and " + b) EndIf |
||
denismu321Betreff: hier noch ein Update |
Fr, Dez 24, 2021 20:49 Antworten mit Zitat |
|
---|---|---|
Code: [AUSKLAPPEN] For Local a=0 To 6 For Local b=0 To 1 If (ballX >= blockX[a,b] - width[a,b]) And (ballX <= blockX[a,b] + width[a,b]) And (ballY < blockY[a,b]) 'width[a,b] = 0 'height[a,b] = 0 DebugLog("ball hit brick at " + a + " and " + b) speedX = speedX * -1 speedY = speedY * -1 hitBricks[a,b] = True DebugLog("block array has " + blockX.length + " elements") DebugLog("removing array at " + a + " and " + b) EndIf Next Next For Local a=0 To 6 For Local b=0 To 1 If hitBricks[a,b] = True blockX[a,b] = Null blockY[a,b] = Null EndIf Next Next |
||
Midimaster |
Sa, Dez 25, 2021 10:41 Antworten mit Zitat |
|
---|---|---|
Es gibt für das Löschen mehrere Möglichkeiten. Hast Du dich schon mal mit "Listen" und "Typen" beschäftigt? Hierbei werden die Steine nicht in ein Array eingefügt, sondern einfach in einer Liste geführt. Während beim Array die Koordinaten direkt aus der Array-Position errechnet werden können, brauchen wir bei Listen zwei weitere "Unter"-Variablen, die uns die Lage des Steins verraten.
Das ganze ist so mächtig, dass du es nie wieder vermissen möchtest, wenn Du es erst mal kapiert hast... Also.. jeder Brick ist ein Element vom Type "BrickTyp". Du definiertst den BrickTyp wie Du ihn brauchst. so hat er (beliebig viele Eigenschafte): X-Pos-, Y-Pos, seine Größe in Breit und Hoch. Aber du könntest auch noch weitere hinzufügen wie Leben oder BrickFarbe oder Farbe... BlitzMax: [AUSKLAPPEN] Type BrickTyp Programmiertechnisch ist das jetzt als hättet Du eine Variable mit "Untervariablen" BlitzMax: [AUSKLAPPEN] Local Brick:BrickTyp = New BrickTyp Nun kannst du so beliebig viele dieser Bricks erzeugen und sie zu einer Liste hinzufügen: BlitzMax: [AUSKLAPPEN] Liste.AddLast Brick und beim Sterben einfach auch wieder rausnehmen: BlitzMax: [AUSKLAPPEN] Liste.Remove Brick bis dahin sind Typen echt leicht zu verstehen. Was jetzt kommt erscheint einem unglaubwürdig, funktioniert aber... Um die einzelnen Elemente der Liste nun einzeln anzusprechen wird die Liste mit einer For Each-Schleife durchgegangen. Hierbei scheinen die vielen Bricks plötzlich alle den Variablennamen Brick zu haben. BlitzMax: [AUSKLAPPEN] For Local Brick:BrickType = EachIn Liste Damit malt sich nun jeder Brick selbst an die richtige Position. Das macht er mit einer sogenannten Methode: BlitzMax: [AUSKLAPPEN] Method Draw() darin definierst Du , wie er sich malen soll. ebenso leicht kann er sich selbst auf Kollision mit dem Ball testen: BlitzMax: [AUSKLAPPEN] Method Check:Int() Alles sieht plötzlich so übersichtlich aus dank Typen. Hier mal ein Gesamt-Überblick: BlitzMax: [AUSKLAPPEN] Type BrickTyp Um nun alle Bricks zu erschaffen benötigst du fast die gleiche Formel wie in Deinem Programm. Dieser Code geschieht außerhalb des Types: BlitzMax: [AUSKLAPPEN] Graphics 800,600 Und hier mal eine komplettes Demo mit Kollision und sogar schon in "Farbe": BlitzMax: [AUSKLAPPEN] Graphics 800,600 |
||
- Zuletzt bearbeitet von Midimaster am Sa, Dez 25, 2021 20:21, insgesamt einmal bearbeitet
denismu321Betreff: Hallo Midimaster |
Sa, Dez 25, 2021 12:06 Antworten mit Zitat |
|
---|---|---|
Das wird mir mit Sicherheit weiterhelfen.
Vielen, vielen Dank dafür. Ich habe schon etwas mit Listen rumprobiert, aber keinen Erfolg gehabt. Das soll sich jetzt , dank deiner Code Beispiele und deiner guten Erklärung ändern. Wenn ich Fortschritte gemacht habe, melde ich mich wieder. Bis dahin wünsche ich dir ein frohes Weihnachten, Denis. |
||
- Zuletzt bearbeitet von denismu321 am Sa, Dez 25, 2021 20:26, insgesamt einmal bearbeitet
XeresModerator |
Sa, Dez 25, 2021 20:02 Antworten mit Zitat |
|
---|---|---|
~VERSCHOBEN~ Scheint ja BlitzMax statt Blitzbasic zu sein. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht BlitzMax, BlitzMax NG Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group