之前,我们用pygame做了一个2D的Pong游戏,今天我们做一个3D的,游戏画面如下:

用ad和←→操作,双人对战


实现该效果我们使用Python强大的3D引擎Ursina,基础的使用方法见下方这篇文章:

手把手教你用Python编一个《我的世界》 1. 认识Ursina并学会绘制立体图形_Leleprogrammer的博客-CSDN博客_ursinaPython有一个不错的3D引擎——UrsinaUrsina官网:www.ursinaengine.org打开cmd,控制台输入pip install ursina以安装ursina编写第一个程序首先导入ursinafrom ursina import *然后创建appapp=Ursina()运行appapp.run()最终代码:from ursina import *app=Ursina()app.run()如果出现了一个灰色的窗口,https://blog.csdn.net/leleprogrammer/article/details/124780527?spm=1001.2014.3001.5502接下来开始写代码吧!

首先,导入ursina和随机库

from ursina import *
import random as rd

定义两个玩家的分数

scorea=scoreb=0

然后,我们创建app

app=Ursina()

ursina自带window参数,代表窗口,它还自带color参数,代表各种颜色,我们直接修改窗口的颜色

window.color=color.cyan

我们创建一个桌子,它是一个长方体,所以model为cube,颜色是橙色,然后进行缩放操作,并设置位置,还有它的材质(普通材质)

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")

因为第二个板子和第一个板子差不多,我们只需要用duplicate函数进行实体复制,然后修改部分参数即可

paddle_B=duplicate(paddle_A,z=-0.62)

然后,把分数显示,显示文字用到了Text类,参数差不多

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

这样运行程序,我们只看到了桌子的侧面,调整视角,改变ursina自带的camera的属性即可,设置它的倾斜度和位置

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")

设置初始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)

然后进入主循环

app.run()

我们在创建app前添加update函数,注意,这里名字一定要用update,然后自己无需调用,由ursina自动调用

创建函数并引入全局变量

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

然后判断按下了按键就对板子进行移动操作,按下按键的信息存储于held_keys中,并限制板子的移动范围

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

移动小球

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

更新比分显示

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

进行板子和球的碰撞检测,先用intersects获取触碰到的实体列表,然后对碰到实体为两个板子的时候进行反弹、加速或减速的操作

    hit_info=ball.intersects()if hit_info.hit:if hit_info.entity==paddle_A:dz=-dzif 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=-dzif 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=-dxif ball.z>0.25:scoreb+=1ball.x=0ball.z=-0.2dx=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+=1ball.x=0ball.z=-0.2dx=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行代码,就实现了以下效果~

这里附上最终代码:

from ursina import *
import random as rdscorea=scoreb=0def update():global dx,dz,scorea,scorebpaddle_B.x-=held_keys["left arrow"]*time.dtpaddle_B.x+=held_keys["right arrow"]*time.dtpaddle_A.x-=held_keys["a"]*time.dtpaddle_A.x+=held_keys["d"]*time.dtif paddle_A.x>0.35:paddle_A.x=0.35elif paddle_A.x<-0.35:paddle_A.x=-0.35if paddle_B.x>0.35:paddle_B.x=0.35elif paddle_B.x<-0.35:paddle_B.x=-0.35ball.x+=dx*time.dtball.z+=dz*time.dtt.text=f"Player A : Player B  {scorea} : {scoreb}"hit_info=ball.intersects()if hit_info.hit:if hit_info.entity==paddle_A:dz=-dzif 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=-dzif 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=-dxif ball.z>0.25:scoreb+=1ball.x=0ball.z=-0.2dx=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+=1ball.x=0ball.z=-0.2dx=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.cyantable=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=30Text(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()

喜欢的话就点赞收藏+关注吧~

谢谢支持~

Python 用3D引擎写一个Pong游戏相关推荐

  1. python俄罗斯方块算法详解_用 Python 写一个俄罗斯方块游戏 (

    @@ -2,34 +2,34 @@ > * 原文作者:[Dr Pommes](https://medium.com/@pommes) > * 译文出自:[掘金翻译计划](https://g ...

  2. Python 写一个俄罗斯方块游戏

    使用 Python 的 PyGame 库写一个俄罗斯方块游戏的逐步指南 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例 ...

  3. 用 Python 写一个俄罗斯方块游戏

    使用 Python 的 PyGame 库写一个俄罗斯方块游戏的逐步指南 在这篇教程中,我们会用 Python 的 PyGame 库写一个简单的俄罗斯方块游戏.里面的算法很简单,但对新手可能有一点挑战性 ...

  4. python写游戏脚本-使用Python写一个小游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...

  5. python编程小游戏-使用Python写一个小游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...

  6. 使用python制作聊天框解谜游戏_使用Python写一个小游戏alien invasion!

    最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下其中的 ...

  7. 手机版python3h如何自制游戏_教你如何用 Python 写一个小游戏

    教你如何用 Python 写一个小游戏 引言 最近 python 语言大火, 除了在科学计算领域 python 有用武之地之外, 在游戏后台等方面, python 也大放异彩, 本篇博文将按照正规的项 ...

  8. 关于python小游戏的毕业论文_使用Python写一个小游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...

  9. Python代码写一个超长游戏

    很遗憾,我无法提供您写一个超长游戏的 Python 代码.但是我可以给你一些建议,希望能帮到你. 首先,你可以考虑使用 Python 的标准库中的 time 模块来实现游戏的超长时间流逝效果.time ...

最新文章

  1. angularjs2 html转义,详解Angular.js数据绑定时自动转义html标签及内容
  2. 针对脑出血识别的AI匹配准确性
  3. 【四种解法】剑指 Offer 39. 数组中出现次数超过一半的数字
  4. outlook2016投票_投票:2016年读者选择奖和最佳采访奖
  5. 西安高铁“洋班组” 助力新春运
  6. 银行岗位的“香饽饽”—金融科技岗
  7. CANape操作指南
  8. linux复制压缩包到另一个文件夹,linux复制文件到另一个文件夹或目录
  9. coreldraw橙子怎么画_cdr怎么画一杯橙汁?CorelDRAW简单绘制的一杯满满的橙汁教程...
  10. 哪些英语用法是普通中国学生最生疏的?
  11. libvirt Java 实现远程管理虚拟机
  12. java编译和反编译
  13. 操作系统实验——模拟动态分区首次适应分配和回收算法
  14. 数据库连接中useSSL是否为true 或者 false的选择
  15. java-在IDEA中,如何在代码和注释之间自动添加空格?
  16. 【python】绘制一朵小红花
  17. 【000】欢迎来到嵌入式开发教程
  18. GUI编程(java)
  19. 网络安全的威胁与解决方案
  20. china.js报错

热门文章

  1. 相见恨晚系列--穷查理宝典
  2. 《浅谈Cache Memory》 学习-第四章
  3. 杜比音频和Microsoft Edge体验
  4. 【C语言】【逻辑非】双感叹号的用法
  5. 宏基因组理论教程3PICRUSt功能预测
  6. Android BLE低功耗蓝牙开发
  7. 通过生命周期管理来做热数据到冷数据的迁移
  8. 智慧校园之物联网平台对接各子系统
  9. 家电控制系统matlab,电气工程与自动化控制系统的MATLAB仿真
  10. 2021,还能无脑冲计算机专业么?