BPS #3: Verfolgungswahn - Auswertung

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Xeres

Moderator

Betreff: BPS #3: Verfolgungswahn - Auswertung

BeitragMo, Feb 28, 2011 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Uuund Aus!

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 drei Tagen, am 3. März wird die Musterlösung nach editiert und die nächste Aufgabe eingestellt.

Viel Spaß & viel Erfolg!

Musterlösung:
BlitzBasic: [AUSKLAPPEN]
SeedRnd(MilliSecs())
Const gfx_w = 500, gfx_h = 500

Graphics(gfx_w, gfx_h, 0, 2)
SetBuffer(BackBuffer())
Local FrameTimer = CreateTimer(60)
HidePointer()

;* Konstanten erhöhen die Lesbarkeit!
Const KEY_ESC=1, Eyes_size = 48

;* Mauskoordinaten:
Global mx, my

;* Augenpaar gut sichtbar innerhalb des Fensters anzeigen:
Local Eyes_x = Rand(gfx_w * 0.2, gfx_w * 0.8)
Local Eyes_y = Rand(gfx_h * 0.2, gfx_h * 0.8)
Local Eyes_angle ;* Da wird die Richtung gespeichert, in die die Augen gucken.

Repeat
Cls
;* Oft benutzte Werte am besten zwischenspeichern!
mx = MouseX()
my = MouseY()

;* Obacht! ATan2 Erwartet als ersen Paramter Y nicht X!
;* hier gilt: Ziel - Start
;* Das Negative Vorzeichen sorgt für die Mathematisch korrekte
;* Drehrichtung des Winkels (gegen den Uhrzeigersinn)
;* (...+360) Mod 360 gibt a) einen Positiven Winkel der b) im Bereich 0-359 liegt.
Eyes_angle = (-ATan2(my - Eyes_y, mx - Eyes_x) + 360) Mod 360

;* Der Berechnete Winkel wird beim Zeichnen der Augen verwendet:
DrawAugen(Eyes_x, Eyes_y, Eyes_size, Eyes_angle)

;* Maus Zeichnen:
Color(0,200,0)
DrawCircle(mx, my, 16)

Flip(0)
WaitTimer(FrameTimer)
Until KeyHit(KEY_ESC)

Function DrawAugen(x, y, size, angle)
Color(255,255,255) ;* Farbe: Weiß
DrawCircle(x - size / 2, y, size) ;* Linkes Auge
DrawCircle(x + size / 2, y, size) ;* Rechtes Auge
Color(0,0,0) ;* Farbe: Schwarz
;* Rechte und Linke Puppille:
DrawCircle(x - size / 2 + Cos(angle) * size / 4, y - Sin(angle) * size / 4, size / 4)
DrawCircle(x + size / 2 + Cos(angle) * size / 4, y - Sin(angle) * size / 4, size / 4)
;* x - size / 2 + Cos(angle) * size / 4 =>
;* x - size / 2 = Mittelpunkt des Linken Auges
;* + Cos(angle) * size / 4 = Verschiebung in Richtung des Winkels um den Wert size / 4
End Function

Function DrawCircle(x,y,r)
;* Der Mittelpunkt des Kreises liegt bei x, y.
Oval(x-r/2, y-r/2, r, r)
End Function
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 Do, März 03, 2011 23:05, insgesamt einmal bearbeitet

BlitzMoritz

BeitragDi, März 01, 2011 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Razz Spaß muss sein ... vielleicht ein bisschen frech, nicht so ganz im Sinne des Erfinders und ohne jede trigonometrische Funktion. Daher gibt's auch nich' viel zu erklären. Aber warum eigentlich nicht so? - die Aufgabe ist ja erfüllt. Cool
BlitzBasic: [AUSKLAPPEN]
Global LinkeIris, LinkePupille, RechteIris, RechtePupille
Kopf_zusammenbauen()

Repeat ;Ich messe einfach den Abstand zwischen der Maus und der absoluten Bildschirmposition
;der Pupillen und füge noch den vermindernden Korrekturfaktor 0.1 hinzu, das war's.
;Den Rest erledigt die 3D-Funktion 'RotateEntity' Wink
RotateEntity(LinkeIris, 0.1 * (206 - MouseY()), 0.1 * (MouseX() - 306), 0)
RotateEntity(LinkePupille, 0.1 * (206 - MouseY()), 0.1 * (MouseX() - 306), 0)
RotateEntity(RechteIris, 0.1 * (206 - MouseY()), 0.1 * (MouseX() - 494), 0)
RotateEntity(RechtePupille, 0.1 * (206 - MouseY()), 0.1 * (MouseX() - 494), 0)
RenderWorld()
Flip
Until KeyDown(1)

