运行视频
什么游戏?不如自己做一个!
设计说明
1.游戏设置与配置:
游戏定义了宽度和高度,分别为720像素。
使用了Processing库,通常用于创建交互式可视化应用程序。
settings() 方法设置了游戏窗口的初始大小。
setup() 方法负责初始化游戏,设置帧率,并初始化Hero角色。
2.加载图片:
loadAllImages() 方法加载了英雄角色在不同方向和动画下的图片。这些图片存储在Hero对象的不同列表中。
每个方向(左、右、上、下以及对角线)都有三帧动画。
图片被加载、调整大小,并添加到Hero对象的适当列表中。
处理用户输入:
3.keyPressed() 和 keyReleased() 方法处理用户键盘输入。
当按下方向键(左、右、上、下)时,英雄的方向和移动状态会更新。
特殊的对角方向(例如,LEFTUP)也被处理。
当释放方向键时,移动状态会更新,并且英雄的方向可能会更改为最接近的正交方向。
游戏循环:
4.draw() 方法是游戏循环的一部分,负责更新和渲染游戏元素。
它首先清除背景。
然后调用updateObject() 和 drawObject() 方法来更新和绘制英雄角色。
英雄角色(面向对象方法):
5.Hero 类用于封装英雄角色的属性和行为。
它包含了不同动画和方向的图片列表。
Hero 类内的update() 方法可能处理英雄位置和动画帧的逻辑。
Hero 类内的draw() 方法处理基于当前动画帧和方向来渲染英雄角色。
部分代码
import processing.core.PApplet;
import processing.core.PImage;
/**
* TODO:可以加个过渡动画,但是抠图很麻烦,多个角色,应用在游戏不划算
*
*/
public class 连续帧动作 extends PApplet {
public int WIDTH = 720;
public int HEIGHT = 720;
int currentFrameIndex = 0;
int heroX = 200;
int heroY = 100;
int heroSpeed = 5; // 移动速度
Hero hero = new Hero();
@Override
public void settings() {
size(WIDTH, HEIGHT);
}
@Override
public void setup() {
frameRate(60);
//设置游戏主程序配置
GameConfig.pApplet = this;
//创建对象
hero = new Hero();
//加载所有图片
loadAllImages();
}
/**
* 加载所有图片
* * 图片加载不能用这种方式 会报错
* * GameConfig.pApplet.loadImage("heroRight.png");
*/
private void loadAllImages() {
//加载英雄图片
PImage heroLeft = loadImage("image/heroLeft.png");
for (int i = 0; i < 3; i++) {
PImage image = heroLeft.get(i * 200, 0, 200, 190);
image.resize(hero.heroSize, hero.heroSize);
hero.heroLeftImages.add(image);
}
PImage heroRight = loadImage("image/heroRight.png");
for (int i = 0; i < 3; i++) {
PImage image = heroRight.get(i * 200, 0, 200, 190);
image.resize(hero.heroSize, hero.heroSize);
hero.heroRightImages.add(image);
}
PImage heroUp = loadImage("image/heroUp.png");
for (int i = 0; i < 3; i++) {
PImage image = heroUp.get(i * 200, 0, 200, 190);
image.resize(hero.heroSize, hero.heroSize);
hero.heroUpImages.add(image);
}
PImage heroLeftUp = loadImage("image/heroLeftUp.png");
for (int i = 0; i < 3; i++) {
PImage image = heroLeftUp.get(i * 200, 0, 200, 190);
image.resize(hero.heroSize, hero.heroSize);
hero.heroLeftUpImages.add(image);
}
PImage heroRightUp = loadImage("image/heroRightUp.png");
for (int i = 0; i < 3; i++) {
PImage image = heroRightUp.get(i * 200, 0, 200, 190);
image.resize(hero.heroSize, hero.heroSize);
hero.heroRightUpImages.add(image);
}
PImage heroDown = loadImage("image/heroDown.png");
for (int i = 0; i < 3; i++) {
PImage image = heroDown.get(i * 200, 0, 200, 190);
image.resize(hero.heroSize, hero.heroSize);
hero.heroDownImages.add(image);
}
PImage heroLeftDown = loadImage("image/heroLeftDown.png");
for (int i = 0; i < 3; i++) {
PImage image = heroLeftDown.get(i * 200, 0, 200, 190);
image.resize(hero.heroSize, hero.heroSize);
hero.heroLeftDownImages.add(image);
}
PImage heroRightDown = loadImage("image/heroRightDown.png");
for (int i = 0; i < 3; i++) {
PImage image = heroRightDown.get(i * 200, 0, 200, 190);
image.resize(hero.heroSize, hero.heroSize);
hero.heroRightDownImages.add(image);
}
}
@Override
public void keyPressed() {
if (keyCode == LEFT) {
hero.direction = GameEnum.DirectionEnum.LEFT;
hero.leftMoveStatus =true;
}
if (keyCode == RIGHT) {
hero.direction = GameEnum.DirectionEnum.RIGHT;
hero.rightMoveStatus =true;
}
if (keyCode == UP) {
hero.direction = GameEnum.DirectionEnum.UP;
hero.upMoveStatus =true;
}
if (keyCode == DOWN) {
hero.direction = GameEnum.DirectionEnum.DOWN;
hero.downMoveStatus =true;
}
if(hero.upMoveStatus&&hero.leftMoveStatus){
hero.direction = GameEnum.DirectionEnum.LEFTUP;
}
if(hero.upMoveStatus&&hero.rightMoveStatus){
hero.direction = GameEnum.DirectionEnum.RIGHTUP;
}
if(hero.downMoveStatus&&hero.leftMoveStatus){
hero.direction = GameEnum.DirectionEnum.LEFTDOWN;
}
if(hero.downMoveStatus&&hero.rightMoveStatus){
hero.direction = GameEnum.DirectionEnum.RIGHTDOWN;
}
// System.out.println(keyCode == UP && keyCode == RIGHT);
}
//本来就可以检测多个按键,但是要存储多种状态
@Override
public void keyReleased() {
if (keyCode == LEFT) {
hero.leftMoveStatus =false;
if( hero.direction == GameEnum.DirectionEnum.LEFTUP){
hero.direction = GameEnum.DirectionEnum.UP;
}
if( hero.direction == GameEnum.DirectionEnum.LEFTDOWN){
hero.direction = GameEnum.DirectionEnum.DOWN;
}
}
if (keyCode == RIGHT) {
hero.rightMoveStatus =false;
if( hero.direction == GameEnum.DirectionEnum.RIGHTUP){
hero.direction = GameEnum.DirectionEnum.UP;
}
if( hero.direction == GameEnum.DirectionEnum.RIGHTDOWN){
hero.direction = GameEnum.DirectionEnum.DOWN;
}
}
if (keyCode == UP) {
hero.upMoveStatus =false;
if( hero.direction == GameEnum.DirectionEnum.LEFTUP){
hero.direction = GameEnum.DirectionEnum.LEFT;
}
if( hero.direction == GameEnum.DirectionEnum.RIGHTUP){
hero.direction = GameEnum.DirectionEnum.RIGHT;
}
}
if (keyCode == DOWN) {
hero.downMoveStatus =false;
if( hero.direction == GameEnum.DirectionEnum.LEFTDOWN){
hero.direction = GameEnum.DirectionEnum.LEFT;
}
if( hero.direction == GameEnum.DirectionEnum.RIGHTDOWN){
hero.direction = GameEnum.DirectionEnum.RIGHT;
}
}
}
@Override
public void draw() {
background(255);
//更新角色参数
updateObject();
//绘制角色
drawObject();
}
private void updateObject() {
hero.update();
}
private void drawObject() {
hero.draw();
}
public static void main(String[] args) {
PApplet.main("连续帧动作");
}
}
相关图片