BPS #18: Klicki Bunti - Auswertung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Xeres

Moderator

Betreff: BPS #18: Klicki Bunti - Auswertung

BeitragMo, März 26, 2012 11:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Okaydokay, dann zeigt mal her!

Das war die Aufgabe

Postet hier eure Ergebnisse, Codes, Gedanken. Lernt von den anderen, seht euch deren Quelltext an und versucht euren eigenen zu verbessern.

Diskussion
Postet zu euren Codes stets eine kurze Erklärung mit euren Gedanken in denen ihr simpel gesagt die Frage "Wieso habe ich XY auf diese Art gelöst?" beantwortet. Beiträge, die nur den Code enthalten werden wir aus dem Thread entfernen.

Nächste Aufgabe
In einer Woche wird die Musterlösung nach editiert und in 2 die nächste Aufgabe eingestellt.

Viel Spaß & viel Erfolg!

Musterlösung:
BlitzBasic: [AUSKLAPPEN]
; BPS: Holzchopf - Klicki bunti

Graphics 800,600,0,2 ; Grafikfenster erstellen
SetBuffer BackBuffer() ; Double-Buffering aktivieren
Global timer=CreateTimer(50) ; FPS-Begrenzung (50/s)
SeedRnd MilliSecs() ; Zufallsgenerator streuen

; Type für die erstellten Rechtecke (damit die Anzahl nicht begrenzt ist)
Type TRect
Field x,y ; Position
Field size ; Grösse
Field r,g,b ; Farbe
End Type

; Hauptschleife
While Not KeyDown(1)
; Eingabe
Local mx = MouseX() ; Mausposition
Local my = MouseY()
Local mh1 = MouseHit(1) ; Maustasteneingabe
; Verarbeitung
If mh1 Then ; Wenn die linke Maustaste gedrückt wurde,
Local rc.TRect = New TRect ; wird ein neues Rechteck erstellt,
rc\x = mx ; mit den Mauskoordinaten positioniert
rc\y = my
rc\size = Rand(50,100) ; und mit einer zufälligen Grösse versehen.
rc\r = Rand(0,255) ; Zudem wird eine zufällige Farbe generiert
rc\g = Rand(0,255)
rc\b = Rand(0,255)
EndIf
; Ausgabe
Cls ; Bildschirm leeren
For rc = Each TRect ; Alle Rechtecke durchgehen
If rc\size>0 ; und zeichnen (wenn die Grösse es zulässt)
Color rc\r, rc\g, rc\b
Rect rc\x-rc\size, rc\y-rc\size, rc\size*2, rc\size*2
rc\size = rc\size -1
Else ; oder löschen
Delete rc
EndIf
Next
WaitTimer(timer) ; Timer abwarten für FPS-Begrenzung
Flip 0 ; Buffer ohne vsync flippen (CPU-Last-Minimierung)
Wend
  • Zuletzt bearbeitet von Xeres am Di, Apr 10, 2012 19:39, insgesamt 2-mal bearbeitet

ozzi789

BeitragMo, März 26, 2012 12:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe alles in kleine Funktionen aufgesplittet, sodass der Code leicht verständlich ist.
Beachtet die Kommentare, mit ihnen sollte der Code selbsterklärend sein.


Grüsse, ozzi

Code: [AUSKLAPPEN]
;ozzi789
;14.3.2012
;---------


Type quad
   Field x
   Field y
   Field r
   Field g
   Field b
   Field quad_dimension_instance
End Type


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

timer=CreateTimer(45)
Global mx,my,mh,md,quad_dimension=50
Const quad_dimension_half=25


While Not KeyHit(1)
   Cls
   get_input()
   update_quads()
   render_quads()
   render_info()
   WaitTimer timer   
   Flip 0
Wend



Function render_quads()
   ;Jedes Quadrat durchgehen und zeichnen
   For q.quad=Each quad
      Color q\r,q\g,q\b ;Die Farbe wird im Type gespeichert
      Rect q\x,q\y,q\quad_dimension_instance,q\quad_dimension_instance
   Next
End Function


Function render_info()
   Color 255,255,255
   Text 0,0,"Linke Maustaste klicken: 1 Quadrat erstellen"
   Text 0,20,"Rechte Mauste halten: Kontinuierlich Quadrate erstellen"
   Text 0,40,"Anzahl Quadrate:"+count_quads()
End Function



Function get_input()
   ;Eingabegeräte abfragen
   mx=MouseX()
   my=MouseY()
   mh=MouseHit(1)
   md=MouseDown(2)
   ;Wurde die Maustaste gedrückt/gehalten , dann erstell uns ein neues Quad
   If mh=1 Xor md=1 Then create_quad()
End Function


Function create_quad()
   q.quad=New quad
      q\x=mx-quad_dimension_half ; Sodass der Quadmittelpunkt dort liegt wo sich die Maus befindet
      q\y=my-quad_dimension_half
      q\quad_dimension_instance=quad_dimension
      q\r=Rand(20,200)
      q\g=Rand(20,200)
      q\b=Rand(20,200)
End Function

Function count_quads()
   ;Quad Anzahl ermitteln
   Local counter=0
   For q.quad=Each quad
      counter=counter+1
   Next
   Return counter
End Function


Function update_quads()
   For q.quad=Each quad
      ;Das Quad verkleinern
      q\quad_dimension_instance=q\quad_dimension_instance-1
      ;Ist die Quadgrösse ungerade
      If q\quad_dimension_instance Mod 2
         ;Das Quad nachrücken (sodass der Effekt entsteht es werde von allen Ecken kleinern, nicht nur von rechts unten)
         q\x=q\x+1
         q\y=q\y+1
      EndIf
      ;Falls die Grösse kleiner als 1 wird können wir es der Performance zuliebe löschen
      If q\quad_dimension_instance<1 Then Delete q.quad
   Next
End Function


0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Dicker Hobbit

BeitragMo, März 26, 2012 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
So hier mal meine erste Teilnahme an der BPS!
Das ist nur das absolute Minimum was benötigt wird, mit Schönheitsidealen habe ich mich nicht beschäftigt (da ich sowiso nicht künstlerisch veranlagt bin lege ich darauf auch keinen großen Wert Wink . )

Ich denke der Code ist ausreichend kommentiert und bedarf keiner weiteren Erklärung.
BlitzBasic: [AUSKLAPPEN]

Graphics 800, 480, 16, 2
SetBuffer BackBuffer()
HidePointer()

;quadrattype erstellen
Type quadrat
Field x,y
Field red
Field green
Field blue
Field width
Field height
End Type

timer=CreateTimer(60)

Global size=200

While Not (KeyDown(1))
Cls
quadrateaktualiesieren
malequadrate()
WaitTimer(timer)
Flip(0)




Wend

WaitKey()

End


Function malequadrate()
If MouseHit(1) Then
;neues Quadrat erstellen wenn maustaste gedrückt
q.quadrat=New quadrat
q\x=MouseX()
q\y=MouseY()
q\red = Rnd(255)
q\green=Rnd(255)
q\blue=Rnd(255)
q\height=size
q\width=size
EndIf


;alle Quadrate zeichnen
For q.quadrat=Each quadrat
Color q\red, q\green, q\blue
Rect q\x, q\y, q\width, q\height, 1
Next



End Function

Function quadrateaktualiesieren()
For q.quadrat=Each quadrat
;verkleinern
q\height=q\height-1
q\width=q\width-1
;Prüfen ob Quadrate eine Minimalgröße erreicht haben (0)
If q\height<1 Then Delete q.quadrat
Next
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group