会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132904个问题
Python 全系列/第九阶段:Flask百战电商后台系统/Flask百战电商后台项目 4756楼
JAVA 全系列/第十二阶段:Spring Cloud Alibaba技术栈/Dubbo 4757楼
JAVA 全系列/第十八阶段:亿级高并发电商项目/亿级高并发电商项目(旧) 4758楼

在引入TX-LCN依赖

<dependency>
    <groupId>com.codingapi.txlcn</groupId>
    <artifactId>txlcn-tc</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.codingapi.txlcn</groupId>
    <artifactId>txlcn-txmsg-netty</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>

之前,百战商城后台系统的分页查询功能selectTbItemAllByPage()是正常的。

但,一旦引入上述TX-LCN依赖发现common_item模块出现如下报错:

image.png

IDEA控制台输出

2021-06-02 21:37:21.177 ERROR 12540 --- [nio-9010-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: net.sf.jsqlparser.statement.select.PlainSelect.getGroupBy()Lnet/sf/jsqlparser/statement/select/GroupByElement;] with root cause

java.lang.NoSuchMethodError: net.sf.jsqlparser.statement.select.PlainSelect.getGroupBy()Lnet/sf/jsqlparser/statement/select/GroupByElement;
	at com.github.pagehelper.parser.CountSqlParser.isSimpleCount(CountSqlParser.java:259) ~[pagehelper-5.1.11.jar:na]
	at com.github.pagehelper.parser.CountSqlParser.sqlToCount(CountSqlParser.java:238) ~[pagehelper-5.1.11.jar:na]
	at com.github.pagehelper.parser.CountSqlParser.getSmartCountSql(CountSqlParser.java:197) ~[pagehelper-5.1.11.jar:na]
	at com.github.pagehelper.dialect.AbstractHelperDialect.getCountSql(AbstractHelperDialect.java:78) ~[pagehelper-5.1.11.jar:na]
	at com.github.pagehelper.PageHelper.getCountSql(PageHelper.java:78) ~[pagehelper-5.1.11.jar:na]
	at com.github.pagehelper.util.ExecutorUtil.executeAutoCount(ExecutorUtil.java:130) ~[pagehelper-5.1.11.jar:na]
	at com.github.pagehelper.PageInterceptor.count(PageInterceptor.java:150) ~[pagehelper-5.1.11.jar:na]
	at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:97) ~[pagehelper-5.1.11.jar:na]
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.2.jar:3.5.2]
	at com.sun.proxy.$Proxy138.query(Unknown Source) ~[na:na]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ~[mybatis-3.5.2.jar:3.5.2]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) ~[mybatis-3.5.2.jar:3.5.2]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_202]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_202]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_202]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_202]
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) ~[mybatis-spring-2.0.2.jar:2.0.2]
	at com.sun.proxy.$Proxy101.selectList(Unknown Source) ~[na:na]
	at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223) ~[mybatis-spring-2.0.2.jar:2.0.2]
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147) ~[mybatis-3.5.2.jar:3.5.2]
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80) ~[mybatis-3.5.2.jar:3.5.2]
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:57) ~[mybatis-3.5.2.jar:3.5.2]
	at com.sun.proxy.$Proxy104.selectByExample(Unknown Source) ~[na:na]
	at com.bee.item.service.impl.ItemServiceImpl.selectTbItemAllByPage(ItemServiceImpl.java:32) ~[classes/:na]
	at com.bee.item.controller.ItemController.selectTbItemAllByPage(ItemController.java:25) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_202]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_202]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_202]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_202]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88) ~[spring-boot-actuator-2.1.6.RELEASE.jar:2.1.6.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:114) ~[spring-boot-actuator-2.1.6.RELEASE.jar:2.1.6.RELEASE]
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:104) ~[spring-boot-actuator-2.1.6.RELEASE.jar:2.1.6.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_202]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_202]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.21.jar:9.0.21]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_202]


取消TX-LCN依赖的引入,百战商城后台系统的分页查询功能又正常。感觉好像是TX-LCN的包与pagehelper-5.1.11.jar发生冲突了。


请问老师该问题如何解决?




JAVA 全系列/(旧的隐藏)第二十一阶段:百战商城项目(Spring Cloud最新架构)/百战商城项目 4759楼
JAVA 全系列/(隐藏)第三十阶段:设计模式/框架源码分析(拓展)/SpringMVC源码分析 4760楼

新增功能:
  1.敌方tank自由移动
