BPS #18: Klicki Bunti - Auswertung

Übersicht BlitzMax, BlitzMax NG 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:
BlitzMax: [AUSKLAPPEN]
SuperStrict
' BPS: Holzchopf - Klicki bunti

Graphics 800,600 ' Grafikfenster erstellen
Global timer:TTimer=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
Local rectList:TList = New TList ' Liste, die alle Rechtecke beinhaltet

' Hauptschleife
While Not (KeyDown(KEY_ESCAPE) Or AppTerminate())
' Eingabe
Local mx% = MouseX() ' Mausposition
Local my% = MouseY()
Local mh1% = MouseHit(MOUSE_LEFT) ' 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)
rectList.AddLast(rc) ' Das Rechteck wird noch der Liste hinzugefügt
EndIf
' Ausgabe
Cls ' Bildschirm leeren
For Local rc:TRect = EachIn rectList ' Alle Rechtecke durchgehen
If rc.size>0 ' und zeichnen (wenn die Grösse es zulässt)
SetColor rc.r, rc.g, rc.b
DrawRect rc.x-rc.size, rc.y-rc.size, rc.size*2, rc.size*2
rc.size:-1
Else ' oder löschen
rectList.Remove(rc)
EndIf
Next
WaitTimer(timer) ' Timer abwarten für FPS-Begrenzung
Flip 0 ' Buffer ohne vsync flippen (CPU-Last-Minimierung)
Wend
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)
  • Zuletzt bearbeitet von Xeres am Di, Apr 10, 2012 19:39, insgesamt einmal bearbeitet

skey-z

BeitragMo, März 26, 2012 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Kurze Beschreibung:

Quadrate werden per Mausklick erstellt, Größe(32-128px), Farbe(0-255,rgb) und die Zeit(10-50ms), inderer sie sich verkleinern, werden per Zufall erstellt.
Sobald die Größe der Quadrate bei 0 angekommen ist, werden die entsprechenden Types aus der Liste entfern.

BlitzMax: [AUSKLAPPEN]

Rem
Project: Quads for BPS#18 - Klicki Bunti
Author: skey-z
EndRem


'sauberes_Programmieren_erzwingen
SuperStrict
SeedRnd MilliSecs()
'____________________________


'Bildschirmeigenschaften_____
Global gWidth:Int = 800
Global gHeight:Int = 600
Global gTimer:TTimer = CreateTimer(60)
Local quit:Byte

Graphics gWidth, gHeight
'____________________________


'Hauptschleife_______________
While Not quit

WaitTimer gTimer

'Eingabe
Local mx:Int = MouseX()
Local my:Int = MouseY()
Local mh:Byte = MouseHit(1)


'beenden
If KeyHit(KEY_ESCAPE) Or AppTerminate() Then quit = True


'aktualisieren
If mh Then
TQuads.Create(mx, my)
EndIf

TQuads.Update()


'zeichnen
TQuads.Draw()

SetColor(255, 255, 255)
SetRotation(0)
DrawText "Quads: " + TQuads.Count(), 5, 5

Flip 0
Cls
Wend
'____________________________


'Programm_beenden___________
TQuads.Clear()
End
'___________________________


'Type_Quads__________________

Type TQuads

'Liste
Global _list:TList = CreateList()
Field _link:TLink

'Listeneintrag_erstellen
Method New()
_link = _list.AddLast(Self)
End Method

'Listeneintrag_löschen
Method Remove()
_link.Remove()
End Method

'Attribute
Field _x:Int, _y:Int
Field _size:Int
Field _colR:Byte, _colG:Byte, _colB:Byte
Field _time:Int, _update:Int


'Quad_erstellen
Function Create:TQuads(x:Int, y:Int)

Local quad:TQuads = New TQuads

'Position
quad._x = x
quad._y = y

'Größe
quad._size = Rand(32, 128)

'Farbe
quad._colR = Rand(255)
quad._colG = Rand(255)
quad._colB = Rand(255)

'Aktualisierung
quad._time = MilliSecs()
quad._update = Rand(10, 50)
End Function