Function Kopf_zusammenbauen()
Graphics3D 800, 600, 0, 2
Local Light = CreateLight(), pivot = CreatePivot(), camera = CreateCamera(pivot)
PositionEntity(camera, 0, 0, -12)
RotateEntity Light, 0, 75, 90
Kopf = CreateSphere(24)
EntityColor(Kopf, 255, 139, 100)
ScaleEntity(Kopf, 6, 8, 1)
EntityShininess(Kopf, 1)
Haare = CreateSphere(24)
EntityColor(Haare, 74, 37, 0)
PositionEntity(Haare, 0, 5, 1)
ScaleEntity(Haare, 6, 4, 1.75)
Nase = CreateCone(24)
EntityColor(Nase, 255, 119, 100)
PositionEntity(Nase, 0, 0, -0.75)
ScaleEntity(Nase, 1.5, 2, 1)
EntityShininess(Nase, 1)
Mund = CreateSphere(24)
EntityColor(Mund, 166, 0, 0)
PositionEntity(Mund, 0, -3.5, -0.9)
ScaleEntity(Mund, 2, 0.25, 0.25)
EntityShininess(Mund, 1)
LinkerAugapfel = CreateSphere(24)
PositionEntity(LinkerAugapfel, -2.25, 2.25, -1.25)
RechterAugapfel = CreateSphere(24)
PositionEntity(RechterAugapfel, 2.25, 2.25, -1.25)
LinkeIris = CreateSphere(24)
EntityColor(LinkeIris, 0, 0, 255)
PositionEntity(LinkeIris, -2.25, 2.25, -1.125)
ScaleEntity(LinkeIris, 0.8, 0.8, 1.25)
EntityShininess(LinkeIris, 1)
RechteIris = CreateSphere(24)
EntityColor(RechteIris, 0, 0, 255)
PositionEntity(RechteIris, 2.25, 2.25, -1.125)
ScaleEntity(RechteIris, 0.8, 0.8, 1.25)
EntityShininess(RechteIris, 1)
LinkePupille = CreateSphere(24)
EntityColor(LinkePupille, 0, 0, 0)
PositionEntity(LinkePupille, -2.25, 2.25, -1.125)
ScaleEntity(LinkePupille, 0.5, 0.5, 1.4)
EntityShininess(LinkePupille, 1)
RechtePupille = CreateSphere(24)
EntityColor(RechtePupille, 0, 0, 0)
PositionEntity(RechtePupille, 2.25, 2.25, -1.125)
ScaleEntity(RechtePupille, 0.5, 0.5, 1.4)
EntityShininess(RechtePupille, 1)
End Function

hazumu-kun

BeitragDi, März 01, 2011 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Sooo:

BlitzBasic: [AUSKLAPPEN]
; ###### BPS #3 - Paranoid
; #### Autor: Viken Emesh aka hazumu-kun
; #### Datum: 14.02.2011
; #### Kontakt: kevin66@hotmail.de
; #### Beschreibung:
; #### Eine Schaar von Augen um den paranoiden Betrachter nochmehr zu schädigen.
; ####
; #### ACHTUNG: Komplizierte Mathematik inside
; #### HINWEIS: In Augen zu stechen macht einen Riesenspaß!
; ******

; #### Konstanten
Const EYE_WIDTH = 60
Const EYE_HEIGHT = 80

Const EYE_COL_WHITE = $FFEEEE
Const EYE_COL_RED = $FF9999

Const EYE_RED_TIME = 2250
Const EYE_VEINS = 25
Const EYE_VEINS_RED = 75

Const EYE_COUNT = 10
; ****

; #### Globale/Dims
Global timer_fps
Global mx#,my#
Global dmax#

Dim minside(EYE_COUNT-1)
Dim poke(EYE_COUNT-1)
Dim poke_start(EYE_COUNT-1)
Dim img_Veins(EYE_COUNT-1)
Dim Eye(EYE_COUNT,1)
; ****

Local i

; #### Initialisierung
AppTitle "Paranoid by Viken Emesh"
Graphics 800,600,0,2

timer_fps= CreateTimer(30)
SeedRnd MilliSecs()

;Augen vorbereiten
For i=0 To EYE_COUNT
img_Veins(i)= CreateImage(EYE_WIDTH,EYE_HEIGHT,2,2)
SetBuffer ImageBuffer(img_Veins(i),0)
DrawVeins(EYE_VEINS)
SetBuffer ImageBuffer(img_Veins(i),1)
DrawVeins(EYE_VEINS_RED)

Eye(i,0)= Rand(EYE_WIDTH/2,800-EYE_WIDTH/2)
Eye(i,1)= Rand(EYE_HEIGHT/2,600-EYE_HEIGHT/2)

MaskImage img_Veins(i),1,1,1
Next
SetBuffer BackBuffer()
; ****

