Mẹo về Cách tạo nhân vật trong python Chi Tiết
Pro đang tìm kiếm từ khóa Cách tạo nhân vật trong python được Cập Nhật vào lúc : 2022-11-01 14:40:22 . Với phương châm chia sẻ Thủ Thuật về trong nội dung bài viết một cách Chi Tiết 2022. Nếu sau khi Read Post vẫn ko hiểu thì hoàn toàn có thể lại Comment ở cuối bài để Tác giả lý giải và hướng dẫn lại nha.
Long time no see, ngày hôm nay mình xin phép được đào mộ lại một series về làm trò chơi với pygame. Đây là một series tưởng chừng đã biết thành mình vùi trong quên lãng nhưng lương tâm cắn rứt, tác giả quyết định hành động hoàn thành xong nốt series này
. Hãy cùng tiếp tục phần 3 của serie với chủ đề : Va chạm và hoạt động và sinh hoạt giải trí Nội dung chính Show
- Chuyển động trong pygame
- Mô phỏng trọng tải
- Va chạm với mặt đất
- Source Code
Chuyển động trong pygame
Ở phần trước ta đã biết phương pháp đổi sprite của Mario thông qua những state:
v_state là trạng thái theo chiều dọc: đang nhảy (jumping) và theo chiều ngang h_state: đang đứng yên (standing) hay là đang hoạt động (running) cùng với đó là những trạng thái đang quay mặt về phía nào (facing): trái hay phải. Tuy nhiên, ta chưa thể tương tác với Mario. Ta sẽ thực thi việc tương tác này thông qua những những phím di tán : lên (nhảy lên), trái (di tán sang trái), phải (di tán sang phải) kèm theo là quay mặt nếu thiết yếu.
Để xử lý những sự kiện phím ấn mà
người tiêu dùng nhập vào, ta định nghĩa thêm hàm handle trong class Mario để xử lý những xự kiện. Như ở bài trước, tại hàm run, hàm lặp chính của trò chơi, sau mỗi clock tick ta lấy ra những sự kiện trình làng trong trò chơi và đưa cho từng đối tượng người dùng trong trò chơi để xử lý một cách thích hợp
def run(self):
# main trò chơi loop
while True:
# hold frame rate 60 fps
dt = self.clock.tick(60)
self.time_step += 1
# enumerate sự kiện
for sự kiện in pygame.sự kiện.get():
if sự kiện.type == pygame.QUIT:
sys.exit(0)
# sprite handle sự kiện
self.handle(sự kiện)
self.update(dt / 1000.)
# re-draw screen
self.draw(self.screen)
Tại hàm handle của vòng lặp của trò chơi, ta tiến hành gọi đến hàm handle của mario để xử lý:
def handle(self, sự kiện):
self.my_mario.handle(sự kiện)
pass
Trong phần này ta sẽ tiến hành implement hàm handle cho Mario.
def handle(self, sự kiện):
if sự kiện.type == pygame.KEYDOWN:
if sự kiện.key == pygame.K_UP:
if self.v_state == “resting”:
self.jump()
elif sự kiện.key == pygame.K_RIGHT:
self.move_right()
elif sự kiện.key == pygame.K_LEFT:
self.move_left()
elif sự kiện.type == pygame.KEYUP:
if sự kiện.key == pygame.K_RIGHT or
sự kiện.key == pygame.K_LEFT:
self.vx = 0
self.h_state = “standing”
Như trong phần code ở phía
trên, tham số truyền vào là biến sự kiện, từ biến này ta hoàn toàn có thể kiểm tra xem sự kiện đó là nhấn 1 phím xuống hay là không (sự kiện.type == pygame.KEYDOWN), tại đây ta sẽ thực thi những hành vi: nếu là nhấn phím sang phải sẽ thực thi hành vi di tán sang phải. Dưới đấy là rõ ràng của hàn move_right. Đối với hàm move_left, toàn bộ chúng ta làm hoàn toàn tương tự. Hàm jump toàn bộ chúng ta sẽ nói kỹ hơn khi thực thi mô phỏng trọng lượng.
def move_right(self):
self.vx = 2.5
self.h_state = “running”
self.h_facing = “right”
Đó là logic khi toàn bộ chúng ta nhấn một phím xuống. Việc cần làm tiếp Từ đó là xử
lý khi ta nhả phím ra, thời gian hiện nay ta sẽ update lại những trạng thái của Mario về trạng thái đứng yên như ở đoạn code phía trên.
Việc di tán sang bên phải, đơn thuần và giản dị là thiết lập vận tốc theo chiều x, thay đổi những trạng thái tương ứng với hướng di tán. sau khi thực thi tiến trình này, chạy thử ta thấy mario đã di tán theo như đúng những hướng trái phải mà ta chỉ định.
Mô phỏng trọng tải
Chúng ta cũng xem qua một chút ít logic về phần hoạt động và sinh hoạt giải trí của Mario. Thứ luôn kéo toàn bộ chúng ta về
với mặt đầt, khiến ta không thể bay lượn như chim đó đó đó là trọng tải. Hãy mô phỏng trọng lượng trong trò chơi như sau. Đầu tiên là định nghĩa một số trong những thông số:
GRAVITY = 0.4
MAX_VX = 3
MAX_VY = 20
def update(self, dt, trò chơi):
last = self.rect.copy()
if abs(self.vx) > self.MAX_VX:
self.vx = math.copysign(self.MAX_VX, self.vx)
if abs(self.vy) > self.MAX_VY:
self.vy = math.copysign(self.MAX_VY, self.vy)
dy = self.vy
dx = self.vx
self.vy += self.GRAVITY
self.rect = self.rect.move(dx, dy)
new = self.rect4
Ở đây ta nên phải có một chút ít kiến thức và kỹ năng về vật lý. Ta giả lập trọng tải như sau:
- cứ mỗi trò chơi step ta tính toán lại vận tốc của Mario, thêm vào đó vào vận tốc theo chiều y một lượng là GRAVITY
- Li độ mà vật di tán được sau từng bước trò chơi sẽ đó đó là vận tốc của vật theo những chiều x, y
- Tính toán lại
những vận tốc tối đa để tránh việc nhân vật của toàn bộ chúng ta rơi quá nhanh.
Khi đó việc thực thi nhảy lên chỉ đơn thuần và giản dị là di tán với vận tốc âm theo phương y:
def jump(self):
self.vy = -9
self.v_state = “jumping”
Ta init vị trí của Mario như sau tại hàm init của main:
self.tilemap = tmx.load(“map.tmx”, self.screen.get_size())
self.sprites = tmx.SpriteLayer()
self.my_mario = mario.Mario(self.sprites)
self.my_mario.set_position(100, 100)
self.tilemap.layers.append(self.sprites)
Như vậy vật sẽ ngày càng di tán xuống dưới và ngày càng nhanh theo như đúng mô phỏng trọng tải.
Va chạm với mặt đất
Để hoàn toàn có thể thực thi phần va chạm với platformer ta cần sửa đổi lại Map trong Tiled một chút ít. Như đã nó sơ qua trong bài thứ nhất của series. Map được phân thành những lớp background layer, midground layer, foreground layer, những layer này sẽ là phần hiển thị. Nhưng phần sẽ tương tác với đối tượng người dùng của trò chơi sẽ là trigger layer, phần này chứa những đối tượng người dùng nhưng lại không hiển thị, làm ta có cảm hứng là đối tượng người dùng đang tương tác với lớp tile.
Trong lớp trigger của file map, ta thêm những đối
tượng hình chữ nhật với những thuộc tính như sau:
Ta đặt giá trị cho thuộc tính là “tlbr” nghĩa là block theo toàn bộ những hướng trên (t) trái (l) dưới (b) phải (r) cho platform. Và tương tự cho đối tượng người dùng wall dùng để ngăn căn người chơi đi thoát khỏi màn hình hiển thị. Tất cả những đối tượng người dùng này đều nằm trong lớp trigger của map.
Tiếp đó ta nên phải xử lý va chạm giữa người chơi với những đối tượng người dùng thuộc kiểu blocker này. Khi đó toàn bộ code của hàm update sẽ như sau:
def update(self, dt, trò chơi):
last = self.rect.copy()
if abs(self.vx) > self.MAX_VX:
self.vx = math.copysign(self.MAX_VX, self.vx)
if abs(self.vy) > self.MAX_VY:
self.vy = math.copysign(self.MAX_VY, self.vy)
dy = self.vy
dx = self.vx
self.vy += self.GRAVITY
self.rect = self.rect.move(dx, dy)
new = self.rect
for cell in trò chơi.tilemap.layers[‘triggers’].collide(new, ‘blockers’):
if last.right <= cell.left and new.right > cell.left:
new.right = cell.left
if last.left >= cell.right and new.left < cell.right:
new.left = cell.right
if last.bottom <= cell.top and new.bottom > cell.top:
new.bottom = cell.top
self.v_state = “resting”
self.vy = 0
if last.top >= cell.bottom and new.top < cell.bottom:
new.top = cell.bottom
self.vy = 0
trò chơi.tilemap.set_focus(new.x, new.y)
- Đầu tiên ta tính toán vị trí của Mario theo lực tác động của trọng tải.
- Tiếp đến là tính toán va chạm với blocker. Nguyên lý rất đơn thuần và giản dị: lấy ra những blocker, kiểm tra xem phần bao ngoài của chúng có giao với phần bao ngoài của
Mario hay là không. Nếu có giao nhau ta sẽ thiết lập lại bao ngoài mới (new) cho Mario để chúng ko còn giao nhau nữa.
Hình demo khi hiển thị lớp trigger
và lúc không hiển thị lớp trigger:
End
Vậy là ta đã có một nhân vật Mario hoàn toàn có thể di tán trên một địa
hình cơ bản rồi. Phần tiếp theo sẽ là những phương pháp sử dụng map nâng cao cùng với Tiled
Source Code
https://github.com/vigov5/mario_game/
Tải thêm tài liệu liên quan đến nội dung bài viết Cách tạo nhân vật trong python
programming
python
Get_rect trong Python
Animation trong pygame
Font trong pygame
Event trong pygame
Cách cài pygame
Reply
1
0
Chia sẻ
Share Link Down Cách tạo nhân vật trong python miễn phí
Bạn vừa Read nội dung bài viết Với Một số hướng dẫn một cách rõ ràng hơn về Video Cách tạo nhân vật trong python tiên tiến và phát triển nhất và Chia SẻLink Download Cách tạo nhân vật trong python Free.
Hỏi đáp vướng mắc về Cách tạo nhân vật trong python
Nếu sau khi đọc nội dung bài viết Cách tạo nhân vật trong python vẫn chưa hiểu thì hoàn toàn có thể lại Comment ở cuối bài để Admin lý giải và hướng dẫn lại nha
#Cách #tạo #nhân #vật #trong #python