基于ReactNative的跨平台俄罗斯方块游戏的实现2——搭建游戏整体框架

上一篇中我介绍了使用React Native开发的跨平台俄罗斯方块小游戏,截图和代码都在上一篇中。本篇记录的是如何来实现这个小游戏的框架。如果你还不了解React Native,可以参考React Native中文网

游戏整体框架介绍

这个俄罗斯方块小游戏的源码目录层次如下图所示:
这里写图片描述
最主要的是src目录和index.jsApp.js文件,需要注意的是,在低版本的React Native中,新创建的项目里是包含index.android.jsindex.ios.js两个文件的,在高版本的React Native中,这两个文件整合成一个index.js文件。下面分别说下src目录,index.jsApp.js.

index.js文件

该文件是项目的入口文件,源码如下:

import { AppRegistry } from 'react-native';
import App from './App';

AppRegistry.registerComponent('RNTetris', () => App);

其实就是注册了一个App组件,引用了App.js

App.js文件

该文件代码也不多,主要是根据一个游戏状态值gameState来切换不同的游戏界面,比如从准备界面切换到正在游戏界面,从正在游戏界面切换到游戏结束界面,App.js代码如下:

import React, { Component } from 'react';
import GameOverView from './src/view/GameOverView';
import GameNotStartView from './src/view/GameNotStartView';
import GamePauseView from './src/view/GamePauseView';
import GamePlayingView from './src/view/GamePlayingView';
import {
  GAME_STATE_NOT_START, 
  GAME_STATE_PLAYING, 
  GAME_STATE_PAUSE, 
  GAME_STATE_OVER
} from './src/utils/Constants';

// 正式环境中去掉所有的log
if (!__DEV__) {
  global.console = {
    info: () => {},
    log: () => {},
    warn: () => {},
    debug: () => {},
    error: () => {},
  };
}

export default class App extends Component<{}> {
  constructor(props) {
    super(props);
    this.state = {
      // 表示游戏状态,根据这个值来切换游戏界面(开始、进行中、游戏结束)
      gameState: GAME_STATE_NOT_START
    };
  }
  render() {
    switch (this.state.gameState) {
      case GAME_STATE_NOT_START:
        // 游戏待开始界面
        return <GameNotStartView changeGameState={this.changeGameState} />;
        break;
      case GAME_STATE_PLAYING:
        // 游戏正在进行中界面
        return <GamePlayingView changeGameState={this.changeGameState} />;
        break;
      case GAME_STATE_PAUSE:
        // 暂停页面在这个项目中未实现
        return <GamePauseView changeGameState={this.changeGameState} />;
        break;
      case GAME_STATE_OVER:
        // 游戏结束界面
        return <GameOverView changeGameState={this.changeGameState} />;
        break;
    }
  }
  // 该方法作为参数,传给每个页面去调用
  changeGameState = (state)=>{
    this.setState({
      gameState: state
    });
  }
}

这里我们定义了一个state状态值,名为gameStategameState的可取值定义在/src/utils/Constants中,然后定义了一个changeGameState方法,该方法用于改变gameState的值,从而达到切换游戏界面的目的。gameState的取值有如下4个:
1. GAME_STATE_NOT_START(对应src/view/GameNotStartView)
2. GAME_STATE_PLAYING(对应src/view/GamePlayingView)
3. GAME_STATE_PAUSE
4. GAME_STATE_OVER(对应src/view/GameOverView)
其中GAME_STATE_PAUSE这个暂停界面,在本游戏中未实现,本游戏中一共就3个界面,游戏待开始、游戏进行中、游戏结束。

src目录

该目录分为3个包:entityutilsview

entity包

该包存放游戏的实体类,实体类主要是Shape类、Ground类和ShapeFactory类,下面分别说明:

  • Shape
    Shape代表一个方块,方块可以左右移动,可以下落,还可以变形。

  • Ground
    Ground代表游戏面板,即方块可以自由移动的区域。Ground可以吃掉一个Shape,即方块下落到跟Ground接触后,转化为Ground的一部分。Ground还需要在每次吃掉Shape后,检查是否有满行,如果有满行,则需要将满行给删除。

  • ShapeFactory
    ShapeFactory主要用于生产不同形状的方块,比如长条形、正方形、直角形等等。ShapeFactory提供一个getRandomShapeData方法,用于随机生产一种形状的方块。

utils包

该包存放游戏的工具类,主要是游戏常量Constants.js和调试打印的工具Utils.js

view包

该包存放游戏的不同界面,主要是GameNotStartViewGamePlayingViewGamePauseViewGameOverView四个界面,其中GamePauseView在该项目中未实现。

关于游戏绘图

在俄罗斯方块游戏中,由于需要不断的重绘游戏界面,所以需要采用React Native提供的ART API,关于ART的使用,可以自行搜索或者参考这篇文章

后续

最主要的逻辑都在src包中,后面一篇我会详细记录如何实现俄罗斯方块的逻辑,包括方块的移动,变形,被Ground吃掉,Ground满行消除等等。

源码

点击查看项目源码-GitHub
点击查看项目源码-码云

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现基于Python的俄罗斯方块游戏有很多方式,下面是一种简单的实现方法。 首先,我们可以使用Python的图形库pygame实现游戏界面的显示和交互功能。 其次,我们需要定义俄罗斯方块的各种形状和移动规则。可以使用一个二维数组来表示每个方块的状态,使用不同的数字来表示方块的类型和旋转状态。同时,我们还需要定义方块的移动、旋转和碰撞检测等功能。 接下来,我们可以定义游戏的主循环和事件处理函数。在每一帧中,我们通过检测玩家的按键来移动和旋转方块,然后更新方块的位置,并检测方块是否与其他方块碰撞。如果方块碰撞到底部或其他方块上方,则将方块固定在当前位置并生成新的方块。 最后,我们还需要定义游戏的得分规则和结束条件。得分规则可以根据每次消除方块的行数来计算得分,并将得分显示在游戏界面上。当方块堆积到达顶部时,游戏结束。 在实现以上功能后,我们可以通过调用pygame的相关函数来生成游戏窗口,并将游戏逻辑和显示功能结合起来。 总结来说,实现基于Python的俄罗斯方块游戏需要使用pygame库来实现游戏界面的显示和交互功能,并根据游戏规则定义方块的各种状态和移动规则。然后,通过游戏的主循环和事件处理函数来控制方块的移动和碰撞检测。最后,我们还需要定义得分规则和结束条件来完善游戏

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yubo_725

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值