สารบัญ:
- ขั้นตอนที่ 1: ตัวแปร
- ขั้นตอนที่ 2: การสร้างตัวแปร
- ขั้นตอนที่ 3: กฎการตั้งชื่อของตัวแปร
- ขั้นตอนที่ 4: ประเภทตัวแปร
- ขั้นตอนที่ 5: ตัวดำเนินการ
- ขั้นตอนที่ 6: ผลการดำเนินการ:
- ขั้นตอนที่ 7: กฎการดำเนินงาน
- ขั้นตอนที่ 8: ตั้งค่าฟังก์ชัน & ฟังก์ชันวาด
- ขั้นตอนที่ 9: วงกลมในการเคลื่อนไหวในแนวนอน
- ขั้นตอนที่ 10: ทิศทางการเคลื่อนไหว
- ขั้นตอนที่ 11: พื้นหลังที่ถูกมองข้าม
- ขั้นตอนที่ 12: วงกลมสั่น
- ขั้นตอนที่ 13: การโยกย้าย Circle
- ขั้นตอนที่ 14: วงกลมย้ายโดยเมาส์
- ขั้นตอนที่ 15: สิ้นสุด
- ขั้นตอนที่ 16: การอ่านแบบสัมพัทธ์:
วีดีโอ: คำแนะนำการเขียนโปรแกรมที่น่าสนใจสำหรับนักออกแบบ - ทำให้ภาพของคุณดำเนินไป (ตอนที่หนึ่ง): 16 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:09
วิ่ง! วิ่ง! วิ่ง!
การเขียนโปรแกรมไม่ใช่เรื่องยาก จุดสำคัญคือการหาจังหวะของคุณและทำมันทีละตัว
ก่อนอ่านบทนี้ ฉันหวังว่าคุณคงคุ้นเคยกับวิธีการวาดฟังก์ชันพื้นฐานแล้ว มิฉะนั้นคุณจะรู้สึกเวียนหัวและสับสนกับฟังก์ชันหัวโต 2 ฟังก์ชัน ได้แก่ การตั้งค่าและการวาด
เนื่องจากเราต้องการสร้างโมชั่นกราฟิก เราจึงต้องรู้ว่าแอนิเมชั่นถูกสร้างขึ้นมาอย่างไร
ภาพด้านบนดูค่อนข้างน่าสนใจและเผยให้เห็นหลักการใช้งานแอนิเมชั่นด้วยสายตา
แอนิเมชั่นคือเวทมนตร์ มันเป็นเวทย์มนตร์เกี่ยวกับการโกงด้วยภาพ อย่างไรก็ตามในข้อมูลนี้ระเบิดอายุวิดีโอน้ำท่วมเราคุ้นเคยกับมันแล้ว ไม่กี่คนที่จะแปลกใจว่าการดูแอนิเมชั่นเป็นเรื่องที่น่าทึ่ง
หลักการเดียวกันนี้สามารถนำไปใช้กับแอนิเมชั่นการวาดด้วยโปรแกรม เราต้องพิจารณาถึงวิธีการวาดกราฟิกต่างๆ ในแต่ละเฟรม และโปรแกรมจะเปลี่ยนหน้าโดยอัตโนมัติในขณะที่เราเสริมแอนิเมชั่นที่เสร็จสมบูรณ์ในหัวของเรา ในบทต่อไป เราจะพูดถึงวิธีรับรู้การเคลื่อนไหวกราฟิกพื้นฐาน ก่อนหน้านั้นเราจำเป็นต้องรู้ความรู้พื้นฐานเกี่ยวกับตัวแปรก่อน
ขั้นตอนที่ 1: ตัวแปร
ตัวแปรคือคอนเทนเนอร์สำหรับข้อมูล สามารถใช้ซ้ำได้ภายในโปรแกรม
ตัวอย่างเช่น:
[cceN_cpp ธีม="รุ่งอรุณ"] ขนาด(500, 500); วงรี(100, 250, 50, 50); วงรี(200, 250, 50, 50); วงรี(300, 250, 50, 50); วงรี(400, 250, 50, 50);
[/cceN_cpp]
โค้ดส่วนนี้ไม่ได้ใช้ตัวแปรใดๆ มันวาดวงกลมสี่วงในหน้าจอ เราจะพบว่ามีความกว้างและความสูงเท่ากัน เมื่อเป็นเหมือนเดิมแล้ว เพื่อลดการป้อนข้อมูลซ้ำ เราสามารถกำหนดเครื่องหมายเพื่อแสดงแทนได้ เครื่องหมายนี้เป็นตัวแปร
นี่คือรหัสหลังจากเพิ่มตัวแปร:
[cceN_cpp ธีม="รุ่งอรุณ"] ขนาด(500, 500); int a = 50; วงรี(100, 250, a, a); วงรี(200, 250, a, a); วงรี(300, 250, a, a); วงรี(400, 250, a, a);
[/cceN_cpp]
เราได้รับผลลัพธ์ที่เหมือนกันโดยสิ้นเชิง!
เนื่องจากเราได้กำหนดตัวแปร a เราจึงสามารถเปลี่ยนพารามิเตอร์ได้อย่างสะดวก ถ้าเราเปลี่ยน a=50 เป็น a=100 ความกว้างและความสูงของวงกลมทั้งหมดจะกลายเป็น 100 เท่ากัน ดังนั้นเราจึงไม่ต้องเปลี่ยนพารามิเตอร์ทีละรายการ ตัวแปรเป็นสิ่งประดิษฐ์ที่ดีจริงๆ
ขั้นตอนที่ 2: การสร้างตัวแปร
ก่อนใช้ตัวแปร เราต้องสร้างคำสั่งและกำหนดประเภทข้อมูลก่อน
int ฉัน;
ฉัน= 50;
ประโยคแรกของรหัสได้สร้างคำสั่งสำหรับตัวแปร i int เป็นสัญลักษณ์ที่ใช้ประกาศตัวแปรเป็นหลัก เมื่อประกาศจะสำรองห้องไว้ในหน่วยความจำคอมพิวเตอร์ซึ่งเทียบเท่ากับการสร้าง "กล่อง" ที่ใช้เพื่อกู้คืนข้อมูลจำนวนเต็มโดยเฉพาะ ประโยคที่สองหมายถึงการมอบหมาย 50 เพื่อดำเนินการโดยตัวแปร i หลังจากใช้ประโยคนี้ ข้อมูลจะถูกเก็บไว้ในตัวแปร i อย่างเสถียร หรือคุณอาจขี้เกียจที่จะรวมสองประโยคข้างต้นเป็นหนึ่งเดียวและทำงานมอบหมายให้เสร็จสิ้นในขณะที่พูด
int ฉัน= 50;
ค่อนข้างอิสระในการตั้งชื่อตัวแปร แต่บางครั้งเราต้องใส่ใจกับบางสิ่ง
ขั้นตอนที่ 3: กฎการตั้งชื่อของตัวแปร
• ต้องเป็นการผสมผสานระหว่างตัวอักษรและขีดเส้นใต้ อาจเป็นสัญลักษณ์หรือคำก็ได้
• กรณีที่สำคัญ. ชื่อและชื่อสามารถยืนแทนตัวแปรต่างๆ
• พยายามตั้งชื่อให้ง่ายที่สุดเพื่อให้คุณเข้าใจได้ในคราวเดียว อักขระเริ่มต้นต้องเป็นตัวอักษรแทนที่จะเป็นตัวเลขหรืออักขระพิเศษ
• ไม่มีคำสำคัญอย่าง int, float
ต่อไปนี้เป็นข้อความที่ไม่ถูกต้อง
int $a;
int 89b;
นี่คือข้อความที่ถูกต้อง:
int r;
int super_24;
int openTheDoor;
ขั้นตอนที่ 4: ประเภทตัวแปร
ยกเว้นการประกาศข้อมูลจำนวนเต็ม เราสามารถประกาศข้อมูลทศนิยม (เรียกอีกอย่างว่าข้อมูลทศนิยม) ด้วยคำสำคัญลอย
ลอย b = 0.5
เราต้องจำไว้ว่าเราใช้ข้อมูลประเภทใดสำหรับคำสั่งของเรา หากเราใช้คีย์เวิร์ด int การมอบหมายหลังไม่สามารถเขียน i=0.5 หรืออะไรทำนองนั้นได้ มิฉะนั้นโปรแกรมจะกลายเป็นข้อผิดพลาด แต่ถ้าเราเขียนตรงกันข้ามก็ไม่เป็นไร ตัวอย่างเช่น float i=5 เป็นไวยากรณ์ที่ถูกต้อง แต่โปรแกรมจะรับรู้ว่าเป็นเลขทศนิยม
ตัวแปรบางตัวถูกกำหนดโดยระบบแล้ว เราไม่ต้องประกาศด้วยตัวเอง เช่นเดียวกับ "ความกว้าง ความสูง" ที่อ้างถึงก่อนหน้านี้ จะได้รับความกว้างและความสูงของหน้าจอคอมพิวเตอร์โดยอัตโนมัติ ความถี่ในการใช้งานสูงเช่นนี้ที่นักออกแบบกำหนดโดยตรงให้เป็นตัวแปรเริ่มต้นเพื่อให้เราใช้งานได้สะดวกยิ่งขึ้น
ขั้นตอนที่ 5: ตัวดำเนินการ
ต่อไปนี้เป็นตัวดำเนินการของการประมวลผล:
+ บวก
- ลบ
* ทวีคูณ
หาร
% โมดูลัสของเศษเหลือ
คุณต้องคุ้นเคยกับตัวดำเนินการเหล่านี้ทั้งหมด ยกเว้น % มันดูค่อนข้างแปลกเพราะผลลัพธ์มันเหลืออยู่ 9%3 คือ 0 ในขณะที่ 9%5 คือ 4
สามารถใช้ตัวดำเนินการระหว่างการกำหนดและตัวแปรได้
[cceN_cpp theme="dawn"] int a = 1; //ประกาศตัวแปรจำนวนเต็ม a การมอบหมายคือ 1. int b = 2; //ประกาศตัวแปรจำนวนเต็ม b การมอบหมายคือ 2. int c; //ประกาศตัวแปรจำนวนเต็ม c c = a + b; //บวกสองการมอบหมายและกำหนดผลลัพธ์ให้กับค พิมพ์ (c); //ตัวแปรเอาต์พุต c.
[/cceN_cpp]
ขั้นตอนที่ 6: ผลการดำเนินการ:
ผลลัพธ์ผลลัพธ์จะไม่ปรากฏบนหน้าต่าง แต่ในคอนโซลที่ด้านล่าง
วิธีการเขียนบรรทัดที่สี่ดูค่อนข้างแปลก แต่เป็นรูปแบบทั่วไปที่ใช้บ่อยในระหว่างการมอบหมายคอมพิวเตอร์ ด้านซ้ายของสัญลักษณ์เท่ากับควรเป็นตัวแปรที่กำหนดขั้นสุดท้าย ในขณะที่ด้านขวาควรเป็นกระบวนการดำเนินการ
ฟังก์ชันการพิมพ์ในบรรทัดที่ 5 สามารถพิมพ์ตัวแปรในคอนโซล ซึ่งมักใช้เพื่อทดสอบเงื่อนไขของข้อมูลที่ส่งออก
ขั้นตอนที่ 7: กฎการดำเนินงาน
จุดที่ยุ่งยากในการประมวลผลคือเราต้องชี้แจงประเภทของตัวแปรให้ชัดเจน เราต้องให้ความสนใจเป็นพิเศษกับกระบวนการของเลขทศนิยมและประเภทจำนวนเต็ม
พิมพ์ (6 / 5); // ผลลัพธ์ 1
การดำเนินการระหว่างจำนวนเต็มจะมีจำนวนเต็มใหม่ 6 หารด้วย 5 คือ 1.2. แต่ผลลัพธ์ของโปรแกรมคือ 1 ซึ่งขัดกับสัญชาตญาณของเรา โปรแกรมจะไม่จัดการกับรอบ แต่จะลบตัวเลขหลังจุดทศนิยม
พิมพ์ (6.0 / 5.0); // ผลลัพธ์ 1.2
การดำเนินการระหว่างจุดลอยตัวจะส่งผลให้จำนวนจุดลอยตัวใหม่ ถ้าผลลัพธ์จริงคือ 1.2 ผลลัพธ์ของโปรแกรมจะเหมือนกัน
พิมพ์ (6 / 5.0); // ผลลัพธ์ 1.2
พิมพ์ (6.0 / 5); // ผลลัพธ์ 1.2
ในที่สุดก็เป็นส่วนผสมของจำนวนเต็มและเลขทศนิยม ผลลัพธ์สุดท้ายจะเป็น 1.2
• ที่จริงแล้ว คุณต้องจำไว้ว่าเป้าหมายของการออกแบบกฎระเบียบนี้คือการไม่สูญเสียความถูกต้องของข้อมูล ดังนั้นหากองค์ประกอบหนึ่งเป็นเลขทศนิยม ผลลัพธ์จะเป็นเลขทศนิยมด้วย
ขั้นตอนที่ 8: ตั้งค่าฟังก์ชัน & ฟังก์ชันวาด
ก่อนหน้านี้เราได้พูดถึงกองความรู้พื้นฐาน ในที่สุดเราก็มาเล่นอะไรที่น่าสนใจกัน การตั้งค่าและวาดฟังก์ชันเทียบเท่ากับฟังก์ชันหลักของการประมวลผล ฟังก์ชันทั้งสองนี้มีความพิเศษมาก สามารถควบคุมขั้นตอนของโปรแกรมได้ โปรแกรมที่ค่อนข้างซับซ้อนจะรวมฟังก์ชันทั้งสองนี้ไว้ด้วยเพราะเป็นเฟรมพื้นฐานสำหรับโปรแกรม รูปแบบ:
การตั้งค่าเป็นโมฆะ (){
}
ถือเป็นโมฆะวาด (){
}
การใช้งานพิเศษทำให้รูปแบบการเรียกใช้แตกต่างจากฟังก์ชันอื่นๆ เราต้องเติม "void" ก่อนชื่อฟังก์ชัน ซึ่งหมายถึง no "returned value" ด้านหลังชื่อฟังก์ชัน เราต้องใส่วงเล็บและวงเล็บปีกกา
[cceN_cpp theme="dawn"] การตั้งค่าเป็นโมฆะ (){ พิมพ์ (1); } วาดเป็นโมฆะ (){ พิมพ์ (2); } [/cceN_cpp]
ลองมาดูตัวอย่าง:
เมื่อกดปุ่มการทำงาน คอนโซลจะส่งออก "1" ก่อน จากนั้นจึงส่งออก "2" อย่างต่อเนื่อง จนกว่าคุณจะกดปุ่มหยุดหรือปิดหน้าต่าง
รหัสภายในวงเล็บในฟังก์ชันการตั้งค่าจะถูกใช้งานเพียงครั้งเดียว ในขณะที่โค้ดภายในฟังก์ชันการวาดจะทำงานอย่างต่อเนื่อง (การใช้งานเริ่มต้น 60 ครั้ง/วินาที)
เนื่องจากอักขระนี้ การตั้งค่ามักจะใช้เพื่อเริ่มต้นคุณสมบัติของสภาพแวดล้อม เช่น ความกว้างและความสูงของหน้าจอ สีพื้นหลัง และการกำหนดตัวแปรทุกประเภท ในขณะที่เรามักจะใส่ฟังก์ชันการวาดลงในฟังก์ชัน draw เพื่อสร้างกราฟิกที่เปลี่ยนแปลงอย่างต่อเนื่อง
ขั้นตอนที่ 9: วงกลมในการเคลื่อนไหวในแนวนอน
ด้วยการวาดฟังก์ชัน เราสามารถเริ่มสร้างแอนิเมชั่นของเราได้ วิธีการเขียนเอฟเฟกต์แอนิเมชั่นด้วยการประมวลผลค่อนข้าง “อึดอัด” มันไม่มีคำสั่งใด ๆ ที่มีอยู่ ตัวอย่างเช่น กำหนดรูปร่างบางอย่างเพื่อทำเป็นเส้นโค้ง
เราต้องกำหนดรายละเอียดเหล่านี้ด้วยตัวเอง คุณต้องบอกโปรแกรมว่าแต่ละเฟรมต้องการกราฟิกประเภทใด
เขียนรหัสต่อไปนี้ลงไป (ตอนนี้เริ่มลงมือทำ):
[cceN_cpp theme="dawn"] int x; int y; การตั้งค่าเป็นโมฆะ () { ขนาด (300, 300); x = 0; y = ความสูง/2; } วาดเป็นโมฆะ () { พื้นหลัง (234, 113, 107); ไม่มีจังหวะ (); วงรี(x, y, 50, 50); x = x+1; }
[/cceN_cpp]
โค้ดส่วนนี้แสดงวงกลมเคลื่อนที่ ตัวแปรที่ประกาศไว้ก่อนหน้านี้ x, y ใช้เพื่อเก็บตำแหน่งของพิกัด การมอบหมายทำงานในการตั้งค่าฟังก์ชัน รหัสคีย์เป็นรหัสต่อไปนี้ภายในฟังก์ชันวาด:
x = x + 1
อย่ามองว่าเป็นสมการทางคณิตศาสตร์ มิฉะนั้น มันจะแปลกมาก ที่นี่ "=" เป็นสัญลักษณ์ของการมอบหมาย มันหมายถึงการวางตัวเลขที่ถูกต้องลงในตัวแปรด้านซ้าย สมมติว่า x คือ 50 เมื่อโค้ดเริ่มทำงาน ด้านขวาของ "=" จะเท่ากับ 50+1 นั่นคือ 51 ผลลัพธ์สุดท้ายจะถูกกำหนดเป็นตัวแปร x ดังนั้นค่าของ x จึงกลายเป็น 51
ทำตามขั้นตอนของโปรแกรม ทุกครั้งที่วาดฟังก์ชันทำงานครั้งเดียว ค่าของ x จะเพิ่มขึ้น 1 ดังนั้นทุกครั้งที่เราวาด วงกลมจะย้ายทิศทางพิกเซลในแนวนอนไปทางขวา เมื่อเทียบกับเฟรมเดิม ดังนั้นกราฟิกจึงเคลื่อนไหวได้
• เพื่อให้โค้ดอ่านง่ายขึ้น เราต้องสำรองห้องหนึ่งไว้ก่อนโค้ดแต่ละบรรทัดในวงเล็บปีกกา และจะต้องจัดแนวให้มากที่สุด กด TAB หรือช่องว่างหลาย ๆ อันก็สามารถดึงกลับได้
• สัญลักษณ์ของช่องว่างและตัวแบ่งบรรทัดในโปรแกรมจะไม่มีผลกับโปรแกรม ไม่เป็นไรถ้าเราพิมพ์มากหรือน้อย
นี่เป็นอีกวิธีที่ง่ายกว่าในการแสดงออก เพื่อให้วงกลมตัวแปรเพิ่มขึ้น 1 โดยอัตโนมัติ เราต้องเขียนให้อยู่ในรูปแบบต่อไปนี้
วงกลม = วงกลม +1
ค่อนข้างไม่สะดวก! ถ้าชื่อตัวแปรยาวกว่านั้น เราต้องพิมพ์คำเพิ่มเติม ดังนั้นรุ่นก่อน ๆ ที่ขี้เกียจของเราจึงคิดแนวคิดแบบนี้
วงกลม++
มันไม่ง่ายมากเหรอ? หมายถึงเพิ่ม 1 โดยอัตโนมัติ ในทำนองเดียวกันมี - - ซึ่งหมายถึงลดลง 1 โดยอัตโนมัติ
แต่ถ้าเราหวังว่าปริมาณการเพิ่มขึ้นอัตโนมัติเป็นตัวเลขอื่นเช่น 2 เราต้องลองนิพจน์อื่น
วงกลม += 2
นี่เท่ากับ
วงกลม = วงกลม + 2
ในทำนองเดียวกันมี -=, /=, *=
ขั้นตอนที่ 10: ทิศทางการเคลื่อนไหว
ทิศทางที่กราฟิกจะเคลื่อนที่นั้นขึ้นอยู่กับว่าคุณเปลี่ยนพิกัดอย่างไร หากเปลี่ยนเป็น y=y+1 วงกลมจะเลื่อนลง ถ้าทั้งx และ y เพิ่มขึ้น 1 วงกลมจะเลื่อนลงด้านล่างขวา ถ้าเราเขียนว่า ti เป็นเครื่องหมายลบ มันจะเคลื่อนที่ไปในทิศทางตรงกันข้าม
[cceN_cpp theme="dawn"] int x, y; //ประกาศตัวแปรหลายตัวพร้อมกันได้ ใช้ลูกน้ำคั่น การตั้งค่าเป็นโมฆะ () { ขนาด (300, 300); x = 0; y = 0; } วาดเป็นโมฆะ () { พื้นหลัง (234, 113, 107); ไม่มีจังหวะ (); วงรี(x, y, 50, 50); x++; ย++; }
[/cceN_cpp]
อัตราการเคลื่อนไหว
จำค่าเริ่มต้น 60 เฟรมต่อวินาทีในการวาดฟังก์ชันหรือไม่ ตามอัตรานี้ วงกลมด้านบนจะเลื่อนไปทางขวา 60 พิกเซลต่อวินาที
หากเราต้องการเปลี่ยนอัตราการเคลื่อนไหวกราฟิก มีสองวิธี: วิธีหนึ่งคือการเพิ่มค่า x ทุกครั้งเนื่องจากจะมีการเปลี่ยนแปลง
x=x+10
ได้ปรับปรุงความเร็วเป็น 10 เท่าเมื่อเทียบกับของเดิม!
อีกวิธีคือเปลี่ยนความถี่ในการรีเฟรชผืนผ้าใบ อัตราเฟรม()
ฟังก์ชันนี้สามารถเปลี่ยนความถี่ในการออกอากาศของแคนวาสได้ เขียน frameRate (10) ลงในการตั้งค่าฟังก์ชัน มันจะเปลี่ยน 60 เฟรมดั้งเดิมต่อวินาทีเป็น 10 เฟรมต่อวินาที ความเร็วจะลดลง 6 เท่าจากเดิม
ขั้นตอนที่ 11: พื้นหลังที่ถูกมองข้าม
ตัวอย่างก่อนหน้านี้ทั้งหมดเขียนพื้นหลังลงในฟังก์ชันวาด คุณเคยคิดที่จะเขียนมันลงในการตั้งค่าฟังก์ชันหรือไม่? มันจะมีความแตกต่างกันหรือไม่? ตอนนี้ เรามาอัปเดตตัวอย่างการเคลื่อนที่ในแนวนอนกัน
[cceN_cpp theme="dawn"] int x, y; การตั้งค่าเป็นโมฆะ () { ขนาด (300, 300); พื้นหลัง(234, 113, 107); x = 0; y = ความสูง/2; } วาดเป็นโมฆะ () { noStroke (); วงรี(x, y, 50, 50); x += 1; } [/cceN_cpp]
เกิดอะไรขึ้น? บางทีก็ไม่สามารถเข้าใจเหตุผลในการผลิตปัญหาได้อย่างถูกต้อง ลบฟังก์ชัน noStroke เพิ่มจังหวะอีกครั้ง และดูเส้นทางการเคลื่อนที่ของวงกลม
อ้อ เป็นเพราะวงที่สร้างไว้ก่อนหน้านี้ยังไม่ถูกลบ! เนื่องจากการตั้งค่าฟังก์ชันทำงานเพียงครั้งเดียว หากเราเขียนพื้นหลังด้านบน พื้นหลังจะเติมพื้นหลังเพียงครั้งเดียว และหลังจะไม่มีผลใดๆ อีกต่อไป พื้นหลังของฟังก์ชันเป็นเหมือนเครื่องมือถังสี เมื่อใช้แล้วจะครอบคลุมเนื้อหาทั้งหมดในผืนผ้าใบแทนการตั้งค่าสีพื้นหลังเท่านั้น เราเขียนมันก่อนการวาดฟังก์ชัน เพื่อให้เฟรมเดิมถูกปิดทุกครั้งที่เราสร้างรูปแบบใหม่ ดังนั้นวงกลมสามารถวิ่งได้ตามที่เราคาดไว้ ยกเว้นการจำการใช้งานแต่ละฟังก์ชัน เราต้องนึกถึงตำแหน่งของโค้ด หลายครั้งที่ขึ้นหรือลงบรรทัดสำหรับ codea และเขียนมันภายในหรือออกจากวงเล็บปีกกาจะสร้างผลกระทบที่แตกต่างกันมาก ทิศทางของรหัสเป็นแบบสองมิติ หากเกิดข้อผิดพลาด เราต้องสอบเทียบในสองมิตินี้
• วิธีการวาดที่ไม่ซ้ำนี้สามารถสร้างเอฟเฟกต์พิเศษได้หากใช้อย่างเหมาะสม คุณสามารถคัดลอกรหัสต่อไปนี้และได้ลอง
[cceN_cpp theme="dawn"] การตั้งค่าเป็นโมฆะ (){ ขนาด (400, 400); } การวาดเป็นโมฆะ (){ วงรี (ความกว้าง/2-mouseX, ความสูง/2-mouseX, mouseY, mouseY); วงรี(ความกว้าง/2-mouseX, ความสูง/2+mouseX, mouseY, mouseY); วงรี(กว้าง/2+mouseX, ความสูง/2-mouseX, mouseY, mouseY); วงรี(ความกว้าง/2+เมาส์X, ความสูง/2+เมาส์X, เมาส์Y, เมาส์Y); } [/cceN_cpp]
ที่นี่เราใช้ตัวแปรวิเศษ mouseX และ mouseY ต่อไปเราจะพูดถึงรายละเอียด
ขั้นตอนที่ 12: วงกลมสั่น
จะทำอย่างไรถ้าฉันต้องการทำให้ทิศทางการเคลื่อนที่ของวงกลมไม่สม่ำเสมอ? ด้วยฟังก์ชันสุ่มอย่างชาญฉลาด คุณสามารถรับรู้ถึงเอฟเฟกต์นี้ได้เช่นกัน Random เป็นฟังก์ชันที่ใช้บ่อย สามารถใช้เพื่อสร้างฟังก์ชันสุ่ม มันเหมือนวิญญาณที่ไร้ร่องรอย เมื่อเกี่ยวข้องกับตัวแปรแล้ว คุณไม่สามารถจินตนาการได้เลยว่าจะเป็นอย่างไรต่อไป
เรียกใช้รูปแบบ:
สุ่ม(สูง)
สูงหมายถึงขีดจำกัดบนแบบสุ่ม และขีดจำกัดล่างเริ่มต้นคือ 0 ตัวอย่างเช่น สุ่ม(10) มันจะสร้างตัวเลขตั้งแต่ 0 ถึง 10 แบบสุ่ม (รวม 0 แต่ไม่รวม 10)
สุ่ม(ต่ำ,สูง)
หากเราตั้งค่าพารามิเตอร์ไว้ 2 ตัว พารามิเตอร์จะย้อนกลับเป็นค่าสุ่มระหว่างพารามิเตอร์ ตัวอย่างเช่น สุ่ม (5, 10) มันจะสร้างตัวเลขจาก 5 ถึง 10 แบบสุ่ม (รวม 5 แต่ไม่รวม 10)
ตัวอย่าง:
[cceN_cpp theme="dawn"] float x;
x = สุ่ม(50, 100);
พิมพ์(x); [/cceN_cpp]
ทุกครั้งที่เรารันโปรแกรม คอนโซลจะแสดงผลค่าต่างๆ
• หมายเหตุ: ค่าที่สร้างโดยฟังก์ชันสุ่มเป็นของประเภททศนิยม (ประเภทเลขทศนิยม) หากเราต้องการกำหนดค่าให้กับตัวแปรจำนวนเต็ม เราต้องแปลงค่าผ่านฟังก์ชัน int() การแปลงจะไม่เป็นวงกลม แต่จะลบส่วนทศนิยมออกโดยตรง ดังนั้นเอาต์พุตของ int (สุ่ม (5)) จึงมีความเป็นไปได้เพียง 5 อย่างเท่านั้น: 0, 1, 2, 3, 4
หลังจากที่เราคุ้นเคยกับการใช้ฟังก์ชัน Random แล้ว เราสามารถเข้ามาในกรณีด้านล่างนี้ได้โดยตรง
[cceN_cpp theme="dawn"] int x, y; การตั้งค่าเป็นโมฆะ () { ขนาด (300, 300); x = ความกว้าง/2; y = ความสูง/2; } วาดเป็นโมฆะ () { พื้นหลัง (234, 113, 107); ไม่มีจังหวะ (); x += int(สุ่ม(-5, 5)); y += int(สุ่ม(-5, 5)); วงรี(x, y, 50, 50); }
[/cceN_cpp]
ค่าพิกัดที่เพิ่มไว้เดิมได้รับการแก้ไขแล้ว เฉพาะในกรณีที่เราเพิ่มค่าสุ่ม วงกลมจะเคลื่อนที่ไปในทิศทางที่ไม่แน่นอน ด้วยช่วงสุ่มที่ใหญ่กว่า มันสั่นบ่อยขึ้น เนื่องจากค่าที่เปลี่ยนไประหว่างเฟรมจะถูกตีกลับ การเคลื่อนไหวจะไม่ราบรื่นอีกต่อไป ในขณะที่เฟรมเดิมอยู่ที่ (150, 150) เฟรมหลังจะย้ายไปที่ตำแหน่ง (170, 170) ภายในชั่วพริบตา
ขั้นตอนที่ 13: การโยกย้าย Circle
แวดวงการย้ายถิ่น
มันจะสร้างการเคลื่อนไหวที่ราบรื่นหรือไม่? ฟังก์ชั่นเสียงรบกวนสามารถช่วยเราได้ มีจังหวะที่ดีกว่าการสุ่มแบบมาตรฐาน และตัวเลขสุ่มที่สร้างแบบสุ่มอย่างต่อเนื่อง
เรียกใช้รูปแบบ:
เสียงรบกวน (t)
เสียงรบกวนจากฟังก์ชันไม่สามารถกำหนดช่วงเอาต์พุตได้ โปรแกรมกำหนดว่าสามารถสร้างตัวเลขทศนิยมจาก 0 ถึง 1 เท่านั้นและอินพุตคงที่สามารถมีเอาต์พุตคงที่เท่านั้น
[cceN_cpp theme="dawn"] float x = เสียงรบกวน(5); ลอย y = เสียงรบกวน(5); พิมพ์(x, y); [/cceN_cpp]
เนื่องจากพารามิเตอร์อินพุตข้างต้นเป็น 5 ดังนั้นผลลัพธ์ที่ได้จึงเหมือนกันแล้วจะเปลี่ยนผลลัพธ์ได้อย่างไร คำตอบคือเปลี่ยนพารามิเตอร์อินพุตแบบไดนามิก ที่จริงแล้ว เราถือว่าเสียงรบกวนเป็นแทร็กเสียงที่ไร้ขีดจำกัด พารามิเตอร์อินพุตก็เหมือนกับ "เวลาปัจจุบัน" หากอินพุตพารามิเตอร์ต่อเนื่อง เอาต์พุตก็จะต่อเนื่องเช่นกัน
[cceN_cpp theme="dawn"] ลอย x, y; การตั้งค่าเป็นโมฆะ () { ขนาด (700, 100); x = 0; พื้นหลัง(0); } ถือเป็นโมฆะ (){ x += 1; y = สัญญาณรบกวน (frameCount/100.0)*100; ไม่มีจังหวะ (); วงรี(x, y, 2, 2); }
[/cceN_cpp]
ในกรณีนี้ เราวาดเส้นทางการเปลี่ยนแปลงของ Y เพื่อให้เราเข้าใจสัญญาณรบกวนของฟังก์ชันได้ดีขึ้น
• ในหมู่มัน ตัวแปร frameCount จะได้รับเฟรมปัจจุบัน ต่างจากความกว้าง ความสูง แบบที่แล้ว ก็ทรงตัวได้ไม่มีเปลี่ยนแปลง นอกจากนี้ มันเริ่มเพิ่มขึ้นจาก 0 หากเราเข้าใจโดยการแสดงภาพกราฟิกเคลื่อนไหวครั้งแรกของเรา มันจะแสดงหน้าที่เราได้เปิดดู (แทนที่จะเป็นแนวคิดเรื่องเวลาในโปรแกรม)
• frameCount เป็นตัวแปรจำนวนเต็ม หารด้วยตัวแปรจำนวนเต็มอื่น โปรแกรมจะใช้ค่าเริ่มต้นในการประมวลผลผลลัพธ์ให้เป็นจำนวนเต็มเพื่อปรับปรุงความแม่นยำของผลลัพธ์ เราต้องเปลี่ยน 100 เป็น 100.0 หารด้วยเลขทศนิยม เราจะได้เลขทศนิยมด้วย
• ในการเปลี่ยนแกน Y จาก 0 เป็น 100 เราต้องคูณผลลัพธ์ของสัญญาณรบกวนด้วย 100 ดังนั้นเราจึงสามารถควบคุมช่วงค่าแบบสุ่มได้
พวกคุณบางคนที่คิดเก่งอาจถามว่า "ทำไมเราต้องหาร frameCountby 100? เขียน frameCount โดยตรงเลยดีไหม" แน่นอนคุณสามารถ! แต่ในที่นี้ เพื่อแสดงคุณลักษณะของเสียงรบกวนของฟังก์ชันได้ดียิ่งขึ้น เราจึงชะลอ "อัตราการแพร่ภาพ" ตัวอย่างด้านล่างแสดงการเปลี่ยนแปลงมูลค่าการส่งออกภายใต้อัตราการเปลี่ยนแปลงที่แตกต่างกัน
[cceN_cpp theme="dawn"] ลอย x, y1, y2, y3, y4, y5; การตั้งค่าเป็นโมฆะ () { ขนาด (700, 500); x = 0; พื้นหลัง(0); } ถือเป็นโมฆะ (){ x += 1; y1 = สัญญาณรบกวน (frameCount)*100; y2 = สัญญาณรบกวน (frameCount/10.0)*100; y3 = สัญญาณรบกวน (frameCount/100.0)*100; y4 = สัญญาณรบกวน (frameCount/1000.0)*100; y5 = สัญญาณรบกวน (frameCount/10000.0)*100; ไม่มีจังหวะ (); วงรี(x, y1, 2, 2); วงรี(x, y2+100, 2, 2); วงรี(x, y3+200, 2, 2); วงรี(x, y4+300, 2, 2); วงรี(x, y5+400, 2, 2); จังหวะ (80); เส้น (0, 100, กว้าง, 100); เส้น (0, 200, กว้าง, 200); เส้น (0, 300, กว้าง, 300); เส้น (0, 400, กว้าง, 400); }
[/cceN_cpp]
คุณสามารถถือว่าพารามิเตอร์ที่เปลี่ยนแปลงภายในเสียงรบกวนของฟังก์ชันเป็นแถบความคืบหน้าได้ เปลี่ยนพารามิเตอร์เหมือนเราย้ายแถบความคืบหน้า ดังนั้นเมื่อขอบเขตการเปลี่ยนแปลงของ "แทร็กเสียง" นี้ใหญ่ขึ้น ลักษณะต่อเนื่องของค่าเอาต์พุตจะอ่อนลง (เราสามารถจินตนาการได้ว่าจะเกิดอะไรขึ้นถ้าเราออกอากาศเพลงหรือวิดีโอด้วยความเร็ว 2 เท่า 5 ครั้งความเร็ว 20 เท่า) เมื่อขอบเขตมีขนาดใหญ่กว่าค่าใดค่าหนึ่ง ก็ไม่มีความแตกต่างกันมากในการทำงานแบบสุ่มที่การสร้างมูลค่า
หากคุณเข้าใจตัวอย่างทั้งหมดข้างต้น คุณจะรู้สึกว่าไม่มีอะไรง่ายไปกว่านี้อีกแล้วในการวาดวงกลมอพยพ คุณสามารถเข้าใจหลักการภายในได้เช่นกัน
[cceN_cpp theme="dawn"] ลอย x, y; การตั้งค่าเป็นโมฆะ () { ขนาด (300, 300); x = 0; } วาดเป็นโมฆะ () { พื้นหลัง (234, 113, 107); x = สัญญาณรบกวน(frameCount/100.0 + 100)*300; y = สัญญาณรบกวน(frameCount/100.0)*300; ไม่มีจังหวะ (); วงรี(x, y, 50, 50); }
[/cceN_cpp]
ตอนนี้ การเคลื่อนไหวมีความน่าสนใจมากขึ้น เช่นเดียวกับไจโรที่หมุนได้
• สาเหตุที่ตัวแปร x ภายในสัญญาณรบกวนของฟังก์ชันต้องบวก 100 เป็นเพราะเพื่อแยกพวกมันออกจากกันในระยะห่าง หากพารามิเตอร์ของ xy ภายในฟังก์ชัน noise เท่ากันหรือใกล้เคียงกัน การเปลี่ยนแปลงของพิกัด x, y จะใกล้เคียงกัน นี่คือการทำให้การเคลื่อนไหวกลายเป็นเรื่องสุ่มมากขึ้น
ขั้นตอนที่ 14: วงกลมย้ายโดยเมาส์
ต่อไป เรามาถึงสองตัวแปรที่ฉันชอบมากที่สุด: mouseX และ mouseY เมื่อแรกเห็นสองแนวคิด ดวงตาของฉันเป็นประกายด้วยแสง เพราะมันเป็นวิธีที่ตรงที่สุดในการโต้ตอบกับกราฟิก เราสามารถสร้างโปรแกรมที่น่าสนใจได้มากมาย
กรณีนี้ค่อนข้างง่าย:
[cceN_cpp theme="dawn"] int x, y; การตั้งค่าเป็นโมฆะ () { ขนาด (300, 300); x = 0; y = 0; } วาดเป็นโมฆะ () { พื้นหลัง (234, 113, 107); ไม่มีจังหวะ (); x = เมาส์X; y = เมาส์Y; วงรี(x, y, 50, 50); }
[/cceN_cpp]
mouseX สามารถรับพิกัด x ของเมาส์ได้ ในขณะที่ mouseY สามารถรับพิกัด y ได้
• ลองเปลี่ยนสัญลักษณ์บวกและลบหรือแลกเปลี่ยน mouseX และ mouseY
ขั้นตอนที่ 15: สิ้นสุด
จากคำสั่งที่คุ้นเคยเหล่านี้ คุณอาจทำการเคลื่อนที่ของกราฟิกได้ ด้วยเนื้อหาของบทที่แล้ว ใช้จินตนาการของคุณอย่างเหมาะสม คุณสามารถสร้างเอฟเฟกต์แอนิเมชั่นที่น่าสนใจมากมาย
ในบทต่อไป เราจะเห็นตัวอย่างมากมาย ในขณะเดียวกัน เราจะใช้ฟังก์ชันทางคณิตศาสตร์และรวมเข้ากับการเคลื่อนไหวแบบกราฟิก
บทความนี้มาจากนักออกแบบ Wenzy
ขั้นตอนที่ 16: การอ่านแบบสัมพัทธ์:
คำแนะนำการเขียนโปรแกรมที่น่าสนใจสำหรับนักออกแบบ -- การประมวลผลการสัมผัสเบื้องต้น
คำแนะนำการเขียนโปรแกรมที่น่าสนใจสำหรับนักออกแบบ -- สร้างโปรแกรมการประมวลผลครั้งแรกของคุณ
บทความนี้มาจาก:
หากคุณต้องการความช่วยเหลือ คุณสามารถติดต่อ: [email protected]
แนะนำ:
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: 5 ขั้นตอน
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: การตวัดเป็นวิธีง่ายๆ ในการสร้างเกม โดยเฉพาะอย่างยิ่งเกมปริศนา นิยายภาพ หรือเกมผจญภัย
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: 3 ขั้นตอน
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: ในคำแนะนำนี้ เราจะทำการตรวจจับใบหน้าบน Raspberry Pi 4 ด้วย Shunya O/S โดยใช้ Shunyaface Library Shunyaface เป็นห้องสมุดจดจำใบหน้า/ตรวจจับใบหน้า โปรเจ็กต์นี้มีจุดมุ่งหมายเพื่อให้เกิดความเร็วในการตรวจจับและจดจำได้เร็วที่สุดด้วย
Arduino Voiced White Cane (ตอนที่หนึ่ง): 6 ขั้นตอน (พร้อมรูปภาพ)
Arduino Voiced White Cane (ตอนที่หนึ่ง): หลายปีก่อน ฉันอยู่กับนักเรียนคนหนึ่งที่มีสมาชิกในครอบครัวที่ตาบอด ฉันตระหนักว่าเราสามารถหาวิธีแก้ปัญหาเล็กๆ ที่สามารถทำให้ได้ยินเสียงได้ว่ามีอุปสรรคกี่ก้าว เห็นได้ชัดว่า Arduino ที่มีตัวเลขที่บันทึกไว้ก่อนหน้านี้สามารถ
คำแนะนำการเขียนโปรแกรมที่น่าสนใจสำหรับนักออกแบบ -- โปรแกรมควบคุมกระบวนการ- คำสั่งวนรอบ: 8 ขั้นตอน
คำแนะนำการเขียนโปรแกรมที่น่าสนใจสำหรับนักออกแบบ -- โปรแกรมควบคุมกระบวนการ- คำสั่งวนรอบ: โปรแกรมควบคุมกระบวนการ- คำสั่งวนรอบ จากบทนี้ คุณจะได้สัมผัสกับความรู้ที่สำคัญและมีประสิทธิภาพ-คำสั่งวนรอบ ก่อนอ่านบทนี้ ถ้าคุณต้องการวาดวงกลม 10,000 วงกลมในโปรแกรม คุณสามารถทำได้โดยใช้ ter
เครื่องดนตรีสายรุ้งพลาสติกของ Sonic Mayhem (ปริซึม) -ตอนที่หนึ่ง: 4 ขั้นตอน
เครื่องดนตรีสายรุ้งพลาสติกของ Sonic Mayhem (PRISM) -PART ONE: ฉันซื้อกีตาร์อะคริลิกเมื่อสัปดาห์ก่อน มันราคาถูกบน ebay และดูค่อนข้างสวยงาม และฉันมีเบสอะคริลิกอยู่แล้ว ฉันก็เลยซื้อมันมา ทั้งที่รู้ว่าเครื่องมือเหล่านี้มีคุณภาพโทนเสียงที่ค่อนข้างน่าสงสัย