MV3D - 3D rendering for RMMV with Babylon.js

CoopNinjask

Veteran
Veteran
Joined
Jan 9, 2020
Messages
107
Reaction score
62
First Language
Portuguese
Primarily Uses
RMMV
@Dread_Nyanak

I was taking a look at the blink and black squares problem and discovered something new.
It seems that the problem only occurs if the event that has the graphics changed is in a range of 2 tiles or less from the player's character.
For some unknown reason, if the event is in a range of 3 or more tiles away, the blink and black square problem does not happen.
I hope this helps to fix the bug.
 

Dread_Nyanak

Veteran
Veteran
Joined
Feb 24, 2019
Messages
165
Reaction score
279
First Language
English
Primarily Uses
RMMV
@safermike
Stair threshold is a global value and can't be set per tile. It allows characters to walk between tiles with slight elevation changes, and allowing it to be set per tile isn't really doable with the current programming.
There are ways you can fake it using events though, like a player touch event that gives the player a move route.
 

LukaYang

Noob
Member
Joined
Feb 9, 2020
Messages
6
Reaction score
0
First Language
Português
Primarily Uses
RMMV
Hello. I really liked your plugin, but there is an error in my game with your plugin. Well, everything is happening normally, but ... the images of the characters are wrong. I don't know if it's my computer, or an error in your plugin.

(I can't place the image, but ... I think you can understand with the text.)
 

Dread_Nyanak

Veteran
Veteran
Joined
Feb 24, 2019
Messages
165
Reaction score
279
First Language
English
Primarily Uses
RMMV
I think I know what you're talking about. Other people have had the same problem. I wish I knew how to reproduce it.

Is it something like this?
View attachment 130205
 
Last edited:

LukaYang

Noob
Member
Joined
Feb 9, 2020
Messages
6
Reaction score
0
First Language
Português
Primarily Uses
RMMV
I think I know what you're talking about. Other people have had the same problem. I wish I knew how to reproduce it.

Is it something like this?
It is this error that is in the photo! I hope there is a way to fix it, because I really want to use your plugin!
 

glaphen

Veteran
Veteran
Joined
Jan 13, 2019
Messages
326
Reaction score
120
First Language
English
Primarily Uses
RMMV
Found a sorta bug with Yanfly Save Core, if you try to load any save from the save screen you cannot move, and map doesn't load only parallax and previous map parts, but if you load from SceneManager.push(Scene_Load); which lets you only load, it works fine. The above is with my game, but in mv3d demo I get visible of undefined when loading that way instead, don't know why it doesn't error in mine.
 

fizzly

Veteran
Veteran
Joined
Mar 23, 2012
Messages
629
Reaction score
390
First Language
Polish
Primarily Uses
RMMV
It is this error that is in the photo! I hope there is a way to fix it, because I really want to use your plugin!
Actually I think it's problem with wrong prepared character file, not the script itself. Or I am wrong?

@Dread_Nyanak thank you for the fixes!
 

WesdrasLink

Veteran
Veteran
Joined
Jan 2, 2013
Messages
40
Reaction score
60
First Language
Portuguese
Primarily Uses
RMMV
In regard on the last update.
My game looks like this:
rmmv3d.png
Before this update, the characters was messy., now it's the map that looks this way, an d the sprites is ok.
 

fizzly

Veteran
Veteran
Joined
Mar 23, 2012
Messages
629
Reaction score
390
First Language
Polish
Primarily Uses
RMMV
@WesdrasLink, Works fine for me, maybe you use some other scripts that collide with babylon?
 

Poppie360

chocobo wrangler
Veteran
Joined
Feb 28, 2018
Messages
175
Reaction score
53
First Language
English
Primarily Uses
RMMV
Hey so, i cant read anything in this plugin so i cant tell what is the issue with the plugin, but it gave me this error;
 

Danielcross

Veteran
Veteran
Joined
Sep 27, 2017
Messages
100
Reaction score
10
First Language
English
Primarily Uses
RMMV
Found a sorta bug with Yanfly Save Core, if you try to load any save from the save screen you cannot move, and map doesn't load only parallax and previous map parts, but if you load from SceneManager.push(Scene_Load); which lets you only load, it works fine. The above is with my game, but in mv3d demo I get visible of undefined when loading that way instead, don't know why it doesn't error in mine.
Dread was nice enough to create a compatibility fix, just yesterday in fact!

try adding mv3d.needClearMap=true; to the end of Scene_File.prototype.onLoadSuccess in the save_core js file.

Also, head's up to people who are using mv3d enable/disable commands. Recent versions of MV3D no longer carry the command to new maps, so you will have to have a map tag like:

<mv3d>

disable()

</mv3d>

If you switch to a new map but want the enable/disable command to continue.
 

CoopNinjask

Veteran
Veteran
Joined
Jan 9, 2020
Messages
107
Reaction score
62
First Language
Portuguese
Primarily Uses
RMMV
@Dread_Nyanak

First, I would like to thank you for fixing the bugs. Worked perfectly!


I am developing an ABS shooter for the MV3D and I have some questions that I need to clarify:

1) I need the Z coordinate of an event (the bullet of a revolver) to always be equal to the value of the Z coordinate of the player. Is there a way for the Z coordinate of an event to take the value of a variable from note tags?
I tried here, but the event was invisible. It seems that it failed to get the value of the variable.

