国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《Python多人游戲項目實戰(zhàn)》第三節(jié) 在窗口上顯示玩家ID以及對話內(nèi)容

這篇具有很好參考價值的文章主要介紹了《Python多人游戲項目實戰(zhàn)》第三節(jié) 在窗口上顯示玩家ID以及對話內(nèi)容。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

3.1 顯示不同的人物圖片

3.2?顯示玩家ID

3.3?顯示玩家對話內(nèi)容

3.4?完整代碼下載地址


本節(jié)只是在上一節(jié)內(nèi)容的基礎上加一些小功能:顯示不同的人物圖片、在人物頭頂上顯示玩家ID以及人物頭頂上顯示一個聊天對話框。大家可以把這一節(jié)內(nèi)容當做一個過渡,用來鞏固下多人游戲程序中pickle的用法。程序完成后的運行結果如下:

《Python多人游戲項目實戰(zhàn)》第三節(jié) 在窗口上顯示玩家ID以及對話內(nèi)容

本項目結構顯示如下:

├── SimHei.ttf        # 字體文件
├── client.py         # 客戶端代碼
├── pics              # 圖片文件夾
│?? ├── 1.png
│?? ├── 2.png
│?? ├── 3.png
│?? ├── 4.png
│?? ├── 5.png
│?? └── 6.png
├── player.py         # 包含Player類
└── server.py         # 服務端代碼

在client.py中我們一共導入了以下模塊或庫:

import sys
import pygame
import pickle
import socket
from player import Player
from random import randint

在player.py中我們一共導入了以下模塊或庫:

import pygame
import random

在server.py中我們一共導入了以下模塊或庫:

import socket
import pickle
from player import Player
from threading import Thread

3.1 顯示不同的人物圖片

pics文件夾下有6個人物方位圖,玩家打開游戲窗口時,程序都會從這6個方位圖中隨機選擇一張進行顯示。因為是隨機的,所以其他玩家的人物圖片可能跟當前玩家的一樣,也可能不一樣。

首先修改Player類:

# player.py
class Player:
    def __init__(self, p_id, x, y,  pic_num, frame_width, frame_height):
        self.id = p_id
        self.dis = 3
        self.x = x
        self.y = y

        self.pic_num = pic_num      # 1
        self.frame_width = frame_width
        self.frame_height = frame_height
        self.frame_num = 0
        self.frame_rect = (self.frame_num * self.frame_width, 0 * self.frame_height,
                           self.frame_width, self.frame_height)

        self.current_dir = "下"
        self.last_dir = self.current_dir
    
    ...

代碼解釋如下:

1. 在初始化函數(shù)中加一個pic_num變量用來保存玩家顯示的人物圖片編號,這樣就能從服務端傳送過來的數(shù)據(jù)中知道某個玩家用的什么人物圖了。

接著修改GameWindow類:

# client.py
class GameWindow:
    def __init__(self):
        ...

        self.pic_dict = {                                   # 1
            1: pygame.image.load("./pics/1.png"),
            2: pygame.image.load("./pics/2.png"),
            3: pygame.image.load("./pics/3.png"),
            4: pygame.image.load("./pics/4.png"),
            5: pygame.image.load("./pics/5.png"),
            6: pygame.image.load("./pics/6.png")
        }
        frame_width = self.pic_dict[1].get_width() // 4     # 2
        frame_height = self.pic_dict[1].get_height() // 4

        self.player = Player(p_id=None,
                             x=randint(0, self.width-frame_width),
                             y=randint(0, self.height-frame_height),
                             pic_num=randint(1, 6),         # 3
                             frame_width=frame_width,
                             frame_height=frame_height)

        ...

    ...

    def update_window(self):
        self.window.fill((255, 255, 255))

        self.player.move()
        self.player.draw(self.window, self.pic_dict[self.player.pic_num])   # 4

        other_players_data = pickle.loads(self.send_player_data())
        self.update_other_players_data(other_players_data)

        pygame.display.update()

    def update_other_players_data(self, data):
        for player in data.values():
            player.draw(self.window, self.pic_dict[player.pic_num])         # 5

    ...

