spring-mvc教程_使用MVC模式制作游戏-教程和简介

spring-mvc教程

游戏开发中一种有用的体系结构模式是MVC(模型视图控制器)模式。

它有助于分离输入逻辑,游戏逻辑和UI(渲染)。 在任何游戏开发项目的早期阶段,它的用途很快就会被注意到,因为它可以快速更改内容,而无需在应用程序的所有层中进行过多的代码重做。

下图是模型视图控制器概念的最简单逻辑表示。

模型-视图-控制器模式

用法示例

在玩家控制机器人的示例游戏中,可能会发生以下情况:

  • 1 –用户单击/轻击屏幕上的某个位置。
  • 2控制器处理单击/点击并将事件转换为适当的操作。 例如,如果一个敌人占领了地形,则创建攻击动作;如果它是空的地形,则创建移动动作,最后,如果用户轻拍的地方被障碍物占据,则什么都不做。
  • 3控制器会相应地更新机器人的( 模型 )状态。 如果创建了移动动作,那么它将改变位置;如果发起了攻击,则它将触发。
  • 4渲染器视图 )收到有关状态更改的通知,并渲染世界的当前状态。

这意味着模型(机器人)对如何绘制自己或如何更改其状态(位置,命中点)一无所知。 他们是愚蠢的实体。 在Java中,它们也称为POJO(普通的Java对象)。

控制器负责更改模型的状态并通知渲染器。

为了绘制模型,渲染器必须引用模型(机器人和任何其他实体)及其状态。
从典型的游戏体系结构中我们知道, 主循环充当超级控制器,它会更新状态,然后每秒将对象呈现到屏幕上多次。 我们可以将所有更新和渲染与机器人一起放入主循环,但这很麻烦。
让我们确定游戏的不同方面(问题)。

型号
  • 玩家控制的机器人
  • 机器人可以移动的竞技场
  • 一些障碍
  • 一些敌人要射击
控制器
  • 主循环和输入处理程序
  • 控制器处理玩家输入
  • 在玩家的机器人上执行动作(移动,攻击)的控制器
观点
  • 世界渲染器–将对象渲染到屏幕上

创建项目

为了简单起见,我这次选择了applet,并将尝试使其简短。 该项目具有以下结构:

MVC –项目结构

文件Droids.java是applet,包含主循环。