Bullet - Variable.png


2) How do I make a condition based on the Z coordinate of an event?
For example: Check if the Z coordinate value of the bullet is equal to the Z coordinate value of an enemy on the map and, if true, activates a result that would correspond to what would happen when a collision occurred.

3) Is there a way for the event to collide only if it has the same Z coordinate as an object on the map? (I say object as a tileset B, C, D and etc., not an event)
Ideally, the bullet would hit the object if it had the same Z, but go over the object if it had a higher Z than the object.

4) Finally, I wanted to know if there is a way for the event (bullet) to go over the river tileset, even with the passability of the river tileset blocking the player (X passability) and the other events.
Thus it would be possible to activate switches that were on the other side of a river by a shot, making a bridge appear for the player to cross the river, for example.
 

MikePjr

Artist
Veteran
Joined
Nov 7, 2012
Messages
732
Reaction score
453
First Language
English
Primarily Uses
I wouldn't mind seeing some sort of ability to use simplistic 3D models for things like maybe doors, or types of roofs for homes.
If anyone is familure with early 3D games, you'll know what i mean.
Like Shining the Holy Ark.
 

glaphen

Veteran
Veteran
Joined
Jan 13, 2019
Messages
326
Reaction score
120
First Language
English
Primarily Uses
RMMV
@Dread_Nyanak

First, I would like to thank you for fixing the bugs. Worked perfectly!


I am developing an ABS shooter for the MV3D and I have some questions that I need to clarify:

1) I need the Z coordinate of an event (the bullet of a revolver) to always be equal to the value of the Z coordinate of the player. Is there a way for the Z coordinate of an event to take the value of a variable from note tags?
I tried here, but the event was invisible. It seems that it failed to get the value of the variable.

View attachment 133812


2) How do I make a condition based on the Z coordinate of an event?
For example: Check if the Z coordinate value of the bullet is equal to the Z coordinate value of an enemy on the map and, if true, activates a result that would correspond to what would happen when a collision occurred.

3) Is there a way for the event to collide only if it has the same Z coordinate as an object on the map? (I say object as a tileset B, C, D and etc., not an event)
Ideally, the bullet would hit the object if it had the same Z, but go over the object if it had a higher Z than the object.

4) Finally, I wanted to know if there is a way for the event (bullet) to go over the river tileset, even with the passability of the river tileset blocking the player (X passability) and the other events.
Thus it would be possible to activate switches that were on the other side of a river by a shot, making a bridge appear for the player to cross the river, for example.
You can check my bird script on page 31, should be able to show you how to do it, just make a movement route script pretty much same as I did for birds. Number 2 should be answered by my bird chase script as well. 3 you could probably do by tagging regions as a comparison in the movement like the bird script. 4 you could probably turn on through temporarily, which I did in my heavily edited bird chase script recently, perhaps it will be of use.