'Quads_aktualisieren
Function Update:TQuads()
For Local quad:TQuads = EachIn TQuads._list
If quad._size > 0 Then
If (MilliSecs() > quad._time+quad._update) Then
quad._size :- 1
quad._time = MilliSecs()
EndIf
Else
quad.Remove()
EndIf
Next
End Function


'Quads_zählen
Function Count:Int()
Local index:Int
For Local quad:TQuads = EachIn TQuads._list
index :+ 1
Next
Return index
End Function


'Quads_zeichnen
Function Draw:TQuads()
For Local quad:TQuads = EachIn TQuads._list

'Farbe_setzen
SetColor(quad._colR, quad._colG, quad._colB)

'Quadrate_zeichnen
DrawRect quad._x-quad._size/2, quad._y-quad._size/2, quad._size, quad._size
Next
End Function


'Quads_löschen
Function Clear:TQuads()
For Local quad:TQuads = EachIn TQuads._list
quad.Remove()
Next
End Function
End Type
'____________________________
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

BlitzMoritz

BeitragMi, März 28, 2012 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier der nachgelieferte Code der "Diamonds aren't forever"-Exe:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Local timer:TTimer = CreateTimer(60)
AppTitle = "Diamonds aren't forever"
Graphics 800,600
AutoMidHandle(True)

'die Farbspektrum-RGB-Arrays im Abstand 8
'fuer die "Regenbogen-Faerbung beim Mausziehen":
Global Red@[192], Green@[192], Blue@[192]
For Local i@ = 0 To 31
Red[i] = 255
Green[i] = i*8
Red[32+i] = 255 - i*8
Green[32+i] = 255
Green[64+i] = 255
Blue[64+i] = i*8
Green[96+i] = 255 - i*8
Blue[96+i] = 255
Blue[128+i] = 255
Red[128+i] = i*8
Blue[160+i] = 255 - i*8
Red[160+i] = 255
Next

'Im Folgenden wird die Klasse von Quadraten definiert,
'die der Benutzer per Mausklick auf den Bildschirm setzt:
Type TDiamond

'die Seitenlaenge des Quadrates:
Const DiamondSize% = 40

'das kleine "Extra": ein Bild statt DrawRect()
Global Image:TImage

'die Liste, in der alle erschaffenen Diamanten gesammelt werden:
Global List:TList = CreateList()

'individuelle Eigenschaften eines einzelnen Diamanten:
Field time%, x%, y%, scale#, rotation%, rotation_progress%, RGB@[3]
'(Erstellungszeit, Position, Groesse, Drehung und Farbe)

'einen neuen Diamanten erstellen und der Liste hinzufuegen:
Function Create(new_x%, new_y%)
Local NewDiamond:TDiamond = New TDiamond

'bestimmte Position:
NewDiamond.x = new_x
NewDiamond.y = new_y

'zufaellige Eigenschaften:
NewDiamond.scale = 1.0 + Rnd() + Rnd()
NewDiamond.rotation = Rand(0,89)
NewDiamond.rotation_progress = Rand(180, 540) * (1-2*Rand(0,1))
NewDiamond.time = MilliSecs()

'Zufallsfarbe zeitabhaengig machen, um beim Mausziehen Regenbogenfarben zu erzeugen:
Local temp_RGB_index% = (NewDiamond.time / 10) Mod 192
NewDiamond.RGB = [Red[temp_RGB_index], Green[temp_RGB_index], Blue[temp_RGB_index]]

List.addlast(NewDiamond)
End Function

Function draw()
'aktuelle Zeit:
Local time% = MilliSecs()

'Alle Diamanten der Liste durchgehen:
For Local D:TDiamond = EachIn List
Local progress# = 1.0 - (time - D.time) / 4000.0

'verkleinern und malen, falls noch nicht 4 Sekunden vergangen sind
If progress > 0 Then

SetColor D.RGB[0], D.RGB[1], D.RGB[2]
Local temp_scale# = progress*progress*D.scale
SetScale temp_scale, temp_scale
SetRotation D.rotation + Sqr(progress) * D.rotation_progress

Local special_progress# = 0.75*(1-progress)^0.75
Local temp_x# = D.x - special_progress * (D.x - 400)
Local temp_y# = D.y - special_progress * (D.y - 300)