package net.obviam.droids;import java.applet.Applet;
import java.awt.Color;
import java.awt.Event;
import java.awt.Graphics;
import java.awt.image.BufferedImage;public class Droids extends Applet implements Runnable {private static final long serialVersionUID = -2472397668493332423L;public void start() {new Thread(this).start();}public void run() {setSize(480, 320); // For AppletViewer, remove later.// Set up the graphics stuff, double-buffering.BufferedImage screen = new BufferedImage(480, 320, BufferedImage.TYPE_INT_RGB);Graphics g = screen.getGraphics();Graphics appletGraphics = getGraphics();long delta = 0l;// Game loop.while (true) {long lastTime = System.nanoTime();g.setColor(Color.black);g.fillRect(0, 0, 480, 320);// Draw the entire results on the screen.appletGraphics.drawImage(screen, 0, 0, null);// Lock the frame ratedelta = System.nanoTime() - lastTime;if (delta < 20000000L) {try {Thread.sleep((20000000L - delta) / 1000000L);} catch (Exception e) {// It's an interrupted exception, and nobody cares}}if (!isActive()) {return;}}}public boolean handleEvent(Event e) {return false;}
}

将上面的代码作为applet运行,无非是设置主循环并将屏幕涂成黑色。
结构中有3个程序包,各个组件都将放在那儿。

net.obviam.droids.model将包含所有模型
net.obviam.droids.view将包含所有渲染器
net.obviam.droids.controller将包含所有控制器

创建模型

机器人

Droid.java

package net.obviam.droids.model;public class Droid {private float x;private float y;private float speed = 2f;private float rotation = 0f;private float damage = 2f;public float getX() {return x;}public void setX(float x) {this.x = x;}public float getY() {return y;}public void setY(float y) {this.y = y;}public float getSpeed() {return speed;}public void setSpeed(float speed) {this.speed = speed;}public float getRotation() {return rotation;}public void setRotation(float rotation) {this.rotation = rotation;}public float getDamage() {return damage;}public void setDamage(float damage) {this.damage = damage;}
}

它是一个简单的Java对象,对周围世界一无所知。 它具有位置,旋转,速度和损坏。 这些状态由成员变量定义,可以通过getter和setter方法访问。
游戏需要更多模型:地图上的障碍物和敌人。 为简单起见,障碍物将仅在地图上定位,而敌人将是站立的物体。 该地图将是一个二维数组,其中包含敌人,障碍物和机器人。 该地图将被称为Arena以与标准Java地图区分开,并且在构建地图时会填充障碍物和敌人。
Obstacle.java

package net.obviam.droids.model;public class Obstacle {private float x;private float y;public Obstacle(float x, float y) {this.x = x;this.y = y;}public float getX() {return x;}public float getY() {return y;}
}

Enemy.java

package net.obviam.droids.model;public class Enemy {private float x;private float y;private int hitpoints = 10;public Enemy(float x, float y) {this.x = x;this.y = y;}public float getX() {return x;}public float getY() {return y;}public int getHitpoints() {return hitpoints;}public void setHitpoints(int hitpoints) {this.hitpoints = hitpoints;}
}

Arena.java

package net.obviam.droids.model;import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class Arena {public static final int WIDTH = 480 / 32;public static final int HEIGHT = 320 / 32;private static Random random = new Random(System.currentTimeMillis());private Object[][] grid;private List<Obstacle> obstacles = new ArrayList<Obstacle>();private List<Enemy>  enemies = new ArrayList<Enemy>();private Droid droid;public Arena(Droid droid) {this.droid = droid;grid = new Object[HEIGHT][WIDTH];for (int i = 0; i < WIDTH; i++) {for (int j = 0; j < HEIGHT; j++) {grid[j][i] = null;}}// add 5 obstacles and 5 enemies at random positionsfor (int i = 0; i < 5; i++) {int x = random.nextInt(WIDTH);int y = random.nextInt(HEIGHT);while (grid[y][x] != null) {x = random.nextInt(WIDTH);y = random.nextInt(HEIGHT);}grid[y][x] = new Obstacle(x, y);obstacles.add((Obstacle) grid[y][x]);while (grid[y][x] != null) {x = random.nextInt(WIDTH);y = random.nextInt(HEIGHT);}grid[y][x] = new Enemy(x, y);enemies.add((Enemy) grid[y][x]);}}public List<Obstacle> getObstacles() {return obstacles;}public List<Enemy> getEnemies() {return enemies;}public Droid getDroid() {return droid;}
}

Arena是一个更复杂的对象,但是通读代码应该易于理解。 它基本上将所有模型归为一个世界。 我们的游戏世界是一个竞技场,其中包含机器人,敌人和障碍物等所有元素。

WIDTHHEIGHT是根据我选择的分辨率计算的。 网格上的一个像元(块)将高32像素,所以我只计算网格上有多少个像元。
在构造函数(第19行)中,建立了网格,并随机放置了5个障碍物和5个敌人。 这将构成起步舞台和我们的游戏世界。
为了使主循环保持整洁,我们将把更新和渲染委托给GameEngine 。 这是一个简单的类,它将处理用户输入,更新模型的状态并渲染世界。 这是一个很小的粘合框架,可以实现所有这些功能。 GameEngine.java存根

package net.obviam.droids.controller;import java.awt.Event;
import java.awt.Graphics;public class GameEngine {/** handle the Event passed from the main applet **/public boolean handleEvent(Event e) {switch (e.id) {case Event.KEY_PRESS:case Event.KEY_ACTION:// key pressedbreak;case Event.KEY_RELEASE:// key releasedbreak;case Event.MOUSE_DOWN:// mouse button pressedbreak;case Event.MOUSE_UP:// mouse button releasedbreak;case Event.MOUSE_MOVE:// mouse is being movedbreak;case Event.MOUSE_DRAG:// mouse is being dragged (button pressed)break;}return false;}/** the update method with the deltaTime in seconds **/public void update(float deltaTime) {// empty}/** this will render the whole world **/public void render(Graphics g) {// empty}
}

要使用该引擎,需要修改Droids.java类。 我们需要创建GameEngine类的实例,并在适当的时候调用update()render()方法。 另外,我们需要将输入处理委托给引擎。
添加以下行:

声明私有成员并实例化它。

private GameEngine engine = new GameEngine();

修改后的游戏循环如下所示:

while (true) {long lastTime = System.nanoTime();g.setColor(Color.black);g.fillRect(0, 0, 480, 320);// Update the state (convert to seconds)engine.update((float)(delta / 1000000000.0));// Render the worldengine.render(g);// Draw the entire results on the screen.appletGraphics.drawImage(screen, 0, 0, null);// Lock the frame ratedelta = System.nanoTime() - lastTime;if (delta < 20000000L) {try {Thread.sleep((20000000L - delta) / 1000000L);} catch (Exception e) {// It's an interrupted exception, and nobody cares}}}

高亮显示的行(#7-#10)包含对update()render()方法的委托。 请注意,从纳秒到秒的转换是几秒钟。 在几秒钟内工作非常有用,因为我们可以处理现实价值。

重要说明 :更新需要在计算增量(自上次更新以来经过的时间)之后进行。 更新后也应调用渲染器,以便它将显示对象的当前状态。 请注意,每次在渲染(涂成黑色)之前都会清除屏幕。
最后要做的是委派输入处理。

用以下代码片段替换当前的handleEvent方法:

public boolean handleEvent(Event e) {return engine.handleEvent(e);}

非常简单直接的委托。
运行小程序不会产生特别令人兴奋的结果。 只是黑屏。 这是有道理的,因为除了每个周期要清除的屏幕之外,所有内容都只是一个存根。

初始化模型(世界)

我们的游戏需要机器人和一些敌人。 按照设计,世界就是我们的Arena 。 通过实例化它,我们创建了一个世界(检查Arena的构造函数)。
我们将在GameEngine创建世界,因为引擎负责告诉视图要渲染的内容。

我们还需要在此处创建Droid ,因为Arena需要它的构造函数。 最好将其分开,因为机器人将由玩家控制。
将以下成员与初始化世界的构造函数一起添加到GameEngine

private Arena arena;private Droid droid;public GameEngine() {droid = new Droid();// position droid in the middledroid.setX(Arena.WIDTH / 2);droid.setY(Arena.HEIGHT / 2);arena = new Arena(droid);}

注意Arena构造函数需要修改,因此Droid会在障碍物和敌人之前添加到网格中。

...// add the droidgrid[(int)droid.getY()][(int) droid.getX()] = droid;
...

再次运行该applet,不会更改输出,但是我们已经创建了世界。 我们可以添加日志记录以查看结果,但这不会很有趣。 让我们创建第一个视图,它将揭示我们的世界。

创建第一个视图/渲染器

我们在创建竞技场和世界上付出了很多努力,我们渴望看到它。 因此,我们将创建一个快速而肮脏的渲染器来揭示整个世界。 快速而肮脏的意思是,除了简单的正方形,圆形和占位符之外,没有其他奇特的图像。 一旦我们对游戏元素感到满意,就可以在更精细的视图上进行操作,以用精美的图形替换正方形和圆形。 这就是去耦能力的光芒所在。
渲染世界的步骤。

  • 绘制网格以查看单元格在哪里。
  • 障碍物将被绘制为蓝色方块,它们将占据细胞
  • 敌人将是红色圆圈
  • 机器人将是带有棕色正方形的绿色圆圈

首先,我们创建渲染器界面。 我们使用它来建立与渲染器交互的单一方法,这将使创建更多视图而不影响游戏引擎变得容易。 要了解更多关于为什么是一个好主意,检查这个和这个 。
view包中创建一个接口。

Renderer.java

package net.obviam.droids.view;import java.awt.Graphics;public interface Renderer {public void render(Graphics g);
}

就这些。 它包含一种方法: render(Graphics g)Graphics g是从applet传递的画布。 理想情况下,该接口将是不可知的,并且每个实现都将使用不同的后端,但是此练习的目的是描述MVC而不是创建完整的框架。 因为我们选择了applet,所以我们需要Graphics对象。
具体的实现如下所示:

SimpleArenaRenderer.java (在view包中)

package net.obviam.droids.view;import java.awt.Color;
import java.awt.Graphics;import net.obviam.droids.model.Arena;
import net.obviam.droids.model.Droid;
import net.obviam.droids.model.Enemy;
import net.obviam.droids.model.Obstacle;public class SimpleArenaRenderer implements Renderer {private Arena arena;public SimpleArenaRenderer(Arena arena) {this.arena = arena;}@Overridepublic void render(Graphics g) {// render the gridint cellSize = 32; // hard codedg.setColor(new Color(0, 0.5f, 0, 0.75f));for (int i = 0; i <= Arena.WIDTH; i++) {g.drawLine(i * cellSize, 0, i * cellSize, Arena.HEIGHT * cellSize);if (i <= Arena.WIDTH)g.drawLine(0, i * cellSize, Arena.WIDTH * cellSize, i * cellSize);}// render the obstaclesg.setColor(new Color(0, 0, 1f));for (Obstacle obs : arena.getObstacles()) {int x = (int) (obs.getX() * cellSize) + 2;int y = (int) (obs.getY() * cellSize) + 2;g.fillRect(x, y, cellSize - 4, cellSize - 4);}// render the enemiesg.setColor(new Color(1f, 0, 0));for (Enemy enemy : arena.getEnemies()) {int x = (int) (enemy.getX() * cellSize);int y = (int) (enemy.getY() * cellSize);g.fillOval(x + 2, y + 2, cellSize - 4, cellSize - 4);}// render player droidg.setColor(new Color(0, 1f, 0));Droid droid = arena.getDroid();int x = (int) (droid.getX() * cellSize);int y = (int) (droid.getY() * cellSize);g.fillOval(x + 2, y + 2, cellSize - 4, cellSize - 4);// render square on droidg.setColor(new Color(0.7f, 0.5f, 0f));g.fillRect(x + 10, y + 10, cellSize - 20, cellSize - 20);}
}

第13 – 17行声明了Arena对象,并确保在构造渲染器时设置了该对象。 我将其称为ArenaRenderer是因为我们将渲染竞技场(世界)。

渲染器中唯一的方法是render()方法。 让我们一步一步看看。
#22 –声明像元大小(以像素为单位)。 它是32。与Arena类中一样,它是硬编码的。
#23 –#28 –正在绘制网格。 这是一个简单的网格。 首先,将颜色设置为深绿色,并以相等的距离绘制线条。

绘制障碍物–蓝色方块
#31 –将笔刷颜色设置为蓝色。
#32 –#36 –遍历舞台上的所有障碍物,并为每个障碍物绘制一个蓝色填充的矩形,该矩形稍小于网格上的单元格。 #39 –#44 –将颜色设置为红色,并通过遍历竞技场中的敌人,在相应位置绘制一个圆圈。 #47 –#54 –最后将机器人绘制为绿色圆圈,顶部带有棕色正方形。
请注意 ,现实世界中的竞技场宽度为15(480/32)。 因此,机器人将始终位于相同的位置(7,5),并且渲染器通过使用单位度量转换来计算其在屏幕上的位置。 在这种情况下,世界坐标系中的1个单位在屏幕上为32个像素。 通过修改GameEngine以使用新创建的视图( SimpleArenaRenderer ),我们得到了结果。

public class GameEngine {private Arena arena;private Droid droid;private Renderer renderer;public GameEngine() {droid = new Droid();// position droid in the middledroid.setX(Arena.WIDTH / 2);droid.setY(Arena.HEIGHT / 2);arena = new Arena(droid);// setup renderer (view)renderer = new SimpleArenaRenderer(arena);}/** ... code stripped ... **//** this will render the whole world **/public void render(Graphics g) {renderer.render(g);}
}

注意突出显示的行(5、15、22)。 这些是将渲染器(视图)添加到游戏中的行。
结果应如下图所示(位置与玩家的机器人分开是随机的):

第一次查看的结果

这是测试舞台并查看模型的绝佳视图。 创建一个新视图而不是形状(正方形和圆形)显示实际的精灵非常容易。

处理输入和更新模型的控制器

到目前为止,该游戏什么都不做,只显示当前的世界状态(竞技场)。 为简单起见,我们将仅更新机器人的一种状态,即其位置。

根据用户输入移动机器人的步骤为:

  • 鼠标悬停时,检查网格上单击的单元格是否为空。 这意味着它确实包含任何可能是EnemyObstacle实例的对象。
  • 如果单元格为空,则控制器将创建一个动作,该动作将使机器人以恒定的速度移动,直到到达目的地为止。
package net.obviam.droids.controller;import net.obviam.droids.model.Arena;
import net.obviam.droids.model.Droid;public class ArenaController {private static final int unit = 32;private Arena arena;/** the target cell **/private float targetX, targetY;/** true if the droid moves **/private boolean moving = false;public ArenaController(Arena arena) {this.arena = arena;}public void update(float delta) {Droid droid = arena.getDroid();if (moving) {// move on Xint bearing = 1;if (droid.getX() > targetX) {bearing = -1;}if (droid.getX() != targetX) {droid.setX(droid.getX() + bearing * droid.getSpeed() * delta);// check if arrivedif ((droid.getX() < targetX && bearing == -1)|| (droid.getX() > targetX && bearing == 1)) droid.setX(targetX);}// move on Ybearing = 1;if (droid.getY() > targetY) {bearing = -1;}if (droid.getY() != targetY) {droid.setY(droid.getY() + bearing * droid.getSpeed() * delta);// check if arrivedif ((droid.getY() < targetY && bearing == -1)|| (droid.getY() > targetY && bearing == 1)) droid.setY(targetY);}// check if arrivedif (droid.getX() == targetX && droid.getY() == targetY)moving = false;}}/** triggered with the coordinates every click **/public boolean onClick(int x, int y) {targetX = x / unit;targetY = y / unit;if (arena.getGrid()[(int) targetY][(int) targetX] == null) {// start moving the droid towards the targetmoving = true;return true;}return false;}
}

以下细分说明了逻辑和重要位。

#08unit代表一个像元中有多少像素,在世界坐标中代表1个单位。 它是硬编码的,不是最佳的,但是对于演示来说已经足够了。
#09 –控制器将控制的Arena 。 在构造控制器时设置(第16行)。
#12 –点击的目标坐标(以世界单位表示)。 #14 –机器人移动时true 。 这是“移动”动作的状态。 理想情况下,这应该是一个独立的类,但是为了演示控制器并保持简洁,我们将在控制器内部共同编写一个动作。 #20 –一种update方法,用于以恒定速度经过的时间更新机器人的位置。 这非常简单,它可以同时检查X和Y位置,如果它们与目标位置不同,它会根据机器人的速度更新机器人的相应位置(X或Y)。 如果机器人在目标位置,则更新move状态变量以完成移动动作。

这不是一个很好的书面动作,没有对沿途发现的障碍物或敌人进行碰撞检查,也没有发现路径。 它只是更新状态。

#52 –发生“鼠标向上”事件时,将调用onClick(int x, int y)方法。 它检查单击的单元格是否为空,如果为空,则通过将状态变量设置为true来启动“移动”操作
#53-#54 –将屏幕坐标转换为世界坐标。
这是控制器。 要使用它,必须更新GameEngine

更新的GameEngine.java

package net.obviam.droids.controller;import java.awt.Event;
import java.awt.Graphics;import net.obviam.droids.model.Arena;
import net.obviam.droids.model.Droid;
import net.obviam.droids.view.Renderer;
import net.obviam.droids.view.SimpleArenaRenderer;public class GameEngine {private Arena arena;private Droid droid;private Renderer renderer;private ArenaController controller;public GameEngine() {droid = new Droid();// position droid in the middledroid.setX(Arena.WIDTH / 2);droid.setY(Arena.HEIGHT / 2);arena = new Arena(droid);// setup renderer (view)renderer = new SimpleArenaRenderer(arena);// setup controllercontroller = new ArenaController(arena);}/** handle the Event passed from the main applet **/public boolean handleEvent(Event e) {switch (e.id) {case Event.KEY_PRESS:case Event.KEY_ACTION:// key pressedbreak;case Event.KEY_RELEASE:// key releasedbreak;case Event.MOUSE_DOWN:// mouse button pressedbreak;case Event.MOUSE_UP:// mouse button releasedcontroller.onClick(e.x, e.y);break;case Event.MOUSE_MOVE:// mouse is being movedbreak;case Event.MOUSE_DRAG:// mouse is being dragged (button pressed)break;}return false;}/** the update method with the deltaTime in seconds **/public void update(float deltaTime) {controller.update(deltaTime);}/** this will render the whole world **/public void render(Graphics g) {renderer.render(g);}
}

更改将突出显示。
#16 –声明控制器。
#28 –实例化控制器。 #46 –委托鼠标上移事件。 #60 –在控制器上调用update方法。 运行小程序,您可以单击地图,如果单元格为空,则机器人将移动到该位置。

练习

  • 创建一个视图,该视图将显示实体的图像/精灵,而不是绘制的形状。
    提示 :使用BufferedImage来实现。
  • 将移动动作提取到新类中。
  • 单击敌人时添加新的动作(攻击) 提示:创建被发射到目标的项目符号实体。 您可以以更高的速度使用移动动作。 当hitpoint降低到0时,敌人将被消灭。 使用不同的图像表示不同的状态。

源代码

https://github.com/obviam/mvc-droids或下载为zip文件。

您也可以使用git
$ git clone git://github.com/obviam/mvc-droids.git

参考: 使用MVC模式构建游戏– JCG合作伙伴的 教程和简介   反对谷物博客的Impaler。


翻译自: https://www.javacodegeeks.com/2012/02/building-games-using-mvc-pattern.html

spring-mvc教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web前端开发需要学什么(包含前端学习路线)

前端开发&#xff0c;做到后面&#xff0c;是可以走很多方向的&#xff1b;但是要保证后期的平滑过度&#xff0c;前期还是要把一些必须的知识搞扎实的&#xff1b;web前端开发需要学什么环境搭建前端环境很好搭建&#xff0c;编辑器浏览器即可。浏览器推荐使用 Chrome行业内主…

2015年必火的五个Html5移动开发工具推荐

NO.1 DCloudHBuilder:基于HTML5开发工具 中文官网&#xff1a;http://www.dcloud.io/ DCloudHBuilder:基于HTML5开发工具是当前最快的HTML开发工具&#xff0c;强大的代码助手帮你快速完成开发&#xff0c;最全的语法库和浏览器兼容 性数据让浏览器碎片化不再头痛&#xff0c…

想当程序员,如何判断自己是否适合当前端程序员?

说在前面&#xff1a;有粉丝提问说自己并不确定学前端&#xff0c;因为自己还没有工作&#xff0c;想做程序员&#xff0c;想问问做哪个方向比较有前途&#xff1b; 有两三个小伙伴这么问的&#xff0c;感觉很有意义&#xff0c;拿出来单独说说比较好。 目录 程序员有哪些选择&…

个税社保

资料来源&#xff1a;http://finance.qq.com/cross/20160218/H9cM96A8.html?pgv_refaio2015&ptlang2052转载于:https://www.cnblogs.com/weikang/p/5200832.html

前端程序员如何选择适合自己的培训机构

web前端开发培训哪家好这个主要是根据自己的情况来选择&#xff0c;本篇文章主要分享怎么选择适合自己的培训机构市场上有哪些培训机构以及所在位置既然关心哪家培训机构好&#xff0c;基本都是有报班学习的意向&#xff0c;所以就不多说自学和报班的区别了&#xff1b;我是不排…

altium designer 10哪个作者写的好 。

问题截图&#xff1a; 博主解答&#xff1a; 其实这种书籍基本内容都差不多&#xff0c;很多都是作者来回借鉴&#xff0c;我们能根据自己的需要学到知识即可。

新浪微博开发-添加子视图控制器设置颜色

一.添加子视图控制器 二.设置颜色 设置颜色&#xff1a;两种方法 一种较为繁琐&#xff0c;详见视频 第二种&#xff1a; //设置颜色 self.tabBar.tintColor UIColor.orangeColor()转载于:https://www.cnblogs.com/torrescx/p/5237142.html

Android studio的sdk tools下没有LLDB的解决办法

粉丝提问&#xff1a; 博主解答: 解决办法&#xff1a; 点击setting--》plugins--》找到“Android Support”选项&#xff0c;并勾选&#xff0c;然后会提示重启android studio &#xff0c;点击重启&#xff0c;ok&#xff0c;如果已经设置好SDK的路径的话&#xff0c;问题解…

随机JCache内容:多个提供程序和JMX Bean

JCache&#xff08;JSR 107&#xff09;是用于缓存的Java标准…足够了。 没有更多介绍性的东西。 这是一则速成文章&#xff0c;内容涉及 多个JCache提供程序配置&#xff0c;以及 功能&#xff1a;通过JMX Mbeans的JCache统计信息 管理多个JCache提供程序 如果您只使用一个…

linux下spi添加设备,Linux Kernl添加spidev的设备节点

一、spidev介绍如果在内核中配置spidev&#xff0c;会在/dev目录下产生设备节点&#xff0c;通过此节点可以操作挂载在该SPI总线上的设备。用户空间通过该节点可以访问内核空间。二、配置spidev设备步骤在i.MX6&#xff0c;Kernel 4.1.15上配置spidev的支持。1、配置dts支持spi…

Android studio Jin开发生成so文件的具体步骤

粉丝提问&#xff1a; 博主解答&#xff1a; 帖子链接&#xff1a;https://blog.csdn.net/wangsfine/article/details/51445199

linux中改变文件大小,Linux 改变文件大小的方法

函数原型&#xff1a;#include int ftruncate(int fd, off_t length); //改变文件大小为length指定大小;返回值 执行成功则返回0&#xff0c;失败返回-1。函数ftruncate会将参数fd指定的文件大小改为参数length指定的大小。参数fd为已打开的文件描述词&#xff0c;而且必须是以…

apktool重新打包,error:No resource identifier found for attribute ‘compileSdkVersionCodename‘ in package

报错日志:AndroidManifes.xml :1 error:No resource identifier found for attribute compileSdkVersionCodename in package ‘android’ 粉丝提问: 报错图: 博主解答:

终端-进入云服务器

解决办法: 1.先进入管理员模式: 2.下一步&#xff0c;链接服务器。 3.已经连接上服务器&#xff1a; 4.找到云服务器的项目路径: 在这里&#xff1a; 我们可以在cd空格/ 按Tab寻找下个文件夹&#xff0c;也可以输入ls查看文件夹。转载于…

Android studio 清除缓存数据的步骤

导读:在eclipse的当中进行运行Android的运用的程序的时候,就会产生内存缓存的信息,而eclipse是可以直接点击停止运行程序,然后点击清除缓存,就可以解决了这个问题,而Android studio却不能直接点击停止运行的,而只能通过其它的方式来清除Android studio中的缓存。 可以看…

linux 函数 文件校验,Linux中的文件效验命令

在网络传输、设备之间转存、复制大文件等时&#xff0c;可能会出现传输前后数据不一致的情况。这种情况在网络这种相对更不稳定的环境中&#xff0c;容易出现。那么校验文件的完整性&#xff0c;也是势在必行的。md5sum命令用于生成和校验文件的md5值&#xff0c;MD5全称报文摘…

设置按钮5秒后可以点击下一步||5秒后自动关闭网页

场景:业务需要在点击拍摄的时候提示一个用户须知页面,5秒后可以点击下一步。这属于一个js计时器的功能。这里用jQuery实现一下 效果图: html <div style="text-align: center;"><input type="button" value="下一步" id="next…

Codeforces Round #344 (Div. 2) B. Print Check

题意&#xff1a; 给你一个n*m一开始全是0的矩阵&#xff0c;然后又q次询问 每次询问给你三个字母 op,a,b 将第a行变成b 将第a列变成b 然后让你输出Q次询问后&#xff0c;这个矩阵长什么模样 思路&#xff1a;每个格子记录两个状态&#xff0c;区分横竖。 1 #include<cstdio…

JSP + Struts + Hibernate + Spring+MySQL+Myeclipse实现固定资产管理系统

导读:随着计算机信息技术的发展以及对资产、设备的管理科学化、合理化的高要求,利用计算机实现设备及资产的信息化管理已经显得非常重要。固定资产管理系统是一个单位不可缺少的部分。但一直以来人们使用传统的人工方式管理固定资产的信息,这种管理方式存在着许多缺点,这对…

T4模板之菜菜鸟篇

一、废话 T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎。在 Visual Studio 中&#xff0c;“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板&#xff0c;它可以生成文本文件。 在 Visual C# 或 Visual Basic 中&…