Pygrr - input (part 2)
Now we've done the keyboard, let's move onto the mouse. The clicks are registered in the same method, and queried with these statements:
if pygrr.input.mouse_down("left"): # if the button is pressed that frame
if pygrr.input.mouse_up("left"): # if the button is released that frame
if pygrr.input.mouse("left") # if the button is held that frame
And for the mouse position, we can bind a function with tkinter to return the new position of the mouse. Which makes life incredibly easy... So, yeah! You can use pygrr.input.mouse_position(), mouse_x(), or mouse_y() to get the values...
Let's make a small game with Pygrr, with our new-found mouse input!
import pygrr, random # add pygrr library and the random library to the project
def round_to_nearest_5(number): # function that rounds the given number to the nearest 5
return round(number / 5) * 5
pygrr.create_window(width=500, height=400) # create the pygrr window
player = pygrr.Object() # create the player
player.set_model(pygrr.create_model.circle(15))
player.pack()
spawn_time = 5 # time for the enemies to spawn in seconds
timer = 0 # this is the number that ticks down
enemies = [] # store all the enemies in this array
while True: # this is the game loop!
timer -= pygrr.deltatime # tick timer down by the time since last frame
if timer <= 0: # if delta is less than or equal to 0
# create an enemy
enemy = pygrr.Object(model=pygrr.create_model.triangle(8,15),fill_color="red")
enemy.set_x(random.randint(-250, 250)) # give the enemy a random x coordinate
enemy.set_y(random.randint(-200, 200)) # give the enemy a random y coordinate
enemy.pack()
enemies.append(enemy) # add the enemy to the enemy array
timer = spawn_time # reset the timer
for enemy in enemies: # run through all the enemies
enemy.point_towards(player.get_x(), player.get_y()) # point enemy towards the player
enemy.move_forward(50 * pygrr.deltatime) # move the enemy forwards 50 pixels a second
# if the x coordinates of the mouse and the enemy are the same (rounded to nearest 5)
if round_to_nearest_5(pygrr.input.mouse_x()) == round_to_nearest_5(enemy.get_x()):
# if the y coordinates of the mouse and the enemy are the same (rounded to nearest 5)
if round_to_nearest_5(pygrr.input.mouse_y()) == round_to_nearest_5(enemy.get_y()):
# thus, the mouse is over the enemy
enemy.destroy() # remove the enemy from the canvas
enemies.remove(enemy) # remove the enemy from the array
spawn_time *= 0.9 # make the timer quicker by reducing the start time
pygrr.next_frame() # rendering
Make sure you bear in mind that the hashtag (#) denotes a code-comment, so doesn't actually mean anything in the code - the point of it is to help people understand it! Here's the code without comments, see if you can still understand it:
import pygrr, random
def round_to_nearest_5(number):
return round(number / 5) * 5
pygrr.create_window(width=500, height=400)
player = pygrr.Object()
player.set_model(pygrr.create_model.circle(15))
player.pack()
spawn_time = 5
timer = 0
enemies = []
while True:
timer -= pygrr.deltatime
if timer <= 0:
enemy = pygrr.Object(model=pygrr.create_model.triangle(8,15),fill_color="red")
enemy.set_x(random.randint(-250, 250))
enemy.set_y(random.randint(-200, 200))
enemy.pack()
enemies.append(enemy)
timer = spawn_time
for enemy in enemies:
enemy.point_towards(player.get_x(), player.get_y())
enemy.move_forward(50 * pygrr.deltatime)
if round_to_nearest_5(pygrr.input.mouse_x()) == round_to_nearest_5(enemy.get_x()):
if round_to_nearest_5(pygrr.input.mouse_y()) == round_to_nearest_5(enemy.get_y()):
enemy.destroy()
enemies.remove(enemy)
spawn_time *= 0.9
pygrr.next_frame()
Okay, I'll stop being cruel now, here's a video!
I promise there was meaning to me swamping you with code... You might have seen how finicky it was to code the "mouse over", and that when the enemies hit the player, nothing happened...
You guessed it, collision is coming next to a Pygrr near you!
Isaac, over and out...