作品展示

作品特点

  1. 鼠标控制眼珠和眉毛的朝向(始终朝向鼠标位置)
  2. 鼠标控制嘴巴大小(根据鼠标Y轴方向的位置决定,鼠标从下到上,嘴巴从小到大)
  3. 鼠标控制手挥动(根据鼠标Y轴方向的位置决定,鼠标从下到上,手臂从下到上挥动)
  4. 鼠标控制下雪的密度(根据鼠标Y轴方向的位置决定,鼠标从下到上,下雪密度从小到大)
  5. 整体做出一个没下雪的时候情绪低落的样子,雪越大越开心的效果(大概吧)

函数作用说明

  1. 利用fill()函数控制填充颜色,noFill()不填充;stroke()函数控制边框颜色,strokeWeight()控制边框宽度,noStroke()无边框
  2. line()直线,bezier()曲线,ellipse()椭圆/圆,rect()矩形
  3. beginShape()->vertex()画顶点->quadraticVertex()画曲线顶点->endShape()自定义形状(主要用于画头发)
  4. translate()移动坐标原点,rotate()旋转坐标轴

源代码

let snowflakes = [];function setup() {// put setup code herecreateCanvas(600,600);//创建画布
}function draw() {// put drawing code here  background(139);//背景色设置为灰色 drawMe();drawSnow();
}function drawMe(){drawClothes();//衣服drawStar(300,400,20,40,5);//星星drawLHand();//左手drawRHand();//右手noStroke();fill(255,228,181);//脸ellipse(300,200,200,200);fill(255,228,181);//耳朵ellipse(400,200,50,50);ellipse(200,200,50,50);drawEyes();//眼睛fill(255,150,122);//鼻子triangle(300,190,290,230,310,230);drawMouth();//嘴巴drawBrow();//眉毛drawHair();//头发drawGlasses();//眼镜}function drawEyes(){//眼睛noStroke();fill(255,255,255);ellipse(340,180,30,30);ellipse(260,180,30,30);var deltax=(mouseX-300)/300*7.5;var deltay=(mouseY-200)/400*8;fill(0);ellipse(340+deltax,180+deltay,15,15);ellipse(260+deltax,180+deltay,15,15);
}function drawBrow(){//眉毛noFill();stroke(0);strokeWeight(3);var deltax=(mouseX-300)/300*8;var deltay=(mouseY-200)/400*5;bezier(250+deltax,155+deltay,260+deltax,145+deltay,260+deltax,145+deltay,270+deltax,155+deltay);bezier(330+deltax,155+deltay,340+deltax,145+deltay,340+deltax,145+deltay,350+deltax,155+deltay);
}function drawHair(){//头发noStroke();fill(139,69,0);//头发beginShape();vertex(195,174);vertex(200,210);vertex(210,160);vertex(212,170);vertex(230,130);vertex(230,140);vertex(240,120);vertex(270,130);vertex(270,120);vertex(340,140);vertex(340,130);vertex(380,145);vertex(380,135);vertex(385,150);vertex(385,140);vertex(390,170);vertex(392,160);vertex(400,210);vertex(405,174);quadraticVertex(400,90,300,90);quadraticVertex(200,90,195,174);endShape();
}function drawMouth(){//嘴巴noStroke();fill(255,150,122);var deltay=(600-mouseY)/600*20+10;ellipse(300,260,40,deltay);
}function drawGlasses(){//眼镜noFill();stroke(0);strokeWeight(5);rect(230,160,60,40);rect(310,160,60,40);line(290,180,310,180);line(370,180,396,174);line(230,180,204,174);
}function drawClothes(){//衣服noStroke();fill(135,206,235);triangle(300,100,210,480,390,480);fill(255,165,79);rect(240,480,50,80);rect(310,480,50,80);fill(50,50,50);rect(240,560,50,20);rect(310,560,50,20);ellipse(240,570,20,20);ellipse(360,570,20,20);fill(139);rect(240,280,120,20);fill(255,228,181);ellipse(300,300,40,20);
}function drawStar(x,y,radius1,radius2,npoints){//星星noStroke();fill(238,238,0);translate(300,400);rotate(-PI/2);star(0,0,20,40,5);rotate(PI/2);translate(-300,-400);
}function star(x, y, radius1, radius2, npoints) {let angle = TWO_PI / npoints;let halfAngle = angle / 2.0;beginShape();for (let a = 0; a < TWO_PI; a += angle) {let sx = x + cos(a) * radius2;let sy = y + sin(a) * radius2;vertex(sx, sy);sx = x + cos(a + halfAngle) * radius1;sy = y + sin(a + halfAngle) * radius1;vertex(sx, sy);}endShape(CLOSE);
}function drawRHand(){//右手var angle=(mouseY-300)/600/3*PI;translate(350,340);rotate(angle);stroke(135,206,235);strokeWeight(50);line(0,0,100,0);noStroke();fill(255,228,181);ellipse(100,0,60,60);rotate(-angle);translate(-350,-340);}function drawLHand(){//左手var angle=(mouseY-300)/600/3*PI;translate(250,340);rotate(-angle);stroke(135,206,235);strokeWeight(50);line(0,0,-100,0);  noStroke();fill(255,228,181);ellipse(-100,0,60,60);rotate(angle);translate(-250,-340);}function drawSnow(){//雪let t = frameCount / 60;var density=(600-mouseY)/600*10;for (let i = 0; i < random(density); i++){snowflakes.push(new snowflake());}for (let flake of snowflakes){flake.update(t);flake.display();}
}function snowflake(){this.posX = 0;this.posY = random(-50, 0);this.initialangle = random(0, 2 * PI);this.size = random(2, 5);this.radius = sqrt(random(pow(width / 2, 2)));this.update = function(time) {let w = 0.6;let angle =this.initialangle;this.posX = width / 2 + this.radius * sin(angle);this.posY += pow(this.size, 0.5);if (this.posY > height){let index = snowflakes.indexOf(this);snowflakes.splice(index, 1);}};this.display = function(){fill(240);noStroke();ellipse(this.posX, this.posY, this.size);};
}

