71

帖子

0

TA的资源

一粒金砂(初级)

21
 
  1. NexBaPs:--计算球的位置
  2. process(CClk)  --问题代码可能就这段,球在(0,0)位置不动,不移动到下一个点
  3.     begin
  4.        if rising_edge(CClk) then
  5.                if ToNext='0' then --上升沿 ,计算下一个位置
  6.                        if CurBaPsR=0 and CurBaPsL=0 then
  7.                                if HisBaPsR=1 and CurBaPsL=1 then
  8.                                        CurBaPsR<=1;
  9.                                        CurBaPsL<=1;
  10.                                end if;
  11.                        elsif CurBaPsR=0 and CurBaPsL=15 then
  12.                                if HisBaPsR=1 and CurBaPsL=14 then
  13.                                        CurBaPsR<=1;
  14.                                        CurBaPsL<=14;
  15.                                end if;              
  16.                        elsif CurBaPsR=15 and CurBaPsL=0 then
  17.                                if HisBaPsR=14 and CurBaPsL=1 then
  18.                                        CurBaPsR<=14;
  19.                                        CurBaPsL<=1;
  20.                                end if;              
  21.                        elsif CurBaPsR=15 and CurBaPsL=15 then
  22.                                if HisBaPsR=14 and CurBaPsL=14 then
  23.                                        CurBaPsR<=14;
  24.                                        CurBaPsL<=14;
  25.                                end if;  
  26.                        elsif CurBaPsL=0 or CurBaPsL =15 then --碰到左右两边 的 墙壁
  27.                                NexBaPsR<=CurBaPsR+CurBaPsR+(CurBaPsR-HisBaPsR);
  28.                                NexBaPsL <=HisBaPsL;
  29.                        elsif CurBaPsR=15 then
  30.                                NexBaPsL <= CurBaPsL+(CurBaPsL-HisBaPsL);   
  31.                                NexBaPsR <=HisBaPsR;           
  32.                        elsif CurBaPsR =0 then ---到达低端
  33.                                if ((CurBaPsL <4 and BdPs=p0) or
  34.                                    (CurBaPsL>3 and CurBaPsL <8 and BdPs=p1) or
  35.                                    (CurBaPsL>7 and CurBaPsL <12 and BdPs=p2) or
  36.                                    (CurBaPsL>11 and CurBaPsL <16 and BdPs=p3) ) then ---球拍击中球 了 ---计算下一个 位置
  37.                                    NexBaPsR <=CurBaPsR+(CurBaPsR-HisBaPsR);
  38.                                    NexBaPsL <=CurBaPsL+(CurBaPsL-HisBaPsL);
  39.                                end if;
  40.                        else  --在平常 运动范围 内
  41.                                NexBaPsR <= CurBaPsR+(CurBaPsR-HisBaPsR);
  42.                                NexBaPsL <= CurBaPsL+(CurBaPsL-HisBaPsL);
  43.                        end if;
  44.                        ToNext<='1';
  45.                else
  46.                        HisBaPsL <=CurBaPsL;
  47.                        HisBaPsR <=CurBaPsR;
  48.                        CurBaPsL <=NexBaPsL;
  49.                        CurBaPsR <=NexBaPsR;
  50.                        ToNext <='0';
  51.                end if;
  52.       end if;
  53. end process;
复制代码

回复

70

帖子

0

TA的资源

一粒金砂(初级)

22
 
if CurBaPsR=0 and CurBaPsL=0 then
                   if HisBaPsR=1 and CurBaPsL=1 then
                       CurBaPsR<=1;
                       CurBaPsL<=1;
                   end if;
               elsif CurBaPsR=0 and CurBaPsL=15 then
                   if HisBaPsR=1 and CurBaPsL=14 then
                       CurBaPsR<=1;
                       CurBaPsL<=14;
                   end if;           
               elsif CurBaPsR=15 and CurBaPsL=0 then
                   if HisBaPsR=14 and CurBaPsL=1 then
                       CurBaPsR<=14;
                       CurBaPsL<=1;
                   end if;           
               elsif CurBaPsR=15 and CurBaPsL=15 then
                   if HisBaPsR=14 and CurBaPsL=14 then
                       CurBaPsR<=14;
                       CurBaPsL<=14;
                   end if;  

改Cur可能不合适吧
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

23
 
应该改His··是我写错了··

改为:


  1. if CurBaPsR=0 and CurBaPsL=0 then
  2.                   if HisBaPsR=1 and CurBaPsL=1 then
  3.                       NexBaPsR<=1;
  4.                       NexBaPsL<=1;
  5.                   end if;
  6.               elsif CurBaPsR=0 and CurBaPsL=15 then
  7.                   if HisBaPsR=1 and CurBaPsL=14 then
  8.                       NexBaPsR<=1;
  9.                       NexBaPsL<=14;
  10.                   end if;         
  11.               elsif CurBaPsR=15 and CurBaPsL=0 then
  12.                   if HisBaPsR=14 and CurBaPsL=1 then
  13.                       NexBaPsR<=14;
  14.                       NexBaPsL<=1;
  15.                   end if;         
  16.               elsif CurBaPsR=15 and CurBaPsL=15 then
  17.                   if HisBaPsR=14 and CurBaPsL=14 then
  18.                       NexBaPsR<=14;
  19.                       NexBaPsL<=14;
  20.                   end if;  
复制代码
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

24
 
