110 lines
4.3 KiB
Python
110 lines
4.3 KiB
Python
# Dont use C data structures when we can avoid it. Makes Pypy slightly faster.
|
|
|
|
from raylib import *
|
|
import random
|
|
|
|
MAX_BUNNIES = 500000
|
|
|
|
# This is the maximum amount of elements (quads) per batch
|
|
# NOTE: This value is defined in [rlgl] module and can be changed there
|
|
MAX_BATCH_ELEMENTS = 8192
|
|
|
|
|
|
class Bunny:
|
|
def __init__(self):
|
|
self.position_x = 0.0
|
|
self.position_y = 0.0
|
|
self.speed_x = 0.0
|
|
self.speed_y = 0.0
|
|
self.color_r = 0
|
|
self.color_g = 0
|
|
self.color_b = 0
|
|
self.color_a = 0
|
|
|
|
|
|
# // Initialization
|
|
# //--------------------------------------------------------------------------------------
|
|
screenWidth = 1920;
|
|
screenHeight = 1080;
|
|
|
|
InitWindow(screenWidth, screenHeight, b"raylib [textures] example - bunnymark")
|
|
|
|
# // Load bunny texture
|
|
texBunny = LoadTexture(b"resources/wabbit_alpha.png")
|
|
|
|
bunnies = []
|
|
for i in range(0, MAX_BUNNIES):
|
|
bunnies.append(Bunny())
|
|
|
|
bunniesCount = 0 # Bunnies counter
|
|
|
|
SetTargetFPS(60) # Set our game to run at 60 frames-per-second
|
|
#//--------------------------------------------------------------------------------------
|
|
|
|
#// Main game loop
|
|
while not WindowShouldClose(): #// Detect window close button or ESC key
|
|
#// Update
|
|
#//----------------------------------------------------------------------------------
|
|
if IsMouseButtonDown(MOUSE_BUTTON_LEFT):
|
|
#// Create more bunnies
|
|
for i in range(0, 100):
|
|
if bunniesCount < MAX_BUNNIES:
|
|
bunnies[bunniesCount].position_x = GetMousePosition().x
|
|
bunnies[bunniesCount].position_y = GetMousePosition().y
|
|
bunnies[bunniesCount].speed_x = random.randint(-250, 250)/60.0
|
|
bunnies[bunniesCount].speed_y = random.randint(-250, 250)/60.0
|
|
bunnies[bunniesCount].color_r = random.randint(50,240)
|
|
bunnies[bunniesCount].color_g = random.randint(80, 240)
|
|
bunnies[bunniesCount].color_b = random.randint(100, 240)
|
|
bunnies[bunniesCount].color_a = 255
|
|
bunniesCount+=1
|
|
|
|
|
|
# // Update bunnies
|
|
for i in range(0, bunniesCount):
|
|
bunnies[i].position_x += bunnies[i].speed_x
|
|
bunnies[i].position_y += bunnies[i].speed_y
|
|
|
|
if ((bunnies[i].position_x + texBunny.width/2) > GetScreenWidth()) or ((bunnies[i].position_x + texBunny.width/2) < 0):
|
|
bunnies[i].speed_x *= -1
|
|
if ((bunnies[i].position_y + texBunny.height/2) > GetScreenHeight()) or ((bunnies[i].position_y + texBunny.height/2 - 40) < 0):
|
|
bunnies[i].speed_y *= -1
|
|
|
|
# //----------------------------------------------------------------------------------
|
|
#
|
|
# // Draw
|
|
# //----------------------------------------------------------------------------------
|
|
BeginDrawing()
|
|
|
|
ClearBackground(RAYWHITE)
|
|
|
|
for i in range(0, bunniesCount):
|
|
# // NOTE: When internal batch buffer limit is reached (MAX_BATCH_ELEMENTS),
|
|
# // a draw call is launched and buffer starts being filled again;
|
|
# // before issuing a draw call, updated vertex data from internal CPU buffer is send to GPU...
|
|
# // Process of sending data is costly and it could happen that GPU data has not been completely
|
|
# // processed for drawing while new data is tried to be sent (updating current in-use buffers)
|
|
# // it could generates a stall and consequently a frame drop, limiting the number of drawn bunnies
|
|
DrawTexture(texBunny, int(bunnies[i].position_x), int(bunnies[i].position_y), (bunnies[i].color_r,bunnies[i].color_g,bunnies[i].color_b,bunnies[i].color_a))
|
|
|
|
DrawRectangle(0, 0, screenWidth, 40, BLACK)
|
|
text = f"bunnies {bunniesCount}"
|
|
DrawText(text.encode('utf-8'), 120, 10, 20, GREEN)
|
|
text = f"batched draw calls: { 1 + int(bunniesCount/MAX_BATCH_ELEMENTS)}"
|
|
DrawText(text.encode('utf-8'), 320, 10, 20, MAROON)
|
|
|
|
DrawFPS(10, 10)
|
|
|
|
EndDrawing()
|
|
#//----------------------------------------------------------------------------------
|
|
|
|
|
|
#// De-Initialization
|
|
#//--------------------------------------------------------------------------------------
|
|
|
|
|
|
UnloadTexture(texBunny); #Unload bunny texture
|
|
|
|
CloseWindow() # Close window and OpenGL context
|
|
#//--------------------------------------------------------------------------------------
|
|
|