Code:
Game_Event.prototype.clearChaseSettings = function() {
  this._alertCommonEvent = Yanfly.Param.ECPAlertEvent;
  this._alertLock = 0;
  this._alertPlayer = false;
  this._alertSound = Yanfly.Param.ECPAlertSound;
  this._alertSoundVol = 100;
  this._alertSoundPitch = 100;
  this._alertSoundPan = 0;
  this._chasePlayer = false;
  this._chaseRange = 0;
  this._chaseSpeed = this._moveSpeed;
  this._defaultSpeed = this._moveSpeed;
  this._fleePlayer = false;
  this._fleeRange = 0;
  this._fleeSpeed = this._moveSpeed;
  this._seePlayer = Yanfly.Param.ECPSeePlayer;
  this._sightLock = Yanfly.Param.ECPSightLock;
  this._returnAfter = Yanfly.Param.ECPReturn;
  this._returnWait = Yanfly.Param.ECPReturnWait;
  this._returnPhase = false;
  this._returnFrames = 0;
  this._staggerCount = 0;
  this._startLocationX = this.x;
  this._startLocationY = this.y;
  this._startLocationDir = this._direction;
  this._bird = false;
  this._startchase = false;
  this._fleelvl = 200;
  this._defaultThrough = this._through;
  this._defaultFreq = this._moveFrequency;
  this._chaseFreq = this._moveFrequency;
  this._encount = 0;
  this._fight = false;
};

Yanfly.ECP.Game_Event_setupPage = Game_Event.prototype.setupPage;
Game_Event.prototype.setupPage = function() {
    Yanfly.ECP.Game_Event_setupPage.call(this);
    this.clearChaseSettings();
};

Game_Event.prototype.activateAlert = function() {
    if (this._fleePlayer) {
    this.requestBalloon(6);
    } else if (this._returnPhase && !this._startchase) {
    this.requestBalloon(6);
    } else if (this._returnPhase) {
    this.requestBalloon(5);
    } else {
    this.requestBalloon(1);
    }
    this._alertPlayer = true;
    this.playAlertSound();
    this.playAlertCommonEvent();
};

Game_Event.prototype.updateChaseDistance = function() {
    if (this._erased) return;
    if (this._chaseRange <= 0) return;
    if (this._fleePlayer) return;
    var dis = Math.abs(this.deltaXFrom($gamePlayer.x));
    dis += Math.abs(this.deltaYFrom($gamePlayer.y));
    if (this.chaseConditions(dis)) {
    if (dis <= 1) {
    if (this.z <= $gamePlayer.z) {
        if (this._opacity > 200) this.start();
    }
    }
      this.startEventChase();
    } else if (this._chasePlayer) {
      this.startReturnPhase();
    }
};

Game_Event.prototype.canSeePlayer = function() {
    if (!this._seePlayer) return false;
    var sx = this.deltaXFrom($gamePlayer.x);
    var sy = this.deltaYFrom($gamePlayer.y);
    if (Math.abs(sx) > Math.abs(sy)) {
      var direction = (sx > 0) ? 4 : 6;
    } else {
      var direction = (sy > 0) ? 8 : 2;
    }
    if (direction === this.direction()) {                              
      return true;
    }
    return false;
};

Game_Event.prototype.chaseConditions = function(dis) {
    if (dis <= this._chaseRange && this.nonSeePlayer()) return true;                                    
    if (dis <= this._chaseRange && this.canSeePlayer()) return true;
    return false;
};

Game_Event.prototype.fleeConditions = function(dis) {
    if (dis <= this._fleeRange && this.canSeePlayer()) return true;
    if (dis <= this._fleeRange && !this._seePlayer) return true;
    return false;
};

