文章目录

  • 前言
  • 原图
    • 编程语言
  • 实现逻辑
  • 效果图
  • 完整代码

前言

根据老师的要求,创作一幅介绍自己的作品,可以是具象化地描绘形象,也可以是任何形式表现自己的兴趣、追求、特色、经历等。

由于最近比较喜欢一款FPS游戏,就做了里面的一把枪的模型。另外实现了一些动态效果和交互效果。

原图

编程语言

p5.js,编程环境:p5.js在线编程

实现逻辑

将整个模型分为四个模块:消音器、枪管、连接座、弹夹。

就是简单的图形堆叠,仔细观察原图,使用ellipse(),rect(),triangle()等函数实现功能。具体的看我下面的

  1. 消音器
//绘制消音管的函数
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)
}
  1. 枪管
//绘制枪管的函数
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)
}
  1. 连接座
//绘制连接座的函数
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)
}
  1. 弹夹

//绘制弹夹的函数
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消音版手枪模型相关推荐

  1. 用P5 JS绘制二维动画场景——静态篇

    绘画 根据wiki百科的定义,绘画是在技术层面上,是一个以表面作为支撑面,再在其之上加上颜色的行为,那些表面可以是纸张.油画布.木材.玻璃.漆器或混凝土等,加颜色的工具可以是画笔.也可以是刀.海绵或是 ...

  2. 运用p5.js实现王一博q版形象

    创意编程--卡通自画像设计 展示成果 创作灵感 交互代码 生成动态代码 所有代码 展示成果 静态: gif: 创作灵感 这次题目是自画像.自己喜欢的事物,所以我选取了自己喜欢的一个q版形象进行模仿.以 ...

  3. P5.js 实现交互式动态绘画

    p5.js 实现交互式动态绘画 1.关于交互式绘画的思考 2.选定题目 3.内容展示 4.代码分析 (1).按钮的实现 (2).笔刷(画笔) (3).动作 5.总结 6.参考文献 1.关于交互式绘画的 ...

  4. 【码绘】p5.js画Q版自画像

    [码绘]p5.js画Q版自画像 来自互动媒体作业的实验二,这次没有采用processing,而选择了p5.js,原因是用p5.js的在线编辑实时浏览比较方便. 先看一下最后的成果吧 我的实验过程: 手 ...

  5. 初识react(二) 实现一个简版的html+redux.js的demo

    回顾 初识react(一) 揭开jsx语法和虚拟DOM面纱 初识react(二) 实现一个简版的html+redux.js的demo 初识react(三)在 react中使用redux来实现简版计数器 ...

  6. p5.js 交互应用实战 —— 音乐可视化(案例)

    案例一 将振幅转化为图形 准备工作:打开编辑器左边菜单,upload mp3音乐素材(不超过5m) //定义变量 //Sound--声音, amplitude--振幅 let Sound, ampli ...

  7. p5.js创意编程——Q版人像绘制

    目录 主要函数介绍 贝塞尔曲线 Shape frameRate 完整代码 实现效果 主要函数介绍 贝塞尔曲线 如图,是p5.js官方reference上关于贝塞尔曲线的说明,一次可以画出一条贝塞尔曲线 ...

  8. p5.js 编程临摹动态图形(互动媒体技术作业)

    p5.js 编程临摹动态图形(互动媒体技术作业) 动态图形的规律分析 p5.js 代码历程 走过的弯路 拓展 总结 动态图形的规律分析 从老师的动态图形参考资料中,我选择了以下图形进行临摹: 初次见面 ...

  9. p5.js 光速入门中文教程

    本文简介 点赞 + 关注 + 收藏 = 学会了 本文的目标是和各位工友一起有序的快速上手 p5.js ,会讲解 p5.js 的基础用法. 本文会涉及到的内容包括: 项目搭建 p5.js 基础2D图形 ...

最新文章

  1. 《白话法律42讲》读后感
  2. springMVC整合shiro权限框架示例与实践
  3. 编程题:两个数比较大小,之后用变量t互换。
  4. python pandas教程百家号_Pandas 常见的基本方法
  5. JS-垃圾回收机制-执行栈执行上下文-闭包
  6. 给Lisp程序员的Python简介
  7. 随想录(产品需求的几个注意点)
  8. 一个成功的BI项目实施需要注意哪些?
  9. SQLServer中在视图上使用索引(转载)
  10. 软件工程之软件维护与再工程
  11. 解决windows7系统netmeeting无法(安装)使用问题
  12. 太开放计算机软件快上课,[计算机软件及应用]CAXA电子图版上课.ppt
  13. Unreal教学(10)——放置Actor (Placing Actors)
  14. C#报表开发工具ReportViewer vs Stimulsoft Reports.Net
  15. 阴暗、恐怖、外星人?这是一款什么样的游戏?
  16. Java学习总结第一阶段
  17. 为什么说jsp被替代了_您说什么:最喜欢的Windows资源管理器替代品
  18. 把list集合转换为JSON
  19. Axure交互之部件行为
  20. 人类早期驯服野生CNN卷积神经网络的情景

热门文章

  1. 【送礼啦】分享AI Studio项目赢好礼,小度音响、京东卡等你拿!
  2. 三国杀充值登陆服务器响应超时,[十周年][公告]11月6日活动更新延迟及充值活动异常问题补偿...
  3. 马斯洛顶层方法Scrum的特色是以价值观为方法论 | 图解敏捷系列
  4. python minidom生成的xml对象转字符串方法
  5. Android Studio使用Git提交、分支、切换,Android移动应用开发案例
  6. Mac刷新页面的小技巧
  7. [杂想]浑浑噩噩度日
  8. 什么是面向对象的编程思想?
  9. 怎样将设计好的cad图纸转成pdf
  10. iMovie实战及技能