最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python利用3D引擎寫一個Pong游戲

 更新時間:2023年01月05日 16:41:27   作者:Leleprogrammer  
之前,我們嘗試過用pygame做了一個2D的Pong游戲。本文將利用強(qiáng)大的3D引擎Ursina制作一個3D版的Pong游戲。文中的示例代碼講解詳細(xì),感興趣的可以了解一下

前言

之前,我們用pygame做了一個2D的Pong游戲,今天我們做一個3D的,游戲畫面如下:

用ad和←→操作,雙人對戰(zhàn)

實(shí)現(xiàn)該效果我們使用Python強(qiáng)大的3D引擎Ursina,基礎(chǔ)的使用方法見這篇文章:詳解Python 3D引擎Ursina如何繪制立體圖形

接下來開始寫代碼吧!

實(shí)現(xiàn)方法

首先,導(dǎo)入ursina和隨機(jī)庫

from ursina import *
import random as rd

定義兩個玩家的分?jǐn)?shù)

scorea=scoreb=0

然后,我們創(chuàng)建app

app=Ursina()

ursina自帶window參數(shù),代表窗口,它還自帶color參數(shù),代表各種顏色,我們直接修改窗口的顏色

window.color=color.cyan

我們創(chuàng)建一個桌子,它是一個長方體,所以model為cube,顏色是橙色,然后進(jìn)行縮放操作,并設(shè)置位置,還有它的材質(zhì)(普通材質(zhì))

table=Entity(model="cube",color=color.orange,scale=(10,0.5,14),position=(0,0,0),texture="white_cube")

照樣子,創(chuàng)建一個板子

paddle_A=Entity(parent=table,color=color.black,model="cube",scale=(0.2,0.03,0.05),position=(0,3.7,0.22),collider="box")

因?yàn)榈诙€板子和第一個板子差不多,我們只需要用duplicate函數(shù)進(jìn)行實(shí)體復(fù)制,然后修改部分參數(shù)即可

paddle_B=duplicate(paddle_A,z=-0.62)

然后,把分?jǐn)?shù)顯示,顯示文字用到了Text類,參數(shù)差不多

t=Text(text=f"Player A : Player B  {scorea} : {scoreb}", position=(-0.85, 0.45), scale=2,color=color.orange)

這樣運(yùn)行程序,我們只看到了桌子的側(cè)面,調(diào)整視角,改變ursina自帶的camera的屬性即可,設(shè)置它的傾斜度和位置

camera.position=(0,15,-26)
camera.rotation_x=30

繪制兩個玩家的名字

Text(text="Player A",scale=2,position=(-0.1,0.32),color=color.orange)
Text(text="Player B",scale=2,position=(-0.1,-0.4),color=color.orange)

接下來,繪制桌子中間的分割線和球

line=Entity(parent=table,model="quad",scale=(0.88,0.2,0.1),position=(0,3.5,-0.2))
ball=Entity(parent=table,model="sphere",color=color.gold,scale=.05,position=(0,3.7,-0.2),collider="box")

設(shè)置初始x和z的速度

dx=rd.uniform(-0.4,0.15) if rd.randint(0,1)==0 else rd.uniform(0.15,0.4)
dz=rd.uniform(-0.5,0.2) if rd.randint(0,1)==0 else rd.uniform(0.2,0.5)

然后進(jìn)入主循環(huán)

app.run()

我們在創(chuàng)建app前添加update函數(shù),注意,這里名字一定要用update,然后自己無需調(diào)用,由ursina自動調(diào)用

創(chuàng)建函數(shù)并引入全局變量

def update():
    global dx,dz,scorea,scoreb

然后判斷按下了按鍵就對板子進(jìn)行移動操作,按下按鍵的信息存儲于held_keys中,并限制板子的移動范圍

    paddle_B.x-=held_keys["left arrow"]*time.dt
    paddle_B.x+=held_keys["right arrow"]*time.dt
    paddle_A.x-=held_keys["a"]*time.dt
    paddle_A.x+=held_keys["d"]*time.dt
    if paddle_A.x>0.35:
        paddle_A.x=0.35
    elif paddle_A.x<-0.35:
        paddle_A.x=-0.35
    if paddle_B.x>0.35:
        paddle_B.x=0.35
    elif paddle_B.x<-0.35:
        paddle_B.x=-0.35

移動小球

    ball.x+=dx*time.dt
    ball.z+=dz*time.dt

