具有1602显示屏的最简单的Arduino游戏-第1部分


那就是我们必须得到的,好吧,他仍然知道如何跳跃,行走和击败攻击他的邪恶仙人掌,但是我们将逐步进行:)

第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) { //    ,       :) // --------------------------- Animated -> // -------------------- Player -> if (AnimPlayer == 1){lcd.createChar(0, Player_1);} //  1   1 //(lcd.createChar(    0  7,   )) if (AnimPlayer == 2){lcd.createChar(0, Player_2);} //  2   2 } // --------------------------- <- Animated currentMillis = millis(); //   =    PlAn(); } void PlAn () { if (AnimPlayer == 1) //   1  { lcd.setCursor(GGpozX, GGpozY); //  ""      lcd.write(0); //          "" } if (AnimPlayer == 2) //  №1 { lcd.setCursor(GGpozX, GGpozY); lcd.write(0); } if (currentMillis - AnimatedTimeCheck >= AnimatedTime) //       { AnimatedTimeCheck = currentMillis; //     if (AnimPlayer == 2){AnimPlayer = 1; return;} //  2   1      if (AnimPlayer == 1){AnimPlayer = 2;} // 1  2           ,         } } "--------------------------------------------------------------------------" 

开始之后,我们可以看到在屏幕中央的那个小矮人在第二行并开始摇摆。

结论:今天我讨论了如何通过红外端口查找数据,如何绕过微控制器代码的延迟,以及如何制作初始动画。

剩下的很快就会来了:)我还有很多事情要写,所以我将研究一下这对您来说真的很有趣,如果是的话,明天我将开始写续集。

谢谢大家的关注,可可!

文章的第二部分-> habr.com/post/425367

Source: https://habr.com/ru/post/zh-CN424859/


All Articles