Spaces:
Sleeping
Sleeping
File size: 7,090 Bytes
e53fda1 |
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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
import pygame, math
from game.race.utils import pygame_image_scale
from utils.dict_utils import get_with_warning
class CarSprite(pygame.sprite.Sprite):
ACCELERATION = 2
TURN_SPEED = 10
def __init__(self, **kargs):
pygame.sprite.Sprite.__init__(self)
assert 'car_position' in kargs, 'car_position is required'
self.position = get_with_warning(kargs, 'car_position', (100, 100))
self.direction = get_with_warning(kargs, 'direction', 0)
self.speed = get_with_warning(kargs, 'init_speed', 0)
self.speed_attenuation = get_with_warning(kargs, 'speed_attenuation', 0.98)
self.MAX_FORWARD_SPEED = get_with_warning(kargs, 'MAX_FORWARD_SPEED', 10)
self.MAX_REVERSE_SPEED = get_with_warning(kargs, 'MAX_REVERSE_SPEED', 10)
self.ACCELERATION = get_with_warning(kargs, 'ACCELERATION', 2)
self.TURN_SPEED = get_with_warning(kargs, 'TURN_SPEED', 10)
self.car_image = get_with_warning(kargs, 'car_image', './game/race/images/white_car.png')
self.car_image_scale = get_with_warning(kargs, 'car_image_scale', 0.2)
self.src_image = pygame_image_scale(pygame.image.load(self.car_image), self.car_image_scale)
self.clear_k()
self.rect = self.src_image.get_rect(center=self.position)
self.viewpoint = get_with_warning(kargs, "viewpoint", "car")
def clear_k(self):
self.k_left = self.k_right = self.k_down = self.k_up = 0
def update(self, action):
#SIMULATION
# print(f"k_left: {self.k_left}, k_right: {self.k_right}, k_down: {self.k_down}, k_up: {self.k_up}")
print("car_action: ", action)
if self.viewpoint == "car":
print("Moving in the viewpoint of car")
if action == "RIGHT":
self.k_right = -self.TURN_SPEED
elif action == "LEFT":
self.k_left = self.TURN_SPEED
elif action == "FORWARD":
self.k_up = self.ACCELERATION
elif action == "BACKWARD":
self.k_down = -self.ACCELERATION
self.speed += (self.k_up + self.k_down)
if self.speed > self.MAX_FORWARD_SPEED:
self.speed = self.MAX_FORWARD_SPEED
elif self.speed < -self.MAX_REVERSE_SPEED:
self.speed = -self.MAX_REVERSE_SPEED
else:
self.speed = self.speed * self.speed_attenuation
if self.speed >= 0:
self.direction += (self.k_right + self.k_left)
else:
self.direction -= (self.k_right + self.k_left)
self.direction = (self.direction % 360 + 359) % 360 + 1
x, y = (self.position)
rad = self.direction * math.pi / 180
x += -self.speed*math.sin(rad)
y += -self.speed*math.cos(rad)
self.position = (x, y)
self.image = pygame.transform.rotate(self.src_image, self.direction)
# self.rect = self.image.get_rect()
self.rect = self.image.get_rect(center=self.rect.center)
self.rect.center = self.position
elif self.viewpoint == "map":
print("Moving in the viewpoint of map")
x, y = (self.position)
if action == "RIGHT":
x += self.ACCELERATION
elif action == "LEFT":
x -= self.ACCELERATION
elif action == "UP":
y -= self.ACCELERATION
elif action == "DOWN":
y += self.ACCELERATION
self.position = (x, y)
self.image = self.src_image
self.rect.center = self.position
# self.image is no need to update
# DEBUG
# Draw a border around the rectangle
# border_color = (255, 0, 0) # 边框颜色,红色
# border_width = 2 # 边框宽度
# # 创建一个新的表面
# bordered_image = pygame.Surface((self.rect.width + 2 * border_width,
# self.rect.height + 2 * border_width), pygame.SRCALPHA)
# bordered_image.fill((0, 0, 0, 0)) # 设置为透明背景
# # 在表面上绘制边框
# pygame.draw.rect(bordered_image, border_color,
# (0, 0, bordered_image.get_width(), bordered_image.get_height()), border_width)
# # 将旋转后的图像绘制到边框中心
# bordered_image.blit(self.image, (border_width, border_width))
# self.image = bordered_image
class SquarePadSprite(pygame.sprite.Sprite):
normal = pygame.image.load('./game/race/images/square.png')
def __init__(self, position):
super(SquarePadSprite, self).__init__()
self.rect = pygame.Rect(self.normal.get_rect())
self.rect.center = position
self.image = self.normal
class VertivalPadSprite(pygame.sprite.Sprite):
normal = pygame.image.load('./game/race/images/vertical_pads.png')
def __init__(self, position):
super(VertivalPadSprite, self).__init__()
self.rect = pygame.Rect(self.normal.get_rect())
self.rect.center = position
self.image = self.normal
class RacePadSprite(pygame.sprite.Sprite):
normal = pygame.image.load('./game/race/images/race_pads.png')
hit = pygame.image.load('./game/race/images/collision.png')
def __init__(self, position):
super(RacePadSprite, self).__init__()
self.rect = pygame.Rect(self.normal.get_rect())
self.rect.center = position
self.image = self.normal
class HorizontalPad(pygame.sprite.Sprite):
normal = pygame.image.load('./game/race/images/race_pads.png')
def __init__(self, position):
super(HorizontalPad, self).__init__()
self.rect = pygame.Rect(self.normal.get_rect())
self.rect.center = position
self.image = self.normal
class SmallHorizontalPad(pygame.sprite.Sprite):
normal = pygame.image.load('./game/race/images/small_horizontal.png')
def __init__(self, position):
super(SmallHorizontalPad, self).__init__()
self.rect = pygame.Rect(self.normal.get_rect())
self.rect.center = position
self.image = self.normal
class SmallVerticalPad(pygame.sprite.Sprite):
normal = pygame.image.load('./game/race/images/small_vertical.png')
def __init__(self, position):
super(SmallVerticalPad, self).__init__()
self.rect = pygame.Rect(self.normal.get_rect())
self.rect.center = position
self.image = self.normal
class Trophy(pygame.sprite.Sprite):
def __init__(self, position, trophy_image_scale=1.8):
pygame.sprite.Sprite.__init__(self)
self.image = pygame_image_scale(pygame.image.load('./game/race/images/trophy.png'), trophy_image_scale)
self.rect = self.image.get_rect()
self.rect.x, self.rect.y = position
def draw(self, screen):
screen.blit(self.image, self.rect) |