Game_Event.prototype.startEventChase = function() {
    if (!this._returnPhase) {
    this._through = true
    this._chasePlayer = true;
    this.activateAlert();
    this._alertLock = this._sightLock;
    this.setMoveSpeed(this._chaseSpeed);
    this.setMoveFrequency(this._chaseFreq);
    this._startchase = true;
    }
};

Game_Event.prototype.startEventFlee = function() {
    if (!this._returnPhase) {
    this._fleePlayer = true;
    this.activateAlert();
    this._alertLock = this._sightLock;
    this.setMoveSpeed(this._fleeSpeed);
    this.setMoveFrequency(this._chaseFreq);
    this._startchase = true;
    }
};

Game_Event.prototype.updateFleeDistance = function() {
    if (this._erased) return;
    if (this._fleelvl > $gameVariables.value(33)) return;
    var dis = Math.abs(this.deltaXFrom($gamePlayer.x));
    dis += Math.abs(this.deltaYFrom($gamePlayer.y));
    if (this.fleeConditions(dis)) {
    if (dis <= 1) {
    if (this.z <= $gamePlayer.z) {
        if (this._opacity > 200) this.start();
    }
    }
      this.startEventFlee();
    } else if (this._fleePlayer) {
      this.startReturnPhase();
    }
};

Game_Event.prototype.checkFacing = function() {
    var x = this._x;
    var y = this._y;
    var d = this._direction;
    var pl = $gamePlayer;
    var px = pl._x;
    var py = pl._y
    var pd = pl._direction;
    if (x > px && y === py) {
        if (pd === 6) {
                if (d === 6) {
                    this._encount = 1;
                    return true;
                } else {
                    return true;
                    };
        } else if (d === 4) {
            if (pd === 4) {
                this._encount = 2;
            return true;
            } else {
                return true;
                };
        } else {
            return false;
        };
    } else if (x < px && y === py) {
        if (pd === 4) {
                if (d === 4) {
                    this._encount = 1;
                    return true;
                } else {
                    return true;
                    };
        } else if (d === 6) {
            if (pd === 6) {
                this._encount = 2;
            return true;
            } else {
                return true;
                };
        } else {
            return false;
        };
    } else if (y > py && x === px) {
        if (pd === 2) {
                if (d === 2) {
                    this._encount = 1;
                    return true;
                } else {
                    return true;
                    };
        } else if (d === 8) {
            if (pd === 8) {
                this._encount = 2;
            return true;
            } else {
                return true;
                };
        } else {
            return false;
        };
    } else if (y < py && x === px) {
        if (pd === 8) {
                if (d === 8) {
                    this._encount = 1;
                    return true;
                } else {
                    return true;
                    };
        } else if (d === 2) {
            if (pd === 2) {
                this._encount = 2;
            return true;
            } else {
                return true;
                };
        } else {
            return false;
        };
    } else if (y === py && x === px) {
        return true;
    } else {
        return false;
    }
};

Game_Event.prototype.updateChaseMovement = function() {
    if (this._erased) return;
    var trig = this._trigger;
    if (trig > 2) return;
    var dis = Math.abs(this.deltaXFrom($gamePlayer.x));
    dis += Math.abs(this.deltaYFrom($gamePlayer.y));
    if (trig > 0) {
    if (dis <= 1) {
        if (this.z <= $gamePlayer.z) {
            if (this._opacity > 200) {
                if (this.checkFacing()) {
                    this._fight = true;
                    return this.start();
    }}}}}
    if (!this._startchase) {
        if (this._fleelvl < $gameVariables.value(33)) {
                if (this.fleeConditions(dis)) this.startEventFlee();
        } else if (this.chaseConditions(dis)) this.startEventChase();
    } else if (this._alertLock <= 0) this.startReturnPhase();
    var x = this._x;
    var y = this._y;
    var r = this._returnPhase;
    if ($gameSwitches.value(159)) {
    var Edge = $gameMap._myVariable;
    if (y > Edge[0] || y < Edge[1] || x > Edge[2] || x < Edge[3]) {
        if (!r) this.startReturnPhase();
    }
    }
    if (!r && !this._startchase || $gameSwitches.value(160)) return Yanfly.ECP.Game_Event_updateSelfMovement.call(this);
    if (this._staggerCount > 0) {
      return this._staggerCount--;
    }
    if (this._stopCount > 0 && this._chasePlayer) {
      var direction = this.findDirectionTo($gamePlayer.x, $gamePlayer.y);
      if (direction > 0) {
        this.moveStraight(direction);
        if (this._bird) {
            var fly = new Game_Interpreter()
            fly.pluginCommand('mv3d', ['@e' + this.eventId(), 'elevation', '0', '3.5']);
                }
        if (x === this._x && y === this._y) this._staggerCount = 20;
      }
    } else if (this._stopCount > 0 && this._fleePlayer) {
      this.updateFleeMovement();
    } else if (r) {
      this.updateMoveReturnAfter();
    }
};