; #### Mainloop
While Not KeyHit(1)
mx= MouseX():my=MouseY()

For i= 0 To EYE_COUNT-1
If poke(i) Then
If MilliSecs()-poke_start(i)>EYE_RED_TIME Then
poke(i)=0
EndIf
EndIf
Next

For i= 0 To EYE_COUNT-1
minside(i)= DrawEye (Eye(i,0),Eye(i,1),EYE_WIDTH,EYE_HEIGHT,i)
Next

If MouseHit(1) Then
For i= 0 To EYE_COUNT-1
If minside(i) And (Not poke(i)) Then
poke(i)= 1
poke_start(i)= MilliSecs()
EndIf
Next
EndIf

Flip 0
WaitTimer (timer_fps)
Cls
Wend
; ****

End

; #### Funktionen
Function DrawEye (x#,y#,w#,h#,n)
;Zeichnet ein Auge, das auf P(mx|my) schaut
;return:
; 1 wenn die Maus im Auge ist
Local ang#
Local minside
Local i

ang#= ( ATan2#(Float#(mx#-x#),Float#(my#-y#)) +360) Mod 360

;Prüfen ob die Maus im Auge ist.
If Sqr#((mx#-x#)^2+(my#-y#)^2)< Sqr#((Sin#(ang#)*EYE_WIDTH)^2+(Cos#(ang#)*EYE_HEIGHT)^2)*0.25 Then ;boah sieht das Kacke aus...
minside= 1
EndIf

;Augenweiß
If poke(n) Then
Color 0,0,EYE_COL_RED
Else
Color 0,0,EYE_COL_WHITE
EndIf
Oval (x#-w#/2),(y#-h#/2),w#,h#

;Adern
DrawImage img_Veins(n),x#-w#/2,y#-h#/2,poke(n)

;Iris
Color 0,0,$33CC00
If minside Then
Oval mx#-w#/4,my#-h#/4,w#/2,h#/2
Else
Oval x#+(w#/4)*(Sin#(ang#)-1.) , y#+(h#/4)*(Cos#(ang#)-1.) , w#/2 , h#/2
EndIf

;Pupille
Color 0,0,0
If minside Then
Oval mx#-w#/8,my#-h#/8,w#/4,h#/4
Else
Oval x#+(w#/4)*(Sin#(ang#)-.5) , y#+(h#/4)*(Cos#(ang#)-.5) , w#/4 , h#/4
EndIf

Return minside
End Function

Function DrawVeins(n)
;Zeichnet die Äderchen im Auge
Local i
Local sx#,sy#,ex#,ey#
Local ang#,d#
Local dmax#

;Entfernung Augenrand bis Mitte, passend zum Winkel zum Mauszeiger
dmax#= Sqr#((Sin#(ang#)*EYE_WIDTH)^2+(Cos#(ang#)*EYE_HEIGHT)^2)/2

Cls
Color 1,1,1
Rect 0,0,EYE_WIDTH,EYE_HEIGHT
Color 0,0,$FF0000
For i= 0 To n
ang#= Rnd#(0,360)
sx#= (EYE_WIDTH/2.)*(1+Cos#(ang#))
sy#= (EYE_HEIGHT/2.)*(1+Sin#(ang#))

d#= Rnd#(1,dmax#)
ex#= sx#-Cos#(ang#)*d#
ey#= sy#-Sin#(ang#)*d#
Line sx#,sy#,ex#,ey#
Next

;Leere Stelle in der Mitte, über Mask-Farbe
Color 1,1,1
Oval EYE_WIDTH*(.5-.25),EYE_HEIGHT*(.5-.25),EYE_WIDTH/2.,EYE_HEIGHT/2.
End Function
; ****


Die Ausrichtung der Iris war etwas knifflig. Ansonsten eine gute Übung zur Trigonometrie.

Außerdem ist die Augenzahl variabel. ^^

Piekst mal in ein Auge rein Wink
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Xeres

Moderator

BeitragDi, März 01, 2011 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
@hazumu-kun:
Zu viele Parameter in "CreateImage" - ich schätze mal, nur ",2" zu viel hat sich rein geschlichen.
MouseHit(1) würde ich auch aus bekannten Gründen grundsätzlich in einer Variable zwischenspeichern.
Ansonsten schön mit Konstanten gearbeitet & nettes Extra - fein, fein!

@BlitzMoritz:
Die Aufgabe lösen, in dem man sie umgeht, ist natürlich legitim. Smile
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)

hazumu-kun

BeitragMi, März 02, 2011 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit CreateImage hat seine Richtigkeit, da ein Augenweiß 2 Frames (normal und gepiekt) hat.
Ansonsten sehe ich keinen Grund Mousehit zwischenzuspeichern, da ich es wirklich nur an einer Stelle aufrufe.

Danke Xeres ^^
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

hazumu-kun

BeitragMi, März 02, 2011 20:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Huch hier ist der Post geklont worden, leider wurde der Klon schon vom FBI entführt, hier gibt es nichts zu sehen, gehen sie bitte weiter.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent
  • Zuletzt bearbeitet von hazumu-kun am Mi, März 02, 2011 20:11, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragMi, März 02, 2011 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann benutzt du B+?
Code: [AUSKLAPPEN]
CreateImage(EYE_WIDTH, EYE_HEIGHT, 2, 2)
CreateImage (breite, hoehe [, frames] [, modus])
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)

