BlitzEvent

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Silver_Knee

Betreff: BlitzEvent

BeitragMi, März 18, 2009 23:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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
;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
Code: [AUSKLAPPEN]
;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

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group