更新比分顯示

    t.text=f"Player A : Player B  {scorea} : {scoreb}"

進(jìn)行板子和球的碰撞檢測,先用intersects獲取觸碰到的實(shí)體列表,然后對碰到實(shí)體為兩個板子的時候進(jìn)行反彈、加速或減速的操作

    hit_info=ball.intersects()
    if hit_info.hit:
        if hit_info.entity==paddle_A:
            dz=-dz
            if dz>-0.05:
                dz-=rd.uniform(0.1,0.3)
            else:
                dz-=rd.uniform(-0.05,0.2)
        if hit_info.entity==paddle_B:
            dz=-dz
            if dz<0.05:
                dz+=rd.uniform(0.1,0.3)
            else:
                dz+=rd.uniform(-0.05,0.2)

限制球在桌子中間移動,如果一方?jīng)]有接到球,就對另一方進(jìn)行加分的操作

    if abs(ball.x)>0.4:
        dx=-dx
    if ball.z>0.25:
        scoreb+=1
        ball.x=0
        ball.z=-0.2
        dx=rd.uniform(-0.4,0.15) if rd.randint(0,1)==0 else rd.uniform(0.15,0.4)
        dz=rd.uniform(-0.5,0.2) if rd.randint(0,1)==0 else rd.uniform(0.2,0.5)
    if ball.z<-0.65:
        scorea+=1
        ball.x=0
        ball.z=-0.2
        dx=rd.uniform(-0.4,0.15) if rd.randint(0,1)==0 else rd.uniform(0.15,0.4)
        dz=rd.uniform(-0.5,0.2) if rd.randint(0,1)==0 else rd.uniform(0.2,0.5)

我們用了不到100行代碼,就實(shí)現(xiàn)了以下效果~

完整代碼

這里附上最終代碼:

from ursina import *
import random as rd
 
scorea=scoreb=0
 
def update():
    global dx,dz,scorea,scoreb
    paddle_B.x-=held_keys["left arrow"]*time.dt
    paddle_B.x+=held_keys["right arrow"]*time.dt
    paddle_A.x-=held_keys["a"]*time.dt
    paddle_A.x+=held_keys["d"]*time.dt
    if paddle_A.x>0.35:
        paddle_A.x=0.35
    elif paddle_A.x<-0.35:
        paddle_A.x=-0.35
    if paddle_B.x>0.35:
        paddle_B.x=0.35
    elif paddle_B.x<-0.35:
        paddle_B.x=-0.35
    ball.x+=dx*time.dt
    ball.z+=dz*time.dt
    t.text=f"Player A : Player B  {scorea} : {scoreb}"
    hit_info=ball.intersects()
    if hit_info.hit:
        if hit_info.entity==paddle_A:
            dz=-dz
            if dz>-0.05:
                dz-=rd.uniform(0.1,0.3)
            else:
                dz-=rd.uniform(-0.05,0.2)
        if hit_info.entity==paddle_B:
            dz=-dz
            if dz<0.05:
                dz+=rd.uniform(0.1,0.3)
            else:
                dz+=rd.uniform(-0.05,0.2)
    if abs(ball.x)>0.4:
        dx=-dx
    if ball.z>0.25:
        scoreb+=1
        ball.x=0
        ball.z=-0.2
        dx=rd.uniform(-0.4,0.15) if rd.randint(0,1)==0 else rd.uniform(0.15,0.4)
        dz=rd.uniform(-0.5,0.2) if rd.randint(0,1)==0 else rd.uniform(0.2,0.5)
    if ball.z<-0.65:
        scorea+=1
        ball.x=0
        ball.z=-0.2
        dx=rd.uniform(-0.4,0.15) if rd.randint(0,1)==0 else rd.uniform(0.15,0.4)
        dz=rd.uniform(-0.5,0.2) if rd.randint(0,1)==0 else rd.uniform(0.2,0.5)
 
app=Ursina()
 
window.color=color.cyan
 
table=Entity(model="cube",color=color.orange,scale=(10,0.5,14),position=(0,0,0),texture="white_cube")
 
paddle_A=Entity(parent=table,color=color.black,model="cube",scale=(0.2,0.03,0.05),position=(0,3.7,0.22),collider="box")
paddle_B=duplicate(paddle_A,z=-0.62)
 
t=Text(text=f"Player A : Player B  {scorea} : {scoreb}", position=(-0.85, 0.45), scale=2,color=color.orange)
 
