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)