Rechteck, welches mit DrawRect gezeichnet wurde, löschen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

denismu321

Betreff: Rechteck, welches mit DrawRect gezeichnet wurde, löschen

BeitragMi, Dez 22, 2021 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Xeres

Moderator

BeitragMi, Dez 22, 2021 23:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

denismu321

BeitragMi, Dez 22, 2021 23:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragDo, Dez 23, 2021 0:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

denismu321

BeitragDo, Dez 23, 2021 10:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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.
 

denismu321

Betreff: Hallo und frohes Fest

BeitragFr, Dez 24, 2021 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

 

denismu321

Betreff: hier noch ein Update

BeitragFr, Dez 24, 2021 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 25, 2021 10:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Global Liste:TList =New TList
Field X:Int, Y:Int, B:Int, H:Int
End Type


Programmiertechnisch ist das jetzt als hättet Du eine Variable mit "Untervariablen"

BlitzMax: [AUSKLAPPEN]
Local Brick:BrickTyp = New BrickTyp
Brick.X=x*80
Brick.Y=x*30
Brick.B=70
Brick-H=20



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
Brick.Draw
Next


Damit malt sich nun jeder Brick selbst an die richtige Position. Das macht er mit einer sogenannten Methode:
BlitzMax: [AUSKLAPPEN]
Method Draw()
DrawRect X , Y , B , H
End Method

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()
If (ballX>X) And (ballX<=X+B) And (ballY>Y) And BallY<Y+H)
Return True
EndIf
Return False
End Method


Alles sieht plötzlich so übersichtlich aus dank Typen.

Hier mal ein Gesamt-Überblick:

BlitzMax: [AUSKLAPPEN]
Type BrickTyp
Global Liste:TList =New TList
Field X:Int, Y:Int, B:Int, H:Int

Function AddBrick(xpos:Int, ypos:Int)
Local Brick:BrickTyp = New BrickTyp
Brick.X = xpos*80
Brick.Y = ypos*30
Brick.B=70
Brick.H=20
Liste.AddLast Brick
End Function

Function CheckAll()
For Local Brick:BrickTyp = EachIn Liste
If Brick.Check() =True
Liste.Remove Brick
EndIf
Next
End Function

Method Check:Int()
If (ballX>X) And (ballX <=X+B And (ballY>Y) And BallY<Y+H)
Return True
EndIf
Return False
End Method

Function DrawAll()
For Local Brick:BrickTyp = EachIn Liste
Brick.Draw
Next
End Function

Method Draw()
DrawRect X , Y , B , H
End Method
End Type



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
Global BallX, BallY

' erstellen aller bricks:
For Local y:Int =1 To 5
For Local X:Int= 1 To 13
BrickTyp.AddBrick x,y
Next
Next

' malen aller bricks:
Repeat
Cls
BrickTyp.DrawAll
Flip
Until AppTerminate()


Und hier mal eine komplettes Demo mit Kollision und sogar schon in "Farbe":

BlitzMax: [AUSKLAPPEN]
Graphics 800,600
Global BallX:Int=200, BallY:Int=350

' erstellen aller bricks:
For Local y:Int =1 To 5
For Local X:Int= 1 To 13
BrickTyp.AddBrick x,y
Next
Next

' malen aller bricks:
Repeat
Cls
BrickTyp.DrawAll
BallMalen
BrickTyp.CheckAll
Flip
Until AppTerminate()



Type BrickTyp
Global Liste:TList = New TList
Field X:Int, Y:Int, B:Int, H:Int
Field Farbe

Function AddBrick(xpos:Int, ypos:Int)
Local Brick:BrickTyp = New BrickTyp
Brick.X = xpos*80
Brick.Y = ypos*30
Brick.B=70
Brick.H=20
Brick.Farbe=Rand(0,3)
Liste.AddLast Brick
End Function

Function CheckAll()
For Local Brick:BrickTyp = EachIn Liste
If Brick.Check() =True
Liste.Remove Brick
EndIf
Next
End Function

Method Check:Int()
If (ballX>X-17) And (ballX<X+B) And (ballY>Y-17) And (BallY<Y+H)
Return True
EndIf
Return False
End Method

Function DrawAll()
For Local Brick:BrickTyp = EachIn Liste
Brick.Draw
Next
End Function

Method Draw()
SelectFarbe Farbe
DrawRect X , Y , B , H
End Method
End Type


Function SelectFarbe(Nr:Int)
Select nr
Case 0
SetColor 255,0,0
Case 1
SetColor 0,255,0
Case 2
SetColor 255,255,0
Case 3
SetColor 0,0,255
End Select
End Function

Function BallMalen()
BallX:+1
BallY:-1
SetColor 111,111,111
DrawOval BallX,BallY,17,17
End Function


  • Zuletzt bearbeitet von Midimaster am Sa, Dez 25, 2021 20:21, insgesamt einmal bearbeitet
 

denismu321

Betreff: Hallo Midimaster

BeitragSa, Dez 25, 2021 12:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragSa, Dez 25, 2021 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
~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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group