'''
 #导入pygame模块

import pygame,time
import random
_display=pygame.display
COLOR_BLACK=pygame.Color(0,0,0)
COLOR_RED=pygame.Color(255,255,255)
class MainGame():
    #游戏主窗口
    window=None
    TANK_P1=None
    SCREEN_HEIGHT=500
    SCREEN_WIDTH=800
    EnemyTank_list=[]
    EnemyTank_count=5
    def __init__(self):
        pass
    def startGame(self):
        _display.init()
        #创建窗口加载窗口
        MainGame.window=_display.set_mode([MainGame.SCREEN_WIDTH,MainGame.SCREEN_HEIGHT])
        MainGame.TANK_P1 = Tank(400, 300)
        # 生成敌方tank
        self.createEnemyTank()
        #设置一下游戏标题
        _display.set_caption("坦克大战v1.03")

        while True:
            # 使用坦克移动的速度慢一点
            time.sleep(0.02)
            MainGame.window.fill(COLOR_BLACK)
            # 获取事件
            self.getEvent()
            #将绘制文字得到的小画布,粘贴到窗口中
            MainGame.window.blit(self.getTextface("剩余敌方坦克%d辆"%5),(5,5))

            #展示tank
            MainGame.TANK_P1.displayTank()

            #循环展示敌方tank
            self.displayEnemyTank()
            # 增加tank的开关,控制其移动
            if MainGame.TANK_P1.stop == False:
                MainGame.TANK_P1.move()
            #窗口的刷新   #让窗口持续刷新操作
            _display.update()


    def createEnemyTank(self):
        top = 100
        # 循环生成敌方坦克
        for i in range(MainGame.EnemyTank_count):
            left = random.randint(0, 600)
            speed = random.randint(1, 4)
            eTank = EnemyTank(left, top, speed)
            MainGame.EnemyTank_list.append(eTank)


   #循环展示敌方tank
    def displayEnemyTank(self):
        for eTank in MainGame.EnemyTank_list:
            eTank.displayTank()
            # tank的移动方法
            eTank.randMove()

    def endGame(self):
        print("谢谢使用")
        #结束python解释器
        exit()

    #添加左上角提示文字
    def getTextface(self,text):
        #初始化字体模块
        pygame.font.init()
        font=pygame.font.SysFont('kaiti',18)
        #使用对应的字符完成相关内容的绘制
        textSurface=font.render(text,True,COLOR_RED)
        return textSurface

#获取程序期间所有事件(鼠标事件,键盘事件)
    def getEvent(self):
        #获取所有事件
        eventList=pygame.event.get()
        #对事件进行判断
        for event in eventList:
    #判断事件是否是quit,如果是,退出
            if event.type==pygame.QUIT:
                self.endGame()
    #判断事件类型是否是按键按下
            if event.type==pygame.KEYDOWN:
     #具体是哪一个按键的处理
                if event.key==pygame.K_LEFT:
                    print("坦克向左掉头,移动")
                    #修改方向
                    MainGame.TANK_P1.direction='L'
                    MainGame.TANK_P1.stop=False
                    # MainGame.TANK_P1.move()
                if event.key==pygame.K_RIGHT:
                    print("坦克向右掉头,移动")
                    #修改方向
                    MainGame.TANK_P1.direction='R'
                    MainGame.TANK_P1.stop=False
                    # MainGame.TANK_P1.move()
                if event.key == pygame.K_UP:
                        print("坦克向上掉头,移动")
                        # 修改方向
                        MainGame.TANK_P1.direction = 'U'
                        MainGame.TANK_P1.stop = False
                        # MainGame.TANK_P1.move()
                if event.key == pygame.K_DOWN:
                            print("坦克向下掉头,移动")
                            # 修改方向
                            MainGame.TANK_P1.direction = 'D'
                            MainGame.TANK_P1.stop = False
                            # MainGame.TANK_P1.move()
                elif event.key==pygame.K_SPACE:
                    print("发射子弹")


             # 结束游戏方法
            if event.type==pygame.KEYUP:
                    #松开的是方向键,才更改移动开关状态
                    if event.key==pygame.K_LEFT or event.key==pygame.K_RIGHT or \
                        event.key == pygame.K_UP or event.key==pygame.K_DOWN:
                     #修改坦克的移动状态
                         MainGame.TANK_P1.stop=True


#坦克类
class Tank():
    def __init__(self,left,top):
        self.images={
            'U':pygame.image.load('img/p1tankU.gif'),
            'D': pygame.image.load('img/p1tankD.gif'),
            'L': pygame.image.load('img/p1tankL.gif'),
            'R': pygame.image.load('img/p1tankR.gif')
        }

        self.direction='U'
        self.image=self.images[self.direction]
        #坦克所在的区域
        self.rect=self.image.get_rect()
        #指定坦克初始化位置  分别距x,y轴的位置
        self.rect.left=left
        self.rect.top=top
        #设置tank的开关
        self.stop = True
        #设置tank的速度
        self.speed=4

     #展示坦克(将坦克这个surface绘制到窗口中blit())
    def displayTank(self):
        #1.重新设置tank 的图片
        self.image=self.images[self.direction]
        #2.将坦克加入到窗口中
        MainGame.window.blit(self.image,self.rect)


#坦克中添加速度属性,实现坦克移动
    def move(self):
        if self.direction=='L':
            if self.rect.left>0:
                self.rect.left-=self.speed
        elif self.direction=='R':
            if self.rect.left+self.rect.width<MainGame.SCREEN_WIDTH:
                self.rect.left+=self.speed
        elif self.direction=='U':
            if self.rect.top > 0:
                 self.rect.top-=self.speed
        elif self.direction=='D':
            if self.rect.top + self.rect.height< MainGame.SCREEN_HEIGHT:
                self.rect.top += self.speed

    def hitWalls(self):
        pass
    def shot(self):
        pass
    def display(self):
        pass

    #我方坦克
class MyTank(Tank):
    def __init__(self):
        pass
    def hitEnemyTank(self):
        pass


#完善tank类
#敌方坦克类
class EnemyTank(Tank):

    def __init__(self,left,top,speed):
        #加载图片集
        self.images={
            'U':pygame.image.load('img/enemy1U.gif'),
            'D':pygame.image.load('img/enemy1D.gif'),
            'L':pygame.image.load('img/enemy1L.gif'),
            'R':pygame.image.load('img/enemy1R.gif')
        }
        #方向,随机生成敌方坦克的方向
        self.direction=self.randDirection()
        #根据方向获取图片
        self.image=self.images[self.direction]
        #区域
        self.rect=self.image.get_rect()
        #对left和top进行赋值
        self.rect.left=left
        self.rect.top=top
        #速度
        self.speed=speed
        #移动开关键
        self.stop=True
        #薪增加一个步数变量 step
        self.step=50

     #建立随机生成enemytank的四个方向
    def randDirection(self):
            num=random.randint(1,4)
            if num==1:
                 return 'U'
            if num == 2:
                return 'D'
            if num == 3:
                return 'L'
            if num == 1:
                return 'R'

    #实现敌方tank的自由移动
    def randMove(self):
        if self.step<=0:
            self.direction=self.randDirection()
            self.step=50
        else:
            self.move()
            self.step-=1


    def hitMyTank(self):
        pass


#子弹类
class Bullet():
    def __init__(self):
        pass
    def bulletMove(self):
        pass
    def displayBullet(self):
        pass
    def hitEnemyTank(self):
        pass
    def hitMyTank(self):
        pass
    def hitWalls(self):
        pass

#墙壁类
class Wall():
    def __init__(self):
        pass
    def displayWalls(self):
        pass

#爆炸效果类
class Explode():
    def __init__(self):
        pass
    def displayExplode(self):
        pass

#音乐类
class Music():
    def __init__(self):
        pass
    def play(self):
        pass

if __name__=='__main__':
    MainGame().startGame()


Python 全系列/第二阶段:Python 深入与提高/游戏开发-坦克大战 4761楼

使用idea无法加载图片,也没有提示什么错误。

使用老师源码的代码直接拖入运行也没有显示出来,一片空白。

import java.awt.*;
import javax.swing.*;

public class BilliardsGame extends JFrame{

    //添加桌面小球的图片路径,添加小球和桌子
    Image ball = Toolkit.getDefaultToolkit().getImage("images/ball.png");
    Image desk = Toolkit.getDefaultToolkit().getImage("images/desk.png");

    //给添加的物体一个位置
    double x=100;
    double y=100;
    //判断小球方向
    double degree = 3.14/3;//小球运动的角度就是60度 相当于180/3 = 60



    //画窗口的一个方法:加载小球和桌面

    public void paint(Graphics g){
        System.out.println("窗口被划了一次!");
        g.drawImage(desk,0,0,null);
        g.drawImage(ball,(int)x,(int)y,null);
        //边界检测:碰到上下的边界
        //500是窗口的高度:40是桌子的边框;30是球的直径,最后一个是标题栏的高度
        if(y>500-40-30 || y<40+40){
            degree = -degree;
        }
        //左右边界检测
        if(x<40 || x>856-40-30){
            degree = 3.14 - degree;
        }

    }

    //窗口加载
    void launchFrame(){
            //设置窗口的尺寸宽300 高度300
        setSize(856,500);
            //设置窗口的位置
        setLocation(50, 50);
            
             //设置是否可以看得见
        setVisible(true);
        while(true) {
            repaint();

            try {
                Thread.sleep(40);   //1s = 1000ms; 大约1秒绘制1000/40=25次。
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //程序的入口
    public static void main(String[] args) {
        System.out.println("this is a happy day,Let's start a small game project!");
        BilliardsGame game = new BilliardsGame();
        game.launchFrame();
    }
}

这是我的代码,另外这是我的项目结构

image.png

路径是没有问题的,放大缩小的操作都做了,依旧是是一片空白

image.png



JAVA 全系列/第一阶段:JAVA 快速入门/IDEA的使用和第一个java项目 4764楼
JAVA 全系列/第十八阶段:亿级高并发电商项目/亿级高并发电商项目(旧) 4768楼
Python 全系列/第一阶段:Python入门/编程基本概念 4769楼
JAVA 全系列/第一阶段:JAVA 快速入门/控制语句、方法、递归算法 4770楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637