相关参考

其中星星和雪花飘落的效果参考了官方文档,然后自己对其中一些参数做了调整。
星星: https://p5js.org/zh-Hans/examples/form-star.html
雪花: https://p5js.org/zh-Hans/examples/simulate-snowflakes.html

心得

最麻烦的还是画头发吧,调整坐标调整到崩溃,其他的部分只需要注意画的时候代码的顺序(图形遮挡顺序)就可以了。自己没什么美术功底,人物比较丑,交互性和动态上也只是做了比较简单的效果,总体来说还是挺有意思的。

创意编程-创意自画像相关推荐

  1. 创意编程——卡通自画像设计

    创意编程--卡通自画像设计 成果展示 图像分析: 整体图像分为两部分--背景和人物: 背景部分为动态,整体为粉色以及向上升起的白色泡泡. 任务部分为卡通自画像设计 PART1:背景部分代码分析 泡泡初 ...

  2. 玩点创意编程,发现另一个世界

    知识点 什么是创意编程 创意编程的应用领域 创意编程的常见工具 p5.js 简介 什么是创意编程 创意编程(Creative Coding)的概念非常宽泛,它是一种以创作表达为主要目的的计算机编程实践 ...

  3. 新的JavaScript库邀请程序员使用Canvas进行创意编程

    为了模糊技术和艺术之间的界限,Sandpit库使用JavaScript和Canvas 2D元素进行创意编程. 通过GitHub或NPM并内置在ECMAScript 6中,Sandpit仍然使用着一个可 ...

  4. python 创意编程 全国-关于举办第五届全国青少年创意编程与智能设计大赛的通知...

    各省.自治区.直辖市和新疆生产建设兵团科协青少年科技教育工作机构,青少年科技辅导员协会(科技教育协会): 为深入贯彻落实国务院<新一代人工智能发展规划>的任务要求,向广大青少年普及推广编程 ...

  5. python创意编程比赛-报名了!2019年全国青少年创意编程与智能设计大赛报名开始了...

    原标题:报名了!2019年全国青少年创意编程与智能设计大赛报名开始了 本文首发于微信公众号逻得岛编程 激动人心的时刻来了,2019年全国青少年创意编程与智能设计大赛开始报名了! 那么问题来了,全国青少 ...

  6. python创意编程比赛-关于举办2019年青岛市青少年创意编程与智能设计大赛的通知...

    原标题:关于举办2019年青岛市青少年创意编程与智能设计大赛的通知 根据青岛市科协.教育局<关于开展2019年青岛市青少年科学教育系列活动的通知>(青科协字[2019]20号)文件相关要求 ...

  7. 编程迷宫_少儿创意编程(特23)scratch之迷宫模式探索(上)

    上一期的公众号发布了迷宫背景生成的内容,又一次在相关微信群和QQ群引起了大家热烈的讨论,在这里非常感谢大家的支持与参与! 本期内容承接上一期,来介绍几种迷宫的模式吧! 一.碰到颜色返回模式. 这是初学 ...

  8. js高级编程_这位设计师用Processing把创意编程玩到了极致!

    Processing作为新媒体从业者的必备工具,近来却越来越成为设计师们的新宠! 今天小编将介绍以为用Processing把创意编程玩到极致的设计师Tim Rodenbröker. "我们的 ...

  9. background 旋转_第4章 旋转的圆弧(《Python趣味创意编程》教学视频)

    (图书介绍:童晶:<Python趣味创意编程>新书预告) 本章我们将实现旋转的圆弧,如图所示.首先学习圆弧的绘制和旋转:接着利用全局变量实现圆弧逐渐变长,学习if选择语句,实现圆弧长度的重 ...

