p5.js案例(二):创意作品——USP消音版手枪模型
文章目录
- 前言
- 原图
- 编程语言
- 实现逻辑
- 效果图
- 完整代码
前言
根据老师的要求,创作一幅介绍自己的作品,可以是具象化地描绘形象,也可以是任何形式表现自己的兴趣、追求、特色、经历等。
由于最近比较喜欢一款FPS游戏,就做了里面的一把枪的模型。另外实现了一些动态效果和交互效果。
原图
编程语言
p5.js,编程环境:p5.js在线编程
实现逻辑
将整个模型分为四个模块:消音器、枪管、连接座、弹夹。
就是简单的图形堆叠,仔细观察原图,使用ellipse(),rect(),triangle()等函数实现功能。具体的看我下面的
- 消音器
//绘制消音管的函数
function silenceTube(x,y){fill(30)rect(x+60,y+30,180,30)ellipse(x+240,y+45,10,30)ellipse(x+160,y+45,5,32)ellipse(x+80,y+45,5,32)rect(x+50,y+35,10,20)
}
- 枪管
//绘制枪管的函数
function barrel(x,y){fill(80)rect(x+220,y+25,20,10,2)rect(x+245,y+40,5,10)rect(x+65,y+33,180,28)triangle(x+65,y+28,x+60,y+61,x+65,y+61)rect(x+65,y+31,20,2)triangle(x+65,y+28,x+65,y+31,x+70,y+31)triangle(x+64,y+41,x+62,y+48,x+56,y+42)arc(x+60,y+42,8,8,PI,0)fill(200)rect(x+140,y+33,30,20)
}
- 连接座
//绘制连接座的函数
function connection(x,y){fill(80)rect(x+105,y+66,139,12)triangle(x+118,y+91,x+114,y+104,x+133,y+104)rect(x+128,y+100,30,4)triangle(x+164,y+79,x+158,y+104,x+164,y+104)triangle(x+164,y+79,x+164,y+104,x+170,y+79)fill(0)rect(x+60,y+61,185,5)rect(x+60,y+66,45,12)triangle(x+60,y+61,x+56,y+78,x+60,y+78)triangle(x+57,y+78,x+71,y+83,x+71,y+78)triangle(x+71,y+78,x+60,y+163,x+71,y+163)rect(x+71,y+78,40,85)triangle(x+111,y+163,x+111,y+78,x+122,y+78)triangle(x+122,y+78,x+135,y+78,x+118,y+91)noFill()arc(x+150,y+85,12,15,-3/2*PI,-1/2*PI)arc(x+151,y+85,12,15,-3/2*PI,-1/2*PI)arc(x+149,y+85,12,15,-3/2*PI,-1/2*PI)
}
- 弹夹
//绘制弹夹的函数
function pistolClip(x,y){fill(0)triangle(x+86,y+90,x+86,y+158,x+71,y+158)rect(x+86,y+88,20,70)triangle(x+106,y+88,x+106,y+156,x+121,y+88)rect(x+71,y+158,40,5)triangle(x+111,y+158,x+111,y+163,x+116,y+163)
}
模型建好之后,后面是一些动态效果和交互效果的实现。
动态效果包括:背景的变色和子弹的向前发射。
交互效果包括:点击鼠标左键将手枪拆开 和 按下键盘空格键 手枪发射子弹。
- 背景变色:
使用三个变量,r , g , b ,用来作为颜色的值,然后在draw()函数中改变这三个值,达到改变背景颜色的效果。
background(r,g,b);r +=2;g +=3;b +=1;if(r>255)r=0;if(g>255)g=0;if(b>255)b=0;
- 子弹向前发射:
设置子弹的相对坐标(bulletx,bullety),通过在函数中增加bulletx的值,达到子弹向前发射的效果,其中子弹的颜色刚好与背景颜色相对。
bulletx += 30if(bulletx >= 800)bulletx = 490// 下面是子弹构成的代码fill(255-r,255-g,255-b)ellipse(bulletx,bullety,2,6)rect(bulletx,bullety-3,10,6)triangle(bulletx+10,bullety-3,bulletx+10,bullety+3,bulletx+15,bullety)
- 点击鼠标左键将手枪拆开:
使用了p5.js自带的变量mouseIsPressed以及mouseButton,这两个变量都是关于p5.js的鼠标交互事件,具体可以看:p5.js入门教程(4) 鼠标交互
按下鼠标左键之后,手枪拆分成之前说的四个模块,分别置于鼠标当前位置的上下左右,可移动。
// 鼠标事件if(mouseIsPressed){// 点击鼠标左键if(mouseButton == LEFT){// 绕鼠标点转,半径为100silenceTube(mouseX-150,mouseY-200)barrel(mouseX+50,mouseY-50)connection(mouseX-300,mouseY-100)pistolClip(mouseX-100,mouseY+50)}}
- 按下键盘空格键手枪发射子弹:
使用了p5.js自带的变量keyIsPressed和key,是关于p5.js的键盘交互事件,具体可以看:p5.js入门教程(5) 键盘交互
按下键盘空格键,当前手枪换位置,然后枪口发射子弹,子弹向前发射,参考前面的介绍。
// 键盘事件if(keyIsPressed){// 按下键盘空格键if(key == ' '){bulletx += 30if(bulletx >= 800)bulletx = 490silenceTube(250,250)barrel(50,250)connection(50,250)pistolClip(50,250)// 下面是子弹构成的代码fill(255-r,255-g,255-b)ellipse(bulletx,bullety,2,6)rect(bulletx,bullety-3,10,6)triangle(bulletx+10,bullety-3,bulletx+10,bullety+3,bulletx+15,bullety)} }
再后面就是关于最后一个元素,图中的文字。
图中的文字分为两个部分,一个是USP消音版,这是这把手枪在游戏中的名字;一个是by 顾清宇,顾清宇是我的艺名,所以我用了顾清宇,毕竟是创作嘛,哈哈!
另外,值得一提的是,字体的颜色总是和背景色相反,这样可以看的清楚一点。
textSize(32);fill(255-r,255-g,255-b)text('USP消音版', 280, 60);text('____________',275,75)text('by 顾清宇', 600, 550);
效果图
完整代码
p5.js,编程环境:p5.js在线编程
//创意自画像的代码function setup() {createCanvas(800, 600);
}var r=50,g=50,b=50; // 背景颜色的坐标
var bulletx=490, bullety=295; // 子弹的坐标function draw() {background(r,g,b);r +=2;g +=3;b +=1;if(r>255)r=0;if(g>255)g=0;if(b>255)b=0;textSize(32);fill(255-r,255-g,255-b)text('USP消音版', 280, 60);text('____________',275,75)text('by 顾清宇', 600, 550);// 没有鼠标和键盘事件if(!mouseIsPressed && !keyIsPressed){silenceTube(300,100)barrel(100,100)connection(100,100)pistolClip(100,100)}// 鼠标事件if(mouseIsPressed){// 点击鼠标左键if(mouseButton == LEFT){// 绕鼠标点转,半径为100silenceTube(mouseX-150,mouseY-200)barrel(mouseX+50,mouseY-50)connection(mouseX-300,mouseY-100)pistolClip(mouseX-100,mouseY+50)}}// 键盘事件if(keyIsPressed){// 按下键盘空格键if(key == ' '){bulletx += 30if(bulletx >= 800)bulletx = 490silenceTube(250,250)barrel(50,250)connection(50,250)pistolClip(50,250)// 下面是子弹构成的代码fill(255-r,255-g,255-b)ellipse(bulletx,bullety,2,6)rect(bulletx,bullety-3,10,6)triangle(bulletx+10,bullety-3,bulletx+10,bullety+3,bulletx+15,bullety)} }
}//绘制消音管的函数
function silenceTube(x,y){fill(30)rect(x+60,y+30,180,30)ellipse(x+240,y+45,10,30)ellipse(x+160,y+45,5,32)ellipse(x+80,y+45,5,32)rect(x+50,y+35,10,20)
}//绘制枪管的函数
function barrel(x,y){fill(80)rect(x+220,y+25,20,10,2)rect(x+245,y+40,5,10)rect(x+65,y+33,180,28)triangle(x+65,y+28,x+60,y+61,x+65,y+61)rect(x+65,y+31,20,2)triangle(x+65,y+28,x+65,y+31,x+70,y+31)triangle(x+64,y+41,x+62,y+48,x+56,y+42)arc(x+60,y+42,8,8,PI,0)fill(200)rect(x+140,y+33,30,20)
}//绘制连接座的函数
function connection(x,y){fill(80)rect(x+105,y+66,139,12)triangle(x+118,y+91,x+114,y+104,x+133,y+104)rect(x+128,y+100,30,4)triangle(x+164,y+79,x+158,y+104,x+164,y+104)triangle(x+164,y+79,x+164,y+104,x+170,y+79)fill(0)rect(x+60,y+61,185,5)rect(x+60,y+66,45,12)triangle(x+60,y+61,x+56,y+78,x+60,y+78)triangle(x+57,y+78,x+71,y+83,x+71,y+78)triangle(x+71,y+78,x+60,y+163,x+71,y+163)rect(x+71,y+78,40,85)triangle(x+111,y+163,x+111,y+78,x+122,y+78)triangle(x+122,y+78,x+135,y+78,x+118,y+91)noFill()arc(x+150,y+85,12,15,-3/2*PI,-1/2*PI)arc(x+151,y+85,12,15,-3/2*PI,-1/2*PI)arc(x+149,y+85,12,15,-3/2*PI,-1/2*PI)
}//绘制弹夹的函数
function pistolClip(x,y){fill(0)triangle(x+86,y+90,x+86,y+158,x+71,y+158)rect(x+86,y+88,20,70)triangle(x+106,y+88,x+106,y+156,x+121,y+88)rect(x+71,y+158,40,5)triangle(x+111,y+158,x+111,y+163,x+116,y+163)
}
p5.js案例(二):创意作品——USP消音版手枪模型相关推荐
- 用P5 JS绘制二维动画场景——静态篇
绘画 根据wiki百科的定义,绘画是在技术层面上,是一个以表面作为支撑面,再在其之上加上颜色的行为,那些表面可以是纸张.油画布.木材.玻璃.漆器或混凝土等,加颜色的工具可以是画笔.也可以是刀.海绵或是 ...
- 运用p5.js实现王一博q版形象
创意编程--卡通自画像设计 展示成果 创作灵感 交互代码 生成动态代码 所有代码 展示成果 静态: gif: 创作灵感 这次题目是自画像.自己喜欢的事物,所以我选取了自己喜欢的一个q版形象进行模仿.以 ...
- P5.js 实现交互式动态绘画
p5.js 实现交互式动态绘画 1.关于交互式绘画的思考 2.选定题目 3.内容展示 4.代码分析 (1).按钮的实现 (2).笔刷(画笔) (3).动作 5.总结 6.参考文献 1.关于交互式绘画的 ...
- 【码绘】p5.js画Q版自画像
[码绘]p5.js画Q版自画像 来自互动媒体作业的实验二,这次没有采用processing,而选择了p5.js,原因是用p5.js的在线编辑实时浏览比较方便. 先看一下最后的成果吧 我的实验过程: 手 ...
- 初识react(二) 实现一个简版的html+redux.js的demo
回顾 初识react(一) 揭开jsx语法和虚拟DOM面纱 初识react(二) 实现一个简版的html+redux.js的demo 初识react(三)在 react中使用redux来实现简版计数器 ...
- p5.js 交互应用实战 —— 音乐可视化(案例)
案例一 将振幅转化为图形 准备工作:打开编辑器左边菜单,upload mp3音乐素材(不超过5m) //定义变量 //Sound--声音, amplitude--振幅 let Sound, ampli ...
- p5.js创意编程——Q版人像绘制
目录 主要函数介绍 贝塞尔曲线 Shape frameRate 完整代码 实现效果 主要函数介绍 贝塞尔曲线 如图,是p5.js官方reference上关于贝塞尔曲线的说明,一次可以画出一条贝塞尔曲线 ...
- p5.js 编程临摹动态图形(互动媒体技术作业)
p5.js 编程临摹动态图形(互动媒体技术作业) 动态图形的规律分析 p5.js 代码历程 走过的弯路 拓展 总结 动态图形的规律分析 从老师的动态图形参考资料中,我选择了以下图形进行临摹: 初次见面 ...
- p5.js 光速入门中文教程
本文简介 点赞 + 关注 + 收藏 = 学会了 本文的目标是和各位工友一起有序的快速上手 p5.js ,会讲解 p5.js 的基础用法. 本文会涉及到的内容包括: 项目搭建 p5.js 基础2D图形 ...
最新文章
- 《白话法律42讲》读后感
- springMVC整合shiro权限框架示例与实践
- 编程题:两个数比较大小,之后用变量t互换。
- python pandas教程百家号_Pandas 常见的基本方法
- JS-垃圾回收机制-执行栈执行上下文-闭包
- 给Lisp程序员的Python简介
- 随想录(产品需求的几个注意点)
- 一个成功的BI项目实施需要注意哪些?
- SQLServer中在视图上使用索引(转载)
- 软件工程之软件维护与再工程
- 解决windows7系统netmeeting无法(安装)使用问题
- 太开放计算机软件快上课,[计算机软件及应用]CAXA电子图版上课.ppt
- Unreal教学(10)——放置Actor (Placing Actors)
- C#报表开发工具ReportViewer vs Stimulsoft Reports.Net
- 阴暗、恐怖、外星人?这是一款什么样的游戏?
- Java学习总结第一阶段
- 为什么说jsp被替代了_您说什么:最喜欢的Windows资源管理器替代品
- 把list集合转换为JSON
- Axure交互之部件行为
- 人类早期驯服野生CNN卷积神经网络的情景
热门文章
- 【送礼啦】分享AI Studio项目赢好礼,小度音响、京东卡等你拿!
- 三国杀充值登陆服务器响应超时,[十周年][公告]11月6日活动更新延迟及充值活动异常问题补偿...
- 马斯洛顶层方法Scrum的特色是以价值观为方法论 | 图解敏捷系列
- python minidom生成的xml对象转字符串方法
- Android Studio使用Git提交、分支、切换,Android移动应用开发案例
- Mac刷新页面的小技巧
- [杂想]浑浑噩噩度日
- 什么是面向对象的编程思想?
- 怎样将设计好的cad图纸转成pdf
- iMovie实战及技能