pygame網路遊戲 4 1 人物行走

2021-09-12 12:15:39 字數 4119 閱讀 1827

地圖在遊戲中是非常重要的一部分,幾乎所有的遊戲都有地圖。比如夢幻西遊中的長安城、建鄴城、大雁塔等等都是遊戲地圖。

那麼在我們的開發中,地圖的組成部分有:

2.地圖的前景圖:需要把人物遮擋住的地方

我們按照繪圖順序:畫地圖背景、畫玩家、最後再畫地圖前景,這樣就能將玩家遮擋住。

3.行走層資料:乙個二維陣列,將地圖劃分成乙個個的小格仔,記錄著這些小格仔是否可以行走。

就比如在我們的遊戲開發中,將用32*32做為乙個格仔的大小。

上圖是我很久以前做的地圖編輯器,將地圖劃分成乙個個小格仔就是這個意思,這應該好理解了吧,黃色格仔就是不可行走區域。

由於地圖行走層就是乙個二維陣列(二維列表),所以我們先封裝乙個二維列表,方便以後的操作,core.py中增加:

class array2d:

"""說明:

1.構造方法需要兩個引數,即二維陣列的寬和高

2.成員變數w和h是二維陣列的寬和高

3.使用:『物件[x][y]』可以直接取到相應的值

4.陣列的預設值都是0

"""def __init__(self, w, h, default=0):

self.w = w

self.h = h

self.data =

self.data = [[default for y in range(h)] for x in range(w)]

def show_array2d(self):

for y in range(self.h):

for x in range(self.w):

print(self.data[x][y], end=' ')

print("")

def __getitem__(self, item):

return self.data[item]

建立array2d物件就是建立乙個寬和高為w、h的二維陣列,其中show_array2d是在控制台列印二維陣列的內容。

因為我們實現了__getitem__方法,所以可以直接用中括號對array2d物件進行取值,比如

arr2d=array2d(3,5)

arr2d[2][4]=666

接下來就是編寫地圖類了,上面我們已經分析過了,地圖包括:背景圖、前景圖、行走資料。

class gamemap(array2d):

"""遊戲地圖類

"""def __init__(self, bottom, top, x, y):

# 將地圖劃分成w*h個小格仔,每個格仔32*32畫素

w = int(bottom.get_width() / 32) + 1

h = int(top.get_height() / 32) + 1

super().__init__(w, h)

self.bottom = bottom

self.top = top

self.x = x

self.y = y

def draw_bottom(self, screen_surf):

screen_surf.blit(self.bottom, (self.x, self.y))

def draw_top(self, screen_surf):

screen_surf.blit(self.top, (self.x, self.y))

def load_walk_file(self, path):

"""讀取可行走區域檔案

"""with open(path, 'r') as file:

for x in range(self.w):

for y in range(self.h):

v = int(file.readline())

self[x][y] = v

self.show_array2d()

gamemap繼承自array2d,因為地圖本身就是乙個二維陣列嘛。

構造方法裡有四個引數,bottom和top是相應的su***ce,x,y是地圖的繪圖座標。

draw_bottom和draw_top是繪製地圖背景和地圖前景的方法。

load_walk_file是載入地圖行走區域的方法,用雙for迴圈讀取檔案是因為當初寫檔案的時候,也是這樣寫入的,由於繼承了array2d,所以可以直接用self[x][y]。最後在控制台列印一下讀取的地圖二維陣列。

既然封裝好了地圖類,那我們簡單使用一下,看看效果咋樣:

在main.py的game類中,修改一下**:

def __init_game(self):

self.hero = pygame.image.load('./img/character/hero.png').convert_alpha()

self.map_bottom = pygame.image.load('./img/map/0.png').convert_alpha()

self.map_top = pygame.image.load('./img/map/0_top.png').convert_alpha()

self.game_map = gamemap(self.map_bottom, self.map_top, 0, 0)

self.game_map.load_walk_file('./img/map/0.map')

增加了乙個game_map屬性,也就是遊戲地圖物件。

再修改一下繪圖的**,看看效果:

def update(self):

while true:

self.clock.tick(self.fps)

# todo:邏輯更新

self.event_handler()

# todo:畫面更新

self.game_map.draw_bottom(self.screen_surf)

sprite.draw(self.screen_surf, self.hero, 100, 100, 0, 0)

sprite.draw(self.screen_surf, self.hero, 210, 120, 1, 1)

sprite.draw(self.screen_surf, self.hero, 300, 100, 2, 2)

pygame.display.update()

我故意改了一下第二個精靈的位置,它竟然跑到房頂去了。

不過,別擔心,是因為沒有繪製前景圖將角色擋住:

我們加一行**就行了:

def update(self):

while true:

self.clock.tick(self.fps)

# todo:邏輯更新

self.event_handler()

# todo:畫面更新

本章完~

網路遊戲架構

1 一種架構是peer to peer 對等通訊結構,如下圖所示,即在多個玩家參與的遊戲中,各玩家之間採用peer to peer的直接通訊方式。在網路通訊服務的形式上,一般採用浮動伺服器的形式,即其中乙個玩家的機器既是客戶端,又扮演伺服器的角色,一般由建立遊戲局的玩家擔任伺服器 主機 很多對戰型的...

網路遊戲 《紛爭》

紛爭ol 原圖 紛爭ol 人物設定 網路 具有遊戲廠商所不具備的廣泛而忠實的受眾 消費群體。在現行體制下,還具備無與倫比的公信力,這都是遊戲廠商所追求且無法獲得的資源。而遊戲 產業強勁的發展勢頭和巨大的發展潛力,對於依靠傳統廣告支撐的市場已經相對飽和的網路傳媒業來說,無疑是乙個絕佳的第二戰場。在利益...

網路遊戲架構

1 一種架構是 peer to peer 對等通訊結構 如下圖所示,即在多個玩家參與的遊戲中,各玩家之間採用 peer to peer 的直接通訊方式。在網路通訊服務的形式上,一般採用浮動伺服器的形式,即其中乙個玩家的機器既是客戶端,又扮演伺服器的角色,一般由建立遊戲局的玩家擔任伺服器 主機 很多對...