I’m working on a 2d game, and I,m stuck on sprite movement speed. I can move my sprite, but how do I control the speed at which it moves/translates?
here is my code
#include <GL/gl.h>
#include <GL/freeglut.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <png.h>
#include <string>
#include “keyboard.h”
#include “texture.h”
using namespace std;
GLuint sprite[4];
GLuint tile[4];
GLfloat meow = 0.0;
GLuint emerald;
int cMap[10][10] = { //our map
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 1, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
};
void drawTiles (void) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (cMap[i][j] == 0) {
glBindTexture( GL_TEXTURE_2D, tile[1] ); //bind our grass texture to our shape
}
else
{
glBindTexture( GL_TEXTURE_2D, tile[0] ); //bind our dirt texture to our shape
}
glPushMatrix();
glTranslatef(j * 16, -i * 16, 0);
glBegin (GL_QUADS);
glTexCoord2d(0.0, 0.0); glVertex3f(400.0, 400.0, 0.9);
glTexCoord2d(1.0, 0.0); glVertex3f(416.0, 400.0, 0.9);
glTexCoord2d(1.0, 1.0); glVertex3f(416.0, 416.0, 0.9);
glTexCoord2d(0.0, 1.0); glVertex3f(400.0, 416.0, 0.9);
glEnd();
glPopMatrix();
}
}
}
void background(void) {
glColor4f(1.0f,1.0f,1.0f,1.0f);
glBindTexture( GL_TEXTURE_2D, sprite[0]);
glPushMatrix();
glBegin(GL_QUADS);
glTexCoord2d(0.0,0.0); glVertex3f(0.0,0.0,0.0);
glTexCoord2d(0.0,1.0); glVertex3f(0.0,768.0,0.0);
glTexCoord2d(1.0,1.0); glVertex3f(1024.0,768.0,0.0);
glTexCoord2d(1.0,0.0); glVertex3f(1024.0,0.0,0.0);
glEnd();
glPopMatrix();
}
void square(void) {
glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glTranslatef(0.0, meow, 0.0);
//glDisable(GL_COLOR_MATERIAL);
glPushMatrix();
glBindTexture( GL_TEXTURE_2D, emerald);
glBegin(GL_QUADS);
glTexCoord2d(0.0,0.0);
glVertex3f(400.0,400.0,1.0);
glTexCoord2d(0.0,1.0);
glVertex3f(400.0,432.0,1.0);
glTexCoord2d(1.0,1.0);
glVertex3f(416.0,432.0,1.0);
glTexCoord2d(1.0,0.0);
glVertex3f(416.0,400.0,1.0);
glDisable(GL_BLEND);
glEnd();
glPopMatrix();
}
void display (void) {
glClearColor(0.0f,0.0f,0.0f,1.0f);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glOrtho(0,640,0,480,-1,10);
glEnable( GL_TEXTURE_2D );
//background();
drawTiles(); //draw our tiles
square();
glutSwapBuffers();
emerald = sprite[1];
}
void reshape (int w, int h) {
glViewport (0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glMatrixMode (GL_MODELVIEW);
}
int main (int argc, char **argv) {
glutInit (&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutGameModeString( “640x480:32@70” );
glutEnterGameMode();
glutDisplayFunc (display);
//glutIdleFunc (display);
glutReshapeFunc (reshape);
glutKeyboardFunc(keyboard);
glutSpecialFunc(controls);
tile[0] = loadTexture(“C:\Dev-Cpp\code\files\grass.png”, 16, 16);
tile[1] = loadTexture(“C:\Dev-Cpp\code\files\stonewall.png”, 16, 16);
sprite[0] = loadTexture(“C:\Dev-Cpp\code\files\background.png”, 1024, 768);
sprite[1] = loadTexture(“C:\Dev-Cpp\code\files\emerald_a.png”, 32, 16);
sprite[2] = loadTexture(“C:\Dev-Cpp\code\files\emeraldfs_a.png”, 32, 16);
emerald = sprite[1];
glutTimerFunc(40,timer,1);
glutMainLoop ();
//Free our texture
FreeTexture(sprite[0]);
FreeTexture(sprite[1]);
FreeTexture(sprite[2]);
FreeTexture(tile[0]);
FreeTexture(tile[1]);
return 0;
}
here is my keyboard include file
#ifndef KEYBOARD_H
#define KEYBOARD_H
extern GLfloat meow;
extern GLuint emerald;
extern GLuint sprite[4];
int count;
void movedown(void) {
meow = meow - 16.0;
emerald = sprite[2];
}
void timer(int x) {
glutPostRedisplay();
glutTimerFunc(40, timer, 1);
}
void keyboard(unsigned char key, int x, int y) {
if (key==27) {
glutLeaveGameMode();
exit(0);
}
/* if (key==113) {
meow = meow - 16.0;
emerald = sprite[2];
}
*/
}
void controls(int key, int x, int y) {
switch(key) {
case GLUT_KEY_DOWN:
//for (count = 0; count < 1600; count++)
movedown();
break;
}
}
#endif