Game_Character.prototype.Randommove = function() {
    switch (Math.randomInt(5)) {
    case 0: case 1:
        this.moveRandom();
        break;
    case 2: case 3: case 4:
        this.moveForward();
        break;
    }
};


Game_Character.prototype.flyRandom = function() {
    switch (Math.randomInt(8)) {
    case 0: case 1:
    if (this.z <= $gamePlayer.z) {
        this.ascend();
        break;
    }
        this.descend();
        break;
     case 2: case 3: case 4: case 5: case 6: case 7:
    if (this.z >= $gamePlayer.z + 5) {
        this.descend();
        break;
    }
        this.ascend();
        break;
    }
};

Game_Character.prototype.ascend = function() {
        var fly = new Game_Interpreter()
        var RNG = Math.floor(Math.random(15) * 10) / 3
        fly.pluginCommand('mv3d', ['@e' + this.eventId(), 'elevation', '+' + RNG, '0.853']);
};

Game_Character.prototype.descend = function() {
        var fly = new Game_Interpreter()
        var RNG = this.z - Math.floor(Math.random(30) * 10) / 3;
        fly.pluginCommand('mv3d', ['@e' + this.eventId(), 'elevation', '' + RNG, '0.853']);
};

Game_Event.prototype.startReturnPhase = function() {
    this._chasePlayer = false;
    this._fleePlayer = false;
    this.setMoveSpeed(this._defaultSpeed);
    this.setMoveFrequency(this._defaultFreq);
    this._returnPhase = true;
    this.activateAlert();
    this._alertLock = 0;
    this._alertPlayer = false;
    this._returnFrames = this._returnWait;
};

Game_Event.prototype.updateMoveReturnAfter = function() {
    if (this._returnFrames > 0) return;
        if (!this._returnAfter) {
        this._returnPhase = false;
        this._returnFrames = 0;
        this._startchase = false;
        }
    var sx = this.deltaXFrom(this._startLocationX);
    var sy = this.deltaYFrom(this._startLocationY);
    if (this._bird) this.flyRandom();
    if (Math.abs(sx) > Math.abs(sy)) {
      if (Math.randomInt(6) <= 4) {
        this.moveStraight(sx > 0 ? 4 : 6);
        if (!this.isMovementSucceeded() && sy !== 0) {
          this.moveStraight(sy > 0 ? 8 : 2);
        }
      } else {
        this.moveRandom();
      }
    } else if (sy !== 0) {
      if (Math.randomInt(6) <= 4) {
        this.moveStraight(sy > 0 ? 8 : 2);
        if (!this.isMovementSucceeded() && sx !== 0) {
          this.moveStraight(sx > 0 ? 4 : 6);
        }
      } else {
        this.moveRandom();
      }
    }
    if (sx === 0 && sy === 0) {
      this._returnPhase = false;
      this._returnFrames = 0;
      this._direction = this._startLocationDir;
      this.setThrough(this._defaultThrough);
      this._startchase = false;
    }
};

