; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=4065&start=10 ; Author: DarkDragon (updated for PB 4.00 by Andre) ; Date: 22. March 2004 ; OS: Windows ; Demo: No ; BounceBalls, inspired by Knoppixgames ; First adjust the keys for up,down,left&right and then start the game. ; Move exactly the red ball and bounce the smaller ones, so that they leave the window. ; Then you will win else you loose... #Image = 0 #Win = 0 InitNetwork() Global Stage.l, Points.l, HindX.l, HindY.l, Hind.l Procedure Button(X, Y, Text.s, ColorNormal.l, ColorOver.l, ColorClick, Event) StartDrawing(ImageOutput(#Image)) DrawingMode(1) If WindowMouseX(#Win) >= X And WindowMouseY(#Win) >= Y+30 And WindowMouseX(#Win) <= X+TextWidth(Text) And WindowMouseY(#Win) <= Y+45 If Event = #WM_LBUTTONDOWN Or Event = #WM_RBUTTONDOWN FrontColor(ColorClick) DrawText(X, Y, Text) StopDrawing() ProcedureReturn 2 Else FrontColor(ColorOver) DrawText(X, Y, Text) StopDrawing() ProcedureReturn 1 EndIf Else FrontColor(ColorNormal) DrawText(X, Y, Text) StopDrawing() ProcedureReturn 0 EndIf EndProcedure Procedure.s SendToHost(Host$, File$, _Data$) ConnectionID = OpenNetworkConnection(Host$, 80) If ConnectionID String$ = "" If _Data$ <> "" String$ + "POST " + File$ + " HTTP/1.1" + Chr(13) + Chr(10) Else String$ + "GET " + File$ + " HTTP/1.1" + Chr(13) + Chr(10) EndIf String$ + "Host: " + Host$ + Chr(13) + Chr(10) String$ + "Content-Type: application/x-www-form-urlencoded" + Chr(13) + Chr(10) String$ + "Connection: close" + Chr(13) + Chr(10) If _Data$ <> "" String$ + "Content-Length: " + Str(Len(_Data$)) + Chr(13) + Chr(10) EndIf String$ + Chr(13) + Chr(10) String$ + _Data$ + Chr(13) + Chr(10) SendNetworkString(ConnectionID, String$) Repeat : Until NetworkClientEvent(ConnectionID) = 2 *Buffer = AllocateMemory(10000) ReceiveNetworkData(ConnectionID, *Buffer, 10000) CloseNetworkConnection(ConnectionID) ProcedureReturn PeekS(*Buffer) EndIf EndProcedure Procedure Highscore() If MessageRequester("Highscore Uploaden?", "Wollen Sie die "+Str(Points)+" Punkte unter ihrem Namen ins Internet stellen?", #PB_MessageRequester_YesNo) = #IDYES Nick.s = InputRequester("Namen eingeben", "Geben Sie hier ihren/ihre Namen ein:", "") SendToHost("mitglied.lycos.de", "/dani008/bb/index.php", "nick="+Nick+"&score="+Str(Points)) RunProgram("http://mitglied.lycos.de/dani008/bb/index.php") EndIf EndProcedure Structure Player Life.l Col.l SpeedX.f SpeedY.f X.f Y.f UP.l DOWN.l LEFT.l RIGHT.l EndStructure Global NewList Enemy.Player() Global NewList Player.Player() AddElement(Enemy()) Enemy()\X = Random(50)+200 Enemy()\Y = Random(50)+150 AddElement(Enemy()) Enemy()\X = Random(50)+200 Enemy()\Y = Random(50)+250 AddElement(Enemy()) Enemy()\X = Random(50)+300 Enemy()\Y = Random(50)+150 AddElement(Enemy()) Enemy()\X = Random(50)+300 Enemy()\Y = Random(50)+250 AddElement(Player()) Player()\X = 16 Player()\Y = 16 Player()\Life = 2 #WindowWidth = 500 #WindowFlags = #PB_Window_TitleBar | #PB_Window_SystemMenu | #PB_Window_ScreenCentered #WindowHeight = 400 Procedure SelectNearestPlayer(X, Y) Nearest = 10000 ForEach Player() If Sqr(Pow(Player()\X-X, 2)+Pow(Player()\Y-Y, 2)) <= Nearest And Player()\Life > 0 Near = ListIndex(Player()) Nearest = Sqr(Pow(Player()\X-X, 2)+Pow(Player()\Y-Y, 2)) EndIf Next SelectElement(Player(), Near) ProcedureReturn Near EndProcedure Procedure GetGameState() If CountList(Enemy()) <= 0 Stage + 1 ProcedureReturn 2 EndIf Current = ListIndex(Player()) ForEach Player() If Player()\Life <= 0 lost + 1 EndIf Next SelectElement(Player(), Current) If lost >= CountList(Player()) ProcedureReturn 1 EndIf EndProcedure hWnd = OpenWindow(#Win, 0, 0, #WindowWidth, #WindowHeight, "BounceBalls", #WindowFlags) hImg = CreateImage(#Image, 500, 400) StartDrawing(ImageOutput(#Image)) Box(0, 0, WindowWidth(#Win), WindowHeight(#Win), RGB(0, 0, 0)) StopDrawing() Main: Repeat Event = WindowEvent() Select Event Case #WM_KEYDOWN Select EventwParam() Case #VK_ESCAPE If Mode = 2 Or Mode = 4 Or Mode = 3 Highscore() EndIf Mode = 0 EndSelect EndSelect StartDrawing(ImageOutput(#Image)) Box(0, 0, WindowWidth(#Win), WindowHeight(#Win), RGB(0, 0, 0)) StopDrawing() ;Knöpfe If Mode = 0 StartDrawing(ImageOutput(#Image)) Ellipse(200, 150, WindowWidth(#Win)/2, WindowWidth(#Win)/2, RGB(0,0, 255)) Ellipse(400, 300, 100, 100, RGB(255,255, 0)) StopDrawing() If Button((WindowWidth(#Win)-Len("Start")*7)/2, 150, "Start", RGB(255, 0, 0), RGB(0, 255, 0), RGB(0, 255, 0), Event) = 2 Points = 0 Start = 0 HindX = Random(WindowWidth(#Win)) HindY = Random(WindowHeight(#Win)) ClearList(Enemy()) AddElement(Enemy()) Enemy()\X = Random(50)+200 Enemy()\Y = Random(50)+150 AddElement(Enemy()) Enemy()\X = Random(50)+200 Enemy()\Y = Random(50)+250 AddElement(Enemy()) Enemy()\X = Random(50)+300 Enemy()\Y = Random(50)+150 AddElement(Enemy()) Enemy()\X = Random(50)+300 Enemy()\Y = Random(50)+250 ForEach Player() Player()\SpeedX = 0 Player()\SpeedY = 0 If ListIndex(Player()) = 0 Player()\X = 16 Player()\Y = 16 Player()\Life = 5 ElseIf ListIndex(Player()) = 1 Player()\X = WindowWidth(#Win)-16 Player()\Y = WindowHeight(#Win)-16 Player()\Life = 5 ElseIf ListIndex(Player()) = 2 Player()\X = WindowWidth(#Win)-16 Player()\Y = 16 Player()\Life = 5 ElseIf ListIndex(Player()) = 3 Player()\X = 16 Player()\Y = WindowHeight(#Win)-16 Player()\Life = 5 EndIf Next Mode = 2 EndIf If Button((WindowWidth(#Win)-Len("Spieler "+Str(CountList(Player())))*6.75)/2, 175, "Spieler "+Str(CountList(Player())), RGB(255, 0, 0), RGB(0, 255, 0), RGB(0, 255, 0), Event) = 2 If CountList(Player()) < 4 And Event = #WM_LBUTTONDOWN AddElement(Player()) If ListIndex(Player()) = 0 Player()\X = 16 Player()\Y = 16 Player()\Life = 2 ElseIf ListIndex(Player()) = 1 Player()\X = WindowWidth(#Win)-16 Player()\Y = WindowHeight(#Win)-16 Player()\Life = 2 ElseIf ListIndex(Player()) = 2 Player()\X = WindowWidth(#Win)-16 Player()\Y = 16 Player()\Life = 2 ElseIf ListIndex(Player()) = 3 Player()\X = 16 Player()\Y = WindowHeight(#Win)-16 Player()\Life = 2 EndIf ElseIf CountList(Player()) > 1 And Event = #WM_RBUTTONDOWN LastElement(Player()) DeleteElement(Player()) EndIf EndIf If Button((WindowWidth(#Win)-Len("Steuerung")*7.5)/2, 200, "Steuerung", RGB(255, 0, 0), RGB(0, 255, 0), RGB(0, 255, 0), Event) = 2 FirstElement(Player()) Mode = 1 EndIf ElseIf Mode = 1 StartDrawing(ImageOutput(#Image)) Ellipse(200, 150, WindowWidth(#Win)/2, WindowWidth(#Win)/2, RGB(0,0, 255)) Ellipse(400, 300, 100, 100, RGB(255,255, 0)) StopDrawing() If Button((WindowWidth(#Win)-Len("Spieler "+Str(ListIndex(Player())+1))*7)/2, 10, "Spieler "+Str(ListIndex(Player())+1), RGB(255, 0, 0), RGB(0, 255, 0), RGB(0, 255, 0), Event) = 2 If ListIndex(Player()) < CountList(Player())-1 And Event = #WM_LBUTTONDOWN NextElement(Player()) SearchKey = 0 ElseIf ListIndex(Player()) > 0 And Event = #WM_RBUTTONDOWN PreviousElement(Player()) SearchKey = 0 Else Mode = 0 EndIf EndIf StartDrawing(ImageOutput(#Image)) FrontColor(RGB(255, 255, 0)) DrawingMode(1) Select SearchKey Case 0 DrawText((WindowWidth(#Win)-Len("Hoch")*7)/2, 100, "Hoch") If Event = #WM_KEYDOWN Player()\UP = EventwParam() SearchKey + 1 EndIf Case 1 DrawText((WindowWidth(#Win)-Len("Runter")*7)/2, 100, "Runter") If Event = #WM_KEYDOWN Player()\DOWN = EventwParam() SearchKey + 1 EndIf Case 2 DrawText((WindowWidth(#Win)-Len("Links")*7)/2, 100, "Links") If Event = #WM_KEYDOWN Player()\LEFT = EventwParam() SearchKey + 1 EndIf Case 3 DrawText((WindowWidth(#Win)-Len("Rechts")*7)/2, 100, "Rechts") If Event = #WM_KEYDOWN Player()\RIGHT = EventwParam() SearchKey + 1 EndIf Case 4 SearchKey = 0 If ListIndex(Player()) < CountList(Player())-1 NextElement(Player()) Else Mode = 0 EndIf EndSelect StopDrawing() ElseIf Mode = 3 GO - 1 If GO <= 0 Highscore() Mode = 0 EndIf StartDrawing(ImageOutput(#Image)) FrontColor(RGB(128, 128, 128)) DrawingMode(1) DrawText((500-TextWidth("Game Over"))/2, 180, "Game Over") StopDrawing() ElseIf Mode = 4 GO - 1 If GO <= 0 ClearList(Enemy()) AddElement(Enemy()) Enemy()\X = Random(50)+200 Enemy()\Y = Random(50)+150 AddElement(Enemy()) Enemy()\X = Random(50)+200 Enemy()\Y = Random(50)+250 AddElement(Enemy()) Enemy()\X = Random(50)+300 Enemy()\Y = Random(50)+150 AddElement(Enemy()) Enemy()\X = Random(50)+300 Enemy()\Y = Random(50)+250 Mode = 2 ForEach Player() Player()\SpeedX = 0 Player()\SpeedY = 0 If ListIndex(Player()) = 0 Player()\X = 16 Player()\Y = 16 ElseIf ListIndex(Player()) = 1 Player()\X = WindowWidth(#Win)-16 Player()\Y = WindowHeight(#Win)-16 ElseIf ListIndex(Player()) = 2 Player()\X = WindowWidth(#Win)-16 Player()\Y = 16 ElseIf ListIndex(Player()) = 3 Player()\X = 16 Player()\Y = WindowHeight(#Win)-16 EndIf Next EndIf StartDrawing(ImageOutput(#Image)) FrontColor(RGB(128, 128, 128)) DrawingMode(1) DrawText((500-TextWidth("Level geschafft!"))/2, 180, "Level geschafft!") StopDrawing() Else If GetGameState() = 1 GO = 100 Mode = 3 ElseIf GetGameState() = 2 GO = 100 Mode = 4 EndIf If Random((200/(Stage+1))+250) = 10 AddElement(Enemy()) Enemy()\X = 250 Enemy()\Y = 200 EndIf If Random(500) = 0 Hind = 0 Else If Hind = 0 If Random(1) = 1 HindX = Random(WindowWidth(#Win)) HindY = Random(WindowHeight(#Win)) Hind = 1 EndIf EndIf EndIf StartDrawing(ImageOutput(#Image)) DrawingMode(1 | 4) If Hind = 1 Ellipse(HindX, HindY, 8, 8, RGB(255, 255, 255)) EndIf DrawingMode(1) ForEach Enemy() If Enemy()\X <= 0 Or Enemy()\X >= WindowWidth(#Win) Or Enemy()\Y <= 0 Or Enemy()\Y >= WindowHeight(#Win) DeleteElement(Enemy()) Points + 1 If CountList(Enemy()) = 0 Break EndIf EndIf If Enemy()\Col <= 0 SelectNearestPlayer(Enemy()\X, Enemy()\Y) If CountList(Player()) <> 0 If Player()\Y < Enemy()\Y If Enemy()\SpeedY >= -2.75 Enemy()\SpeedY - 0.25 EndIf ElseIf Player()\Y > Enemy()\Y If Enemy()\SpeedY <= 2.75 Enemy()\SpeedY + 0.25 EndIf EndIf If Player()\X < Enemy()\X If Enemy()\SpeedX >= -2.75 Enemy()\SpeedX - 0.25 EndIf ElseIf Player()\X > Enemy()\X If Enemy()\SpeedX <= 2.75 Enemy()\SpeedX + 0.25 EndIf EndIf EndIf Else Enemy()\Col - 1 EndIf Col = Enemy()\Col Cur = ListIndex(Enemy()) CurX.f = Enemy()\X CurY.f = Enemy()\Y CurSpeedX.f = Enemy()\SpeedX CurSpeedY.f = Enemy()\SpeedY If Hind = 1 If Sqr(Pow(HindX-CurX, 2)+Pow(HindY-CurY, 2)) <= 12 And Col <= 0 If HindX <> CurX Col = 3 CurSpeedX = CurSpeedX *-1 EndIf If HindY <> CurY Col = 3 CurSpeedY = CurSpeedY *-1 EndIf EndIf EndIf ForEach Player() If Sqr(Pow(Player()\X-CurX, 2)+Pow(Player()\Y-CurY, 2)) <= 12 And ListIndex(Player()) <> Cur And Col <= 0 And Player()\Col <= 0 If Player()\X <> CurX Player()\SpeedX * -1 Player()\Col = 3 Col = 3 CurSpeedX = (Player()\SpeedX+CurSpeedX) *-1 EndIf If Player()\Y <> CurY Player()\SpeedY * -1 Player()\Col = 3 Col = 3 CurSpeedY = (Player()\SpeedY+CurSpeedY) *-1 EndIf EndIf Next ForEach Enemy() If Sqr(Pow(Enemy()\X-CurX, 2)+Pow(Enemy()\Y-CurY, 2)) <= 8 And Col <= 0 And Enemy()\Col <= 0 If Enemy()\X <> CurX Enemy()\SpeedX * -1 Enemy()\Col = 3 Col = 3 CurSpeedX = (Enemy()\SpeedX+CurSpeedX) *-0.5 EndIf If Enemy()\Y <> CurY Enemy()\SpeedY * -1 Enemy()\Col = 3 Col = 3 CurSpeedY = (Enemy()\SpeedY+CurSpeedY) *-0.5 EndIf EndIf Next SelectElement(Enemy(), Cur) Enemy()\Col = Col Enemy()\SpeedX = CurSpeedX Enemy()\SpeedY = CurSpeedY Enemy()\X + Enemy()\SpeedX Enemy()\Y + Enemy()\SpeedY Ellipse(Enemy()\X, Enemy()\Y, 4, 4, RGB(200, 200, 200)) Next ForEach Player() If Player()\X <= 0 Or Player()\X >= WindowWidth(#Win) Or Player()\Y <= 0 Or Player()\Y >= WindowHeight(#Win) Player()\Life - 1 Player()\SpeedX = 0 Player()\SpeedY = 0 If ListIndex(Player()) = 0 Player()\X = 16 Player()\Y = 16 ElseIf ListIndex(Player()) = 1 Player()\X = WindowWidth(#Win)-16 Player()\Y = WindowHeight(#Win)-16 ElseIf ListIndex(Player()) = 2 Player()\X = WindowWidth(#Win)-16 Player()\Y = 16 ElseIf ListIndex(Player()) = 3 Player()\X = 16 Player()\Y = WindowHeight(#Win)-16 EndIf EndIf If Player()\Col <= 0 If GetAsyncKeyState_(Player()\UP) If Player()\SpeedY >= -3 Player()\SpeedY - 0.25 EndIf ElseIf GetAsyncKeyState_(Player()\DOWN) If Player()\SpeedY <= 3 Player()\SpeedY + 0.25 EndIf EndIf If GetAsyncKeyState_(Player()\LEFT) If Player()\SpeedX >= -3 Player()\SpeedX - 0.25 EndIf ElseIf GetAsyncKeyState_(Player()\RIGHT) If Player()\SpeedX <= 3 Player()\SpeedX + 0.25 EndIf EndIf Else Player()\Col - 1 EndIf Col = Player()\Col Cur = ListIndex(Player()) CurX.f = Player()\X CurY.f = Player()\Y CurSpeedX.f = Player()\SpeedX CurSpeedY.f = Player()\SpeedY If Hind = 1 If Sqr(Pow(HindX-CurX, 2)+Pow(HindY-CurY, 2)) <= 17 And Col <= 0 If HindX <> CurX Col = 3 CurSpeedX = CurSpeedX *-1 EndIf If HindY <> CurY Col = 3 CurSpeedY = CurSpeedY *-1 EndIf EndIf EndIf ForEach Player() If Sqr(Pow(Player()\X-CurX, 2)+Pow(Player()\Y-CurY, 2)) <= 17 And ListIndex(Player()) <> Cur And Col <= 0 And Player()\Col <= 0 If Player()\X <> CurX Player()\SpeedX * -1 Player()\Col = 3 Col = 3 CurSpeedX = (Player()\SpeedX+CurSpeedX) *-0.5 EndIf If Player()\Y <> CurY Player()\SpeedY * -1 Player()\Col = 3 Col = 3 CurSpeedY = (Player()\SpeedY+CurSpeedY) *-0.5 EndIf EndIf Next ForEach Enemy() If Sqr(Pow(Enemy()\X-CurX, 2)+Pow(Enemy()\Y-CurY, 2)) <= 12 And Col <= 0 And Enemy()\Col <= 0 If Enemy()\X <> CurX Enemy()\SpeedX * -2 Enemy()\Col = 3 Col = 3 CurSpeedX = (Enemy()\SpeedX+CurSpeedX) *-0.5 EndIf If Enemy()\Y <> CurY Enemy()\SpeedY * -2 Enemy()\Col = 3 Col = 3 CurSpeedY = (Enemy()\SpeedY+CurSpeedY) *-0.5 EndIf EndIf Next SelectElement(Player(), Cur) Player()\Col = Col Player()\SpeedX = CurSpeedX Player()\SpeedY = CurSpeedY Player()\X + Player()\SpeedX Player()\Y + Player()\SpeedY If Player()\SpeedY <> 0 If Player()\SpeedY < 0 Player()\SpeedY + 0.05 Else Player()\SpeedY - 0.05 EndIf EndIf If Player()\SpeedX <> 0 If Player()\SpeedX < 0 Player()\SpeedX + 0.05 Else Player()\SpeedX - 0.05 EndIf EndIf If ListIndex(Player()) = 0 Ellipse(Player()\X, Player()\Y, 8, 8, RGB(255, 0, 0)) ElseIf ListIndex(Player()) = 1 Ellipse(Player()\X, Player()\Y, 8, 8, RGB(255, 255, 0)) ElseIf ListIndex(Player()) = 2 Ellipse(Player()\X, Player()\Y, 8, 8, RGB(0, 255, 0)) ElseIf ListIndex(Player()) = 3 Ellipse(Player()\X, Player()\Y, 8, 8, RGB(0, 0, 255)) EndIf FrontColor(RGB(128, 128, 128)) DrawText((ListIndex(Player())*100)+50, 5, Str(Player()\Life)) Next DrawText(250, 380, Str(Points)) StopDrawing() EndIf StartDrawing(WindowOutput(#Win)) DrawImage(hImg, 0, 0) StopDrawing() ;Ende Knöpfe Delay(20) Until Event = #PB_Event_CloseWindow MessageRequester("Created by", "Daniel B."+Chr(10)+"e-mail: bradan10@web.de") End ; IDE Options = PureBasic v4.02 (Windows - x86) ; Folding = - ; DisableDebugger