camera.position=(0,15,-26)
camera.rotation_x=30
 
Text(text="Player A",scale=2,position=(-0.1,0.32),color=color.orange)
Text(text="Player B",scale=2,position=(-0.1,-0.4),color=color.orange)
 
line=Entity(parent=table,model="quad",scale=(0.88,0.2,0.1),position=(0,3.5,-0.2))
ball=Entity(parent=table,model="sphere",color=color.gold,scale=.05,position=(0,3.7,-0.2),collider="box")
 
dx=rd.uniform(-0.4,0.15) if rd.randint(0,1)==0 else rd.uniform(0.15,0.4)
dz=rd.uniform(-0.5,0.2) if rd.randint(0,1)==0 else rd.uniform(0.2,0.5)
 
app.run()

到此這篇關(guān)于Python利用3D引擎寫一個Pong游戲的文章就介紹到這了,更多相關(guān)Python Pong游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Python產(chǎn)生加密表和解密表的實(shí)現(xiàn)方法

    利用Python產(chǎn)生加密表和解密表的實(shí)現(xiàn)方法

    這篇文章主要介紹了利用Python產(chǎn)生加密表和解密表的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • django DRF圖片路徑問題的解決方法

    django DRF圖片路徑問題的解決方法

    這篇文章主要給大家介紹了關(guān)于django DRF圖片路徑問題的解決方法,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Python內(nèi)置庫之webbrowser模塊用法詳解

    Python內(nèi)置庫之webbrowser模塊用法詳解

    webbrowser模塊是Python自帶的標(biāo)準(zhǔn)庫,無需安裝,可以直接在Python中使用該模塊來打開網(wǎng)頁、PDF文件等,本文給大家詳細(xì)介紹了Python webbrowser模塊用法,需要的朋友可以參考下
    2023-08-08
  • 對django后臺admin下拉框進(jìn)行過濾的實(shí)例

    對django后臺admin下拉框進(jìn)行過濾的實(shí)例

    今天小編就為大家分享一篇對django后臺admin下拉框進(jìn)行過濾的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • PyTorch?Autograd的核心原理和功能深入探究

    PyTorch?Autograd的核心原理和功能深入探究

    本文深入探討了PyTorch中Autograd的核心原理和功能,從基本概念、Tensor與Autograd的交互,到計算圖的構(gòu)建和管理,再到反向傳播和梯度計算的細(xì)節(jié),最后涵蓋了Autograd的高級特性
    2024-01-01
  • 實(shí)例講解Python腳本成為Windows中運(yùn)行的exe文件

    實(shí)例講解Python腳本成為Windows中運(yùn)行的exe文件

    在本篇文章里小編給大家分享了關(guān)于Python腳本成為Windows中運(yùn)行的exe文件的相關(guān)知識點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2019-01-01
  • PyCharm2019.3永久激活破解詳細(xì)圖文教程,親測可用(不定期更新)

    PyCharm2019.3永久激活破解詳細(xì)圖文教程,親測可用(不定期更新)

    這篇文章主要介紹了PyCharm2019.3最新激活碼(注冊碼)破解永久版詳細(xì)圖文教程的相關(guān)資料,親測可用,需要的朋友可以參考下
    2020-10-10
  • 淺析python 字典嵌套

    淺析python 字典嵌套

    這篇文章主要介紹了python 字典嵌套的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-09-09
  • Django對數(shù)據(jù)庫進(jìn)行添加與更新的例子

    Django對數(shù)據(jù)庫進(jìn)行添加與更新的例子

    今天小編就為大家分享一篇Django對數(shù)據(jù)庫進(jìn)行添加與更新的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • pytorch模型保存方式

    pytorch模型保存方式

    這篇文章主要介紹了pytorch模型保存方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09

最新評論

岑溪市| 定陶县| 星子县| 治多县| 松滋市| 永宁县| 武汉市| 桂平市| 承德市| 乐平市| 海宁市| 灵川县| 深泽县| 高尔夫| 黑山县| 桃园县| 金山区| 平阳县| 信丰县| 鹤山市| 永修县| 温州市| 涿鹿县| 阿合奇县| 迭部县| 临泉县| 特克斯县| 通辽市| 大埔县| 定襄县| 肥城市| 大化| 石楼县| 桂平市| 贡觉县| 广州市| 邻水| 汶上县| 南宁市| 保德县| 南昌市|