地圖在遊戲中是非常重要的一部分,幾乎所有的遊戲都有地圖。比如夢幻西遊中的長安城、建鄴城、大雁塔等等都是遊戲地圖。
那麼在我們的開發中,地圖的組成部分有:
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 的直接通訊方式。在網路通訊服務的形式上,一般採用浮動伺服器的形式,即其中乙個玩家的機器既是客戶端,又扮演伺服器的角色,一般由建立遊戲局的玩家擔任伺服器 主機 很多對...