一种游戏的逃跑认识北京的方式有N种 游戏一一FRAMEN

想玩游戏吗?
就到某位神犇这来吧!
这会告诉你很多游戏写法!
今天,神犇就开始书写第三期——打飞机!!!
很容易,只需要用脑袋想想即可,READY——GO!
我也希望大家多多捧场哦~~~
#include&iostream&
#include&windows.h&
#include&conio.h&
#include&time.h&
#include&string&
/*=============== all the structures ===============*/
typedef struct Frame
COORD position[2];
/*=============== all the functions ===============*/
void SetPos(COORD a)// set cursor
HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(out, a);
void SetPos(int i, int j)// set cursor
COORD pos={i, j};
SetPos(pos);
void HideCursor()
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
//把第y行,[x1, x2) 之间的坐标填充为 ch
void drawRow(int y, int x1, int x2, char ch)
SetPos(x1,y);
for(int i = 0; i &= (x2-x1); i++)
//在a, b 纵坐标相同的前提下,把坐标 [a, b] 之间填充为 ch
void drawRow(COORD a, COORD b, char ch)
if(a.Y == b.Y)
drawRow(a.Y, a.X, b.X, ch);
SetPos(0, 25);
cout&&"error code 01:无法填充行,因为两个坐标的纵坐标(x)不相等";
system("pause");
//把第x列,[y1, y2] 之间的坐标填充为 ch
void drawCol(int x, int y1, int y2, char ch)
while(y!=y2+1)
SetPos(x, y);
//在a, b 横坐标相同的前提下,把坐标 [a, b] 之间填充为 ch
void drawCol(COORD a, COORD b, char ch)
if(a.X == b.X)
drawCol(a.X, a.Y, b.Y, ch);
SetPos(0, 25);
cout&&"error code 02:无法填充列,因为两个坐标的横坐标(y)不相等";
system("pause");
//左上角坐标、右下角坐标、用row填充行、用col填充列
void drawFrame(COORD a, COORD
b, char row, char col)
drawRow(a.Y, a.X+1, b.X-1, row);
drawRow(b.Y, a.X+1, b.X-1, row);
drawCol(a.X, a.Y+1, b.Y-1, col);
drawCol(b.X, a.Y+1, b.Y-1, col);
void drawFrame(int x1, int y1, int x2, int y2, char row, char col)
COORD a={x1, y1};
COORD b={x2, y2};
drawFrame(a, b, row, col);
void drawFrame(Frame frame, char row, char col)
COORD a = frame.position[0];
COORD b = frame.position[1];
drawFrame(a, b, row, col);
void drawPlaying()
drawFrame(0, 0, 48, 24, '=', '|');//
drawFrame(49, 0, 79, 4, '-', '|');//
draw output frame
drawFrame(49, 4, 79, 9, '-', '|');//
draw score frame
drawFrame(49, 9, 79, 20, '-', '|');// draw operate frame
drawFrame(49, 20, 79, 24, '-', '|');// draw other message frame
SetPos(52, 6);
cout&&"得分:";
SetPos(52, 7);
cout&&"称号:";
SetPos(52,10);
cout&&"操作方式:";
SetPos(52,12);
a,s,d,w 控制战机移动。";
SetPos(52,14);
p 暂停游戏。";
SetPos(52,16);
e 退出游戏。";
//在[a, b)之间产生一个随机整数
int random(int a, int b)
int c=(rand() % (a-b))+
//在两个坐标包括的矩形框内随机产生一个坐标
COORD random(COORD a, COORD b)
int x=random(a.X, b.X);
int y=random(a.Y, b.Y);
COORD c={x, y};
judgeCoordInFrame(Frame frame, COORD spot)
if(spot.X&=frame.position[0].X)
if(spot.X&=frame.position[1].X)
if(spot.Y&=frame.position[0].Y)
if(spot.Y&=frame.position[0].Y)
void printCoord(COORD a)
cout &&"( "&&a.X&&" , "&&a.Y&&" )";
void printFrameCoord(Frame a)
printCoord(a.position[0]);
cout &&" - ";
printCoord(a.position[1]);
int drawMenu()
SetPos(30, 1);
cout&&"P l a n e
drawRow(3, 0, 79, '-');
drawRow(5, 0, 79, '-');
SetPos(28, 4);
cout&&"w 和 s 选择, k 确定";
SetPos(15, 11);
cout&&"1. 简单的敌人";
SetPos(15, 13);
cout&&"2. 冷酷的敌人";
drawRow(20, 0, 79, '-');
drawRow(22, 0, 79, '-');
SetPos(47, 11);
cout&&"简单的敌人:";
SetPos(51, 13);
cout&&"简单敌人有着较慢的移动速度。";
SetPos(24, 21);
cout&&"制作:LJF神犇";
SetPos(12, j);
cout&&"&&";
//drawFrame(45, 9, 79, 17, '=', '|');
{ if( _kbhit() )
char x=_getch();
switch (x)
case 'w' :
if( j == 13)
SetPos(12, j);
cout&&" ";
SetPos(12, j);
cout&&"&&";
SetPos(51, 13);
cout&&"            ";
SetPos(47, 11);
cout&&"简单的敌人:";
SetPos(51, 13);
cout&&"简单敌人有着较慢的移动速度,比较容易对付";
case 's' :
if( j == 11 )
SetPos(12, j);
cout&&" ";
SetPos(12, j);
cout&&"&&";
SetPos(51, 13);
cout&&"              ";
SetPos(47, 11);
cout&&"冷酷的敌人:";
SetPos(51, 13);
cout&&"冷酷的敌人移动速度较快,难对付哟。";
case 'k' :
if (j == 8) return 1;
else return 2;
DWORD WINAPI MusicFun(LPVOID lpParamte)
//DWORD OBJ;
sndPlaySound(TEXT("bgm.wav"), SND_FILENAME|SND_ASYNC);
/*================== the Game Class ==================*/
class Game
COORD position[10];
COORD bullet[10];
Frame enemy[8];
//初始化所有
void initPlane();
void initBullet();
void initEnemy();
//初始化其中一个
//void initThisBullet( COORD );
//void initThisEnemy( Frame );
void planeMove(char);
void bulletMove();
void enemyMove();
//填充所有
void drawPlane();
void drawPlaneToNull();
void drawBullet();
void drawBulletToNull();
void drawEnemy();
void drawEnemyToNull();
//填充其中一个
void drawThisBulletToNull( COORD );
void drawThisEnemyToNull( Frame );
void Pause();
void Playing();
void judgePlane();
void judgeEnemy();
void Shoot();
void GameOver();
void printScore();
Game::Game()
initPlane();
initBullet();
initEnemy();
score = 0;
rank = 25;
rankf = 0;
flag_rank = 0;
void Game::initPlane()
COORD centren={39, 22};
position[0].X=position[5].X=position[7].X=position[9].X=centren.X;
position[1].X=centren.X-2;
position[2].X=position[6].X=centren.X-1;
position[3].X=position[8].X=centren.X+1;
position[4].X=centren.X+2;
for(int i=0; i&=4; i++)
position[i].Y=centren.Y;
for(int i=6; i&=8; i++)
position[i].Y=centren.Y+1;
position[5].Y=centren.Y-1;
position[9].Y=centren.Y-2;
void Game::drawPlane()
for(int i=0; i&9; i++)
SetPos(position[i]);
cout&&"O";
else if(i==5)
cout&&"|";
void Game::drawPlaneToNull()
for(int i=0; i&9; i++)
SetPos(position[i]);
cout&&" ";
void Game::initBullet()
for(int i=0; i&10; i++)
bullet[i].Y = 30;
void Game::drawBullet()
for(int i=0; i&10; i++)
if( bullet[i].Y != 30)
SetPos(bullet[i]);
cout&&"^";
void Game::drawBulletToNull()
for(int i=0; i&10; i++)
if( bullet[i].Y != 30 )
COORD pos={bullet[i].X, bullet[i].Y+1};
SetPos(pos);
cout&&" ";
void Game::initEnemy()
COORD a={1, 1};
COORD b={45, 15};
for(int i=0; i&8; i++)
enemy[i].position[0] = random(a, b);
enemy[i].position[1].X = enemy[i].position[0].X + 3;
enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
void Game::drawEnemy()
for(int i=0; i&8; i++)
drawFrame(enemy[i].position[0], enemy[i].position[1], '-', '|');
void Game::drawEnemyToNull()
for(int i=0; i&8; i++)
drawFrame(enemy[i].position[0], enemy[i].position[1], ' ', ' ');
void Game::Pause()
SetPos(61,2);
SetPos(61,2);
cout&&"暂停中...";
char c=_getch();
while(c!='p')
c=_getch();
SetPos(61,2);
void Game::planeMove(char x)
if(x == 'a')
if(position[1].X != 1)
for(int i=0; i&=9; i++)
position[i].X -= 2;
if(x == 's')
if(position[7].Y != 23)
for(int i=0; i&=9; i++)
position[i].Y += 1;
if(x == 'd')
if(position[4].X != 47)
for(int i=0; i&=9; i++)
position[i].X += 2;
if(x == 'w')
if(position[5].Y != 3)
for(int i=0; i&=9; i++)
position[i].Y -= 1;
void Game::bulletMove()
for(int i=0; i&10; i++)
if( bullet[i].Y != 30)
bullet[i].Y -= 1;
if( bullet[i].Y == 1 )
COORD pos={bullet[i].X, bullet[i].Y+1};
drawThisBulletToNull( pos );
bullet[i].Y=30;
void Game::enemyMove()
for(int i=0; i&8; i++)
for(int j=0; j&2; j++)
enemy[i].position[j].Y++;
if(24 == enemy[i].position[1].Y)
COORD a={1, 1};
COORD b={45, 3};
enemy[i].position[0] = random(a, b);
enemy[i].position[1].X = enemy[i].position[0].X + 3;
enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
void Game::judgePlane()
for(int i = 0; i & 8; i++)
for(int j=0; j&9; j++)
if(judgeCoordInFrame(enemy[i], position[j]))
SetPos(62, 1);
cout&&"坠毁";
drawFrame(enemy[i], '+', '+');
Sleep(1000);
GameOver();
void Game::drawThisBulletToNull( COORD c)
SetPos(c);
cout&&" ";
void Game::drawThisEnemyToNull( Frame f )
drawFrame(f, ' ', ' ');
void Game::judgeEnemy()
for(int i = 0; i & 8; i++)
for(int j = 0; j & 10; j++)
if( judgeCoordInFrame(enemy[i], bullet[j]) )
score += 5;
drawThisEnemyToNull( enemy[i] );
COORD a={1, 1};
COORD b={45, 3};
enemy[i].position[0] = random(a, b);
enemy[i].position[1].X = enemy[i].position[0].X + 3;
enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
drawThisBulletToNull( bullet[j] );
bullet[j].Y = 30;
void Game::Shoot()
for(int i=0; i&10; i++)
if(bullet[i].Y == 30)
bullet[i].X = position[5].X;
bullet[i].Y = position[5].Y-1;
void Game::printScore()
if(score == 120 && flag_rank == 0)
rank -= 3;
flag_rank = 1;
else if( score == 360 && flag_rank == 1)
rank -= 5;
flag_rank = 2;
else if( score == 480 && flag_rank == 2)
rank -= 5;
flag_rank = 3;
int x=rank/5;
SetPos(60, 6);
if( rank!=rankf )
SetPos(60, 7);
if( x == 5)
title="初级飞行员";
else if( x == 4)
title="中级飞行员";
else if( x == 3)
title="高级飞行员";
else if( x == 2 )
title="王牌飞行员";
void Game::Playing()
//HANDLE MFUN;
//MFUN= CreateThread(NULL, 0, MusicFun, NULL, 0, NULL);
drawEnemy();
drawPlane();
int flag_bullet = 0;
int flag_enemy = 0;
if(_kbhit())
char x = _getch();
if ('a' == x || 's' == x || 'd' == x || 'w' == x)
drawPlaneToNull();
planeMove(x);
drawPlane();
judgePlane();
else if ('p' == x)
else if( 'k' == x)
else if( 'e' == x)
//CloseHandle(MFUN);
GameOver();
/* 处理子弹 */
if( 0 == flag_bullet )
bulletMove();
drawBulletToNull();
drawBullet();
judgeEnemy();
flag_bullet++;
if( 5 == flag_bullet )
flag_bullet = 0;
/* 处理敌人 */
if( 0 == flag_enemy )
drawEnemyToNull();
enemyMove();
drawEnemy();
judgePlane();
flag_enemy++;
if( flag_enemy &= rank )
flag_enemy = 0;
/* 输出得分 */
printScore();
void Game::GameOver()
system("cls");
COORD p1={28,9};
COORD p2={53,15};
drawFrame(p1, p2, '=', '|');
SetPos(36,12);
string str="Game Over!";
for(int i=0; i&str.size(); i++)
Sleep(80);
cout&&str[i];
Sleep(1000);
system("cls");
drawFrame(p1, p2, '=', '|');
SetPos(31, 11);
cout&&"击落敌机:"&&score/5&&" 架";
SetPos(31, 12);
cout&&"得  分:"&&
SetPos(31, 13);
cout&&"获得称号:"&&
SetPos(30, 16);
Sleep(1000);
cout&&"继续? 是(y)| 否(n)制作:最牛的LJF";
char x=_getch();
if (x == 'n')
else if (x == 'y')
system("cls");
int a = drawMenu();
if(a == 2)
game.rank = 20;
system("cls");
drawPlaying();
game.Playing();
/*================== the main function ==================*/
int main()
//游戏准备
srand((int)time(0)); //随机种子
HideCursor(); //隐藏光标
int a = drawMenu();
if(a == 2)
game.rank = 20;
system("cls");
drawPlaying();
game.Playing();
}容易吧!只需用c++运行即可,这样,你就可以尽情装B了!!!
希望你可以一直追踪哦~~~
c++制作小游戏--雷电
最近无聊,于是用c++实现了一个小游戏--雷电,貌似运行的还不错,贴图和声效也是Duang!Duang!的。整个项目我也会给出下载链接,有兴趣的可以编译运行一下,用到了C++11的新特性,最好是使用v...
C++(qt)游戏实战项目:坦克大战(一)
地图左到右从上到下依次编号0,1,2,3…28//file:main.h
#ifndef MAIN
#define MAIN
#define JNUM 17//地图块列数
#define INUM 1...
C++(qt)游戏实战项目:坦克大战(五)
单独的子弹类根据坦克属性生成相应的子弹对象。//file bullet.h
#ifndef BULLET_H
#define BULLET_H#include&wanwu.h&
C++实现2048小游戏(控制台版的)
无聊,在公司写了个2048小游戏的程序,聊以自娱。(事实是我手机坏了,没得玩)。 很简单,直接上代码了。
using namesp...
c++游戏设计三:打地鼠
class CMyWnd :public CFrameWnd
CBitmap *m_pbitmap[5];
CRect my...
C++ 扫雷游戏实现
C++ 扫雷游戏
这个星期在尝试着自己写一个扫雷游戏。功能基本和windows下的功能差不多。左键单击翻开一个格子,如果没有雷则显示其周围格子中含有雷的个数,没有周围的没有雷的话,那么就扩展空...
用C++语言写游戏——打怪小游戏
想玩游戏吗?
就到某位神犇这来吧!
这会告诉你很多游戏写法!
今天,神犇就开始书写第二期——打怪小游戏!!!
很容易,只需要用脑袋想想即可,READY——GO!
我也希望大家多多捧场哦~~~...
C++ 小游戏之推箱子
做完C的贪吃蛇游戏后,感觉还不错,刚好记得在HDU上做过一道关于推箱子游戏的算法题目,即双BFS。
所以我决定来做做C++的小游戏推箱子,由于刚学C++,对C++还是不很熟练,但是思路还是很清楚的,...
C++小游戏——走迷宫
大家想不想成名,那就一步步来吧,先写一些小游戏热热身。
主程序代码:#include
2D 太空打飞机游戏 Bitfighter源码下载(C/C++ Lua)
Bitfighter 是一个 2D 画面的太空打飞机游戏, 支持 Windows, Linux, 和 OS X ,支持本地及互联网联机对战,内置了对战服务器。
更多屏幕截图请看这里。
没有更多推荐了,更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
按住视频可进行拖动
&正在加载...
举报视频:
举报原因(必填):
请说明举报原因(300字以内):
请输入您的反馈
举报理由需要输入300字以内
感谢您的反馈~
请勿重复举报~
请刷新重试~
收藏成功,可进入查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
WARFRAME ZAW自制长柄:浸染剧毒的血肉长矛
正在检测客户端...
您尚未安装客户端,正在为您下载...安装完成后点击按钮即可下载
30秒后自动关闭
WARFRAME ZAW自制长柄:浸染剧毒的血肉长矛">WARFRAME ZAW自制长柄:浸染剧毒的血肉长矛
请选择打赏金额:
热门短视频推荐
Copyright (C) 2018 & All Rights Reserved
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
正在为您下载爱奇艺客户端安装后即可快速下载海量视频
正在为您下载爱奇艺客户端安装后即可免费观看1080P视频
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
后才可以领取积分哦~
每观看视频30分钟
+{{data.viewScore}}分
{{data.viewCount}}/3
{{if data.viewCount && data.viewCount != "0" && data.viewCount != "1" && data.viewCount != "2" }}
访问泡泡首页
+{{data.rewardScore}}分
{{if data.rewardCount && data.rewardCount != 0 && data.getRewardDayCount != 0}}1{{else}}0{{/if}}/1
{{if data.rewardCount && data.rewardCount != 0 && data.getRewardDayCount != 0}}
+{{data.signScore}}分
{{data.signCount}}/1
{{if data.signCount && data.signCount != 0}}
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制我有一个frame控件数组
里边有N个checkbox
如何遍历【vb吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:109,705贴子:
我有一个frame控件数组
里边有N个checkbox
如何遍历收藏
有一组按钮
和frame index对应
如何遍历对应的 checkbox
For Each C1 In Me.Controls
If TypeOf C1 Is CheckBox And C1.Name = "Check" & (Index + 1) Then C1.Value =1
这个是判断所有的 能否判断 checkbox的容器名称呢
通用软件不合适,定做软件太昂贵,自己用vb.net开发太难,何不试试FoxTable?
脑子太直了吧?C1.Caption 不就是名称吗
CHECK1数组的容器 直接使用GetParent 儿子找老爸啊Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As LongPrivate Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As LongDim TmpStr$, HwndVal&, SPrivate Sub Command1_Click()
HwndVal = GetParent(Check1.hwnd)
MsgBox GetCaption(HwndVal)End SubPublic Function GetCaption(HwndValal&) As String
TmpStr = String(GetWindowTextLength(HwndValal) + 1, 0)
GetWindowText HwndValal, TmpStr, GetWindowTextLength(HwndValal) + 1
S = Split(TmpStr, Chr(0))
GetCaption = S(0)End Function
我的确够笨的。 原来我发的就是正确答案
VERSION 5.00Begin VB.Form Form1
ClientHeight
ClientLeft
ClientWidth
ScaleHeight
ScaleWidth
StartUpPosition =
Begin VB.CommandButton Command2
Begin VB.CommandButton Command2
Begin VB.CommandButton Command1
Begin VB.CommandButton Command1
Begin VB.Frame Frame1
Begin VB.CheckBox Check2
Begin VB.CheckBox Check2
Begin VB.CheckBox Check2
Begin VB.Frame Frame1
Begin VB.CheckBox Check1
Begin VB.CheckBox Check1
Begin VB.CheckBox Check1
Begin VB.CheckBox Check1
Begin VB.CheckBox Check1
EndEndAttribute VB_Name = "Form1"Attribute VB_GlobalNameSpace = FalseAttribute VB_Creatable = FalseAttribute VB_PredeclaredId = TrueAttribute VB_Exposed = False'就是说先遍历,控件,Command1_Clickindex相联系。比如index=0 那我就遍历 frame1里边的所有check控件,因为 frame很多。 check名称'也不一样。写起来繁琐, 所有想用一个 通用for each 来实现 不知道可以成功不 Private Sub Command1_Click(Index AsInteger)Select Case Index'-------------------------------------这部分代码 我是想要改的。
For i = 0 To 4
Check1(i).Value = 1
For i = 0 To 2
Check2(i).Value = 1
Next iEnd SelectEnd Sub Private Sub Command2_Click(Index AsInteger) '-----------通用版。当然 frame数组控件下标
要和 checkbox 对应 比如0-check1
1-check2Dim C1For Each C1 In Me.ControlsIf TypeOf C1 Is CheckBox And C1.Name ="Check" & (Index + 1) ThenC1.Value = 1End IfNextEnd Sub
登录百度帐号之前在unity里尝试用过语音控制,当时的想法是实时控制游戏角色的移动与攻击,这在通过在线api解析语义的方式下体验一般,不过也想到在实时性要求不那么高的互动场景应该可以用起来。这里就在微信小游戏中尝试一下。
语音交互自然需要一个对象,像我这种手残人士最适合的设计当然就是卡通的小动物了。经过多次修改,在iPad上完成了形象设计(有点丑,有点歪,大家不要见怪):
设计好形象之后就可以设计动画了。一帧一帧的画出连贯的动作。因为偷懒,所以一个动画也就几帧,准备了下面几个动画:
眨眼。1帧,空闲状态的时候播放,避免什么都不做的时候画面看起来太死板。
挠头。2帧,录音结束发给服务器等待服务器结果的时候播放,使得能在话音刚落时就给出反应。
微笑。1帧,对它说“笑一个”的时候播放。
举牌子。3帧,狗狗不会说话,要通过写字的方式和玩家交流。
接下来就可以参考飞机示例,完成游戏的代码部分。
首先新建一个class InterAction,在constructor中进行各种初始化,主要是加载一些图片资源,注册事件等:
constructor(c, returnTitle) {
this.returnTitle = returnTitle
this.bg = wx.createImage()
this.bg.src = 'images/bg2.png'
this.recordBtn = wx.createImage()
this.recordBtn.src = 'images/record.png'
this.recordBtnDown = wx.createImage()
this.recordBtnDown.src = 'images/recorddown.png'
this.btn = this.recordBtn
this.dog = new Dog()
this.idleFrameCount = 0
this.result = ''
this.recorderManager = wx.getRecorderManager()
this.recorderManager.onStop(this.onRecordEnd.bind(this))
this.restart()
restart() {
this._touchStartHandler = this.touchStartHandler.bind(this)
wx.onTouchStart(this._touchStartHandler)
this._touchEndHandler = this.touchEndHandler.bind(this)
wx.onTouchEnd(this._touchEndHandler)
requestAnimationFrame(this.loop.bind(this))
之后,可以看到主线程结构和飞机的基本一样:
this.update()
this.render()
requestAnimationFrame(this.loop.bind(this))
在update和按钮、录音的回调函数中更新状态,在render中显示当前帧的内容。
录音结束后,调用happycxz提供的接口进行语音解析:
onRecordEnd(res) {
let url = 'https://api.happycxz.com/wxapp/mp32asr'
this.dog.playAnimation('thinking', 0, true)
this.idleFrameCount = 0
this.processFileUploadForAsr(url, res.tempFilePath)
processFileUploadForAsr(url, filePath) {
wx.uploadFile({
filePath: filePath,
name: 'file',
formData: { 'appKey': appkey, 'appSecret': appsecret, 'userId': UTIL.getUserUnique()},
header: {'content-type': 'multipart/form-data'},
success: function(res) {
let nliResult = this.getNliFromResult(res.data)
let stt = this.getSttFromResult(res.data)
let result = ''
if (nliResult != undefined && nliResult.length != 0) {
result = nliResult[0].desc_obj.result
result = '出了点问题'
this.handleResult(result)
}.bind(this),
fail: function (res) {
wx.showModal({
title: '提示',
content: "网络请求失败,请确保网络是否正常",
showCancel: false,
success: function (res) {
}.bind(this)
处理返回结果:
handleResult(res) {
if (res.length & 6) {
res = res.substr(0, 6)
this.result = res
if (this.result == '微笑') {
this.dog.playAnimation('smile', 0, true, 60)
this.idleFrameCount = 0
} else if (this.result == 'exit') {
wx.offTouchStart(this._touchStartHandler)
wx.offTouchEnd(this._touchEndHandler)
this.returnTitle()
this.dog.playAnimation('answer',
function () {
ctx.fillStyle = "#ffffff"
ctx.font = "15px Arial"
ctx.fillText(
this.result,
constants.screenWidth * 17 / 32,
constants.screenHeight * 15 / 32
)}.bind(this),
this.idleFrameCount = 0
Dog是继承自我扩展之后的Animation类,主要的改动有两个,一个是支持多个动画,另一个是在playAnimation时增加了多个参数,可以控制动画循环的方式,并可以指定在特定的帧显示时调用的回调函数。具体的代码可以看文末的代码包,这里就不多说了。
最后来看看测试效果。
按下录音键,说话,松开后会做挠头动作(有点难看),等待一段时间会举起牌子显示结果。目前只在olami平台配置了闲聊、24点和算术功能。为了适应牌子大小,结果做了截断处理。下面是几个测试例子:
笑一个/笑一笑:会做出笑脸
再见/拜拜:会返回标题界面
其他:会通过牌子上显示文字信息
另外,代码中还包含了一个跳跃的小游戏,通过在主界面点击开始可以进入。如果进一步开发,可以把小游戏的分数做为奖励,在互动界面购置一些装饰品之类的,应该会增加不少游戏的趣味性。
此项目源码地址:
游戏实时语音解决方案是怎么炼成的
作者:冼牛,微信xianniu1216,即构科技市场运营总监,北京邮电大学计算机硕士,香港大学工商管理硕士,多年从事语音视频云服务技术研究,专注互动直播技术和实时游戏语音。
孟子曰:“独乐乐,...
微信小游戏开发,需要用到哪些接口?
微信小游戏今年必火!先来看两张来自微信公开课发出的图,可以看到,接二连三的推送了【小游戏】的扶持政策、广告接入方式和重要信息等。微信官方的这些消息,包括张小龙之前在大会上的分享,都透露了一个重要的信息...
在游戏中实现语音聊天和语音转化成文字
如何在游戏中添加语音聊天功能,并且需要将语音转化成文本信息
从技术角度谈如何开发一款微信联网小游戏
微信自从有了 “跳一跳” 后微信小游戏就开始迅速火爆起来,为跟上这股潮流,相信很多开发者都想探一探微信小游戏是如何开发的。下面我就从技术的角度说说一下微信小游戏如何开发的。
附:本文适合有开发经...
微信小游戏资源加载
微信小游戏资源加载
请大家关注我的微博:@NormanLin_BadPixel坏像素
我们知道,小游戏的包内体积不能够超过 4mb,额外的资源必须通过网络请求下载。
CCC已经帮我们做好了资...
[小游戏] 微信小游戏开发源码_教程_工具_资源最新集合
[小游戏资源] 微信小游戏开发资源目录
一、微信官方游戏教程
小游戏简易教程小游戏API大全小游戏开发工具
二、微信小游戏图标资源
Game-icons.n...
[视频教程]用Unity3d开发跳一跳小游戏
本文首发于“洪流学堂”微信公众号。
洪流学堂,让你快人几步成为Unity大牛!
包含的知识点
编辑器基本用法及操作
简单的C#编程
刚体Rigidbod...
Unity Shader--模拟微信跳一跳中方块的弹性效果
最近微信小程序跳一跳很火,在网上也有人用Unity模拟做了小游戏,不过主要是模拟逻辑部分,我闲来无事,研究了一下其中的方块弹性效果用Shader实现的方式,今天把研究过程分享出来,供像我这样非...
微信小游戏和微信小程序的区别与共同
微信小游戏
小游戏的运行环境在 iOS 上是 JavaScriptCore,在 Android 上是 V8,都是没有 BOM 和 DOM 的运行环境,没有全局的 document 和 window ...
没有更多推荐了,}

我要回帖

更多关于 Vd%。,N。一一 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信