最新文章

  1. 宏基因组理论教程7挖掘微生物组生物标记
  2. emacs python plugin_使用 python 扩展 emacs
  3. android 变化字体,android 字体修改
  4. IOS 开发一些常用的地址
  5. bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列
  6. 样条表示---Bezier样条曲线
  7. python应用POP3、IMAP、SMTP 协议,获取邮箱验证码
  8. 容器中apscheduler不执行_APScheduler:定时任务框架
  9. CVPR 2020 Oral | 旷视提出目前最好的密集场景目标检测算法:一个候选框,多个预测结果...
  10. 【嵌入式工程师面试高频问题】你知道SPI吗
  11. 【运维程序】简单的命令控制器(支持定时命令执行、重复定时任务命令和进程管理,开发这个小程序主要是为了方便管理服务进程)【个人github项目】...
  12. oracle分组关联统计,没有记录则显示0
  13. html自动跳转到锚点,html中的锚点
  14. 利用github for windows 工具将本地的内容同步到github上
  15. 【11月29】PF 粒子滤波的多维运动模型代码
  16. 服务器内存系统,服务器内存系统容量
  17. 2019腾讯广告算法大赛
  18. SpringBoot单元测试的@RunWith与@SpringBootTest注解
  19. Ae 入门系列之二:素材的导入与管理
  20. Dump文件分析 - PDB强制匹配流程

热门文章

  1. ubuntu 外接显示器 无法检测 更换驱动 登录界面无限循环
  2. .NET 学习-未将对象引用设置到对象的实例 解决方法
  3. ESP32的CAN通信
  4. Robocup-Rescue仿真救援简介
  5. 报告解读:双肩包品牌消费趋势洞察(附完整版报告)
  6. 华为q1设置虚拟服务器,快速设置手机解决 华为Q1系统解析_华为 路由Q1_网络设备无线网络和技术-中关村在线...
  7. 氮化镓充电器哪家做得好_【一点资讯】主流品牌已多达近10款: 氮化镓充电器怎么选? www.yidianzixun.com...
  8. 在小黑窗用mysql查询navicat_轻松掌握MySQL的使用(CMD小黑窗版)
  9. 魅族android 10内测答案,魅族Flyme内测招募:10款机型升级Android 10!
  10. Nios II 系统的Avalon总线