代碼解釋如下:

1. 創(chuàng)建一個pic_dict字典變量,用來保存各個人物方位圖對象,字典的鍵就是圖片編號。

2. 因為所有人物方位圖的大小都是一樣的,所以這里就直接通過第一張方位圖獲取幀的寬高值。

3. 隨機獲取1-6之間的整數(shù),這樣就可以隨機選擇一張人物方位圖了。

4. & 5. 根據(jù)pic_num值從pic_dict字典中選擇對應的人物方位圖,然后繪制到窗口上。

運行結果如下:

《Python多人游戲項目實戰(zhàn)》第三節(jié) 在窗口上顯示玩家ID以及對話內(nèi)容

3.2?顯示玩家ID

很多游戲會把玩家的id或名稱顯示在人物圖片上方,并跟隨人物移動,如下圖所示。

《Python多人游戲項目實戰(zhàn)》第三節(jié) 在窗口上顯示玩家ID以及對話內(nèi)容

這點其實很好實現(xiàn),因為我們已經(jīng)將玩家id值保存在Player對象的id屬性中,所以只需要將這個id值繪制到窗口上就可以了。

將Player類的draw()函數(shù)修改如下:

# player.py
def draw(self, win, pic):
    win.blit(pic, (self.x, self.y), self.frame_rect)

    font = pygame.font.SysFont("Arial", 10)          # 1
    id_text = font.render(self.id, True, (150, 150, 150))
    win.blit(id_text, (self.x + round(self.frame_width/2) - round(id_text.get_width()/2), self.y - id_text.get_height()))

代碼解釋如下:

1. 設置文字字體并將文本繪制到人物圖片的正上方。

運行結果如下:

《Python多人游戲項目實戰(zhàn)》第三節(jié) 在窗口上顯示玩家ID以及對話內(nèi)容

3.3?顯示玩家對話內(nèi)容

如果要聊天的話,玩家就會在文本輸入框中輸入消息,然后按下回車鍵發(fā)送,其他玩家隨后也會收到該玩家發(fā)送的消息。Pygame沒有提供一個文本輸入框控件,如果要自己實現(xiàn)的話會增加很多跟本教程主題無關的代碼。所以為了保持代碼簡潔,筆者就預先設置好一些聊天內(nèi)容,然后隨機發(fā)送一條。

修改Player類:

# player.py
class Player:
    def __init__(self, p_id, x, y,  pic_num, frame_width, frame_height):
        ...

        self.message = ""           # 1

    ...

    def speak(self):                # 2
        messages_list = ["你好", "最近咋樣", "我在打怪呢", "你說的有道理", "你哪里人", "不玩了,去吃飯了", "待會再玩", "今天很開心"]
        self.message = random.choice(messages_list)

代碼解釋如下:?

1. message變量用來存儲玩家要發(fā)送消息。

2. speak()函數(shù)會隨機生成一條聊天消息,并保存在message變量中。

修改GameWindow類:

# client.py
class GameWindow:
    def __init__(self):
        ...

        self.all_players_messages = []      # 1
        self.max_messages_shown = 6         # 2

        self.port = 5000
        self.host = "127.0.0.1"
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        self.connect()

    ...

    def send_player_data(self):
        data = {
            "id": self.player.id,
            "player": self.player
        }
        self.sock.send(pickle.dumps(data))
        self.player.message = ""            # 3
        return self.sock.recv(2048)

    def update_window(self):
        self.window.fill((255, 255, 255))

        self.player.move()
        self.player.draw(self.window, self.pic_dict[self.player.pic_num])
        if randint(0, 1000) < 50:           # 4
            self.player.speak()
        self.update_messages(self.player)   # 5

        other_players_data = pickle.loads(self.send_player_data())
        self.update_other_players_data(other_players_data)

        pygame.display.update()

    def update_other_players_data(self, data):
        for player in data.values():
            player.draw(self.window, self.pic_dict[player.pic_num])
            self.update_messages(player)    # 6

    def update_messages(self, player):
        if player.message:
            self.all_players_messages.insert(0, f"{player.id}: {player.message}")
            if len(self.all_players_messages) > self.max_messages_shown:
                self.all_players_messages.pop()

        font_size = 12
        font = pygame.font.Font("SimHei.ttf", font_size)
        for i, msg in enumerate(self.all_players_messages):
            msg_text = font.render(msg, True, (150, 150, 150))
            self.window.blit(msg_text, (0, self.height-(font_size*(i+1))))