hazumu-kun

BeitragMi, März 02, 2011 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Jap, das tue ich Smile
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Xeres

Moderator

BeitragDo, März 03, 2011 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Besten Dank an alle bisherigen Teilnehmer.

Die Musterlösung findet sich im Eingangspost.

Fragen & Anregungen sind und bleiben erwünscht Wink
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)

Nova

BeitragFr, Jun 01, 2012 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
(Auch hier gilt: Ich weiß, dass der Thread alt ist, möchte aber trotzdem meine Lösung hier kundtun. Wink)

Hier musste ich schon etwas mehr nachdenken. Ich mag zwar Trigonometrie, aber so richtig in Spielen habe ich es bisher nicht benutzt. Da war der Test mit den Augen schon etwas fordernder.

Insgesamt habe ich das Hauptprogramm und zwei Funktionen: Eine bestimmt den Abstand zwischen zwei Koordinaten, und die andere zeichnet eine Pupille der Augen. Probleme gab es dabei kurzzeitig mit der Methode, wie ich den Abstand zwischen Augenmittelpunkt und Maus auch richtig auf Pupille und Auge zurechne. Ich hatte da erst etwas mit Wurzel ziehen, aber das hat die Augen zum "Schielen" gebracht...

"Besonders" ist bei meinem Programm gegenüber der Musterlösung einfach nur, dass nicht nur der Winkel zwischen Maus und Augenmittelpunkt einberechnet wird, sondern auch noch die Entfernung zur Maus.

BlitzBasic: [AUSKLAPPEN]
; Definiere ein paar Konstanten
Const AUFLOESUNGX = 640
Const AUFLOESUNGY = 460
Const AUGENABSTAND = 120

; Bereite alles vor, also die Grafik und die Timer
Graphics 640, 480, 0, 2
SetBuffer BackBuffer()
timer = CreateTimer(60)

; Definiere ein paar wichtige Variablen
Local linksX = 0
Local linksY = 0
Local rechtsX = 0
Local rechtsY = 0
Local abstandLinks = 0
Local abstandRechts = 0
Local mausX = 0
Local mausY = 0

; Nun setzen wir noch die Hintergrundfarbe auf weiß...
ClsColor 255, 255, 255

; Und schon gehen wir in die Hauptschleife und starten das Programm
While Not KeyHit(1) ; Programm beenden mit Escape.
Cls
Color 0, 0, 0
Text 1, 1, "Escape zum Beenden des Programms"
mausX = MouseX ()
mausY = MouseY ()


Color 255, 200, 200

; Zeichne das linke Auge
Oval (AUFLOESUNGX /2) - (AUGENABSTAND /2) -40, (AUFLOESUNGY /2) -40, 80, 80, 1

; Zeichne das rechte Auge
Oval (AUFLOESUNGX /2) + (AUGENABSTAND /2) -40, (AUFLOESUNGY /2) -40, 80, 80, 1


Color 200, 200, 255

; Zeichne linke Pupille
zeichnePupille ((AUFLOESUNGX /2) - (AUGENABSTAND /2), (AUFLOESUNGY /2), mausX, mausY)

; Zeichne rechte Pupille
zeichnePupille ((AUFLOESUNGX /2) + (AUGENABSTAND /2), (AUFLOESUNGY /2), mausX, mausY)


WaitTimer timer
Flip
Wend

End ; Hier wird das Programm dann beendet.


; Definition der verwendeten Funktionen.
Function abstand (x1, y1, x2, y2)
Local abstandX = Abs (x1 - x2)
Local abstandY = Abs (y1 - y2)

Return Sqr ((abstandX ^2) + (abstandY ^2))
End Function

Function zeichnePupille (x, y, mausX, mausY)
Local abstand = abstand (x, y, mausX, mausY)
;Local pupillenabstand = Sqr (abstand) *1.5
Local pupillenabstand = abstand / 15

winkel# = (ATan2 (mausX - x, mausY - y) +360) Mod 360

Local abstandX = Int (Sin (winkel) * pupillenabstand)
Local abstandY = Int (Cos (winkel) * pupillenabstand)

Oval x + abstandX - 5, y + abstandY - 5, 10, 10, 1
End Function
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group