1

I'm writing a program where on mouseclick, the player shoots a dagger which will eventually hit a villain. I've got the code so that the dagger shoots, however when I move my character to a different position, the shot continues coming from one spot, and not from the character.

I believe this is because I have the player set in a Rect in one position when it starts, and all the shots come from that rect. If that is the problem; how do I make it so that the Rect moves with the player?

I've added my whole code below:

#Import the necessary modules
import pygame
import sys
import os
import math

#Initialize pygame
pygame.init()

# Set the size for the surface (screen)
screenSize = (900,600)
screen = pygame.display.set_mode((screenSize),0)

# Set the caption for the screen
pygame.display.set_caption("Neverland")

#Define Colours
WHITE = (255,255,255)
BLUE = (0,0,255)
BLACK = (0,0,0)
GRAY = (128, 128, 128)
MAROON = (128, 0, 0)
NAVYBLUE = (0, 0, 128)
OLIVE = (128, 128, 0)
PURPLE = (128, 0, 128)
TEAL = (0,128,128)
PINK = (226,132,164)
MUTEDBLUE = (155,182,203)
PLUM = (221,160,221)

#Clock Setup
clock = pygame.time.Clock()

#Load Images
peterPlayer = pygame.image.load('pixelPirateOne.png')
nightBackground = pygame.image.load (('skyTwo_1.png'))
daggerPlayer = pygame.image.load('daggerPlayer.png')

#Settting Variables for Moving Character

player = pygame.Rect(200, 275, 160, 146)
xPlayer = 200
yPlayer = 275
dxPlayer = 0
dyPlayer = 0
playerPosition = (200,275)
accuracyShot = [0,0]
daggers = []
angle = 0

def quitGame():
    pygame.quit()
    sys.exit()

def outOfBounds(shot):
    return shot[0] < -40 or shot[0] > 900 or shot[1] < -40 or shot[1] > 600

go = True
while go:

#Quit Game
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
                quitGame()

#Move Player                
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                dxPlayer -= 25
            elif event.key == pygame.K_RIGHT:
                dxPlayer += 25
            elif event.key == pygame.K_UP:
                dyPlayer -= 25
            elif event.key == pygame.K_DOWN:
                dyPlayer += 25

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                dxPlayer = 0
            elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                dyPlayer = 0

        elif event.type == pygame.MOUSEBUTTONDOWN:
            mousePosition = pygame.mouse.get_pos()   
            velx = math.cos(angle)*12
            vely = math.sin(angle)*12

            daggerImage = pygame.transform.rotate(daggerPlayer, -math.degrees(angle))
            width, height = daggerImage.get_size()

            daggers.append([[player.centerx-width/2, player.centery-height/2],
                            [velx, vely], daggerImage]) 

#Update move player
    xPlayer = xPlayer + dxPlayer
    yPlayer = yPlayer + dyPlayer
    pygame.display.update()

#Learned about atan2 from --> https://docs.python.org/2/library/math.html
#Allows To Rotate Player With Mouse    
    mousePosition = pygame.mouse.get_pos()
    rise = mousePosition[1] - player.centery
    run = mousePosition[0] - player.centerx
    angle = math.atan2(rise, run)
    playerRotate = pygame.transform.rotate(peterPlayer, -math.degrees(angle))
    playerPositionNew = (xPlayer-playerRotate.get_rect().width/2, yPlayer-playerRotate.get_rect().height/2)
    player = playerRotate.get_rect(center=player.center)

#Learned about cos and sin in python from --> https://docs.python.org/2/library/math.html
#Learned about .pop from --> https://docs.python.org/2/tutorial/datastructures.html
#Draw daggers to screen
    filtered_daggers = []
    for shot in daggers:
        if not outOfBounds(shot[0]):
            filtered_daggers.append(shot)
        daggers = filtered_daggers

    for shot in daggers:
        shot[0][0] += shot[1][0]
        shot[0][1] += shot[1][1]

    screen.blit(nightBackground, (0,0))
    screen.blit(playerRotate, playerPositionNew)

    for shot in daggers:
        x, y = shot[0]       
        screen.blit(shot[2], shot[0])

    pygame.display.update()
    clock.tick(30)
Student
  • 49
  • 1
  • 11
  • Why don't you just `daggers.append(` using `xPlayer` and `yPlayer` instead of `player.centerx` and `player.centery`? Maybe this will help, although, on first look, your code looks correctly to. – Adrijaned Jun 13 '17 at 04:37
  • I tried! But I got the error `daggers.append([[player.xPlayer-width/2, player.yPlayer-height/2], AttributeError: 'pygame.Rect' object has no attribute 'xPlayer'` – Student Jun 13 '17 at 04:43
  • 1
    No, I mean't completely replace `player.centerx` with `xPlayer` and `player.centery` with `yPlayer`, so the code would look like `daggers.append([[xPlayer...`. It should mean the same thing after all, shouldn't it? Also, i don't grant you succes when going this way, I just say I dont see in your code much yet and trying to swap few values is the first thing I'd have personally done. – Adrijaned Jun 13 '17 at 04:50
  • Thank you so so much I can't believe I didn't even notice that. I see what you're saying now and it works! – Student Jun 13 '17 at 05:10
  • However for the reason why this works you have to look yourself. Don't forget to post it as answer later. – Adrijaned Jun 13 '17 at 05:12

0 Answers0