Also included my heavily removed chase script as I edited it so much I think I'll just combine them soon.
Code:
Yanfly.ECP.Game_Event_updateSelfMovement =
    Game_Event.prototype.updateSelfMovement;
Game_Event.prototype.updateSelfMovement = function() {
    if (Imported.YEP_StopAllMove && $gameSystem.isEventMoveStopped()) return;
    this.updateChaseMovement();
};

Yanfly.ECP.Game_Event_update = Game_Event.prototype.update;
Game_Event.prototype.update = function() {
    Yanfly.ECP.Game_Event_update.call(this);
    this.updateReturnPhase();
};

Game_Event.prototype.canSeePlayer = function() {
    if (!this._seePlayer) return false;
    var sx = this.deltaXFrom($gamePlayer.x);
    var sy = this.deltaYFrom($gamePlayer.y);
    if (Math.abs(sx) > Math.abs(sy)) {
      var direction = (sx > 0) ? 4 : 6;
    } else {
      var direction = (sy > 0) ? 8 : 2;
    }
    if (direction === this.direction()) {
      this._alertLock = this._sightLock;
      return true;
    }
    return false;
};


Game_Event.prototype.nonSeePlayer = function() {
  if (Imported.YEP_X_EventChaseStealth) {
    if (this.meetStealthModeConditions()) {
      this.stealthClearChaseSettings();
      this._stopCount = 0;
      return false;
    }
  }
  return !this._seePlayer;
};

Game_Event.prototype.updateFleeDistance = function() {
    if (this._erased) return;
    if (this._fleeRange <= 0) return;
    var dis = Math.abs(this.deltaXFrom($gamePlayer.x));
    dis += Math.abs(this.deltaYFrom($gamePlayer.y));
    if (this.fleeConditions(dis)) {
      this.startEventFlee();
    } else if (this._fleePlayer) {
      this.endEventFlee();
    }
};

Game_Event.prototype.fleeConditions = function(dis) {
    if (this._alertLock > 0) return true;
    if (dis <= this._fleeRange && this.canSeePlayer()) return true;
    if (dis <= this._fleeRange && !this._seePlayer) {
      this._alertLock = this._sightLock;
      return true;
    }
    return false;
};

Game_Event.prototype.startEventFlee = function() {
    this._fleePlayer = true;
    this.setMoveSpeed(this._fleeSpeed);
};

Game_Event.prototype.endEventFlee = function() {
    this._fleePlayer = false;
    this.setMoveSpeed(this._defaultSpeed);
    if (this._alertTimer <= 0) this._alertPlayer = false;
    this.startReturnPhase();
};

Game_Event.prototype.updateChaseMovement = function() {
    if (this._staggerCount > 0) {
      return this._staggerCount--;
    }
    if (this._stopCount > 0 && this._chasePlayer) {
      var direction = this.findDirectionTo($gamePlayer.x, $gamePlayer.y);
      if (direction > 0) {
        var x = this._x;
        var y = this._y;
        this.moveStraight(direction);
        if (x === this._x && y === this._y) this._staggerCount = 20;
      }
    } else if (this._stopCount > 0 && this._fleePlayer) {
      this.updateFleeMovement();
    } else if (this._returnPhase) {
      this.updateMoveReturnAfter();
    } else {
      Yanfly.ECP.Game_Event_updateSelfMovement.call(this);
    }
};

Game_Event.prototype.updateFleeMovement = function() {
    switch (Math.randomInt(6)) {
    case 0: case 1: case 2: case 3: case 4:
      this.moveAwayFromPlayer();
      break;
    case 5:
      this.moveRandom();
      break;
    }
};

Game_Event.prototype.playAlertSound = function() {
    if (this._alertSound === '') return;
    var sound = {
      name:   this._alertSound,
      volume: this._alertSoundVol,
      pitch:  this._alertSoundPitch,
      pan:    this._alertSoundPan
    };
    AudioManager.playSe(sound);
};

Game_Event.prototype.playAlertCommonEvent = function() {
    if (this._alertCommonEvent <= 0) return;
    $gameTemp.reserveCommonEvent(this._alertCommonEvent);
};

