精华内容
参与话题
问答
  • 贪吃蛇游戏是一款经典休闲游戏,本文将在android上实现经典的...该游戏的实现思路主要是在一个View中将贪吃蛇的游戏界面绘制出来,游戏空间由16*32个小方块组成,使用一个数组记录每一个位置的状态(黑、白)。...

    贪吃蛇游戏是一款经典休闲游戏,本文将在android上实现经典的贪吃蛇游戏,操作界面和以前那些游戏机一样。


    游戏空间界面

    该游戏的实现思路主要是在一个View中将贪吃蛇的游戏界面绘制出来,游戏空间由16*32个小方块组成,使用一个LinkedList记录当前蛇的位置和用一个变量记录食物的位置。

    private int snakeFood; // 记录当前食物的位置,横坐标*100+纵坐标
    private LinkedList<Integer> snakeArray; // 记录蛇的位置信息,每一节的坐标和食物的一致,横坐标*100+纵坐标
    新建SnakeSpace继承自View。在onDraw方法中绘制游戏空间的界面,如下代码:
        @Override
        protected void onDraw(Canvas canvas) {
            int width = getWidth();
            int height = getHeight();
            int dx = width / 16;
            Paint paint = new Paint();
            paint.setStrokeWidth(4);
            canvas.drawColor(0xffFCBD00);
            canvas.drawLine(0, 0, width, 0, paint);
            canvas.drawLine(width, 0, width, height, paint);
            canvas.drawLine(0, height, width, height, paint);
            canvas.drawLine(0, 0, 0, height, paint);
            Paint paint2 = new Paint();
            paint2.setColor(0x50000000);
    
            for (int i = 0; i < 16; i++){
                for (int j = 0; j < 32; j++) {
                    if (snakeArray.contains(i*100+j) || snakeFood == (i*100+j)){
                        canvas.drawRect((dx * i) + 1, (dx * j) + 1, (dx * i) + dx - 1, (dx * j) + dx - 1, paint);
                    }else{
                        canvas.drawRect((dx * i) + 1, (dx * j) + 1, (dx * i) + dx - 1, (dx * j) + dx - 1, paint2);
                    }
                }
            }
    
            super.onDraw(canvas);
        }

    在代码中,首先获取width和height以便后续绘图使用,绘制空间周围的小黑边,然后双重循环绘制控制中的26*32个小方块,这里判断绘制的坐标如果是蛇或者食物,则绘制全黑的方块,否则绘制有透明度的方块。这样的话,在游戏过程中,改变蛇和食物变量的值,即可改变界面显示。

    移动蛇

    按下界面上的上下左右按键可以让蛇移动,这里将蛇移动的方法暴露出来,通过Dir参数设置移动的方向。

        public static final int DIRECTION_UP = 1;
        public static final int DIRECTION_DOWN = 2;
        public static final int DIRECTION_LEFT = 3;
        public static final int DIRECTION_RIGHT = 4;
        private int direction;
        public void move(int dir){
            if ((dir <= 2 && direction <= 2) || (dir > 2 && direction > 2)){
                return;
            }
            direction = dir;
        }
        public void move(){
            int firstIndex = snakeArray.getFirst();
            switch (direction){
                case DIRECTION_LEFT:
                    if (firstIndex >= 100){
                        firstIndex -= 100;
                    }else{
                        return;
                    }
                    break;
                case DIRECTION_UP:
                    if (firstIndex%100 > 0){
                        firstIndex -= 1;
                    }else{
                        return;
                    }
                    break;
                case DIRECTION_RIGHT:
                    if (firstIndex < 1500){
                        firstIndex += 100;
                    }else{
                        return;
                    }
                    break;
                case DIRECTION_DOWN:
                    if (firstIndex%100 < 31){
                        firstIndex += 1;
                    }else{
                        return;
                    }
                    break;
            }
            snakeArray.addFirst(firstIndex);
            if (firstIndex == snakeFood){
                showFood();
            }else{
                snakeArray.removeLast();
            }
            postInvalidate();
        }

    代码中主要是设置蛇头和蛇尾的位置,因为每一次移动只移动一步,所以都是只需要改变蛇头和蛇尾而已。在该方法中做了食物处理,即蛇吃到食物后,随机显示下一个食物,蛇身变长。

    随机显示食物

        private void showFood(){
            int x = (int) Math.round(Math.random() * 16);
            int y = (int) Math.round(Math.random() * 32);
            // 该方法存在一个很大的BUG,即可能在生成食物时会占用大量的时间甚至进入死循环,即游戏空间上已经没有合适的位置了。后续的文章中将修改这个。
            while (snakeArray.contains(x*100 + y)){ // 判断直到随机产生的位置是一个空位置,
                x = (int) Math.round(Math.random() * 16);
                y = (int) Math.round(Math.random() * 32);
            }
            Log.e("SnakeSpace", "food pos = " + snakeFood);
            snakeFood = x*100 + y;
        }

    使用贪吃蛇View

    在MainActivity的布局文件中引入我们创建的贪吃蛇View,和上下左右四个按键。

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.qcymall.snake.MainActivity">
    
        <!--<SurfaceView-->
            <!--android:id="@+id/glv_main_demo"-->
            <!--android:layout_width="match_parent"-->
            <!--android:layout_height="match_parent" />-->
    
    
        <com.qcymall.snake.SnakeSpace
            android:id="@+id/snake_view"
            android:layout_width="128dp"
            android:layout_height="wrap_content"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>
    
        <Button
            android:id="@+id/up_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="上"
            android:onClick="upMove"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintBottom_toTopOf="@id/down_btn"/>
        <Button
            android:id="@+id/down_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="下"
            android:onClick="downMove"
            app:layout_constraintLeft_toLeftOf="@id/up_btn"
            app:layout_constraintBottom_toBottomOf="parent"/>
        <Button
            android:id="@+id/left_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="左"
            android:onClick="leftMove"
            app:layout_constraintTop_toTopOf="@id/down_btn"
            app:layout_constraintRight_toLeftOf="@id/down_btn"/>
        <Button
            android:id="@+id/right_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="右"
            android:onClick="rightMove"
            app:layout_constraintTop_toTopOf="@id/down_btn"
            app:layout_constraintLeft_toRightOf="@id/down_btn"/>
    </android.support.constraint.ConstraintLayout>

    在MainActivity中的使用代码如下:

    class MainActivity : AppCompatActivity() {
        private val glRenderer: GLRenderer? = null
        private lateinit var snake: SnakeSpace
    
        private var mTimer: Timer? = null
        private var mTimerTask: TimerTask? = null
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            snake = findViewById(R.id.snake_view)
            startTimer()
        }
    
        private fun startTimer(){
            stopTimer()
            mTimer = Timer()
            mTimerTask = object : TimerTask(){
                override fun run() {
                    snake.move()
                }
            }
            mTimer!!.schedule(mTimerTask, 1000, 500)
        }
    
        private fun stopTimer(){
            if (mTimer != null){
                mTimer!!.cancel()
                mTimer = null
            }
            if (mTimerTask != null){
                mTimerTask!!.cancel()
                mTimerTask = null
            }
        }
        public fun upMove(view: View){
            snake.move(SnakeSpace.DIRECTION_UP)
        }
        public fun downMove(view: View){
            snake.move(SnakeSpace.DIRECTION_DOWN)
        }
        public fun leftMove(view: View){
            snake.move(SnakeSpace.DIRECTION_LEFT)
        }
        public fun rightMove(view: View){
            snake.move(SnakeSpace.DIRECTION_RIGHT)
        }
    代码主要思路是使用定时器控制游戏速度,上下左右按键改变蛇的移动方向。

    至此,已经实现了一个简单的可以移动的贪吃蛇游戏雏形了,项目源码可参考Github项目。

    https://github.com/dgutkai/RetroSnake.git

    https://github.com/dgutkai/RetroSnake.gi
    展开全文
  • 网上找了一个拼图游戏,它没有游戏菜单界面,我想自己添加一个menu界面,布局文件和逻辑代码简单写了下,运行后,从菜单点击进入游戏,可以进入到原来的游戏界面,但是按键无反应,游戏倒计时也无反应(如图)。...
  • @引入依赖 import pygame import sys @全局初始化 ...resolution = width,height = 480,700 #设置窗口大小和标题 windowSurface = pygame.display.set_mode(resolution) #设置分辨率并得到全局的【绘图表面】 ...

    @引入依赖

    import pygame
    import sys

    @全局初始化

    # 全局初始化
    pygame.init()
    
    # 设置窗口的分辨率和标题
    resolution = width,height = 480,700 #设置窗口大小和标题
    windowSurface = pygame.display.set_mode(resolution) #设置分辨率并得到全局的【绘图表面】
    pygame.display.set_caption("飞机大战")#设置标题
    
    #加载背景图,返回的表面可以用于绘制其它对象于其上
    bgSurface = pygame.image.load("./images/background.png").convert()
    
    # 创建时钟对象
    clock = pygame.time.Clock()

    @逐帧绘制界面和监听退出事件

    if __name__ == '__main__':
    
        # 开启消息循环
        while True:
    
            # 处理用户事件
            for event in pygame.event.get():
    
                # 处理退出事件
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
    
            # 将背景图像绘制于窗口表面windowSurface
            windowSurface.blit(bgSurface, (0, 0))
    
            # 绘制结束,刷新界面
            pygame.display.flip()
    
            # 时钟停留一帧的时长
            clock.tick(60)

    @执行效果
    这里写图片描述

    展开全文
  • 疯狂连连看之开发游戏界面组件

    千次阅读 2011-07-15 16:38:28
    GameView主要就是根据游戏的状态数据来绘制界面上的方块,GameView继承了View组件,重写了View组件上onDraw(Canvas canvas)方法,重写该方法主要就是绘制游戏里剩余的方块;除此之外,它还会负责绘制连接方块的连接...

    GameView主要就是根据游戏的状态数据来绘制界面上的方块,GameView继承了View组件,重写了View组件上onDraw(Canvas canvas)方法,重写该方法主要就是绘制游戏里剩余的方块;除此之外,它还会负责绘制连接方块的连接线。

    GamaView的代码如下。

    程序清单:codes\18\Link\src\org\crazyit\link\view\GameView.java

    public class GameViewextends View

    {

         // 游戏逻辑的实现类

         private GameService gameService;          //①

         // 保存当前已经被选中的方块

         private Piece selectedPiece;

         // 连接信息对象

         private LinkInfo linkInfo;

         private Paint paint;

         // 选中标识的图片对象

         private Bitmap selectImage;

         public GameView(Context context, AttributeSet attrs)

         {

              super(context, attrs);

              this.paint = new Paint();

              // 设置连接线的颜色

              this.paint.setColor(Color.RED);

              // 设置连接线的粗细

              this.paint.setStrokeWidth(3);

              this.selectImage = ImageUtil.getSelectImage(context);

         }

         public void setLinkInfo(LinkInfo linkInfo)

         {

              this.linkInfo = linkInfo;

         }

         public void setGameService(GameService gameService)

         {

              this.gameService = gameService;

         }

         @Override

         protected void onDraw(Canvas canvas)

         {

              super.onDraw(canvas);

              if (this.gameService == null)

                   return;

              Piece[][] pieces = gameService.getPieces();            //②

              if (pieces != null)

              {

                   // 遍历pieces二维数组

                   for (int i = 0; i <pieces.length; i++)

                   {

                        for (int j = 0; j <pieces[i].length; j++)

                        {

                              // 如果二维数组中该元素不为空(即有方块),将这个方块的图片画出来

                              if (pieces[i][j] !=null)

                              {

                                   // 得到这个Piece对象

                                   Piece piece =pieces[i][j];

                                   // 根据方块左上角XY坐标绘制方块

                                   canvas.drawBitmap(piece.getImage().getImage(),

                                     piece.getBeginX(), piece.getBeginY(), null);

                              }

                        }

                   }

              }

              // 如果当前对象中有linkInfo对象, 即连接信息

              if (this.linkInfo != null)

              {

                   // 绘制连接线

                   drawLine(this.linkInfo, canvas);

                   // 处理完后清空linkInfo对象

                   this.linkInfo = null;

              }

              // 画选中标识的图片

              if (this.selectedPiece != null)

              {

                   canvas.drawBitmap(this.selectImage,this.selectedPiece.
                      getBeginX(),

                        this.selectedPiece.getBeginY(), null);

              }

         }

         // 根据LinkInfo绘制连接线的方法

         private void drawLine(LinkInfo linkInfo, Canvas canvas)

         {

              // 获取LinkInfo中封装的所有连接点

              List<Point> points =linkInfo.getLinkPoints();

              // 依次遍历linkInfo中的每个连接点

              for (int i = 0; i < points.size() -1; i++)

              {

                   // 获取当前连接点与下一个连接点

                   Point currentPoint =points.get(i);

                   Point nextPoint = points.get(i +1);

                   // 绘制连线

                   canvas.drawLine(currentPoint.x,currentPoint.y,

                        nextPoint.x, nextPoint.y,this.paint);

              }

         }

         // 设置当前选中方块的方法

         public void setSelectedPiece(Piece piece)

         {

              this.selectedPiece = piece;

         }

         // 开始游戏方法

         public void startGame()

         {

              this.gameService.start();

              this.postInvalidate();

         }

    }

    上面的GameView中第一段粗体字代码用于根据游戏的状态数据来绘制界面中的所有方块,第二段粗体字代码则用于根据LinkInfo来绘制两个方块之间的连接线。

    上面的程序中①号代码处定义了GameService对象,②号代码则调用了GameService的getPieces()方法来获取游戏中剩余的方块,GameService是游戏的业务逻辑实现类。后面会详细介绍该类的实现,此处暂不讲解。

     

    本文节选自《疯狂Android讲义(含CD光盘1张)》一书。

    图书详细信息:http://blog.csdn.net/broadview2006/article/details/6609027

    展开全文
  • 我目前是大一的学生,编程方面的东西不是很懂,想做一个简单的对对碰游戏,可是运行结果总是不能出现游戏界面,请问我要怎么让那个界面出现呢,是否还要建立包含游戏图片的库??求大神们能和我说一下都需要做些什么
  • 我现在想自己编个小游戏,但在游戏界面上遇到了问题,不知道游戏的地图或界面要如何编写,所以想请大家给我一点思路,包括要用到的函数,还有它编写的大致思路,如何让界面有颜色,如。谢谢。。。。。。
  • 游戏界面设计GUI

    千次阅读 2019-11-04 13:15:19
    区别 NGUI:Unity的插件,由外部公司...GUI是指那些显示在屏幕上给予用户提示的界面,这些界面不会与游戏内容产生互动或者影响。 GUI用的是屏幕坐标系,都是2D效果。 主要API 所有代码都要写在OnGUI()方...

    区别

    1. NGUI:Unity的插件,由外部公司开发的。(因开发人员离开Unity,继续开发NGUI,所以NGUI现在仍在更新)
    2. UGUI:Unity吸收NGUI的开发公司,为Unity新增原生的UGUI。

    什么是GUI

    1. GUI是指那些显示在屏幕上给予用户提示的界面,这些界面不会与游戏内容产生互动或者影响。
    2. GUI用的是屏幕坐标系,都是2D效果。

    主要API

    1. 所有代码都要写在OnGUI()方法中。在界面变动时每帧都会进行一次擦除、一次重绘。
    2. 流式布局:GUILayout.xxx(自左向右、自上向下顺序排列布局)
    3. 块布局:GUI.xxx(固定在某个位置)
    4. 文本框:GUILayout.TextField(文本框内容, GUI布局的规格参数);(返回值为当前文本框的内容)
    5. 按钮:GUILayout.Button(文本框内容, GUI布局的规格参数);(默认值为false,点击后返回值为true)
    6. 世界坐标转化为屏幕坐标:Camera.main.WorldToScreenPoint(世界坐标位置);
    7. GUI绘制图形:GUI.DrawTexture(new Rect(图形x坐标,图形y坐标,图形宽度,图形高度),图形对象);

    GUI文本框 源码

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class GUITest : MonoBehaviour
    {
        //设置变量,用于存储文本框内容
        string s1,s2 ;
        int i;
        private void Start()
        {
            s1 = "click";
            s2 = "";
            i = 0;
        }
        //调用GUI方法,每帧都会进行一次擦除、一次重绘
        private void OnGUI()
        {
            //s = GUILayout.TextField(s, GUILayout.Width(100));
            //print(s);
    
            //判断按钮是否激活,松开时返回true,其他状态返回false
            if (GUILayout.Button(s1, GUILayout.Width(100)))
            {
                i++;
                s2 = "click-" + i;
            }
            //流布局绘制文本框
            GUILayout.TextField(s2, GUILayout.Width(100));
        }
    }
    

    GUI血条效果 源码

    在unity中上传血条图片
    在这里插入图片描述

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class GUIHealth : MonoBehaviour
    {
        //定义图片对象,在unity上传图片
        public Texture2D health;
        private float speed;
        private Vector3 headPos;
        // Start is called before the first frame update
        void Start()
        {
            speed = 5;
        }
    
        // Update is called once per frame
        void Update()
        {
            //物体按键移动
            transform.Translate(Vector3.right * Time.deltaTime * speed * Input.GetAxisRaw("Horizontal"));
            transform.Translate(Vector3.forward * Time.deltaTime * speed * Input.GetAxisRaw("Vertical"));
    
            //获取物体头顶的位置
            //将世界坐标系转到屏幕坐标系
            headPos = Camera.main.WorldToScreenPoint(transform.position + Vector3.up*1.5f);
        }
    
        private void OnGUI()
        {
            //GUI绘制血条图形
            GUI.DrawTexture(new Rect(headPos.x-64, Screen.height - headPos.y, 128,8), health);
        }
    }
    

    在这里插入图片描述

    展开全文
  • 游戏界面的跳转

    2016-07-20 19:23:36
    _backMenuScene:function(){ cc.director.runScene( new GameScene()); _backMenuScene:function(){ cc.director.runScene( new HelloWorldScene());
  • 微信小游戏开发-麻将游戏界面(一)

    万次阅读 多人点赞 2018-10-17 09:52:46
    界面效果如下: 主程序入口问game.js import './js/libs/weapp-adapter' import './js/libs/symbol' import Main from './js/main' console.log(GameGlobal) GameGlobal.wsServerUrl = "ws://127.0.0.1...
  • Java解决游戏界面闪屏

    千次阅读 2016-06-03 20:08:18
    Java双缓冲技术的使用,解决游戏闪屏问题。
  • 简单的游戏界面设计

    千次阅读 2015-02-13 22:43:02
    先看效果 自己做那还是游戏啊 失败失败 自己只有一点点图片 图片多可以自己去替换下面的文件夹中的图片 主要的代码 using UnityEngine; using System.Collections; public class AA : MonoBehaviour { // Use ...
  • 游戏界面设计的原则

    千次阅读 2011-11-14 23:14:38
    游戏界面是什么呢?对于这个问题,也许一百个人能有一百个答案,对于我而言,如果把游戏整体比喻为一个人,那么程序部分则是筋骨、美术资源自然就是肌肤、而游戏性则是这个人的气质。而我们谈论的游戏界面自然是容貌...
  • XNA游戏界面全屏切换

    千次阅读 2010-08-07 20:57:00
    private void ToggleFullScreen(){ PresentationParameters presentation = graphics.GraphicsDevice.PresentationParameters; if (presentation.IsFullScreen) { graphics.PreferredBackBufferWidth = 1024;...
  • shell脚本打字游戏界面框架

    千次阅读 2018-11-13 14:08:25
    本来有音乐来着,但是由于音乐文件没有,所以没有音乐,如果需要音乐,怎么后台播放,以及怎么去杀死这个进程,当时测试的时候加上去的,参照程序顶头注释部分,前提条件:装好了相应的播放器,准备好了相应的音乐...
  • 游戏过程中按Home键后返回游戏界面

    千次阅读 2011-11-29 21:09:01
    以前一直没在意只有结束线程在运行游戏,今天觉得改仔细琢磨一下这个问题了! 首先第一件事:打印Logo看看按下Home键后会调用哪些方法,结果如下: 游戏过程中按下Home后: 11-29 20:42:07.090: I/System.out...
  • c++ GUI库 游戏界面

    千次阅读 2015-11-25 11:44:36
    著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:侯铁 ... 来源:知乎 ...题主君去隔壁C#君看到人家写出来的程序Aero风格的毛玻璃,Metro风格的小瓷砖 ...而且人家只用了两个月呢,太羡慕啦...
  • DirectX3D游戏制作之---游戏界面的设计

    千次阅读 热门讨论 2016-08-21 12:20:24
    前言:   再深沉的感情,再真挚的牵挂,还是会有分开的一天......到头来又怎么敌得过生离死别......  -------韩菱纱《仙剑奇侠传四》 PS:为了方便大家
  • cocos2dx游戏接入360平台,出现一个问题从游戏界面转到福利界面,在转会到游戏界面黑屏,通过log日志,也发现游戏的activity中的onDestroy函数执行了。 protected void onDestroy() { // 游戏退出前,不再调用SDK...
  • 【Unity】制作简单的启动、菜单和游戏界面

    万次阅读 多人点赞 2019-08-22 14:42:34
    本文介绍如何制作简易的启动、菜单和游戏界面

空空如也

1 2 3 4 5 ... 20
收藏数 19,200
精华内容 7,680
关键字:

游戏界面