引用 22 楼 erwa 的回复:
if CurBaPsR=0 and CurBaPsL=0 then
                  if HisBaPsR=1 and CurBaPsL=1 then
                      NexBaPsR<=1;
                      NexBaPsL<=1;
                  end if;
              elsif CurBaPsR=0 and CurBaPsL=15 then
                  if HisBaPsR=1 and CurBaPsL=14 then
                      NexBaPsR<=1;
                     …


即使这样,当cur为[0,0]时,如果his不是[1,1],球就不动了。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

25
 
回来了~~
实验室演算的结果是:
  以H=(0,0),C(1,1)为初始出发,球的运动轨迹将是固定的。四个角中,球仅会撞到最右上角,撞到后将在0行和15行直接跳跃运动。在非撞到四个直角点的时候的运动是正确的。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

26
 
如果在运动到四个直角后原路返回,那整个运动的轨迹应该就是是固定了的,是吗? 考虑让运动到四个角时,将随机产生靠近当前点的相邻H和C再继续运动,这样将应该能够避免运动轨迹的固定性。这种方法怎么样?
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

27
 
这样轨迹其实还是固定的,变成了一个X加上一个口。为什么一定是16x16呢?16x15就好多了。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

28
 
引用 23 楼 benjaminweber 的回复:
引用 22 楼 erwa 的回复:
if CurBaPsR=0 and CurBaPsL=0 then
                  if HisBaPsR=1 and CurBaPsL=1 then
                      NexBaPsR <=1;
                      NexBaPsL <=1;
                  end if;
              elsif CurBaPsR=0 and CurBaPsL=15 then
                  if HisBaPsR=1 and CurBaPsL=14 then
                      NexBaPsR <=1;
                    …


即…


cur为[0,0]时,his一定是[1,1]··不然你想想还有其他情况吗??
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

29
 
引用 23 楼 benjaminweber 的回复:
引用 22 楼 erwa 的回复:
if CurBaPsR=0 and CurBaPsL=0 then
                  if HisBaPsR=1 and CurBaPsL=1 then
                      NexBaPsR <=1;
                      NexBaPsL <=1;
                  end if;
              elsif CurBaPsR=0 and CurBaPsL=15 then
                  if HisBaPsR=1 and CurBaPsL=14 then
                      NexBaPsR <=1;
                    …


即…


cur为[0,0]时,his一定是[1,1]··不然你想想还有其他情况吗??
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

30
 
引用 23 楼 benjaminweber 的回复:
引用 22 楼 erwa 的回复:
if CurBaPsR=0 and CurBaPsL=0 then
                  if HisBaPsR=1 and CurBaPsL=1 then
                      NexBaPsR <=1;
                      NexBaPsL <=1;
                  end if;
              elsif CurBaPsR=0 and CurBaPsL=15 then
                  if HisBaPsR=1 and CurBaPsL=14 then
                      NexBaPsR <=1;
                    …


即…


cur为[0,0]时,his一定是[1,1]··不然你想想还有其他情况吗??
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

31
 
引用 29 楼 erwa 的回复:
cur为[0,0]时,his一定是[1,1]··不然你想想还有其他情况吗??


即使真的是这样,那程序也不够通用。为什么就没有[0,1]-[0,0]的情况。运动轨迹很单一哦
另外,如果这时确认这一点,那干脆连if都省了
突然发现,if里面居然是his=1和cur=1,笔误?
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

32
 
引用 30 楼 benjaminweber 的回复:
引用 29 楼 erwa 的回复:
cur为[0,0]时,his一定是[1,1]··不然你想想还有其他情况吗??


即使真的是这样,那程序也不够通用。为什么就没有[0,1]-[0,0]的情况。运动轨迹很单一哦
另外,如果这时确认这一点,那干脆连if都省了
突然发现,if里面居然是his=1和cur=1,笔误?


呵呵··笔误·我复制的时候复制错了···
在他这个程序里面,每一个面以及球拍都是将球已45度角反弹的,所以不会出现[0,1]-[0,0]的情况的情况,因为此时是垂直入射的了不会出现这种情况。就是因为他的所有面和球拍会已45度角反弹乒乓,所以也导致了这个游戏里面每一个路径都是固定的了(至少对于这个正方形的显示屏是这样的)。要解决这个问题,我觉得可以在球和球拍接触的时候判断控制球拍移动方向的那个按键来增加或者是减小乒乓运行的斜率。比如,如果乒乓是向右下方向运行的,和球拍接触的时候,刚好你是按下了球拍向右移动的按键,那么乒乓反弹的时候,就以小于45度角向左的方向反弹。这样所有路径都是可变的了。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

33
 
对不起,各位,近几天发生了一些事情--不是很好的事情~
benjaminweber 说的15×16 的处理,可以让球的运动看起来更为真实些。Erwa提到可以跟球拍的运动方向来决定球的反弹路径,这让我想到了另外一种方法--既然球拍是用四个连续点来表示的,那依据撞击的点的不同来确定反弹路径:
1.如果击中的是球拍中间的两点之一,着反弹路径在45度反弹路径上发生在运动方向的平行移动
比如:

! × × × × × × × ×
× ! × × × × × × ^
× × ! × × × × ^ ×
× × × ! × × ^ × ×
× × - - @ - × × ×
                 !到^表示运动路径,@表示击中的点
2.如果撞击的是球拍的左或右端点,则按45度角反弹

! × × × × × × ×
× ! × × × × × ^
× × ! × × × ^ ×
× × × ! × ^ × ×
× - - - @ × × ×

这样处理的话,那球拍移动的方式将要改为一个点一个点的运动,而不是四个点一个状态一个状态的转变。对于撞击到四个直角上的处理,则个按原路返回的方式。
大家怎么看?

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表