Game_Event.prototype.startReturnPhase = function() {
    if (!this._returnAfter) return;
    this._returnPhase = true;
    this._returnFrames = this._returnWait;
};

Game_Event.prototype.updateReturnPhase = function() {
    if (this._returnPhase) this._returnFrames--;
    if (this._alertLock) this._alertLock--;
};

Game_Event.prototype.updateMoveReturnAfter = function() {
    if (this._returnFrames > 0) return;
    var sx = this.deltaXFrom(this._startLocationX);
    var sy = this.deltaYFrom(this._startLocationY);
    if (Math.abs(sx) > Math.abs(sy)) {
      if (Math.randomInt(6) <= 4) {
        this.moveStraight(sx > 0 ? 4 : 6);
        if (!this.isMovementSucceeded() && sy !== 0) {
          this.moveStraight(sy > 0 ? 8 : 2);
        }
      } else {
        this.moveRandom();
      }
    } else if (sy !== 0) {
      if (Math.randomInt(6) <= 4) {
        this.moveStraight(sy > 0 ? 8 : 2);
        if (!this.isMovementSucceeded() && sx !== 0) {
          this.moveStraight(sx > 0 ? 4 : 6);
        }
      } else {
        this.moveRandom();
      }
    }
    if (sx === 0 && sy === 0) {
      this._returnPhase = false;
      this._returnFrames = 0;
      this._direction = this._startLocationDir;
    }
};

Here's event page in case it helps with conditionals.
Slime1.pngSlime2.png
I had to turn on through since anything that tracks calculates destinations based off player seems to be extremely laggy unless set to through, even moving using the mouse diagonally at long distances.
 

fizzly

Veteran
Veteran
Joined
Mar 23, 2012
Messages
629
Reaction score
390
First Language
Polish
Primarily Uses
RMMV
I wouldn't mind seeing some sort of ability to use simplistic 3D models for things like maybe doors, or types of roofs for homes.
If anyone is familure with early 3D games, you'll know what i mean.
Like Shining the Holy Ark.
To create different roofs you can use already implemented slopes. Doors also can be made with "fence" or "wall".
 

MikePjr

Artist
Veteran
Joined
Nov 7, 2012
Messages
732
Reaction score
453
First Language
English
Primarily Uses
Eh.. not what i meant.. but okay...
Also.. slopes? Didn't notice anything about slopes..
 

fizzly

Veteran
Veteran
Joined
Mar 23, 2012
Messages
629
Reaction score
390
First Language
Polish
Primarily Uses
RMMV
Eh.. not what i meant.. but okay...
Also.. slopes? Didn't notice anything about slopes..
Check description of rm3d-babylon.js. Slopes like in the stairs. Place stair tiles to see slopes. You can texture it with roof and change direction to make roofs. There are no placed slopes in the actual demo, I think.
 

tseyik

Villager
Member
Joined
Oct 22, 2015
Messages
20
Reaction score
19
First Language
English
Primarily Uses
Check description of rm3d-babylon.js. Slopes like in the stairs. Place stair tiles to see slopes. You can texture it with roof and change direction to make roofs. There are no placed slopes in the actual demo, I think.
MAP slope test
001.jpg

mv3d-babylon.js presets
001.jpg
 

Attachments

Last edited:

Users Who Are Viewing This Thread (Users: 1, Guests: 4)

Latest Threads

Latest Posts

Latest Profile Posts

Working on some bosses for my game-
His tracks are always so wonderful.
In a narrative Choose Your Own Adventure-style RPG, do you prefer the narrative to be in 2nd person ("you saw", "you thought"), or 3rd person ("he saw", "he thought")?

What's your preference, and why?
So I have been wondering, if a scientist had to fight mano-a-mano, what kind of weapon he could use besides guns, injecting himself with Super Drug X, and piloting Mecha 13th?

Forum statistics

Threads
100,558
Messages
977,215
Members
132,135
Latest member
alfredotrojse
Top