代碼解釋如下:

1. 所有玩家的消息都會存儲在all_players_messages列表變量中。

2. max_messages_shown變量用來控制在窗口上顯示的聊天消息數(shù)。

3. 當前玩家的數(shù)據(jù)被發(fā)送到服務器后,就要清空Player對象的message屬性,否則其他玩家會重復收到一條不變的消息。

4. 使用隨機數(shù)來模擬玩家聊天。

5. update_messages()函數(shù)是重點,在該函數(shù)中,我們首先判斷玩家數(shù)據(jù)中的message變量是否有值,有的話說明有發(fā)送消息,那就將這個值插到all_players_messages列表開頭。如果消息總數(shù)大于max_messages_shown變量的值,那就把列表中最后一條聊天消息刪除掉,不再顯示。最后將所有聊天內(nèi)容都顯示到窗口左下角。為了解決Pygame中文顯示的問題,筆者這里使用了另外的SimHei.ttf字體,已放入到項目文件夾中。

6. 接收到其他玩家的數(shù)據(jù)后,要記得調(diào)用update_messages()函數(shù)更新聊天內(nèi)容。

運行結果如下:

《Python多人游戲項目實戰(zhàn)》第三節(jié) 在窗口上顯示玩家ID以及對話內(nèi)容

3.4?完整代碼下載地址

鏈接:https://pan.baidu.com/s/1chQ5c94X07Oi3Iv_eX3xDg ?

密碼:9qbz文章來源地址http://www.zghlxwxcb.cn/news/detail-411887.html

