我已经使用SDL编写了这段代码,但是有一些错误。
这是代码
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
#include <SDL_mixer.h>
#include <fstream>
#include <iostream>
using namespace std;
/////////////////////////////////// functions & global variable ////////////////////////////////
SDL_Window* window;
SDL_Renderer* renderer;
SDL_Color textColor;
TTF_Font* font;
SDL_Surface* surface=SDL_GetWindowSurface(window);
SDL_Event event;
SDL_Texture* LoadTexture(char* path)
{
SDL_Surface* surface = IMG_Load(path);
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer,surface);
SDL_FreeSurface(surface);
return texture;
}
///////////////////////////////////// Cell /////////////////////////////////////
class Cell
{
private:
char num;
public:
Cell();
Cell(int ,int ,char);
char * img;
pair <int ,int> cor;
int flag;
int size;
void display();
bool indomain(int ,int);
};
Cell :: Cell(int x ,int y ,char n){
num=n;
cor.first=x;
cor.second=y;
size=40;
flag=0;
if (num == '#')
img="0.png";
else if (num == '!')
img="1.png";
else
img="street.png";
}
bool Cell :: indomain(int x ,int y){
if ( (cor.first<=x && x<=cor.first+size) && (cor.second<=y && y<=cor.second+size))
return true;
return false;
}
void Cell :: display(){
SDL_Rect rect;
rect.x=cor.first;
rect.y=cor.second;
SDL_Texture* texture = LoadTexture(img);
SDL_RenderCopy(renderer,texture,NULL,&rect);
}
//////////////////////////////////////////// Tower /////////////////////////////////////////
class Tower
{
public:
Tower();
Tower(int ,int ,int ,int ,char* ,int ,int ,int);
~Tower();
int price;
int up_cost;
char * img;
int power;
int domain;
int grade;
int index;
pair <int ,int> cor;
void upgrade();
void display();
bool mark(int ,int);
};
Tower :: Tower(int pr ,int co ,int pow ,int dom ,char* im ,int x ,int y ,int i){
price=pr;
up_cost=co;
power=pow;
domain=dom;
img=im;
cor.first=x;
cor.second=y;
grade=1;
index=i;
}
void Tower :: upgrade(){
if (grade<5)
{
grade+=1;
power*=2;
domain*=1.2;
price*=1.2;
}
}
void Tower :: display(){
SDL_Rect rect;
rect.x=cor.first;
rect.y=cor.second;
SDL_Texture* texture = LoadTexture(img);
SDL_RenderCopy(renderer,texture,NULL,&rect);
}
bool Tower :: mark(int x, int y){
if ((cor.first<=x && x<=cor.first+40) && (cor.second<=y && x<=cor.second+80))
return true;
return false;
}
//////////////////////////////// Enemy //////////////////////////////////////
class Enemy
{
public:
Enemy();
Enemy(int ,char* ,int ,int ,int);
~Enemy();
char * img;
int health;
int cellNum;
int index;
pair <int ,int> cor;
bool live();
void display();
void damge(Tower t);
};
Enemy :: Enemy(int h ,char* im ,int x ,int y ,int i){
health=h;
img=im;
cor.first=x;
cor.second=y;
cellNum=0;
index=i;
}
bool Enemy :: live(){
if (health>0)
return true;
return false;
}
void Enemy :: damge(Tower t){
health-=t.power;
}
void Enemy :: display(){
SDL_Rect rect;
rect.x=cor.first;
rect.y=cor.second;
SDL_Texture* texture = LoadTexture(img);
SDL_RenderCopy(renderer,texture,NULL,&rect);
}
///////////////////////////////////////////// Map ///////////////////////////////////////
class Map
{
private:
char * file;
int len;
public:
Map();
Map(char* ,int);
~Map();
Cell map[15][20];
pair <int ,int> * path;
void display();
void put_tower(Tower ,Cell);
void put_enemy(Enemy ,Cell);
void remove(Cell);
void enemyMove(Enemy);
void pathFinder(int);
};
Map :: Map(char * f ,int l){
file=f;
len=l;
ifstream infile;
infile.open(file);
char * line=new char;
for (int i=0;i<15;i++)
{
infile >> line;
for (int j=0;j<20;j++)
map[i][j]=Cell(j*40 ,i*40 ,line[j]);
}
this->pathFinder(len);
}
void Map :: put_enemy(Enemy e ,Cell c){
e.cor=c.cor;
e.display();
}
void Map :: put_tower(Tower t ,Cell c){
t.cor=c.cor;
t.display();
}
void Map :: remove(Cell c){
c.display();
}
void Map :: enemyMove(Enemy e){
e.cellNum+=1;
e.cor=path[e.cellNum];
}
void Map :: pathFinder(int l){
path=new pair<int ,int> [l];
ifstream infile;
infile.open(file);
char ** lines=new char* [15];
for (int i=0;i<15;i++)
infile >> lines[i];
for (int i=0;i<20;i++)
if (lines[0][i]=='0')
{
path[0]=make_pair(0,i);
break;
}
int x=0;
int y=path[0].second;
int ord=48;
for (int i=1;i<l;i++)
{
if (int(lines[x-1][y])==((ord-47)%10)+48)
x-=1;
else if (int(lines[x+1][y])==((ord-47)%10)+48)
x+=1;
else if (int(lines[x][y-1])==((ord-47)%10)+48)
y-=1;
else if (int(lines[x][y+1])==((ord-47)%10)+48)
y+=1;
path[i]=make_pair(x,y);
ord+=1;
}
}
void Map :: display(){
for (int i=0;i<15;i++)
for (int j=0;j<20;j++)
map[i][j].display();
}
//////////////////////////////////////////////////// Game ////////////////////////////////////////
class Game
{
private:
int health;
int money;
int score;
int step;
public:
Game(int ,int);
~Game();
bool End;
int enemyNum;
int towerNum;
Enemy enemys[20];
Tower towers[50];
int getHealth();
int getMoney();
int getScore();
int getStep();
void setHealth(int);
void setMoney(int);
void setScore(int);
void setStep(int);
void distroy_enemy(Enemy ,Cell);
void distroy_tower(Tower ,Cell);
void shooting(Tower);
void drag_drop(Tower);
void upgradeTower(Tower);
void buyTower(Tower);
void sellTower(Tower ,Cell);
void display(Map);
void displayMenu();
void endDisplay();
bool checkEnd();
void animation();
};
Game :: Game(int h ,int m){
health=h;
money=m;
step=1;
score=0;
enemyNum=0;
towerNum=0;
End=false;
}
int Game :: getHealth(){
return health;
}
int Game :: getMoney(){
return money;
}
int Game :: getScore(){
return score;
}
int Game :: getStep(){
return step;
}
void Game :: setHealth(int h){
health=h;
}
void Game :: setMoney(int m){
money=m;
}
void Game :: setScore(int s){
score=s;
}
void Game :: setStep (int s){
step=s;
}
void Game :: distroy_enemy(Enemy e,Cell c){
for (int i=e.index;i<enemyNum-1;i++)
enemys[i]=enemys[i+1];
enemyNum-=1;
c.display();
}
void Game :: distroy_tower(Tower t ,Cell c){
for (int i=t.index;i<towerNum-1;i++)
towers[i]=towers[i+1];
towerNum-=1;
c.display();
}
void Game :: shooting(Tower t){
for(int i=0;i<enemyNum;i++)
{
if (sqrt(pow(enemys[i].cor.first,2)+pow(enemys[i].cor.second,2)) <= t.domain)
enemys[i].health-=t.power;
}
}
void Game :: upgradeTower(Tower t){
t.upgrade();
money-=t.up_cost;
}
void Game :: buyTower(Tower t){
money-=t.price;
towers[towerNum]=t;
towerNum+=1;
t.display();
}
void Game :: sellTower(Tower t ,Cell c){
distroy_tower(t,c);
money+=t.price/2;
}
void Game :: endDisplay(){
End=true;
SDL_FillRect(surface,&surface->clip_rect,SDL_MapRGB(surface->format,0XFF,0XFF,0XFF));
SDL_Surface* text;
font=TTF_OpenFont("AV.TTF",40);
textColor.b=20;
textColor.g=10;
textColor.r=0;
if (health<=0)
{
text=TTF_RenderText_Solid(font ,"You lose" ,textColor);
}
else if (health>0)
{
text=TTF_RenderText_Solid(font ,"Complete the mission" ,textColor);
}
SDL_Rect rect;
rect.x=300;
rect.y=300;
SDL_BlitSurface(text,NULL,surface,&rect);
}
bool Game :: checkEnd(){
if (health<=0 || step==20)
return true;
return false;
}
void Game :: displayMenu(){
SDL_Rect rect;
rect.x=800;
rect.y=0;
SDL_Texture* texture = LoadTexture("menu.png");
SDL_RenderCopy(renderer,texture,NULL,&rect);
}
void Game :: display(Map m){
m.display();
for (int i=0;i<towerNum;i++)
towers[i].display();
for (int i=0;i<enemyNum;i++)
enemys[i].display();
this->displayMenu();
/////////// ttf
}
void Game :: animation(){
SDL_Rect Lrect;
Lrect.x=83;
Lrect.y=0;
SDL_Rect Rrect;
Rrect.x=915;
Rrect.y=0;
SDL_Texture* leftpic = LoadTexture("left.png");
SDL_Texture* rightpic = LoadTexture("right.png");
for (int i=0;i<12;i++)
{
SDL_RenderCopy(renderer,leftpic,NULL,&Lrect);
SDL_RenderCopy(renderer,rightpic,NULL,&Rrect);
Rrect.x-=20;
Lrect.x+=60;
SDL_RendererFlip();
SDL_Delay(300);
}
}
////////////////////////////////////////////////////////////// main //////////////////////////////////////////////////////////////////////
int main()
{
window=SDL_CreateWindow("Frontline Defence",SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,940,600,SDL_WINDOW_SHOWN);
Game game(1000,500);
Map map("map.txt",30);
while ( !game.checkEnd() )
{
if ( SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
return 0;
if (event.type == SDL_MOUSEBUTTONDOWN )
{
SDL_Delay(3000);
}
}
}
game.endDisplay();
return 0;
}
我做了我能做的每一件事,但没有改变! 我尝试过包含这些库,在主文件中输入代码的所有部分以及许多其他方法,但它没有帮助
这些是错误:
Error 12 error LNK1120: 8 unresolved externals C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\Debug\ConsoleApplication1.exe ConsoleApplication1
Error 4 error LNK2019: unresolved external symbol "public: __thiscall Cell::Cell(void)" (??0Cell@@QAE@XZ) referenced in function "public: __thiscall Map::Map(char *,int)" (??0Map@@QAE@PADH@Z) C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\classes.obj ConsoleApplication1
Error 8 error LNK2019: unresolved external symbol "public: __thiscall Enemy::~Enemy(void)" (??1Enemy@@QAE@XZ) referenced in function "public: __thiscall Game::Game(int,int)" (??0Game@@QAE@HH@Z) C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\classes.obj ConsoleApplication1
Error 7 error LNK2019: unresolved external symbol "public: __thiscall Enemy::Enemy(void)" (??0Enemy@@QAE@XZ) referenced in function "public: __thiscall Game::Game(int,int)" (??0Game@@QAE@HH@Z) C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\classes.obj ConsoleApplication1
Error 10 error LNK2019: unresolved external symbol "public: __thiscall Game::~Game(void)" (??1Game@@QAE@XZ) referenced in function "int __cdecl SDL_main(void)" (?SDL_main@@YAHXZ) C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\classes.obj ConsoleApplication1
Error 9 error LNK2019: unresolved external symbol "public: __thiscall Map::~Map(void)" (??1Map@@QAE@XZ) referenced in function "int __cdecl SDL_main(void)" (?SDL_main@@YAHXZ) C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\classes.obj ConsoleApplication1
Error 6 error LNK2019: unresolved external symbol "public: __thiscall Tower::~Tower(void)" (??1Tower@@QAE@XZ) referenced in function "public: __thiscall Game::Game(int,int)" (??0Game@@QAE@HH@Z) C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\classes.obj ConsoleApplication1
Error 5 error LNK2019: unresolved external symbol "public: __thiscall Tower::Tower(void)" (??0Tower@@QAE@XZ) referenced in function "public: __thiscall Game::Game(int,int)" (??0Game@@QAE@HH@Z) C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\classes.obj ConsoleApplication1
Error 11 error LNK2019: unresolved external symbol _SDL_main referenced in function _main C:\Users\FUJITSU\Desktop\frontline defence\project\ConsoleApplication1\ConsoleApplication1\SDL2main.lib(SDL_windows_main.obj) ConsoleApplication1
答案 0 :(得分:3)
您正在获取引用构造函数和析构函数的链接器错误,因为您还没有为这些函数提供任何实现(正如Michael Burr在评论中指出的那样)。
unresolved external symbol _SDL_main referenced in function _main
是因为main
函数需要具有特定签名:int main(int argc, char* argv[])
并检查链接器的输入中是否还有SDL2main.lib
。 / p>
最后,您似乎永远不会创建任何renderer
(除非您创建代码示例中未包含的地方),因此您必须在创建SDL_Window之后添加对SDL_CreateRenderer()的调用主要。