那就是我们必须得到的,好吧,他仍然知道如何跳跃,行走和击败攻击他的邪恶仙人掌,但是我们将逐步进行:)
第1部分的基础知识
我以为自己订购了一个arduino,一个“马马虎虎玩具”,一个小工具包(用于测试),后来我后悔了。 我想释放潜能,但是由于缺少附加模块,这无法正常工作,我不得不进行实验,将arduino切成安全系统,并观察传感器的工作方式,然后决定发出声音警报(使用套件中的实用尖叫声),因此让狗断了犬声或突然突然吠叫:),然后我的手到达显示屏1602。“嗯……这是一个真实的显示屏。”但我很失望地发现他吃掉了arduino本身几乎所有接触的一半。 我四处逛逛,在“ i2C”套件中发现了一块奇怪的板子,对此非常怀疑! 孔的数量与显示器上拉皮条的数量一致。 “嗯,不容易……”我想着,决定焊接它们。 过了一会儿,我意识到我做对了,现在我的显示器只吃了两个频道。 他开始研究这种显示器是什么以及他能做什么。 研究了足够的材料后,我发现显示的内容纯粹是文字的,但是瞧瞧! 它可以处理8个新字符,尺寸为5x8像素。 好吧,让我们开始编写游戏! 首先,您需要弄清楚它将是什么样的游戏,我决定使它看起来像恐龙的镀铬,但是有一些芯片,可以说对于初学者来说,它会起作用:)
但是您仍然必须管理某些事情,并且多按钮功能,不必花很多时间思考。 我从套件中取出了红外遥控器。

“那是操纵杆。”我屏住呼吸,怀疑地想着遥控器的延迟,IR传感器的清晰度以及这种想法的充分性,但是没什么可做的,我可以训练arduino使用计算机的键盘,但这确实很懒惰去做。 因此,我开始写下远程控制代码,以便将来可以使用它们。 微控制器的代码在这里是最简单的:
"--------------------------------------------------------------------------" // IRremote #include <IRremote.h> decode_results results; IRrecv irrecv (A0); // void setup () { Serial.begin(9600); // com irrecv.enableIRIn(); // } void loop () { if (irrecv.decode( &results )) // , { Serial.println( results.value, HEX ); // irrecv.resume(); // } } "--------------------------------------------------------------------------"
远程控制信号代码如下所示:“ FF18E7”您的代码肯定会有所不同,但是您必须了解其本质,并且当您对该代码提出上诉时,我们会在开头添加“ 0x”,然后得到(0xFF18E7)。
将其填充到arduino中并按需要连接后,我们可以在单击IR设备的按钮后,从tsiforka的日志端口开始记录。 但是在这里,我只想向您说明如何连接红外传感器。
如果我们看一下传感器,我们会看到三个支路,左(模拟信号),中间(接地),右(加5V)。

由于我仍然不知道该如何工作,因此我开始进行实验。 首先,我逐步地通过(延迟(时间))编写了草图代码,我并不怀疑这是一个坏主意:)
什么是主要门框。 该微控制器不能执行多任务处理。 他从上至下考虑代码,遍历所有分支和函数,完成后便重新开始。 现在,当我们在代码中有很多这些“延迟”时,我们开始注意到明显的延迟。 顺便说一句,是的,为什么我们根本需要很多“延迟”。 当我们制作游戏时,检查和互动的数量开始增加。 例如,一个敌人正在向我们移动,我想越过它,我按“跳”,然后按计划,我必须在空中悬吊0.8f秒,这就是整个游戏过程,并冻结了0.8f秒。 我想“开始”,并开始考虑解决方案。 快速找到了解决方案。 微控制器本身能够从头到尾快速读取代码(如果它不打扰他的话),并且他也知道如何从开始算起就计算时间。 这就是我们所需要的。 现在,我们仅创建变量来存储此操作或该操作的时间,并创建一个变量,该变量比较与现在的时间以及激活代码所需的时间之间的差异。 Arduino每秒需要1000毫秒,非常方便。 下面的代码片段变得更加清晰:
"--------------------------------------------------------------------------" // , , // long ClearTime = 150; // 150 = 0.15f ~6 long ClearTimeCheck = 0; // , long currentMillis = 0; // void loop () { currentMillis = millis(); // = } void clearscreen () // { // if (currentMillis - ClearTimeCheck >= ClearTime) // ( - 0.15f { ClearTimeCheck = currentMillis; // lcd.clear(); // , } } "--------------------------------------------------------------------------"
不难吧?
用新的方式重写了整个代码之后,游戏开始快速清晰地工作,以模拟多任务操作:)我走了很长一段路。 毕竟,我们仍然需要制作角色,界面和动画。 由于我们只能创建八个新角色,因此我们需要以某种方式巧妙地将其弄乱。 到目前为止,我不打算在显示器上做很多对象,因此可以这样做,以便在一次代码处理中屏幕上只有八个活动对象。 会是什么 好吧,自然而然地,主要角色,打击,反派角色,一颗心脏和健康指标。 对于初学者来说,这就足够了。 是的,我还有另外三个独特的对象。
主要角色将如下所示:

输入新字符的过程,我用二进制代码生成(感觉很舒服)
它看起来像这样:
01110
01110
00100
01110
10101
00100
01110
01010
如果您仔细观察的话,那么我们将从中看到我们的角色,但是为了让他不会闲着,让我们为他制作动画。

现在,在我们的代码中,又添加了一组二进制数字,即:
00000
01110
01110
00100
11111
00100
01110
01010
我已按照上面的逻辑说明了如何在此显示器上制作动画,现在让我们开始练习,现在将其放置在屏幕中央并使其静止不动,请记住,我们的任务是仅对两个动画精灵使用一个存储单元。 这比听起来容易:
"--------------------------------------------------------------------------" #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,16,2); // long AnimatedTime = 300; // long AnimatedTimeCheck = 0; // ( ) int AnimPlayer = 1; // int GGpozX = 8; // int GGpozY = 1; // 1 2 0 long currentMillis = 0; // // , , :) enum { SYMBOL_HEIGHT = 8 }; byte Player_1[SYMBOL_HEIGHT] = {B01110,B01110,B00100,B01110,B10101,B00100,B01110,B01010,}; // 1 byte Player_2[SYMBOL_HEIGHT] = {B00000,B01110,B01110,B00100,B11111,B00100,B01110,B01010,}; // 2 void setup() { lcd.init(); lcd.backlight();// loop(); PlAn(); } void loop() { if (AnimPlayer != 50) { // , :) //
开始之后,我们可以看到在屏幕中央的那个小矮人在第二行并开始摇摆。
结论:今天我讨论了如何通过红外端口查找数据,如何绕过微控制器代码的延迟,以及如何制作初始动画。
剩下的很快就会来了:)我还有很多事情要写,所以我将研究一下这对您来说真的很有趣,如果是的话,明天我将开始写续集。
谢谢大家的关注,可可!
文章的第二部分->
habr.com/post/425367