forked from Johnidel/Python-Projects
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplayer.py
More file actions
117 lines (103 loc) · 4.1 KB
/
Copy pathplayer.py
File metadata and controls
117 lines (103 loc) · 4.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import pygame
import math
#rotate image by it's center(SQURE IMAGES ONLY)
def rot_center(image, rect, angle):
"""rotate an image while keeping its center"""
rot_image = pygame.transform.rotate(image, angle)
rot_rect = rot_image.get_rect(center=rect.center)
return rot_image,rot_rect
class Player:
def __init__(self, pos, speed, level):
#These two are to make it look like character is walking; there's probably a better way to do this
self.x=0
#init vats
self.img = [pygame.image.load("res/player-right2.png").convert_alpha(), pygame.image.load("res/player-left2.png").convert_alpha()]
self.imgStanding = pygame.image.load("res/player-standing2.png").convert_alpha()
self.imgAttacking = pygame.image.load("res/player-knife2.png").convert_alpha()
self.imgCarrying = pygame.image.load("res/player.png").convert_alpha()
self.playerRect = self.img[0].get_rect()
self.pos = pos
self.playerRect = self.playerRect.move(pos[0], pos[1])
self.speedO = speed
self.theta = 0
self.level = level
self.attacking = False
self.standing = True
self.carrying = False
self.collisionRect = pygame.Rect(self.playerRect.center[0] - 31, self.playerRect.center[1] - 31, 64, 64)
def draw(self, screen):
#rotate player image
if self.carrying:
rot_img = pygame.transform.rotate(self.imgCarrying, self.theta)
mag = 23
elif self.standing and not self.attacking:
rot_img = pygame.transform.rotate(self.imgStanding, self.theta)
mag = 23
elif not self.attacking:
rot_img = pygame.transform.rotate(self.img[0], self.theta)
mag = 23
else:
rot_img = pygame.transform.rotate(self.imgAttacking, self.theta)
mag = 40
rot_rect = rot_img.get_rect()
rot_rect.center = (self.playerRect.center[0] - math.cos(math.radians(self.theta - 90)) * (mag), self.playerRect.center[1] + math.sin(math.radians(self.theta - 90)) * (mag))
#draw image
screen.blit(rot_img, rot_rect)
pygame.draw.rect(screen, (255, 0 , 0), self.collisionRect, 3)
def update(self, keys):
deltaF = 0
deltaS = 0
#get distance between mouse and center of player
mouseX, mouseY = pygame.mouse.get_pos()
mouseXO, mouseYO = pygame.mouse.get_pos()
mouseX, mouseY = mouseX - self.playerRect.center[0], mouseY - self.playerRect.center[1]
#find angle at which mouse is with respect to player
magMovement = ((mouseX ** 2) + (mouseY ** 2)) ** (1/2)
if magMovement != 0:
dirMovement = (mouseX / magMovement, mouseY / magMovement)
theta = math.asin(mouseX / magMovement)
if mouseY > 0 and mouseX < 0:
theta = math.pi-theta
if mouseY > 0 and mouseX >= 0:
theta = math.pi - theta
theta = -theta * 180 / math.pi
#round to nearest degree to minimize jitterting
self.theta = round(theta)
#check what keys/buttons are pressed
if keys["R"] and not self.carrying and not self.attacking:
self.speed = self.speedO + 2
elif self.carrying:
self.speed = self.speedO - 2
else:
self.speed = self.speedO
if keys["W"]:
self.standing = False
deltaF = self.speed
self.x+=1
if self.x == 5:
self.img.append(self.img.pop(0))
self.x = 0
else:
self.standing = True
if keys["A"]:
deltaS = -self.speed
if keys["S"]:
deltaF = -self.speed
if keys["D"]:
deltaS = self.speed
if pygame.mouse.get_pressed()[0] and not self.carrying:
self.attacking = True
else:
self.attacking = False
#move rectangle bsed on key input
self.playerRect = self.playerRect.move(dirMovement[0] * deltaF, dirMovement[1] * deltaF)
self.playerRect = self.playerRect.move(-dirMovement[1] * deltaS, dirMovement[0] * deltaS)
#collision rect for player
self.collisionRect = pygame.Rect(self.playerRect.center[0] - 31, self.playerRect.center[1] - 31, 64, 64)
#check collision with walls
for wall in self.level.walls:
if self.collisionRect.colliderect(wall):
self.playerRect = self.playerRect.move(-dirMovement[0] * deltaF, -dirMovement[1] * deltaF)
self.playerRect = self.playerRect.move(dirMovement[1] * deltaS, -dirMovement[0] * deltaS)
#move mouse to front of player
pygame.mouse.set_pos(self.playerRect.center[0] + round(dirMovement[0] * 40), self.playerRect.center[1] + round(dirMovement[1] * 40))