`

punya代码分析和学习笔记

 
阅读更多

punya(DXプニャリン競争)是用DxRuby实现的一个小游戏。

see also: 

http://www20.atpages.jp/papihime/

http://www20.atpages.jp/papihime/ruby/index.htm

下面是我的学习笔记。

 

一、场景模块(DXRuby的场景框架):

 

1. 类

(1) Scene::Exit

退出场景类,空类,表示场景为空(见Scene.main_loop)

(2) Scene::Base

抽象类,Scene.main_loop的第一参数

 

2. 方法

(1) Scene::Base#initialize

构造函数。清空下一场景;帧数设为0;调用init。

(2) Scene::Base#__update

帧数加一,调用update。

(3) Scene::Base#init

抽象方法。初始化事件。

(4) Scene::Base#quit

抽象方法。退出场景并且将要进入下一个场景时的事件。

(5) Scene::Base#update

抽象方法。逻辑更新或场景切换事件。

(6) Scene::Base#render

抽象方法。界面渲染事件,发生在update后。

(7) Scene.main_loop(scene_class, fps = 60, step = 1)

静态方法。

* scene_class是Scene的子类,这里的作用相当于模板参数(实际是传入类构造器);

* fps是窗口最初的指定帧率。

* step是默认fps倍数(在运行期间可按PGUP和PGDN键调节),表示在一个循环内执行多少次渲染和逻辑更新。当它放大时窗口的fps随之缩小,使每秒执行的次数保持相同。

作用:

1) 构造出最开始的scene

2) 按PGUP和PGDN键调节更新内循环数。

3) 调用Scene.Base的回调方法

4) 判断scene.next_scene,如果非空的话构造新的scene读写。

5) 按ESCAPE键退出窗口循环

3. 属性:

(1) Scene::Base#next_scene

可读写。Scene.Base类的子类的类构造器。等于Scene.Exit的话退出。

(2) Scene::Base#frame_counter

只读。从最开始到目前为止的update次数,在update前加一。用于实现场景的透明度和闪烁动画。

4. 出现过的DxRuby API

* Window.loop

窗口循环

* Window.fps

设置窗口帧率

* Input.keyPush?

键盘当前是否按下状态?

 

二、dx_punya模块(游戏实现)

1. 类

(1) LogoStart

logo,Scene::Base的子类

(2) TitleScene

标题,Scene::Base的子类

(3) MenuScene

菜单,Scene::Base的子类

(4) CharactersScene

帮助与说明,Scene::Base的子类

(5) Punya

每个角色实例的设置

(6) PunyaRaceScene

游戏主界面。

 

2. 主入口

Scene.main_loop LogoStart

从LogoStart场景开始进入Scene框架主循环

 

3. 各个类的方法和字段

* LogoStart#FADE_IN_TIME:动画总时间

* LogoStart#init

* LogoStart#go_next_scene

* LogoStart#update

* LogoStart#render

1) 把frame_counter作为定时器参照修改images/logo2.png的显示透明度(渐现后渐隐)

2) 到达FADE_IN_TIME时间后转至下一个场景TitleScene

* TitleScene#init

* TitleScene#go_next_scene

* TitleScene#update

* TitleScene#render

1) 把frame_counter作为定时器参照修改背景图images/bg_title.png的显示透明度(渐现)

2) 提示文字images/press_any_key.png闪烁显示(某些时候不显示)

* MenuScene#init

* MenuScene#go_next_scene

* MenuScene#update

* MenuScene#hit_img?(img):鼠标当前位置是否落在某个菜单图片上。

* MenuScene#render

1) 背景由30个images/menu_tile.png砖块数组组成

2) 标题文字为images/menu_title.png

3) 菜单图片(选择)为images/menu#{i}.png,共三个

4) 菜单图片(未选择)为images/menu#{i}_back.png,共三个

5) 菜单(选择,未选择)信息数组有三个条目:

选择数组(img[])条目为[x坐标, y坐标, 菜单图片,是否当前选择]

未选择数组(img_back[])条目为[x坐标, y坐标, 菜单图片]

6) 按空格或鼠标左键时跳转场景。

根据@cursol_id的值选择跳转到:

PunyaRaceScene,CharactersScene,TitleScene

7) 根据鼠标当前所在位置判断选择哪个菜单

是否落在菜单数组条目,

根据img[0],img[1],image[2].width,image[2].height来判断。

8) 分别绘画

@bg_tiles:循环平铺,根据frame_counter进行偏移(不超过e.width)

形成倾斜方向的运动动画。

@back_menus:循环3次绘画。

@menus:如果@menus[i][3]为1时才绘画。

@title:绘画标题。

* CharactersScene#init

* CharactersScene#go_next_scene

* CharactersScene#update

* CharactersScene#render

1) 渐现背景图images/bg_characters.png(alpha随frame_counter而增加)

2) 空格或鼠标左键跳转到下一个场景MenuScene

* Punya#initialize(idx)

* Punya#update(frame_counter):由PunyaRaceScene场景类的update方法调用

* Punya#goal?:此精灵角色是否到达终点

* Punya#render:由PunyaRaceScene场景类的render方法调用

1) 构造函数传入角色编号idx

加载images/punya#{idx}.png的6张子图片(3*2)(动画精灵图片)。

根据idx算出@x, @y

@move为0,指示@image数组的下标(动画精灵的当前帧数)

2) 根据@x和@y绘画图片@image[@move]

3) 根据frame_counter,在合适的时候增加@i。

4) 根据@i切换精灵的帧图片:

到达终点:@move修改为3->4->5->4->...

未到达终点:@move修改为0->1->2->0->...

5) 根据@i移动精灵

到达终点:不动

未到达终点:@x += rand(4)

6) 精灵的@x超过560时认为到达终点

* PunyaRaceScene#init

* PunyaRaceScene#go_next_scene

* PunyaRaceScene#update

* PunyaRaceScene#render

1) 绘画背景图images/bg_race.png

2) 创建6个Punya精灵

3) 调用精灵的update和render方法

4) 空格或左键跳转到下一个场景MenuScene

 

4. 出现过的DxRuby API

* Image.load

加载图片

* Input.keyPush?

判断键盘是否按下

* Input.mousePush?

判断鼠标是否按下

* Window.drawAlpha

绘画图片到指定坐标,改变其透明度实现渐隐和渐现。

* Window.draw

绘画图片到指定坐标,可以实现闪烁(显示或不显示)

* Input.mousePosX

鼠标当前所在的X坐标

* Input.mousePosY

鼠标当前所在的Y坐标

* Image.loadToArray

加载一张图片并分割成m * n个对象后返回

 

三、总结和值得借鉴的内容

1. MenuScene和Punya的实现比较复杂,需要重点分析。

2. 学习如何用滴答数实现透明度动画、闪烁动画、砖块平移动画以及精灵动画。

3. 学习如何实现菜单按钮(选择和未选择)。


分享到:
评论

相关推荐

    punya:由MIT App Inventor技术提供支持的Punya框架

    我们提供此代码供参考,以及希望操作自己的Punya实例和/或为该项目做出贡献的有经验的人。 该代码已经过测试,可以与Java 8一起使用。 贡献者 在App Inventor中集成更改的最佳方法是在就您打算更改或添加的内容...

    xpdc:aplikasi mirip jne dari rubickz punya

    2. **PHP编程**:学习PHP的基础语法,如何创建和组织PHP项目,以及如何利用PHP框架提高开发效率和代码质量。 3. **Web开发最佳实践**:包括使用版本控制系统(如Git)进行代码管理,以及持续集成/持续部署(CI/CD)...

    punya-tutorials

    麻省理工学院Punya教程该存储库包含MIT Punya系统的教程。 教程主要是用Markdown编写的,应与支持资产一起放置在tutorials目录下。 通过将URL放在Screen1的TutorialURL属性中,可以在项目模板中指定教程。 例如,RDF...

    Fathur-s-resolusi:储存库punya Fathur untuk resolusi ke masa depan

    储存库punya Fathur untuk resolusi ke masa depan。 1.你好Github 我叫Muhammad Fathur Nur Rizky。您可以叫我Fathur(我是Web开发人员),我来自泗水(印度尼西亚)。而且我还是学生,试图找出我写的关于自己的...

    Aan Punya-开源

    我的http://www.apkbaru.net项目

    Childe:Bot Bucinan Hasil Kegabutan

    【标题】"Childe:Bot Bucinan Hasil Kegabutan" 指的可能是一个基于Python开发的聊天机器人...在"Bot bucinan hasil kegabutan"这个项目中,我们可以推测开发者在实验和学习过程中,逐步完善了机器人的功能和用户体验。

    TERMOS-WABOT:脚本Bot Lib Baileys

    笔记 不要出售/购买脚本,对于您的长期用户,此脚本是100%免费的 准备工具和材料。 > niat > 2 handphone (1 buat jalanin sc, 1 buat scan kode qr) > jaringan internet kenceng,kuota+ > penyimpanan yang ...

    面向信息时代的教师培训课程开发——由TPACK引发的思考.pdf

    TPACK(技术、内容、教学法知识)是由Punya Mishra和Matthew J. Koehler两位教授于2005年提出的概念,它强调了教师需要具备的三种核心知识:学科知识(C)、教学法知识(P)和信息技术知识(T)。这三个方面不是孤立...

    信息化背景下高校教师实践性知识发展研究.docx

    教师需要不断学习最新的教育理论和技术,以便更好地应用到教学实践中去。对于新手教师而言,将理论知识转化为实践性知识是一个从理论到实践的过程;而对于资深教师,则更多是从实践中提炼出新的理论知识。 ##### ...

    接近香农极限的纠错码的编码译码:Turbo码(英文版)

    Turbo码是由Claude Berrou、Alain Glavieux和Punya Thitimajshima三位学者在1993年提出的一种接近香农极限的纠错编码技术。根据文献的描述,Turbo码是由两个递归系统卷积码(Recursive Systematic Convolutional ...

    turbo论文,发明者在ICC上的原文

    Turbo码是一种高效的错误校正编码技术,由Claude Berrou、Alain Glavieux和Punya Thitimajshima三位学者于1993年首次提出。这项技术因其卓越的性能而迅速成为通信领域的一个里程碑。本文将对原论文《NEAR SHANNON ...

    Termux-Wa-BOT:可在手机上使用的WhatsApp Bot

    AQIP BOT BOT WHATSAPP TERMUX仅由穆罕默德·阿基普(Muhammad Aqip) ... > kalo lu belum punya apk termux, download di playstore > masuk ke apk termux lalu ketik dibawah ini ! > termux-setu

    pomodoropro.github.io:创建一个pomdoro供学习

    BARANG SIAPA YANG NYOLONG TERUS GAK NGASIH WM DAN NGAKU PUNYA DIA,PERCAYALAH SAYA IKHLAS SAJA SEMOGA BERKAH

    博特

    :alien_monster: 兰斯 :alien_monster: 仅通过ARIS187 ID来BOT WHATSAPP TERMUX阿拉丹巴汉Siapin ... > kalo lu belum punya apk termux, download di playstore> masuk ke apk termux lalu ketik dibawah ini !> te

    GaboT:Google Apps脚本的电报Bot库

    文件特征全面的Telegram Bot API 5.1支持(进展) 命令处理程序(原型) Apa selanjutnya,punya ide hebat吗? 在这里提交概述// ScriptProperties.setProperty("BOT_TOKEN", 'xxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxx'...

    Liker Converter - Randy Bastian-crx插件

    Jika kedepannya yang punya脚本meminta saya untuk mematikan脚本ini,maka saya akan mematikan脚本ini。 脚本ini 100%免费。 支持语言:Deutsch,English,Français,español,italiano,polski,português (Brasil)...

    wancak:非官方的 1cak API

    非官方 1Cak API 对我们所有人来说都是好消息,现在 1Cak 有一个 API :D 特征 获取每个部分的帖子 ...范围 范围 描述 需要部分 有4个部分,lol( Hot ),趋势( Trending ),... "title":"Bangga Punya Walikota Sepe

    waridhobot:whatsappbot = RIDHO BOT

    机器人 BOT WHATSAPP RIDHO 忠诚 HP 工具和材料 准备工具和材料。 > niat > 2 handphone (1 buat ... > kalo lu belum punya apk termux, download di playstore > masuk ke apk termux lalu ketik dibawah ini ! > g

    bebasin:Bebasin帮助您绕过带有主机文件的Internet Positif阻止的所有阻止的内容

    Bebasin dapat membantu和一个untuk绕过semua konten网站yang diblokir Internet Positif melalui。Saya Punya Pertanyaan Silahkan baca terlebih dahulu。潘当星卡 terlebih dahulu。 解压缩programnya。 Yang ...

    Komdat-P1-Kel1

    下载VM Pada链接berikut Selesaikan散文显示了杨安达和旁雅。 下载VDI pada链接berikut Buat VM Baru Pada VM Yang Anda punya Tentukan名称,机器文件夹,类型dan版本。 Untuk类型的Pilih Linux Dan untuk版本的...

Global site tag (gtag.js) - Google Analytics