Next up, orbiting camera.
While I'm working the controls out, my short term aim is Max Payne style controls (FPS controls with a 3rd person perspective on the camera), then we can develop into more 3d platformer style controls.

Posted 30 November 2012 - 07:45 AM
Posted 30 November 2012 - 03:09 PM
Sofox, on 30 November 2012 - 07:45 AM, said:
float x = 0;
float y = 0;
float z = 0;
float distance = me_character.camDistance;
float xA = cam.rotation.eulerAngles.x;
float yA = cam.rotation.eulerAngles.y;
x = -Mathf.Sin(yA) * Mathf.Cos(xA);
y = Mathf.Sin(xA);
z = -Mathf.Cos(yA) * Mathf.Cos(xA);
cam.position = new Vector3(x, y, z) * distance;
cam.position += me_character.position
Posted 30 November 2012 - 03:18 PM
Posted 30 November 2012 - 03:26 PM
winterhell, on 30 November 2012 - 03:18 PM, said:
Posted 30 November 2012 - 06:46 PM
Posted 30 November 2012 - 07:07 PM
Sofox, on 30 November 2012 - 06:46 PM, said:
...
world.character.pos.z+=cos(angleY)*move;
}
//Compute where the camera is in relation to character
double cameraDist = 6;
//Code for rotating camera goes here (hook into SDL and change using mouse movement?)
angleY = world.camera.rot.y*PI/180.0;
double angleX = world.camera.rot.x*PI/180.0;
world.camera.pos.x = (-sin(angleY) * cos(angleX) * cameraDist) + world.character.pos.x;
world.camera.pos.y = (sin(angleX) * cameraDist) + world.character.pos.y + 1;
world.camera.pos.z = (-cos(angleY) * cos(angleX) * cameraDist) + world.character.pos.z;
Posted 30 November 2012 - 09:59 PM
Posted 30 November 2012 - 10:16 PM
Posted 01 December 2012 - 12:46 AM
Posted 01 December 2012 - 04:14 AM
Posted 01 December 2012 - 08:31 AM
#ifndef ME_INPUT
#define ME_INPUT
struct me_input {
bool upPressed;
bool downPressed;
bool leftPressed;
bool rightPressed;
bool quit;
int mouseRelX;
int mouseRelY;
int mouseX;
int mouseY;
};
me_input setupInput();
void processInput(me_input &input);
#endif#include "input.h"
#include "SDL/SDL.h"
me_input setupInput(){
struct me_input input;
input.upPressed = false;
input.downPressed = false;
input.leftPressed = false;
input.rightPressed = false;
input.quit = false;
input.mouseRelX = 0;
input.mouseRelY = 0;
input.mouseX = 0;
input.mouseY = 0;
return input;
}
void processInput(me_input &input){
SDL_Event event;
while(SDL_PollEvent(&event)) {
switch(event.type) {
case SDL_QUIT:
input.quit = true;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym){
case SDLK_UP:
input.upPressed = true;
break;
case SDLK_DOWN:
input.downPressed = true;
break;
case SDLK_LEFT:
input.leftPressed = true;
break;
case SDLK_RIGHT:
input.rightPressed = true;
break;
case SDLK_ESCAPE:
input.quit=true;
break;
default:
break;
}
break;
case SDL_KEYUP:
switch(event.key.keysym.sym){
case SDLK_UP:
input.upPressed = false;
break;
case SDLK_DOWN:
input.downPressed = false;
break;
case SDLK_LEFT:
input.leftPressed = false;
break;
case SDLK_RIGHT:
input.rightPressed = false;
break;
default:
break;
}
break;
case SDL_MOUSEMOTION:
input.mouseRelX = event.motion.xrel;
input.mouseRelY = event.motion.yrel;
input.mouseX = event.motion.x;
input.mouseY = event.motion.y;
break;
}
}
}void update(me_input &input, me_world &world){
if(input.leftPressed)
world.character.rot.y+=0.05;
if(input.rightPressed)
world.character.rot.y-=0.05;
double angleY = world.character.rot.y*PI/180.0;
if(input.upPressed || input.downPressed){
double move = input.upPressed ? -0.01: 0.01;
world.character.pos.x+=sin(angleY)*move;
world.character.pos.z+=cos(angleY)*move;
}
//Compute where the camera is in relation to character
double cameraDist = 6;
double angleX = world.camera.rot.x*PI/180.0;
//Make new position with trig
world.camera.pos.x = world.character.pos.x+(sin(angleY)*cameraDist * cos(angleX));
world.camera.pos.y = world.character.pos.y + 1 + (sin(angleX)*cameraDist);
world.camera.pos.z = world.character.pos.z+(cos(angleY)*cameraDist * cos(angleX));
world.camera.rot.x += input.mouseRelY * 0.2;
//No going higher than 90!
if(world.camera.rot.x > 90)
world.camera.rot.x = 90;
if(world.camera.rot.x < -90)
world.camera.rot.x = -90;
//Last bits
world.camera.rot.y = world.character.rot.y;
input.mouseRelX = 0;
input.mouseRelY = 0;
}void render(me_world world){
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
//Camera control
glRotatef(-world.camera.rot.y,0.0,1.0,0.0);
//Some more trig for the local X axis - needs optimizing
glRotatef(world.camera.rot.x,(cos(world.character.rot.y*PI/180.0)*cos(world.character.rot.x*PI/180.0)),0.0,-(sin(world.character.rot.y*PI/180.0)*cos(world.character.rot.x*PI/180.0)));
glTranslatef(-world.camera.pos.x,-world.camera.pos.y,-world.camera.pos.z);
//Begin rendering
glBegin(GL_QUADS);
glColor4f(0.1,0.8,0.0,1.0);
glVertex3f(-100,0,-100);
glVertex3f(100,0,-100);
glVertex3f(100,0,100);
glVertex3f(-100,0,100);
glEnd();
renderCharacter(world.character);
glBegin(GL_QUADS);
glColor4f(1.0,1.0,1.0,1.0);
glVertex3f(1,0,-12);
glVertex3f(3,0,-12);
glVertex3f(3,2,-12);
glVertex3f(1,2,-12);
glEnd();
glBegin(GL_TRIANGLES);
glColor4f(1.0,0.9,0.5,0.9);
glVertex3f(-20,0,12);
glVertex3f(-20,0,14);
glVertex3f(-20,10,13);
glEnd();
glBegin(GL_TRIANGLES);
glColor4f(0.2,0.9,0.57,0.9);
glVertex3f(22,0,-45);
glVertex3f(24,0,-45);
glVertex3f(23,9,-45);
glEnd();
glLoadIdentity();
SDL_GL_SwapBuffers();
}me_camera setupCamera(){
struct me_camera camera;
camera.pos.x = 0;
camera.pos.y = 1;
camera.pos.z = 6;
camera.rot.x = 0;
camera.rot.y = 0;
return camera;
}
Posted 01 December 2012 - 10:24 AM
Posted 01 December 2012 - 04:51 PM
Posted 02 December 2012 - 06:54 AM