Collision mit Type
Übersicht

pepetigoBetreff: Collision mit Type |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das mit der Collision funktioniert nicht, warum ???
thx Code: [AUSKLAPPEN] Function collide() If ImagesCollide(spieler_1, Player_pos_X, 380, 0, gegner_1, gegner\x, 380, 0) leben = leben - schaden EndIf End Function |
||
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
weil du im type-Feld das image speichern musst und nicht versuchen mit dem Type zu kollidieren? 0o | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Tschüss... *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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
X-Calibur |
![]() Antworten mit Zitat ![]() |
---|---|---|
So wie ich das sehe hast du hier keine instanz von deinem type definiert. gegner\x wäre somit in dieser function unzulässig.
mfg Calibur |
||
pepetigo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie???
So ... Code: [AUSKLAPPEN] Type rot Field x Field y Field speed [b]Field bild [/b] End Type und so... ??? Code: [AUSKLAPPEN] Function collide() If ImagesCollide(spieler_1, Player_pos_X, 380, 0, gegner\bild, gegner\x, 380, 0) leben = leben - schaden EndIf End Function |
||
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
genau, und wenn spieler_1 auch ein type ist, dort auch. | ||
![]() |
X-Calibur |
![]() Antworten mit Zitat ![]() |
---|---|---|
eher so^^
Code: [AUSKLAPPEN] Function collide() for gegner.rot = each rot If ImagesCollide(spieler_1, Player_pos_X, 380, 0, gegner_1, gegner\x, 380, 0) leben = leben - schaden EndIf next End Function Das setzt vorraus dass alle gegner Gegnertyp 1 sind bzw die Grafik gegner_1 benutzen. Calibur |
||
- Zuletzt bearbeitet von X-Calibur am Di, Okt 16, 2007 23:07, insgesamt einmal bearbeitet
pepetigo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
geht aber immer noch nicht, vielleicht liegt es am Code insgesamt???
Code: [AUSKLAPPEN] ;Grafikmodus setzen Graphics 640, 480, 16, 2 ;Fenstertitel bestimmen AppTitle "Schuss frei" ;Alle benötigten Bilder laden und gegebenfalls mit transparenz versorgen Global spieler_1 = LoadImage("gfx/Spieler_1.png") MaskImage spieler_1 ,255, 0, 255 Global gegner_1 = LoadImage("gfx/gegner_2.png") MaskImage gegner_1 ,255, 0, 255 Global gegner_2 = LoadImage("gfx/gegner_2.png") MaskImage gegner_2 ,255, 0, 255 Global stars=LoadImage("gfx/stars.bmp") Global loser=LoadImage("gfx/loser.png") MaskImage loser, 255, 0, 255 ;Hintergrundvariablen Global x_star = 1 ;Gegnervariablen SeedRnd MilliSecs() Global Gegner_pos_X = Rnd(1, 640) Global Gegner_pos_Y = 1 Global gtimer = MilliSecs() ;Spielervariablen Global leben = 3 Global schaden = 1 Global stimer = MilliSecs() Global Player_pos_X Global gegner.rot ;Type oder Dim, weiß ich nicht was könnt ihr mir empfehlen ??? Type rot Field x Field y Field speed Field bild End Type ;buffer setzen u. Spieler zeichnen SetBuffer BackBuffer() DrawImage spieler_1, 0, 380 ;Musik Global titelsound = LoadSound("sound/17_sasha_-_goodbye.mp3");(namen ersetzen für eigenes lied) sound() neuesspiel() ;//////////////////FUNKTIONEN\\\\\\\\\\\\\\\\\\\\\\\ Function sound() LoopSound titelsound titelsound =PlaySound(titelsound) End Function ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function gegner_1() DrawImage gegner_1, Gegner_pos_X, Gegner_pos_Y If MilliSecs() > gtimer + 150 Gegner_pos_Y=Gegner_pos_Y+5 gtimer=MilliSecs() EndIf End Function ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function lose() Cls DrawImage loser, 20, 140 star() Flip If KeyHit(57) Or KeyHit(28) Or KeyHit(1) neuesspiel() End Function ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function star() TileImage stars, x_star, 1 x_star = x_star + 1 If x_star = 201 Then x_star = 1 End Function ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function collide() If ImagesCollide(spieler_1, Player_pos_X, 380, 0, gegner\bild, gegner\x, 380, 0) leben = leben - schaden EndIf End Function ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function neuesspiel() DrawImage spieler_1, 0, 380 leben = 3 ;HAUPTSCHLEIFE Repeat SeedRnd MilliSecs() t = Rnd(1, 50) If t=2 Then neuergegner() ;funktionen star() collide() gegnerbewegen() ;Leben etc. Text 1,1,"Leben:" + leben If leben <= 0 Then lose() If KeyHit(57) Then leben = leben - 1 ;Es sollen ungefähl 1000 Gegner auf 10000 der Achse y kommen und wenn die mit dem spieler Kollidieren soll ein Leben von 3 abgezogen werden ! ! ! ;spieler bewegen If KeyDown(203) If MilliSecs() > stimer + 100 Player_pos_X=Player_pos_X-20 stimer=MilliSecs() EndIf If Player_pos_X=<0 Then Player_pos_X=1 EndIf If KeyDown(205) If MilliSecs() > stimer + 100 player_pos_x=player_pos_X +20 stimer=MilliSecs() EndIf If Player_pos_X=>540 Then Player_pos_X=540 EndIf ;Spieler zeichnen (positionswechsel?) DrawImage spieler_1,player_pos_x,380 ;Buffer swap u. altes bild cls Flip Cls ;ENDE HAUPTSCHLEIFE Until KeyHit(1) ;beenden End End Function ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function neuergegner() gegner.rot = New rot gegner\x = Rnd(1, 620) gegner\y = 0 gegner\speed = Rnd(1,3) gegner\bild = LoadImage("gfx/gegner_2.png") End Function Function gegnerbewegen() For gegner.rot = Each rot gegner\y = gegner\y + gegner\speed ; Helicopter zeichnen. DrawImage gegner_1, gegner\x, gegner\y ; Wenn Heli am unteren Rand ist, wird er gelöscht. If gegner\y > 480 Then gegnerloeschen = 1 EndIf If gegnerloeschen = 1 Then Delete gegner.rot gegnerloeschen = 0 EndIf Next End Function |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm
Also wenn du nicht-type type kollision machst, müsste das so eig gehen: (ausn kopf) Code: [AUSKLAPPEN] for info.bla = each bla if imagescollide( hero, hx, hy, 0 , typ_bild , info\bild_x, info\bild_y,0) then delete info.bla end if next typ zu type kollison funtz auch ohne, dass du das image in den type mit rein legst: 2 überprüfungen: einmal shoot - feind und feind - shoot. Anmerkung : "es geht immer schöner und elleganter, aber funtzen tut das auch." laser - shoot Code: [AUSKLAPPEN] For info.shot = Each shot For info2.feind = Each feind If ImagesCollide(laser, info\sx,info\sy,0, feind, info2\fx, info2\fy,0) Then delete info2.feind end if Next Next feind - laser Code: [AUSKLAPPEN] For info2.feind = Each feind For info.shot = Each shot If ImagesCollide(feind, info2\fx, info2\fy,0,laser, info\sx,info\sy,0 ) Then Delete info.shot End If Next Next Funktionsfähiges beispiel liegt im archiv: ("typ - typ colli") (link und datei werden in n paar tagen verschwinden) - verschunden - ~edit~ achja ähm man ballert mit der maus ^^ mfg Dottakopf |
||
- Zuletzt bearbeitet von Dottakopf am Fr, Okt 19, 2007 11:50, insgesamt einmal bearbeitet
pepetigo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Noch mal das mit der Collision.
Das geht aber das zweite irgendwie nicht, vielleicht könnt ihr mir helfen. thx Das geht: Code: [AUSKLAPPEN] For schuss.laser = Each laser For gegner1.mittel = Each mittel If ImagesCollide(laser_g, schuss\lx, schuss\ly, 0, gegner_2, gegner1\mx, gegner1\my,0) Then Delete schuss.laser gegner1\mleben = gegner1\mleben - 1 EndIf If gegner1\mleben = 0 Delete gegner1.mittel punkte = punkte + 500 EndIf Next Next Das nicht: Code: [AUSKLAPPEN] For schuss.laser = Each laser For gegner.klein = Each klein If ImagesCollide(laser_g, schuss\lx, schuss\ly, 0, gegner_1, gegner\kx, gegner\ky,0) Then Delete schuss.laser gegner\kleben = gegner\kleben - 1 EndIf If gegner\kleben = 0 Delete gegner.klein punkte = punkte +100 EndIf Next Next |
||
![]() |
Smily |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kannst du bitte in zukunft bessere fehlerbeschreibungen geben als "geht nicht!"?
Was für eine Fehlermeldung bekommst du? |
||
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets "Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!" stummi.org |
pepetigo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok
ich bekomme die Fehlermeldung "Illegal Memory Adress", wenn der Schuss den Gegner trifft. aber beim anderen gehts, warum ??? thx P.S Vielleicht liegt es auch am ganzen Code: Code: [AUSKLAPPEN] ;Grafikmodus setzen
Graphics 640, 480, 16, 2 ;Fenstertitel bestimmen AppTitle "Schuss frei" ;Alle benötigten Bilder laden und gegebenfalls mit transparenz versorgen Global spieler_1 = LoadImage("gfx/Spieler_1.png") MaskImage spieler_1 ,255, 0, 255 Global gegner_1 = LoadImage("gfx/gegner_2.png") MaskImage gegner_1 ,255, 0, 255 Global gegner_2 = LoadImage("gfx/gegner_1.png") MaskImage gegner_2 ,255, 0, 255 Global stars=LoadImage("gfx/stars.bmp") Global loser=LoadImage("gfx/loser.png") MaskImage loser, 255, 0, 255 Global fadenkreuz_1 = LoadImage("gfx/fadenkreuz_1.png") MaskImage fadenkreuz_1, 255, 0, 255 Global fadenkreuz_2 = LoadImage("gfx/fadenkreuz_2.png") MaskImage fadenkreuz_2, 255, 0, 255 Global fadenkreuz_3 = LoadImage("gfx/fadenkreuz_3.png") MaskImage fadenkreuz_3, 255, 0, 255 Global fadenkreuz_4 = LoadImage("gfx/fadenkreuz_4.png") MaskImage fadenkreuz_4, 255, 0, 255 Global schuss_frei_1 = LoadImage("gfx/schuss_frei_1.png") MaskImage schuss_frei_1, 255, 0, 255 Global schuss_frei_2 = LoadImage("gfx/schuss_frei_2.png") MaskImage schuss_frei_2, 255, 0, 255 Global laser_g = LoadImage("gfx/laser.bmp") Global messzeit = MilliSecs() Global zeit Global punkte Global schuss_laser = 380 Global xspieler ;Hintergrundvariablen Global x_star = 1 ;Spielervariablen Global leben = 3 Global schaden = 1 Global stimer = MilliSecs() Global Player_pos_X Global warten_1_X = 45 Global titelsound schrift = LoadFont("Bauhaus 93", 50) SetFont schrift Color 0, 255, 0 ;Type oder Dim, weiß ich nicht was könnt ihr mir empfehlen ??? Type laser Field lx Field ly End Type Type klein Field kx Field ky Field kspeed Field kleben End Type Type mittel Field mx Field my Field mspeed Field mleben End Type fadenkreuz() ;buffer setzen u. Spieler zeichnen SetBuffer BackBuffer() DrawImage spieler_1, 0, 380 ;Musik Global goodbye = LoadSound("sound/17_sasha_-_goodbye.mp3") Global hamma = LoadSound("sound/Culcha Candela - Hamma.mp3") Global hupe = LoadSound("sound/autohupe-soundarchiv.com.mp3") sound() neuesspiel() ;//////////////////FUNKTIONEN\\\\\\\\\\\\\\\\\\\\\\\ Function sound() SeedRnd MilliSecs() titelsound = Rnd(1, 2) If titelsound = 1 Then titelsound = hamma If titelsound = 2 Then titelsound = goodbye LoopSound titelsound titelsound =PlaySound(titelsound) End Function ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function lose() Cls star() DrawImage loser, 20, 140 Flip For gegner.klein = Each klein Delete gegner.klein Next For gegner1.mittel = Each mittel Delete gegner1.mittel Next If KeyHit(57) Or KeyHit(28) Or KeyHit(1) neuesspiel() End Function ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function star() TileImage stars, x_star, 1 x_star = x_star + 1 If x_star = 201 Then x_star = 1 End Function ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function collide() For schuss.laser = Each laser For gegner.klein = Each klein If ImagesCollide(laser_g, schuss\lx, schuss\ly, 0, gegner_1, gegner\kx, gegner\ky,0) Then Delete schuss.laser gegner\kleben = gegner\kleben - 1 EndIf If gegner\kleben = 0 Delete gegner.klein punkte = punkte +100 EndIf Next Next For schuss.laser = Each laser For gegner1.mittel = Each mittel If ImagesCollide(laser_g, schuss\lx, schuss\ly, 0, gegner_2, gegner1\mx, gegner1\my,0) Then Delete schuss.laser gegner1\mleben = gegner1\mleben - 1 EndIf If gegner1\mleben = 0 Delete gegner1.mittel punkte = punkte + 500 EndIf Next Next For gegner.klein = Each klein If ImagesCollide( spieler_1, Player_pos_x, 380, 0, gegner_1, gegner\kx, gegner\ky,0) Then Delete gegner.klein leben = leben - schaden punkte = punkte-50 h = PlaySound(hupe) End If Next For gegner1.mittel = Each mittel If ImagesCollide( spieler_1, Player_pos_x, 380, 0, gegner_2, gegner1\mx, gegner1\my,0) Then Delete gegner1.mittel leben = leben - schaden punkte = punkte-250 h = PlaySound(hupe) End If Next End Function ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function neuesspiel() StopChannel (h) StopChannel (toi) leben = 3 zeit = 60 punkte = 0 ;HAUPTSCHLEIFE Repeat SeedRnd MilliSecs() t = Rnd(1, 30) If t=2 Then neuergegnerk() t = Rnd(1, 1000) If t=2 Then neuergegnerm() ;funktionen star() gegnerbewegen() collide() zeitmessen() ; Überlebenszeit messen Text 550, 0, zeit Text 350, 0, punkte ;Leben etc. Text 1,1,"Leben:" + leben If leben <= 0 Then FlushKeys lose() EndIf If KeyHit(57) laser() EndIf ;spieler bewegen If KeyDown(203) If MilliSecs() > stimer + 100 Player_pos_X=Player_pos_X-20 stimer=MilliSecs() EndIf If Player_pos_X=<0 Then Player_pos_X=1 EndIf If KeyDown(205) If MilliSecs() > stimer + 100 player_pos_x=player_pos_X +20 stimer=MilliSecs() EndIf If Player_pos_X=>540 Then Player_pos_X=540 EndIf ;Spieler zeichnen (positionswechsel?) DrawImage spieler_1,player_pos_x,380 ;Buffer swap u. altes bild cls Flip Cls ;ENDE HAUPTSCHLEIFE Until KeyHit(1) ;beenden End End Function ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function neuergegnerk() gegner.klein = New klein gegner\kx = Rnd(1, 620) gegner\ky = 0 gegner\kspeed = Rnd(1,3) gegner\kleben = 1 End Function Function neuergegnerm() gegner1.mittel = New mittel gegner1\mx = Rnd(1, 540) gegner1\my = 0 gegner1\mspeed = Rnd(1, 2) gegner1\mleben = 3 End Function Function laser() xspieler = Player_pos_x + 50 schuss.laser = New laser schuss\lx = xspieler schuss\ly = schuss_laser End Function Function gegnerbewegen() For schuss.laser = Each laser schuss\ly = schuss\ly - 5 DrawImage laser_g, schuss\lx, schuss\ly If schuss\ly < 0 Then gegnerloeschen = 1 EndIf If gegnerloeschen = 1 Then Delete schuss.laser gegnerloeschen = 0 EndIf Next ;klein For gegner.klein = Each klein gegner\ky = gegner\ky + gegner\kspeed DrawImage gegner_1, gegner\kx, gegner\ky If gegner\ky > 480 Then gegnerloeschen = 1 EndIf If gegnerloeschen = 1 Then Delete gegner.klein gegnerloeschen = 0 EndIf Next ;mittel For gegner1.mittel = Each mittel gegner1\my = gegner1\my + gegner1\mspeed DrawImage gegner_2, gegner1\mx, gegner1\my If gegner1\my > 480 Then gegnerloeschen = 1 EndIf If gegnerloeschen = 1 Then Delete gegner1.mittel gegnerloeschen = 0 EndIf Next End Function Function fadenkreuz() fadenkreuz_1 = LoadImage("gfx/fadenkreuz_1.png") MaskImage fadenkreuz_1, 255, 0, 255 fadenkreuz_2 = LoadImage("gfx/fadenkreuz_2.png") MaskImage fadenkreuz_2, 255, 0, 255 fadenkreuz_3 = LoadImage("gfx/fadenkreuz_3.png") MaskImage fadenkreuz_3, 255, 0, 255 fadenkreuz_4 = LoadImage("gfx/fadenkreuz_4.png") MaskImage fadenkreuz_4, 255, 0, 255 schuss_frei_1 = LoadImage("gfx/schuss_frei_1.png") MaskImage schuss_frei_1, 255, 0, 255 schuss_frei_2 = LoadImage("gfx/schuss_frei_2.png") MaskImage schuss_frei_2, 255, 0, 255 DrawImage schuss_frei_1, 20, 10 Delay 1000 DrawImage schuss_frei_2, 370, 50 Delay 1000 schuss_frei_1() SeedRnd MilliSecs() fad_i = Rnd(3, 5) For i = 1 To fad_i DrawImage fadenkreuz_1, 220, 140 Delay 300 DrawImage fadenkreuz_2, 220, 140 Delay 300 DrawImage fadenkreuz_3, 220, 140 Delay 300 DrawImage fadenkreuz_4, 220, 140 Delay 300 Next Cls End Function Function schuss_frei_1() schuss_frei_1 = LoadSound("sound/schuss_frei_1.mp3") schuss_frei_1 = PlaySound(schuss_frei_1) End Function Function zeitmessen() ; Alle 1000 Millisekunden geht zeit eins runter. If MilliSecs() - messzeit >= 1000 Then messzeit = MilliSecs() zeit = zeit - 1 EndIf If zeit = 0 End EndIf End Function |
||
![]() |
Smily |
![]() Antworten mit Zitat ![]() |
---|---|---|
ganz einfach, du versuchst auf das objekt zuzugreifen, nachdem du es gelöscht hast:
mal aufs wichtige komprimiert: Code: [AUSKLAPPEN] For schuss.laser = Each laser
For gegner.klein = Each klein If [.....] Then Delete schuss.laser EndIf Next Next das objekt "schuss.laser" wird zwar gelöscht, aber die innere for-next-schleife läuft weiter.. und beim nächsten durchlauf wird dann versucht auf ein objekt zuzugreifen, das nicht (mehr) exisitiert. gruß, Smily0412 |
||
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets "Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!" stummi.org |
pepetigo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie soll ich es denn beheben???
thx |
||
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
denk selber mal nach.
Also, mach, dass es überprüft ob ein Schuss=Alive ist. Und wenn jetzt kommt: "Wie mach ich das????" dann werde ich dir nicht weiterhelfen. |
||
pepetigo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
was soll "Schuss=Alive" bedeuten???
ich meine das Alive Und warum klappt das beim 2.-mal??? |
||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
"Alive" ist englisch und bedeutet "lebend", in diesem Sinne wohl besser übersetzt mit "existent". | ||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
pepetigo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Aber warum geht es bei dem 2-ten???
thx |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
was ist das 2te ?
denkanstoß: zu deinem fehler. lösche das objekt male das objekt hin und warum findet bb das objekt nicht ? mfg Dottakopf |
||
pepetigo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich meine:
Das erste, functionier nicht: Und warum functioniert das "Erste" nicht, aber das "zweite", ist doch eigentlich das gleicht??? Code: [AUSKLAPPEN] For gegner.klein = Each klein For schuss.laser = Each laser If ImagesCollide(laser_g, schuss\lx, schuss\ly, 0, gegner_1, gegner\kx, gegner\ky,0) Then Delete schuss.laser gegner\kleben = gegner\kleben - 1 EndIf If gegner\kleben = 0 Delete gegner.klein punkte = punkte +100 EndIf Next Next Und das 2-te, functioniert: Code: [AUSKLAPPEN] For gegner1.mittel = Each mittel For schuss.laser = Each laser If ImagesCollide(laser_g, schuss\lx, schuss\ly, 0, gegner_2, gegner1\mx, gegner1\my,0) Then Delete schuss.laser gegner1\mleben = gegner1\mleben - 1 EndIf If gegner1\mleben = 0 Delete gegner1.mittel punkte = punkte + 500 EndIf Next Next |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group