BlitzEvent
Übersicht

![]() |
Silver_KneeBetreff: BlitzEvent |
![]() Antworten mit Zitat ![]() |
---|---|---|
Event heißt soviel wie Ereignis. Auf diesen aufbauend ist in vielen Sprachen ein Programm zu erstellen: Der User macht irgendwas -Tippt zum Beispiel etwas in ein Feld oder klickt irgendwo hin- und auf dieses Ereignis reagiert das Programm. Das hat eine bessere Übersicht im Programm zur Folge und ermöglicht einem verschiedenen Aktivitäten (ALT+F4, Schließen-Button, Datei->Beenden) das gleiche Ereignis (Programm beenden) zuzuweisen.
Bei der Spieleprogrammierung ist so ein Verhalten zunächst mal hinderlich: Was wäre Tetris, wenn es nur auf Tastendruck reagieren würde? Um ein "normales" Verhalten eines Spiels zu erzeugen, müsste man Timer erstellen, die ablaufen und damit das, was wir momentan als Hauptschleife kennen, ausführen. Was ist allerdings mit den Vorteilen eines solchen Systems. Dass man sie in Blitzbasic integrieren kann, zeigen WaitEvent & co von Mark Silby persönlich. Einige Funktionen, die auch dem kleinen Progger von nebenan es möglich machen, möchte ich hiermit vorstellen. Was bringt das? Als Alternative zu der Funktion in der Funktion, die zur Gruppierung der Funktionengruppen dient, lässt sich soetwas mit einem BlitzEvent relativ einfach als Event und somit als Ereignis darstellen. Dieses Ereignis kann von der Hauptschleife an den verschiedensten Punkten mit den verschiedensten Voraussetzungen ausgelöst werden, um dann an einer Sammelstelle im Code ausgeführt zu werden. Ein vielleicht vertrautes Problem, "Ich weiß, dass ich eine Funktion ausführen muss, aber noch nicht mit welchen Parametern", geht damit relativ leicht vom Tisch. Event auslösen, dass an der Sammelstelle weitere Events oder auch direkt mit allen Parametern eine Funktion ausführen kann. Auch Code-Strukturen, wie Eingabe-Verarbeitung-Ausgabe, sind mit den BlitzEvents kein Problem. Im Zweifelsfall muss für eine Ausgabe eben selbst ein Event herhalten. Diese Trennung schafft Übersicht und Wiederverwendbarkeit. Abgesehen davon können auch Error-Meldungen und Debugging-Ausgaben als Event rausgehen und bei bedarf abgerufen werden, sodass das Programm an späterer Stelle entscheiden kann ob und wie eine aktion vielleicht nochmal durchgeführt werden muss. Außerdem werde ich versuchen BlitzEvents zu aktuellen anderen Codes aus dem Codearchiv kompatibel zu gestalten. Ein Beispiel, wie soetwas aussehen könnte, sieht man in der Collisions-Erweiterung. Gedacht habe ich momentan an eine Draw3D-Erweiterung (mit Button-Klicks als Event, keinen RuntimeErrors) und einer BlitzPlus-Erweiterung (Übersetzt B+ Window Events in BlitzEvents) ---------------------------------- Die Bedienung der BlitzEvents ist in den 4 Samples zu sehen. Die Basic_Samples zeigen allgemeine Anwendung und die Collision_Sampels sind auf die Collision-Erweiterung bezogen. Kurz erklärt ginge das so: Man definiert eine Event-Art: EventArt=AddBlitzEventKind Man aktiviert ein Event: FireEvent(EventArt,Info) Info ist hier einfach ein Integer, der später abgegrifen werden kann. Es bietet sich hier das Handle eines Types oder eine Bank zu nehmen um mehr informationen zu einem Event zu speichern. Man fragt alle Events des Schleifendurchgangs ab mit Code: [AUSKLAPPEN] While NextBlitzEvent()
... Wend Dabei sind die beiden Globalen BlitzEventInfo und BlitzEventKind von nutzen. Alternativ kann man auch nur Events bestimmter Arten abfragen: Code: [AUSKLAPPEN] While NextBlitzEventOfKind(EventArt)
... Wend So kann man auch an verschiedenen Stellen verschiedene Events ausführen. ---------------------------------- Download Codes ---------------------------------- Source: Code: [AUSKLAPPEN] ;File: BlitzEvent_Basic.bb
;Author: Silver_Knee ;Description: Demonstriert die einfachste Anwendung der BlitzEvents. ;Original Uploaded: www.BlitzForum.de ;---{BlitzEvents v1.0}--- ;---{Public Constants}--- Const BLITZEVENT_ERROR_OTHER=-1 ;EventErrorID Const BLITZEVENT_ERROR_NOTFUND=0 ;EventErrorID Const BLITZEVENT_ERROR_CANNOTDELETE=1 ;EventErrorID Const BLITZEVENT_ERROR_CANNOTFIRE=2 ;EventErrorID Const BLITZEVENT_ERROR_CANNOTLOOP=3 ;EventErrorID ;---{Public Globals}--- ;BlitzEventInfo% : EventInfoInteger ;BlitzEventKind% : EventKindID Global BlitzEventInfo% Global BlitzEventKind% Global BLITZEVENT_ERROR%=AddBlitzEventKind() ;---{Public Types}--- ;BlitzEventError : Type, dessen Handels als Info von BLITZEVENT_ERROR gefired wird, ; wenn BlitzEvents einen Fehler feststellt. Es kann wie jedes ; andere Event abgefragt werden. Type BlitzEventError Field txt$,errorid End Type ;---{Public Functions}--- ;AddBlitzEventKind% : Return EventKindID ;DeleteBlitzEventKind(kind%) : Return / ;FireBlitzEvent(kind%,info%) : Return / ;NextBlitzEvent() : Return True, if event was fired / False, if no more events fired ;NextBlitzEventOfKind(kind%) : Return True, if event was fired / False, if no more events fired Function AddBlitzEventKind%() Local bek.BlitzEventKind,id bek=Last BlitzEventKind If bek=Null id=1 Shl 31;=kleinste negative Zahl Else id=bek\id+1 EndIf bek=New BlitzEventKind bek\id=id Return id End Function Function DeleteBlitzEventKind(kind) Local bek.BlitzEventKind,bee.BlitzEventError If kind=BLITZEVENT_ERROR bee=New BlitzEventError bee\txt="DeleteEventKind: Eventkind [BLITZEVENT_ERROR] could not be deleted!" bee\errorid=BLITZEVENT_ERROR_CANNOTDELETE FireBlitzEvent (BLITZEVENT_ERROR,Handle(bee)) Return EndIf bek=FindBlitzEventKind (kind) If bek=Null bee=New BlitzEventError bee\txt="DeleteEventKind: Eventkind ["+kind+"] could Not be deleted!" bee\errorid=BLITZEVENT_ERROR_CANNOTDELETE FireBlitzEvent (BLITZEVENT_ERROR,Handle(bee)) Return EndIf If bek\firstchild<>Null bee=New BlitzEventError bee\txt="DeleteEventKind: Eventkind ["+kind+"] is still fired!" bee\errorid=BLITZEVENT_ERROR_CANNOTDELETE FireBlitzEvent (BLITZEVENT_ERROR,Handle(bee)) Return Else Delete bek EndIf End Function Function FireBlitzEvent(kind%,info%) Local be.BlitzEvent,bek.BlitzEventKind,bee.BlitzEventError bek=FindBlitzEventKind(kind) If bek=Null bee=New BlitzEventError bee\txt="FireEvent: Event ["+kind+"] could not be fired!" bee\errorid=BLITZEVENT_ERROR_CANNOTFIRE FireBlitzEvent (BLITZEVENT_ERROR,Handle(bee)) Return EndIf be=New BlitzEvent be\info=info be\kind=bek If bek\firstchild=Null bek\firstchild=be Else Insert be After bek\firstchild EndIf End Function Function NextBlitzEvent() Local be.BlitzEvent If (Last BlitzEvent)=Null Return False Else SetCurrentBlitzEvent (First BlitzEvent) Delete First BlitzEvent Return True EndIf End Function Function NextBlitzEventOfKind(kind) Local be.BlitzEvent,bek.BlitzEventKind,bee.BlitzEventError bek=FindBlitzEventKind(kind) If bek=Null bee=New BlitzEventError bee\txt="NextEventOfKind: Cannot loop through eventkind ["+kind+"] !" bee\errorid=BLITZEVENT_ERROR_CANNOTLOOP FireBlitzEvent (BLITZEVENT_ERROR,Handle(bee)) Return EndIf If bek\firstchild=Null Return False Else SetCurrentBlitzEvent(bek\firstchild) be=bek\firstchild bek\firstchild=After bek\firstchild Delete be If bek\firstchild\kind<>bek;beim Verlassen des gewählten EventKinds bek\firstchild=Null;Das Ende simulieren. EndIf Return True EndIf End Function ;---{Internal Types}--- Type BlitzEvent Field info Field kind.BlitzEventKind End Type Type BlitzEventKind Field id Field firstchild.BlitzEvent End Type ;---{Internal Functions}--- Function FindBlitzEventKind.BlitzEventKind(kind) Local bek.BlitzEventKind,bee.BlitzEventError For bek=Each BlitzEventKind If bek\id=kind Then Return bek Next bee=New BlitzEventError bee\txt="FindEventKind: EventKind "+kind+" not found." bee\errorid=BLITZEVENT_ERROR_NOTFUND FireBlitzEvent (BLITZEVENT_ERROR,Handle(bee)) Return Null End Function Function SetCurrentBlitzEvent(be.BlitzEvent) BlitzEventInfo=be\info BlitzEventKind=be\kind\id End Function Code: [AUSKLAPPEN] ;File: BlitzEvent_Collisions.bb
;Author: Silver_Knee ;Description: Erweiterung um Blitz3D-Collisions als BlitzEvent verarbeiten zu können. ;Original Uploaded: www.BlitzForum.de ;--{BlitzEvents Extension for Collisions v1}-- Global BLITZEVENT_COLLISION=AddBlitzEventKind() ;---{Public Types}--- ;Collision : Speichert informationene über die Kollision als BLITZEVENT_COLLISION-BlitzEventInfo. Type Collision Field Entity Field nx#,ny#,nz# Field Surface,Time,Triangle Field x#,y#,z# End Type ;---{Public Functions}--- ;WatchEntityCollisions(ent%,firekind=0,fireinfo=0) : Entity für das checken vormerken. Man kann ihm ein Event übertragen, dass es bei Kollision aktiviert. ;UnWatchEntityCollisions(ent%) : Entity nicht mehr für das checken vormerken. ;CheckCollisions() : Überprüft das Entity auf Kollisionen. Aktiviert alle Events. Function WatchEntityCollisions(ent%,firekind=0,fireinfo=0) Local we.WatchedEntity,bee.BlitzEventError For we=Each WatchedEntity If we\ent=ent Then Exit Next If we<>Null bee=New BlitzEventError bee\txt="WatchEntityCollisions: Entity '"+EntityName(ent)+"'["+ent+"] is already watched." bee\errorid=BLITZEVENT_ERROR_OTHER FireBlitzEvent(BLITZEVENT_ERROR,Handle(bee)) Else we=New WatchedEntity we\ent=ent we\firekind=firekind we\fireinfo=fireinfo EndIf End Function Function UnWatchEntityCollisions(ent%) Local we.WatchedEntity,bee.BlitzEventError For we=Each WatchedEntity If we\ent=ent Then Exit Next If we=Null bee=New BlitzEventError bee\txt="UnWatchEntityCollisions: Entity '"+EntityName(ent)+"'["+ent+"] was not watched." bee\errorid=BLITZEVENT_ERROR_OTHER FireBlitzEvent(BLITZEVENT_ERROR,Handle(bee)) Else Delete we EndIf End Function Function CheckCollisions() Local we.WatchedEntity,co.Collision,count,max For we=Each WatchedEntity max=CountCollisions(we\ent) For count=1 To max co=New Collision co\Entity= CollisionEntity(we\ent,count) co\nx= CollisionNX(we\ent,count) co\ny= CollisionNY(we\ent,count) co\nz= CollisionNZ(we\ent,count) co\x= CollisionX(we\ent,count) co\y= CollisionY(we\ent,count) co\z= CollisionZ(we\ent,count) co\Surface= CollisionSurface(we\ent,count) co\Time= CollisionTime(we\ent,count) co\Triangle=CollisionTriangle(we\ent,count) FireBlitzEvent(BLITZEVENT_COLLISION,Handle(co)) FireBlitzEvent(we\firekind,we\fireinfo) Next Next End Function ;---{Internal Types}--- Type WatchedEntity Field ent,firekind,fireinfo End Type Samples: Code: [AUSKLAPPEN] ;File: Basic_Sample1.bb
;Author: Silver_Knee ;Description: Demonstriert die einfachste Anwendung der BlitzEvents. ;Original Uploaded: www.BlitzForum.de Include "BlitzEvent_Basic.bb" Graphics 800,600,32,2 SetBuffer BackBuffer() Local x,y Global KEY_DOWN,END_PROGRAM KEY_DOWN=AddBlitzEventKind() END_PROGRAM=AddBlitzEventKind() Repeat ;Eingabe If KeyDown(200) Or KeyDown(17);hoch FireBlitzEvent(KEY_DOWN,200) EndIf If KeyDown(203) Or KeyDown(30);links FireBlitzEvent(KEY_DOWN,203) EndIf If KeyDown(205) Or KeyDown(32);rechts FireBlitzEvent(KEY_DOWN,205) EndIf If KeyDown(208) Or KeyDown(31);runter FireBlitzEvent(KEY_DOWN,208) EndIf If KeyDown(1) FireBlitzEvent(END_PROGRAM,0) EndIf ;Verarbeitung While NextBlitzEvent() Select BlitzEventKind Case KEY_DOWN Select BlitzEventInfo Case 200:y=y-1 Case 203:x=x-1 Case 205:x=x+1 Case 208:y=y+1 End Select Case END_PROGRAM End Case BLITZEVENT_ERROR Delete Object.BlitzEventError(BlitzEventInfo);ein Error verfällt. End Select Wend;Vor diesem Wend müssen alle Objekte, die als Handle in einer BlitzEventInfo liegen, gelöscht werden. ;Ausgabe Rect x,y,10,10 Flip Cls Forever Code: [AUSKLAPPEN] ;File: Basic_Sample2.bb
Code: [AUSKLAPPEN] ;Author: Silver_Knee ;Description: Demonstriert die BlitzEvents beim Zusammenführen verschiedener Auslöder, ; die das gleiche Ereignis nach sich ziehen. ;Original Uploaded: www.BlitzForum.de Include "BlitzEvent_Basic.bb" Graphics 800,600,32,2 SetBuffer BackBuffer() Local x,y,mo.Movement_Type Global Movement,END_PROGRAM Movement=AddBlitzEventKind() END_PROGRAM=AddBlitzEventKind() Type Movement_Type Field x,y End Type Repeat ;Eingabe If KeyDown(200) Or KeyDown(17);hoch mo=New Movement_Type mo\x=0 mo\y=-2 FireBlitzEvent(Movement,Handle(mo)) ;Dadurch, dass der Handle des Types übergeben wird, ;ist er später wieder reproduzierbar. EndIf If KeyDown(203) Or KeyDown(30);links mo=New Movement_Type mo\x=-2 mo\y=0 FireBlitzEvent(Movement,Handle(mo)) ;Dadurch, dass der Handle des Types übergeben wird, ;ist er später wieder reproduzierbar. EndIf If KeyDown(205) Or KeyDown(32);rechts mo=New Movement_Type mo\x=+2 mo\y=0 FireBlitzEvent(Movement,Handle(mo)) ;Dadurch, dass der Handle des Types übergeben wird, ;ist er später wieder reproduzierbar. EndIf If KeyDown(208) Or KeyDown(31);runter mo=New Movement_Type mo\x=0 mo\y=+2 FireBlitzEvent(Movement,Handle(mo)) ;Dadurch, dass der Handle des Types übergeben wird, ;ist er später wieder reproduzierbar. EndIf If RectsOverlap(x,y,10,10,100,100,200,50) mo=New Movement_Type mo\x=4 mo\y=0 FireBlitzEvent(Movement,Handle(mo)) ;Dadurch, dass der Handle des Types übergeben wird, ;ist er später wieder reproduzierbar. EndIf If KeyDown(1) FireBlitzEvent(END_PROGRAM,0) EndIf ;Verarbeitung While NextBlitzEvent() Select BlitzEventKind Case Movement mo=Object.Movement_Type(BlitzEventInfo) x=x+mo\x y=y+mo\y Case BLITZEVENT_ERROR Delete Object.BlitzEventError(BlitzEventInfo);Errors verfallen Case END_PROGRAM End End Select Wend;Vor diesem Wend müssen alle Objekte, die als Handle in einer BlitzEventInfo liegen, gelöscht werden. ;Ausgabe ;>Power-Feld-Effekt Rect 100,100,200,50,0 Viewport 100,100,200,50 Line ((MilliSecs()/10-50) Mod 200),150,((MilliSecs()/10-50) Mod 200)+50,125 Line ((MilliSecs()/10-50) Mod 200),100,((MilliSecs()/10-50) Mod 200)+50,125 Line ((MilliSecs()/10) Mod 200)+50,150,((MilliSecs()/10) Mod 200)+100,125 Line ((MilliSecs()/10) Mod 200)+50,100,((MilliSecs()/10) Mod 200)+100,125 Line ((MilliSecs()/10+50) Mod 200)+100,150,((MilliSecs()/10+50) Mod 200)+150,125 Line ((MilliSecs()/10+50) Mod 200)+100,100,((MilliSecs()/10+50) Mod 200)+150,125 Line ((MilliSecs()/10+100) Mod 200)+150,150,((MilliSecs()/10+100) Mod 200)+200,125 Line ((MilliSecs()/10+100) Mod 200)+150,100,((MilliSecs()/10+100) Mod 200)+200,125 Line ((MilliSecs()/10+150) Mod 200)+200,150,((MilliSecs()/10+150) Mod 200)+250,125 Line ((MilliSecs()/10+150) Mod 200)+200,100,((MilliSecs()/10+150) Mod 200)+250,125 Viewport 0,0,800,600 ;<Power-Feld-Effekt Rect x,y,10,10 Flip Cls Forever ;File: Collisions_Sample1.bb
;Author: Silver_Knee ;Description: Demonstriert die Funktionsweise der BlitzEvent_Collisions mit eigenen Events ;Original Uploaded: www.BlitzForum.de Include "BlitzEvent_Basic.bb" Include "BlitzEvent_Collisions.bb" Graphics3D 800,600,32,2 SetBuffer BackBuffer() Global LAMPON Global Movement3D,END_PROGRAM LAMPON=AddBlitzEventKind() Movement3D=AddBlitzEventKind() END_PROGRAM=AddBlitzEventKind() Type Movement3D_Type Field x#,z# End Type Local Sphere,lamp,cam,light,mov.Movement3D_Type light=CreateLight() Sphere=CreateSphere() EntityType Sphere,1 WatchEntityCollisions Sphere,LAMPON,0; Bei Kollision wird LAMPON ausgelöst lamp=CreateCylinder() PositionEntity lamp,0,0,6 EntityType lamp,1 cam=CreateCamera() PositionEntity cam,0,5,-5 TurnEntity cam,20,0,0 Collisions 1,1,2,2 Repeat ;Eingabe If KeyDown(200) Or KeyDown(17);hoch mov=New Movement3D_Type mov\x=0 mov\z=+0.1 FireBlitzEvent(Movement3D,Handle(mov)) EndIf If KeyDown(203) Or KeyDown(30);links mov=New Movement3D_Type mov\x=-0.1 mov\z=0 FireBlitzEvent(Movement3D,Handle(mov)) EndIf If KeyDown(205) Or KeyDown(32);rechts mov=New Movement3D_Type mov\x=+0.1 mov\z=0 FireBlitzEvent(Movement3D,Handle(mov)) EndIf If KeyDown(208) Or KeyDown(31);runter mov=New Movement3D_Type mov\x=0 mov\z=-0.1 FireBlitzEvent(Movement3D,Handle(mov)) EndIf If KeyDown(57) FireBlitzEvent(LAMPON,0) EndIf If KeyDown(1) FireBlitzEvent(END_PROGRAM,0) EndIf CheckCollisions() ;Verarbeitung EntityColor lamp,128,128,128 While NextBlitzEvent() Select BlitzEventKind Case Movement3D mov=Object.Movement3D_Type(BlitzEventInfo) MoveEntity Sphere,mov\x,0,mov\z Delete mov Case LAMPON EntityColor lamp,0,255,0 Case BLITZEVENT_COLLISION Delete Object.Collision(BlitzEventInfo);die Collision-Events verfallen Case BLITZEVENT_ERROR Delete Object.BlitzEventError(BlitzEventInfo);Die Errors verfallen Case END_PROGRAM End End Select Wend;Vor diesem Wend müssen alle Objekte, die als Handle in einer BlitzEventInfo liegen, gelöscht werden. ;Ausgabe UpdateWorld RenderWorld Flip Cls Forever Code: [AUSKLAPPEN] ;File: Collisions_Sample2.bb
;Author: Silver_Knee ;Description: Demonstriert die Funktionsweise der BlitzEvent_Collisions mit den eingebauten Events ;Original Uploaded: www.BlitzForum.de Include "BlitzEvent_Basic.bb" Include "BlitzEvent_Collisions.bb" Graphics3D 800,600,32,2 SetBuffer BackBuffer() Global Movement3D,END_PROGRAM LAMPON=AddBlitzEventKind() Movement3D=AddBlitzEventKind() END_PROGRAM=AddBlitzEventKind() Type Movement3D_Type Field x#,z# End Type Local Sphere,lamp,cam,light,mov.Movement3D_Type,co.Collision,resetsurface,resettriangle light=CreateLight() Sphere=CreateSphere() EntityType Sphere,1 WatchEntityCollisions Sphere; Bei Kollision wird LAMPON ausgelöst lamp=CreateCylinder() PositionEntity lamp,0,0,6 EntityType lamp,1 EntityFX lamp,2 cam=CreateCamera() PositionEntity cam,0,5,-5 TurnEntity cam,20,0,0 Collisions 1,1,2,2 Repeat ;Eingabe If KeyDown(200) Or KeyDown(17);hoch mov=New Movement3D_Type mov\x=0 mov\z=+0.1 FireBlitzEvent(Movement3D,Handle(mov)) EndIf If KeyDown(203) Or KeyDown(30);links mov=New Movement3D_Type mov\x=-0.1 mov\z=0 FireBlitzEvent(Movement3D,Handle(mov)) EndIf If KeyDown(205) Or KeyDown(32);rechts mov=New Movement3D_Type mov\x=+0.1 mov\z=0 FireBlitzEvent(Movement3D,Handle(mov)) EndIf If KeyDown(208) Or KeyDown(31);runter mov=New Movement3D_Type mov\x=0 mov\z=-0.1 FireBlitzEvent(Movement3D,Handle(mov)) EndIf If KeyDown(1) FireBlitzEvent(END_PROGRAM,0) EndIf CheckCollisions() ;Verarbeitung If resetsurface<>0 VertexColor resetsurface,TriangleVertex(resetsurface,resettriangle,0),255,255,255 VertexColor resetsurface,TriangleVertex(resetsurface,resettriangle,1),255,255,255 VertexColor resetsurface,TriangleVertex(resetsurface,resettriangle,2),255,255,255 EndIf While NextBlitzEvent() Select BlitzEventKind Case Movement3D mov=Object.Movement3D_Type(BlitzEventInfo) MoveEntity Sphere,mov\x,0,mov\z Delete mov Case BLITZEVENT_COLLISION co=Object.Collision(BlitzEventInfo) VertexColor co\Surface,TriangleVertex(co\Surface,co\Triangle,0),0,0,255 VertexColor co\Surface,TriangleVertex(co\Surface,co\Triangle,1),0,0,255 VertexColor co\Surface,TriangleVertex(co\Surface,co\Triangle,2),0,0,255 resetsurface=co\Surface resettriangle=co\Triangle Delete co Case BLITZEVENT_ERROR Delete Object.BlitzEventError(BlitzEventInfo);Die Errors verfallen Case END_PROGRAM End End Select Wend;Vor diesem Wend müssen alle Objekte, die als Handle in einer BlitzEventInfo liegen, gelöscht werden. ;Ausgabe UpdateWorld RenderWorld Flip Cls Forever |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group