到了這里,關于《Python多人游戲項目實戰(zhàn)》第三節(jié) 在窗口上顯示玩家ID以及對話內(nèi)容的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【零基礎入門Python爬蟲】第三節(jié) Python Selenium

    Python Selenium 是一種自動化測試框架,可以模擬用戶在瀏覽器中的交互行為。它是一個基于瀏覽器驅動程序的工具,可用于Web應用程序測試、數(shù)據(jù)采集等方面,能夠讓開發(fā)人員通過代碼自動化地模擬用戶在瀏覽器中的操作,并獲取到所需的數(shù)據(jù)。 Selenium的主要優(yōu)勢是它可以模擬

    2024年02月04日
    瀏覽(19)
  • 【Python零基礎學習入門篇③】——第三節(jié):Python的字符串類型

    【Python零基礎學習入門篇③】——第三節(jié):Python的字符串類型

    ???????????? ???Hello,大家好呀我是陳童學哦,一個普通大一在校生,請大家多多關照呀嘿嘿?????? ?????? 技術這條路固然很艱辛,但既已選擇,該當堅毅地走下去,加油! ???PUA: ” 你所看到的驚艷都曾平庸歷練 **“**?????? ?????? 最后讓我

    2024年02月04日
    瀏覽(52)
  • 【從零到一手撕腳手架 | 第三節(jié)】項目集成CommitLInt+ESLint+Prettier+StyleLint+LintStaged

    Hello大家好我是?,前兩節(jié)教大家如何初始化一個腳手架項目以及如何封裝Vue技術棧常用的工具庫。本小節(jié)教大家如何向我們的腳手架中配置ESLint、Prettier、StyleLint、LintStage。幫助大家規(guī)范項目代碼,能夠更好的進行團隊協(xié)作開發(fā)。 項目地址: GitHub :LonelySnowman/sv3-template 官方

    2024年04月16日
    瀏覽(18)
  • (數(shù)字圖像處理MATLAB+Python)第七章圖像銳化-第三節(jié):高斯濾波與邊緣檢測

    (數(shù)字圖像處理MATLAB+Python)第七章圖像銳化-第三節(jié):高斯濾波與邊緣檢測

    高斯函數(shù) :是一種常見的連續(xù)函數(shù),通常用符號 G ( x ) G(x) G ( x ) 表示。它可以用下面的公式定義 G ( x ) = 1 σ 2 π e ? x 2 2 σ 2 G(x)=frac{1}{sigma sqrt{ 2pi }}e^{-frac{x^{2}}{2sigma^{2}}} G ( x ) = σ 2 π ? 1 ? e ? 2 σ 2 x 2 ? 其中, x x x 是自變量, σ sigma σ 是一個正實數(shù),表示高斯函

    2024年02月06日
    瀏覽(108)
  • 項目實訓--Unity多人游戲開發(fā)(十一、PUN框架--游戲場景篇(加載與同步))

    項目實訓--Unity多人游戲開發(fā)(十一、PUN框架--游戲場景篇(加載與同步))

    本地加載 有許多方法,舉幾個例子: 本地加載 本地異步加載(場景內(nèi)容過多時,防止卡頓異步加載) 多人游戲加載場景 pun2插件加載 這個異步加載起初是覺得場景內(nèi)容如果過多會引起卡頓。所以把這個應用在了單機模式上。 至于多人游戲加載場景,可能用不到而且也沒法

    2024年02月01日
    瀏覽(107)
  • (數(shù)字圖像處理MATLAB+Python)第九章圖像形態(tài)學運算-第三節(jié):二值圖像的形態(tài)學處理

    (數(shù)字圖像處理MATLAB+Python)第九章圖像形態(tài)學運算-第三節(jié):二值圖像的形態(tài)學處理

    形態(tài)濾波 :是一種在數(shù)字圖像處理中常用的圖像處理技術,用于改善圖像的質量、提取圖像的特定特征或去除圖像中的噪聲。形態(tài)濾波主要基于形態(tài)學運算,通過結構元素(也稱為模板)對圖像進行局部區(qū)域的操作,從而改變圖像的形狀和結構。選擇不同形狀(如各向同性的

    2024年02月08日
    瀏覽(99)
  • 《樹莓派項目實戰(zhàn)》第十三節(jié) 使用ULN2003驅動板控制28BYJ-48單極步進電機

    目錄 13.1 引腳介紹 13.2 控制電機以及計算旋轉角度 13.3?連接到樹莓派 13.4?編寫代碼 在本節(jié),我們將學習如何使用ULN2003驅動板控制一個28BYJ-48單極

    2024年02月05日
    瀏覽(20)
  • Unity中相機中顯示場景畫面,游戲窗口就不顯示怎么解決

    Unity中相機中顯示場景畫面,游戲窗口就不顯示怎么解決

    ? ? ? ? 最近在學習Unity時碰到了這樣一個問題:相機中顯示場景畫面,切換游戲窗口運行就不顯示了,自己在網(wǎng)上查了各種方法都不行,今天自己鼓搗好了,下面給大家分享一下吧,希望對大家有幫助。 問題如下: ? 1.圖層問題 ?首先考慮圖層問題,我們將相機圖層切換成與

    2024年02月11日
    瀏覽(95)
  • 100個Python實戰(zhàn)項目(九)制作貪吃蛇游戲(評論抽獎送書)

    ?? 個人網(wǎng)站:【海擁】【摸魚小游戲】【開發(fā)文檔導航】 ?? 風趣幽默的人工智能學習網(wǎng)站:??人工智能 ?? 想尋找共同學習交流的小伙伴,請點擊【全棧技術交流群】 ?? 免費且實用的計算機相關知識題庫:??進來逛逛 給大家安利一個免費且實用的 Python 刷題(面經(jīng)大全

    2024年02月01日
    瀏覽(16)
  • 第三節(jié)——Vue 基礎語法

    vue語法分為選項是API(Option api)和組合式api(Composition Api),我們以選項式Api入門 template、script、style三部分構成。template可以理解成編寫html的地方,script編寫邏輯js的地方,style編寫樣式的地方 1、概念 vue中,使用{{}}雙花括號,在html標簽的“內(nèi)容區(qū)域”中表現(xiàn)數(shù)據(jù),這個技術

    2024年02月08日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包