DrawImage Image, temp_x, temp_y

'ansonsten aus der Liste entfernen:
Else
List.remove(D)
D = Null
End If
Next

End Function

'eine bescheidene "Diamant-Zeichen-Funktion":
Function CreateGreyDiamond(size%)
Local Grey%, DrawSize%
For Local i% = 0 To size/2
Grey = 510.0 * i / size
SetColor Grey, Grey, Grey
DrawSize = size - i - i
DrawRect i, i, DrawSize, DrawSize
Next
Image = LoadImage(GrabPixmap(0,0,size,size))
End Function

End Type

'Das Erstelenn des "Diamant-Images":
TDiamond.CreateGreyDiamond(TDiamond.DiamondSize)

'====================================

'Es folgt die Klasse der anderen kleinen Lichtflecken,
'die lediglich fuer die Perspektiven-Wirkung benutzt
'wird, ansonsten fuer die BPS-Aufgabe irrelevat ist
'und daher nicht weiter kommentiert werden muss:
Type TMiniStar

Global List:TList = CreateList()

Field x%, y%, time%, duration#

Function CreateAll(count% = 50)
Local temp_time% = MilliSecs()
For Local c% = 1 To count
Local NewMiniStar:TMiniStar = New TMiniStar
NewMiniStar.x = Rand(-400,1200)
NewMiniStar.y = Rand(-300,900)
NewMiniStar.duration = 16.0*Sqr((NewMiniStar.x-400)^2 + (NewMiniStar.y-300)^2)
NewMiniStar.time = temp_time - 1000
List.addLast(NewMiniStar)
Next
End Function

Function drawAll()
SetRotation 45
Local time% = MilliSecs()
For Local MiniStar:TMiniStar = EachIn List
MiniStar.draw(time)
Next
SetScale 1,1
End Function

Method draw(new_time%)
Local progress# = Sqr((new_time - time) / duration)
If progress < 1 Then
Local temp_x# = x - progress * (x-400)
Local temp_y# = y - progress * (y-300)
Local temp_color% = 255 - progress * 255
SetColor temp_color, temp_color, temp_color
'DrawImage TDiamond.Image, temp_x, temp_y
DrawRect temp_x, temp_y, 6-5*progress, 6-5*progress
Else
restart(new_time)
End If

End Method

Method restart(new_time%)
Local Random% = Rand(0,3)
If Random = 0 Then
x = Rand(-400, -100)
y = Rand(0,600)
ElseIf Random = 1 Then
x = 800 + Rand(100,400)
y = Rand(0,600)
ElseIf Random = 2 Then
x = Rand(0,800)
y = Rand(-300, -100)
Else
x = Rand(0,800)
y = 600 + Rand(100,300)
End If
duration = 16.0*Sqr((x-400)^2 + (y-300)^2)
time = new_time
End Method

End Type

TMiniStar.CreateAll()

'Die Blende ist Geschmacksache:
SetBlend LightBlend

'In den folgenden Variablen wird die Mausposition
'beim Klicken gespeichert, um beim Mausziehen nur
'dann Diamanten hinzuzufuegen, wenn sich ihre
'Position ausreichend veraendert hat:
Local MemoX%, MemoY%

'====================================

'Hauptschleife:
Repeat

'Der (unwichtige) "Hintergrund":
Cls
SetScale 1,1
SetRotation 0
TMiniStar.drawAll()

'Alle Diamanten verwalten bzw. zeichnen:
TDiamond.draw()

'Bei Mausklick, neuen Diamant an bestimmter Stelle erstellen:
If MouseDown(1) Then
Local Mouse_X% = MouseX()
Local Mouse_Y% = MouseY()
If Abs(Mouse_X - MemoX) > TDiamond.DiamondSize/2 Or Abs(Mouse_Y - MemoY) > TDiamond.DiamondSize/2 Then
TDiamond.Create(Mouse_X, Mouse_Y)
MemoX = Mouse_X
MemoY = Mouse_Y
End If
Else
MemoX = -999
MemoY = -999
End If

Flip 0
WaitTimer(timer)

Until KeyDown(KEY_ESCAPE) Or AppTerminate()

End

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group